Set up cache in vulkan to reuse GrVkPrograms (aka VkPipelines)

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1816153002

Review URL: https://codereview.chromium.org/1816153002
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index f01c2e4..21e4ee3 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"
@@ -478,12 +476,6 @@
     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);
     }
@@ -1291,32 +1283,22 @@
 
     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");
+                               GrVkPipelineState** pipelineState) {
+    *pipelineState = fResourceProvider.findOrCreateCompatiblePipelineState(pipeline,
+                                                                           primProc,
+                                                                           primitiveType,
+                                                                           renderPass);
+    if (!pipelineState) {
         return false;
     }
 
-    *program = GrVkProgramBuilder::CreateProgram(this,
-                                                 pipeline,
-                                                 primProc,
-                                                 primitiveType,
-                                                 desc,
-                                                 renderPass);
-    if (!program) {
-        return false;
-    }
+    (*pipelineState)->setData(this, primProc, pipeline);
 
-    (*program)->setData(this, primProc, pipeline);
-
-    (*program)->bind(this, fCurrentCmdBuffer);
+    (*pipelineState)->bind(this, fCurrentCmdBuffer);
 
     GrVkPipeline::SetDynamicState(this, fCurrentCmdBuffer, pipeline);
 
@@ -1337,9 +1319,9 @@
 
     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;
     }
 
@@ -1391,21 +1373,18 @@
         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()) {
@@ -1429,14 +1408,11 @@
 
     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();