Home | History | Annotate | Download | only in vk
      1 /*
      2 * Copyright 2016 Google Inc.
      3 *
      4 * Use of this source code is governed by a BSD-style license that can be
      5 * found in the LICENSE file.
      6 */
      7 
      8 #ifndef GrVkResourceProvider_DEFINED
      9 #define GrVkResourceProvider_DEFINED
     10 
     11 #include "GrVkDescriptorPool.h"
     12 #include "GrVkResource.h"
     13 #include "GrVkUtil.h"
     14 #include "SkTArray.h"
     15 
     16 #include "vulkan/vulkan.h"
     17 
     18 class GrPipeline;
     19 class GrPrimitiveProcessor;
     20 class GrVkCommandBuffer;
     21 class GrVkGpu;
     22 class GrVkPipeline;
     23 class GrVkRenderPass;
     24 class GrVkRenderTarget;
     25 
     26 class GrVkResourceProvider {
     27 public:
     28     GrVkResourceProvider(GrVkGpu* gpu);
     29     ~GrVkResourceProvider();
     30 
     31     GrVkPipeline* createPipeline(const GrPipeline& pipeline,
     32                                  const GrPrimitiveProcessor& primProc,
     33                                  VkPipelineShaderStageCreateInfo* shaderStageInfo,
     34                                  int shaderStageCount,
     35                                  GrPrimitiveType primitiveType,
     36                                  const GrVkRenderPass& renderPass,
     37                                  VkPipelineLayout layout);
     38 
     39     // Finds or creates a simple render pass that matches the target, increments the refcount,
     40     // and returns.
     41     const GrVkRenderPass* findOrCreateCompatibleRenderPass(const GrVkRenderTarget& target);
     42 
     43     GrVkCommandBuffer* createCommandBuffer();
     44     void checkCommandBuffers();
     45 
     46     // Finds or creates a compatible GrVkDescriptorPool for the requested DescriptorTypeCount.
     47     // The refcount is incremented and a pointer returned.
     48     // TODO: Currently this will just create a descriptor pool without holding onto a ref itself
     49     //       so we currently do not reuse them. Rquires knowing if another draw is currently using
     50     //       the GrVkDescriptorPool, the ability to reset pools, and the ability to purge pools out
     51     //       of our cache of GrVkDescriptorPools.
     52     GrVkDescriptorPool* findOrCreateCompatibleDescriptorPool(
     53                                         const GrVkDescriptorPool::DescriptorTypeCounts& typeCounts);
     54 
     55     // Destroy any cached resources. To be called before destroying the VkDevice.
     56     // The assumption is that all queues are idle and all command buffers are finished.
     57     // For resource tracing to work properly, this should be called after unrefing all other
     58     // resource usages.
     59     void destroyResources();
     60 
     61     // Abandon any cached resources. To be used when the context/VkDevice is lost.
     62     // For resource tracing to work properly, this should be called after unrefing all other
     63     // resource usages.
     64     void abandonResources();
     65 
     66 private:
     67     GrVkGpu* fGpu;
     68 
     69     // Array of RenderPasses that only have a single color attachment, optional stencil attachment,
     70     // optional resolve attachment, and only one subpass
     71     SkSTArray<4, GrVkRenderPass*> fSimpleRenderPasses;
     72 
     73     // Array of CommandBuffers that are currently in flight
     74     SkSTArray<4, GrVkCommandBuffer*> fActiveCommandBuffers;
     75 };
     76 
     77 #endif
     78