Vulkan: Cache object pointers in ContextVk.

Small performance optimization.

Bug: angleproject:2786
Change-Id: Ib01c1762d438ffb72ec25bf05135a7d3271d6aee
Reviewed-on: https://chromium-review.googlesource.com/1188954
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 4b7885c..13d119b 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -119,6 +119,9 @@
       mVertexBuffersDirty(false),
       mIndexBufferDirty(false),
       mDescriptorSetsDirty(false),
+      mVertexArray(nullptr),
+      mDrawFramebuffer(nullptr),
+      mProgram(nullptr),
       mLastIndexBufferOffset(0),
       mCurrentDrawElementsType(GL_NONE),
       mClearColorMask(kAllColorChannelsMask),
@@ -215,28 +218,24 @@
 {
     ASSERT(!mCurrentPipeline);
 
-    const gl::State &state       = mState.getState();
-    VertexArrayVk *vertexArrayVk = vk::GetImpl(state.getVertexArray());
-    FramebufferVk *framebufferVk = vk::GetImpl(state.getDrawFramebuffer());
-    ProgramVk *programVk         = vk::GetImpl(state.getProgram());
     const gl::AttributesMask activeAttribLocationsMask =
-        state.getProgram()->getActiveAttribLocationsMask();
+        mProgram->getState().getActiveAttribLocationsMask();
 
     // Ensure the topology of the pipeline description is updated.
     mPipelineDesc->updateTopology(mCurrentDrawMode);
 
     // Copy over the latest attrib and binding descriptions.
-    vertexArrayVk->getPackedInputDescriptions(mPipelineDesc.get());
+    mVertexArray->getPackedInputDescriptions(mPipelineDesc.get());
 
     // Ensure that the RenderPass description is updated.
-    mPipelineDesc->updateRenderPassDesc(framebufferVk->getRenderPassDesc());
+    mPipelineDesc->updateRenderPassDesc(mDrawFramebuffer->getRenderPassDesc());
 
     // Trigger draw call shader patching and fill out the pipeline desc.
     const vk::ShaderAndSerial *vertexShaderAndSerial   = nullptr;
     const vk::ShaderAndSerial *fragmentShaderAndSerial = nullptr;
     const vk::PipelineLayout *pipelineLayout           = nullptr;
-    ANGLE_TRY(programVk->initShaders(this, drawCallParams, &vertexShaderAndSerial,
-                                     &fragmentShaderAndSerial, &pipelineLayout));
+    ANGLE_TRY(mProgram->initShaders(this, drawCallParams, &vertexShaderAndSerial,
+                                    &fragmentShaderAndSerial, &pipelineLayout));
 
     mPipelineDesc->updateShaders(vertexShaderAndSerial->getSerial(),
                                  fragmentShaderAndSerial->getSerial());
@@ -261,12 +260,9 @@
 
     const gl::State &state       = mState.getState();
     const gl::Program *programGL = state.getProgram();
-    ProgramVk *programVk         = vk::GetImpl(programGL);
-    FramebufferVk *framebufferVk = vk::GetImpl(state.getDrawFramebuffer());
-    VertexArrayVk *vertexArrayVk = vk::GetImpl(state.getVertexArray());
 
     vk::RecordingMode mode;
-    ANGLE_TRY(framebufferVk->getCommandBufferForDraw(this, commandBufferOut, &mode));
+    ANGLE_TRY(mDrawFramebuffer->getCommandBufferForDraw(this, commandBufferOut, &mode));
 
     // Set any dirty bits that depend on draw call parameters or other objects.
     if (mode == vk::RecordingMode::Start)
@@ -280,13 +276,13 @@
 
     if (context->getStateCache().hasAnyActiveClientAttrib())
     {
-        ANGLE_TRY(vertexArrayVk->updateClientAttribs(context, drawCallParams));
+        ANGLE_TRY(mVertexArray->updateClientAttribs(context, drawCallParams));
         mVertexBuffersDirty = true;
     }
 
-    if (programVk->dirtyUniforms())
+    if (mProgram->dirtyUniforms())
     {
-        ANGLE_TRY(programVk->updateUniforms(this));
+        ANGLE_TRY(mProgram->updateUniforms(this));
         mDescriptorSetsDirty = true;
     }
 
@@ -324,12 +320,12 @@
         {
             TextureVk *textureVk = mActiveTextures[textureIndex];
             ANGLE_TRY(textureVk->ensureImageInitialized(this));
-            textureVk->addReadDependency(framebufferVk);
+            textureVk->addReadDependency(mDrawFramebuffer);
         }
 
-        if (programVk->hasTextures())
+        if (mProgram->hasTextures())
         {
-            ANGLE_TRY(programVk->updateTexturesDescriptorSet(this));
+            ANGLE_TRY(mProgram->updateTexturesDescriptorSet(this));
         }
 
         mDescriptorSetsDirty = true;
@@ -338,11 +334,11 @@
 
     if (mDescriptorSetsDirty)
     {
-        ANGLE_TRY(programVk->updateDescriptorSets(this, drawCallParams, *commandBufferOut));
+        ANGLE_TRY(mProgram->updateDescriptorSets(this, drawCallParams, *commandBufferOut));
 
         // Bind the graphics descriptor sets.
         (*commandBufferOut)
-            ->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, programVk->getPipelineLayout(),
+            ->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, mProgram->getPipelineLayout(),
                                  kDriverUniformsDescriptorSetIndex, 1,
                                  &mDriverUniformsDescriptorSet, 0, nullptr);
         mDescriptorSetsDirty = false;
@@ -353,15 +349,15 @@
     {
         const gl::AttributesMask &programAttribsMask = programGL->getActiveAttribLocationsMask();
         BindNonNullVertexBufferRanges(*commandBufferOut, programAttribsMask, maxAttrib,
-                                      vertexArrayVk->getCurrentArrayBufferHandles(),
-                                      vertexArrayVk->getCurrentArrayBufferOffsets());
+                                      mVertexArray->getCurrentArrayBufferHandles(),
+                                      mVertexArray->getCurrentArrayBufferOffsets());
 
-        const auto &arrayBufferResources = vertexArrayVk->getCurrentArrayBufferResources();
+        const auto &arrayBufferResources = mVertexArray->getCurrentArrayBufferResources();
 
         for (size_t attribIndex : context->getStateCache().getActiveBufferedAttribsMask())
         {
             if (arrayBufferResources[attribIndex])
-                arrayBufferResources[attribIndex]->addReadDependency(framebufferVk);
+                arrayBufferResources[attribIndex]->addReadDependency(mDrawFramebuffer);
         }
 
         mVertexBuffersDirty = false;
@@ -370,15 +366,15 @@
     if (useIndexBuffer && mIndexBufferDirty)
     {
         (*commandBufferOut)
-            ->bindIndexBuffer(vertexArrayVk->getCurrentElementArrayBufferHandle(),
-                              vertexArrayVk->getCurrentElementArrayBufferOffset(),
+            ->bindIndexBuffer(mVertexArray->getCurrentElementArrayBufferHandle(),
+                              mVertexArray->getCurrentElementArrayBufferOffset(),
                               gl_vk::GetIndexType(mCurrentDrawElementsType));
 
         vk::CommandGraphResource *elementArrayBufferResource =
-            vertexArrayVk->getCurrentElementArrayBufferResource();
+            mVertexArray->getCurrentElementArrayBufferResource();
         if (elementArrayBufferResource)
         {
-            elementArrayBufferResource->addReadDependency(framebufferVk);
+            elementArrayBufferResource->addReadDependency(mDrawFramebuffer);
         }
 
         mIndexBufferDirty = false;
@@ -391,19 +387,17 @@
                                           const gl::DrawCallParams &drawCallParams,
                                           vk::CommandBuffer **commandBufferOut)
 {
-    VertexArrayVk *vertexArrayVk = vk::GetImpl(mState.getState().getVertexArray());
-
     if (drawCallParams.type() != mCurrentDrawElementsType)
     {
         mIndexBufferDirty        = true;
         mCurrentDrawElementsType = drawCallParams.type();
     }
 
-    const gl::Buffer *elementArrayBuffer = vertexArrayVk->getState().getElementArrayBuffer().get();
+    const gl::Buffer *elementArrayBuffer = mVertexArray->getState().getElementArrayBuffer().get();
     if (!elementArrayBuffer)
     {
         mIndexBufferDirty = true;
-        ANGLE_TRY(vertexArrayVk->updateIndexTranslation(this, drawCallParams));
+        ANGLE_TRY(mVertexArray->updateIndexTranslation(this, drawCallParams));
     }
     else
     {
@@ -411,12 +405,12 @@
         {
             mIndexBufferDirty      = true;
             mLastIndexBufferOffset = drawCallParams.indices();
-            vertexArrayVk->updateCurrentElementArrayBufferOffset(mLastIndexBufferOffset);
+            mVertexArray->updateCurrentElementArrayBufferOffset(mLastIndexBufferOffset);
         }
 
         if (drawCallParams.type() == GL_UNSIGNED_BYTE && mIndexBufferDirty)
         {
-            ANGLE_TRY(vertexArrayVk->updateIndexTranslation(this, drawCallParams));
+            ANGLE_TRY(mVertexArray->updateIndexTranslation(this, drawCallParams));
         }
     }
 
@@ -427,8 +421,7 @@
                                            const gl::DrawCallParams &drawCallParams,
                                            vk::CommandBuffer **commandBufferOut)
 {
-    VertexArrayVk *vertexArrayVk = vk::GetImpl(mState.getState().getVertexArray());
-    ANGLE_TRY(vertexArrayVk->handleLineLoop(this, drawCallParams));
+    ANGLE_TRY(mVertexArray->handleLineLoop(this, drawCallParams));
     mIndexBufferDirty = true;
     mCurrentDrawElementsType =
         drawCallParams.isDrawElements() ? drawCallParams.type() : GL_UNSIGNED_INT;
@@ -770,10 +763,10 @@
                 break;
             case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
             {
+                mDrawFramebuffer = vk::GetImpl(glState.getDrawFramebuffer());
                 ANGLE_TRY(updateDriverUniforms(glState));
                 updateFlipViewportDrawFramebuffer(glState);
-                FramebufferVk *framebufferVk = vk::GetImpl(glState.getDrawFramebuffer());
-                mPipelineDesc->updateViewport(framebufferVk, glState.getViewport(),
+                mPipelineDesc->updateViewport(mDrawFramebuffer, glState.getViewport(),
                                               glState.getNearPlane(), glState.getFarPlane(),
                                               isViewportFlipEnabledForDrawFBO());
                 updateColorMask(glState.getBlendState());
@@ -795,6 +788,7 @@
                 break;
             case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
             {
+                mVertexArray = vk::GetImpl(glState.getVertexArray());
                 invalidateDefaultAttributes(context->getStateCache().getActiveDefaultAttribsMask());
                 break;
             }
@@ -803,6 +797,7 @@
             case gl::State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING:
                 break;
             case gl::State::DIRTY_BIT_PROGRAM_BINDING:
+                mProgram = vk::GetImpl(glState.getProgram());
                 break;
             case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
             {
@@ -1207,9 +1202,8 @@
 
     ANGLE_TRY(defaultBuffer.flush(this));
 
-    VertexArrayVk *vertexArrayVk = vk::GetImpl(glState.getVertexArray());
-    vertexArrayVk->updateDefaultAttrib(mRenderer, attribIndex, bufferHandle,
-                                       static_cast<uint32_t>(offset));
+    mVertexArray->updateDefaultAttrib(mRenderer, attribIndex, bufferHandle,
+                                      static_cast<uint32_t>(offset));
     return angle::Result::Continue();
 }
 }  // namespace rx