| Index: src/gpu/vk/GrVkProgram.h
|
| diff --git a/src/gpu/vk/GrVkProgram.h b/src/gpu/vk/GrVkProgram.h
|
| index 9b4eeb1e93089ad8c0e2007a6b03e85f3f1df0da..1a024f2f2a6da81c9cec0f1c82145a4314ad5225 100644
|
| --- a/src/gpu/vk/GrVkProgram.h
|
| +++ b/src/gpu/vk/GrVkProgram.h
|
| @@ -55,8 +55,6 @@ private:
|
| GrVkPipeline* pipeline,
|
| VkPipelineLayout layout,
|
| VkDescriptorSetLayout dsLayout[2],
|
| - GrVkDescriptorPool* descriptorPool,
|
| - VkDescriptorSet descriptorSets[2],
|
| const BuiltinUniformHandles& builtinUniformHandles,
|
| const UniformInfoArray& uniforms,
|
| uint32_t vertexUniformSize,
|
| @@ -66,6 +64,40 @@ private:
|
| GrGLSLXferProcessor* xferProcessor,
|
| const GrGLSLFragProcs& fragmentProcessors);
|
|
|
| + // Each pool will manage one type of descriptor. Thus each descriptor set we use will all be of
|
| + // one VkDescriptorType.
|
| + struct DescriptorPoolManager {
|
| + DescriptorPoolManager(VkDescriptorSetLayout layout, VkDescriptorType type,
|
| + uint32_t descCount, GrVkGpu* gpu)
|
| + : fDescLayout(layout)
|
| + , fDescType(type)
|
| + , fCurrentDescriptorSet(0)
|
| + , fPool(nullptr) {
|
| + SkASSERT(descCount < (SK_MaxU32 >> 2));
|
| + fMaxDescriptorSets = descCount << 2;
|
| + this->getNewPool(gpu);
|
| + }
|
| +
|
| + ~DescriptorPoolManager() {
|
| + SkASSERT(!fDescLayout);
|
| + SkASSERT(!fPool);
|
| + }
|
| +
|
| + void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
|
| +
|
| + void freeGPUResources(const GrVkGpu* gpu);
|
| + void abandonGPUResources();
|
| +
|
| + VkDescriptorSetLayout fDescLayout;
|
| + VkDescriptorType fDescType;
|
| + uint32_t fMaxDescriptorSets;
|
| + uint32_t fCurrentDescriptorSet;
|
| + GrVkDescriptorPool* fPool;
|
| +
|
| + private:
|
| + void getNewPool(GrVkGpu* gpu);
|
| + };
|
| +
|
| void writeUniformBuffers(const GrVkGpu* gpu);
|
|
|
| void writeSamplers(GrVkGpu* gpu, const SkTArray<const GrTextureAccess*>& textureBindings);
|
| @@ -110,28 +142,24 @@ private:
|
| // Helper for setData() that sets the view matrix and loads the render target height uniform
|
| void setRenderTargetState(const GrPipeline&);
|
|
|
| -// GrVkGpu* fGpu;
|
| -
|
| // GrVkResources
|
| - GrVkDescriptorPool* fDescriptorPool;
|
| GrVkPipeline* fPipeline;
|
|
|
| // Used for binding DescriptorSets to the command buffer but does not need to survive during
|
| // command buffer execution. Thus this is not need to be a GrVkResource.
|
| VkPipelineLayout fPipelineLayout;
|
|
|
| - // The first set (index 0) will be used for samplers and the second set (index 1) will be
|
| - // used for uniform buffers.
|
| - // The DSLayouts only are needed for allocating the descriptor sets and must survive until after
|
| - // descriptor sets have been updated. Thus the lifetime of the layouts will just be the life of
|
| - //the GrVkProgram.
|
| - VkDescriptorSetLayout fDSLayout[2];
|
| // The DescriptorSets need to survive until the gpu has finished all draws that use them.
|
| // However, they will only be freed by the descriptor pool. Thus by simply keeping the
|
| // descriptor pool alive through the draw, the descritor sets will also stay alive. Thus we do
|
| - // not need a GrVkResource versions of VkDescriptorSet.
|
| + // not need a GrVkResource versions of VkDescriptorSet. We hold on to these in the program since
|
| + // we update the descriptor sets and bind them at separate times;
|
| VkDescriptorSet fDescriptorSets[2];
|
|
|
| + // Meta data so we know which descriptor sets we are using and need to bind.
|
| + int fStartDS;
|
| + int fDSCount;
|
| +
|
| SkAutoTDelete<GrVkUniformBuffer> fVertexUniformBuffer;
|
| SkAutoTDelete<GrVkUniformBuffer> fFragmentUniformBuffer;
|
|
|
| @@ -151,6 +179,9 @@ private:
|
|
|
| GrVkProgramDataManager fProgramDataManager;
|
|
|
| + DescriptorPoolManager fSamplerPoolManager;
|
| + DescriptorPoolManager fUniformPoolManager;
|
| +
|
| #ifdef SK_DEBUG
|
| int fNumSamplers;
|
| #endif
|
|
|