Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(470)

Unified Diff: src/gpu/vk/GrVkGpu.cpp

Issue 1816153002: Set up cache in vulkan to reuse GrVkPrograms (aka VkPipelines) (Closed) Base URL: https://skia.googlesource.com/skia.git@progSamplers
Patch Set: update comment Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/vk/GrVkGpu.cpp
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 926e423b6e3016b13fa999b100520e0abcb398bf..5373338153179d688d8e83365f9540c0ae615fb0 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -21,9 +21,7 @@
#include "GrVkIndexBuffer.h"
#include "GrVkMemory.h"
#include "GrVkPipeline.h"
-#include "GrVkProgram.h"
-#include "GrVkProgramBuilder.h"
-#include "GrVkProgramDesc.h"
+#include "GrVkPipelineState.h"
#include "GrVkRenderPass.h"
#include "GrVkResourceProvider.h"
#include "GrVkTexture.h"
@@ -364,7 +362,7 @@ GrVkGpu::~GrVkGpu() {
// must call this just before we destroy the VkDevice
fResourceProvider.destroyResources();
-#ifdef SK_DEBUG
+#ifdef ENABLE_VK_LAYERS
VK_CALL(DestroyDebugReportCallbackEXT(fVkInstance, fCallback, nullptr));
#endif
@@ -696,12 +694,6 @@ GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, GrGpuResource::Li
if (renderTarget) {
tex = GrVkTextureRenderTarget::CreateNewTextureRenderTarget(this, desc, lifeCycle,
imageDesc);
-#if 0
- // This clear can be included to fix warning described in htttps://bugs.skia.org/5045
- // Obviously we do not want to be clearling needlessly every time we create a render target.
- SkIRect rect = SkIRect::MakeWH(tex->width(), tex->height());
- this->clear(rect, GrColor_TRANSPARENT_BLACK, tex->asRenderTarget());
-#endif
} else {
tex = GrVkTexture::CreateNewTexture(this, desc, lifeCycle, imageDesc);
}
@@ -1509,32 +1501,22 @@ bool GrVkGpu::onReadPixels(GrSurface* surface,
return true;
}
-
bool GrVkGpu::prepareDrawState(const GrPipeline& pipeline,
const GrPrimitiveProcessor& primProc,
GrPrimitiveType primitiveType,
const GrVkRenderPass& renderPass,
- GrVkProgram** program) {
- // Get GrVkProgramDesc
- GrVkProgramDesc desc;
- if (!GrVkProgramDescBuilder::Build(&desc, primProc, pipeline, *this->vkCaps().glslCaps())) {
- GrCapsDebugf(this->caps(), "Failed to vk program descriptor!\n");
- return false;
- }
-
- *program = GrVkProgramBuilder::CreateProgram(this,
- pipeline,
- primProc,
- primitiveType,
- desc,
- renderPass);
- if (!program) {
+ GrVkPipelineState** pipelineState) {
+ *pipelineState = fResourceProvider.findOrCreateCompatiblePipelineState(pipeline,
+ primProc,
+ primitiveType,
+ renderPass);
+ if (!pipelineState) {
return false;
}
- (*program)->setData(this, primProc, pipeline);
+ (*pipelineState)->setData(this, primProc, pipeline);
- (*program)->bind(this, fCurrentCmdBuffer);
+ (*pipelineState)->bind(this, fCurrentCmdBuffer);
GrVkPipeline::SetDynamicState(this, fCurrentCmdBuffer, pipeline);
@@ -1555,9 +1537,9 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline,
fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT);
- GrVkProgram* program = nullptr;
+ GrVkPipelineState* pipelineState = nullptr;
GrPrimitiveType primitiveType = meshes[0].primitiveType();
- if (!this->prepareDrawState(pipeline, primProc, primitiveType, *renderPass, &program)) {
+ if (!this->prepareDrawState(pipeline, primProc, primitiveType, *renderPass, &pipelineState)) {
return;
}
@@ -1609,21 +1591,18 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline,
do {
if (nonIdxMesh->primitiveType() != primitiveType) {
// Technically we don't have to call this here (since there is a safety check in
- // program:setData but this will allow for quicker freeing of resources if the
- // program sits in a cache for a while.
- program->freeTempResources(this);
- // This free will go away once we setup a program cache, and then the cache will be
- // responsible for call freeGpuResources.
- program->freeGPUResources(this);
- program->unref();
- SkDEBUGCODE(program = nullptr);
+ // pipelineState:setData but this will allow for quicker freeing of resources if the
+ // pipelineState sits in a cache for a while.
+ pipelineState->freeTempResources(this);
+ pipelineState->unref();
+ SkDEBUGCODE(pipelineState = nullptr);
primitiveType = nonIdxMesh->primitiveType();
if (!this->prepareDrawState(pipeline, primProc, primitiveType, *renderPass,
- &program)) {
+ &pipelineState)) {
return;
}
}
- SkASSERT(program);
+ SkASSERT(pipelineState);
this->bindGeometry(primProc, *nonIdxMesh);
if (nonIdxMesh->isIndexed()) {
@@ -1647,14 +1626,11 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline,
fCurrentCmdBuffer->endRenderPass(this);
- // Technically we don't have to call this here (since there is a safety check in program:setData
- // but this will allow for quicker freeing of resources if the program sits in a cache for a
- // while.
- program->freeTempResources(this);
- // This free will go away once we setup a program cache, and then the cache will be responsible
- // for call freeGpuResources.
- program->freeGPUResources(this);
- program->unref();
+ // Technically we don't have to call this here (since there is a safety check in
+ // pipelineState:setData but this will allow for quicker freeing of resources if the
+ // pipelineState sits in a cache for a while.
+ pipelineState->freeTempResources(this);
+ pipelineState->unref();
#if SWAP_PER_DRAW
glFlush();

Powered by Google App Engine
This is Rietveld 408576698