| 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();
|
|
|