| Index: src/gpu/vk/GrVkPipelineState.cpp | 
| diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp | 
| index 94d6305bc951a5eba89a6bc8839d94f7a6e15990..700dc4b4cf72c1f7cea456de44fbe481ffdd2ae7 100644 | 
| --- a/src/gpu/vk/GrVkPipelineState.cpp | 
| +++ b/src/gpu/vk/GrVkPipelineState.cpp | 
| @@ -11,6 +11,7 @@ | 
| #include "GrTexturePriv.h" | 
| #include "GrVkCommandBuffer.h" | 
| #include "GrVkDescriptorPool.h" | 
| +#include "GrVkDescriptorSet.h" | 
| #include "GrVkGpu.h" | 
| #include "GrVkImageView.h" | 
| #include "GrVkMemory.h" | 
| @@ -39,6 +40,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu, | 
| const GrGLSLFragProcs& fragmentProcessors) | 
| : fPipeline(pipeline) | 
| , fPipelineLayout(layout) | 
| +    , fUniformDescriptorSet(nullptr) | 
| , fStartDS(SK_MaxS32) | 
| , fDSCount(0) | 
| , fBuiltinUniformHandles(builtinUniformHandles) | 
| @@ -48,8 +50,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu, | 
| , fDesc(desc) | 
| , fDataManager(uniforms, vertexUniformSize, fragmentUniformSize) | 
| , fSamplerPoolManager(dsSamplerLayout, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, | 
| -                          numSamplers, gpu) | 
| -    , fCurrentUniformDescPool(nullptr) { | 
| +                          numSamplers, gpu) { | 
| fSamplers.setReserve(numSamplers); | 
| fTextureViews.setReserve(numSamplers); | 
| fTextures.setReserve(numSamplers); | 
| @@ -124,9 +125,10 @@ void GrVkPipelineState::freeGPUResources(const GrVkGpu* gpu) { | 
| } | 
|  | 
| fSamplerPoolManager.freeGPUResources(gpu); | 
| -    if (fCurrentUniformDescPool) { | 
| -        fCurrentUniformDescPool->unref(gpu); | 
| -        fCurrentUniformDescPool = nullptr; | 
| + | 
| +    if (fUniformDescriptorSet) { | 
| +        fUniformDescriptorSet->recycle(const_cast<GrVkGpu*>(gpu)); | 
| +        fUniformDescriptorSet = nullptr; | 
| } | 
|  | 
| this->freeTempResources(gpu); | 
| @@ -157,9 +159,10 @@ void GrVkPipelineState::abandonGPUResources() { | 
| fTextures.rewind(); | 
|  | 
| fSamplerPoolManager.abandonGPUResources(); | 
| -    if (fCurrentUniformDescPool) { | 
| -        fCurrentUniformDescPool->unrefAndAbandon(); | 
| -        fCurrentUniformDescPool = nullptr; | 
| + | 
| +    if (fUniformDescriptorSet) { | 
| +        fUniformDescriptorSet->unrefAndAbandon(); | 
| +        fUniformDescriptorSet = nullptr; | 
| } | 
| } | 
|  | 
| @@ -208,18 +211,13 @@ void GrVkPipelineState::setData(GrVkGpu* gpu, | 
|  | 
| if (fVertexUniformBuffer.get() || fFragmentUniformBuffer.get()) { | 
| if (fDataManager.uploadUniformBuffers(gpu, fVertexUniformBuffer, fFragmentUniformBuffer) || | 
| -            VK_NULL_HANDLE == fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet]) { | 
| -            const GrVkDescriptorPool* pool; | 
| -            int uniformDSIdx = GrVkUniformHandler::kUniformBufferDescSet; | 
| -            gpu->resourceProvider().getUniformDescriptorSet(&fDescriptorSets[uniformDSIdx], | 
| -                                                            &pool); | 
| -            if (pool != fCurrentUniformDescPool) { | 
| -                if (fCurrentUniformDescPool) { | 
| -                    fCurrentUniformDescPool->unref(gpu); | 
| -                } | 
| -                fCurrentUniformDescPool = pool; | 
| -                fCurrentUniformDescPool->ref(); | 
| +            !fUniformDescriptorSet) { | 
| +            if (fUniformDescriptorSet) { | 
| +                fUniformDescriptorSet->recycle(gpu); | 
| } | 
| +            fUniformDescriptorSet = gpu->resourceProvider().getUniformDescriptorSet(); | 
| +            int uniformDSIdx = GrVkUniformHandler::kUniformBufferDescSet; | 
| +            fDescriptorSets[uniformDSIdx] = fUniformDescriptorSet->descriptorSet(); | 
| this->writeUniformBuffers(gpu); | 
| } | 
| } | 
| @@ -370,8 +368,9 @@ void GrVkPipelineState::addUniformResources(GrVkCommandBuffer& commandBuffer) { | 
| if (fSamplerPoolManager.fPool) { | 
| commandBuffer.addResource(fSamplerPoolManager.fPool); | 
| } | 
| -    if (fCurrentUniformDescPool) { | 
| -        commandBuffer.addResource(fCurrentUniformDescPool); | 
| + | 
| +    if (fUniformDescriptorSet) { | 
| +        commandBuffer.addRecycledResource(fUniformDescriptorSet); | 
| } | 
|  | 
| if (fVertexUniformBuffer.get()) { | 
|  |