1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_VulkanResourceProvider_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_VulkanResourceProvider_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceProvider.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanGraphicsPipeline.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DescriptorData.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID 20*c8dee2aaSAndroid Build Coastguard Worker extern "C" { 21*c8dee2aaSAndroid Build Coastguard Worker typedef struct AHardwareBuffer AHardwareBuffer; 22*c8dee2aaSAndroid Build Coastguard Worker } 23*c8dee2aaSAndroid Build Coastguard Worker #endif 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class VulkanCommandBuffer; 28*c8dee2aaSAndroid Build Coastguard Worker class VulkanDescriptorSet; 29*c8dee2aaSAndroid Build Coastguard Worker class VulkanFramebuffer; 30*c8dee2aaSAndroid Build Coastguard Worker class VulkanGraphicsPipeline; 31*c8dee2aaSAndroid Build Coastguard Worker class VulkanRenderPass; 32*c8dee2aaSAndroid Build Coastguard Worker class VulkanSharedContext; 33*c8dee2aaSAndroid Build Coastguard Worker class VulkanYcbcrConversion; 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker class VulkanResourceProvider final : public ResourceProvider { 36*c8dee2aaSAndroid Build Coastguard Worker public: 37*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t kIntrinsicConstantSize = sizeof(float) * 8; // float4 + 2xfloat2 38*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t kLoadMSAAVertexBufferSize = sizeof(float) * 8; // 4 points of 2 floats 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker using UniformBindGroupKey = FixedSizeKey<2 * VulkanGraphicsPipeline::kNumUniformBuffers>; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker VulkanResourceProvider(SharedContext* sharedContext, 43*c8dee2aaSAndroid Build Coastguard Worker SingleOwner*, 44*c8dee2aaSAndroid Build Coastguard Worker uint32_t recorderID, 45*c8dee2aaSAndroid Build Coastguard Worker size_t resourceBudget, 46*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> intrinsicConstantUniformBuffer); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker ~VulkanResourceProvider() override; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> refIntrinsicConstantBuffer() const; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanYcbcrConversion> findOrCreateCompatibleYcbcrConversion( 53*c8dee2aaSAndroid Build Coastguard Worker const VulkanYcbcrConversionInfo& ycbcrInfo) const; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker private: 56*c8dee2aaSAndroid Build Coastguard Worker const VulkanSharedContext* vulkanSharedContext() const; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GraphicsPipeline> createGraphicsPipeline(const RuntimeEffectDictionary*, 59*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipelineDesc&, 60*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 61*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<PipelineCreationFlags>) override; 62*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ComputePipeline> createComputePipeline(const ComputePipelineDesc&) override; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> createTexture(SkISize, 65*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&, 66*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted) override; 67*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> onCreateWrappedTexture(const BackendTexture&) override; 68*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> createBuffer(size_t size, BufferType type, AccessPattern) override; 69*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Sampler> createSampler(const SamplerDesc&) override; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanFramebuffer> createFramebuffer( 72*c8dee2aaSAndroid Build Coastguard Worker const VulkanSharedContext*, 73*c8dee2aaSAndroid Build Coastguard Worker const skia_private::TArray<VkImageView>& attachmentViews, 74*c8dee2aaSAndroid Build Coastguard Worker const VulkanRenderPass&, 75*c8dee2aaSAndroid Build Coastguard Worker const int width, 76*c8dee2aaSAndroid Build Coastguard Worker const int height); 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker BackendTexture onCreateBackendTexture(SkISize dimensions, const TextureInfo&) override; 79*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID 80*c8dee2aaSAndroid Build Coastguard Worker BackendTexture onCreateBackendTexture(AHardwareBuffer*, 81*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable, 82*c8dee2aaSAndroid Build Coastguard Worker bool isProtectedContent, 83*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 84*c8dee2aaSAndroid Build Coastguard Worker bool fromAndroidWindow) const override; 85*c8dee2aaSAndroid Build Coastguard Worker #endif 86*c8dee2aaSAndroid Build Coastguard Worker void onDeleteBackendTexture(const BackendTexture&) override; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanDescriptorSet> findOrCreateDescriptorSet(SkSpan<DescriptorData>); 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanDescriptorSet> findOrCreateUniformBuffersDescriptorSet( 91*c8dee2aaSAndroid Build Coastguard Worker SkSpan<DescriptorData> requestedDescriptors, 92*c8dee2aaSAndroid Build Coastguard Worker SkSpan<BindBufferInfo> bindUniformBufferInfo); 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanGraphicsPipeline> findOrCreateLoadMSAAPipeline(const RenderPassDesc&); 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker // Find or create a compatible (needed when creating a framebuffer and graphics pipeline) or 97*c8dee2aaSAndroid Build Coastguard Worker // full (needed when beginning a render pass from the command buffer) RenderPass. 98*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanRenderPass> findOrCreateRenderPass(const RenderPassDesc&, bool compatibleOnly); 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker // Use a predetermined RenderPass key for finding/creating a RenderPass to avoid recreating it 101*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanRenderPass> findOrCreateRenderPassWithKnownKey( 102*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, bool compatibleOnly, const GraphiteResourceKey& rpKey); 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker VkPipelineCache pipelineCache(); 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker friend class VulkanCommandBuffer; 107*c8dee2aaSAndroid Build Coastguard Worker friend class VulkanGraphicsPipeline; 108*c8dee2aaSAndroid Build Coastguard Worker VkPipelineCache fPipelineCache = VK_NULL_HANDLE; 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker // Each render pass will need buffer space to record rtAdjust information. To minimize costly 111*c8dee2aaSAndroid Build Coastguard Worker // allocation calls and searching of the resource cache, we find & store a uniform buffer upon 112*c8dee2aaSAndroid Build Coastguard Worker // resource provider creation. This way, render passes across all command buffers can simply 113*c8dee2aaSAndroid Build Coastguard Worker // update the value within this buffer as needed. 114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> fIntrinsicUniformBuffer; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker // The first value of the pair is a renderpass key. Graphics pipeline keys contain extra 117*c8dee2aaSAndroid Build Coastguard Worker // information that we do not need for identifying unique pipelines. 118*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<std::pair<GraphiteResourceKey, 119*c8dee2aaSAndroid Build Coastguard Worker sk_sp<VulkanGraphicsPipeline>>> fLoadMSAAPipelines; 120*c8dee2aaSAndroid Build Coastguard Worker // All of the following attributes are the same between all msaa load pipelines, so they only 121*c8dee2aaSAndroid Build Coastguard Worker // need to be created once and can then be stored. 122*c8dee2aaSAndroid Build Coastguard Worker VkShaderModule fMSAALoadVertShaderModule = VK_NULL_HANDLE; 123*c8dee2aaSAndroid Build Coastguard Worker VkShaderModule fMSAALoadFragShaderModule = VK_NULL_HANDLE; 124*c8dee2aaSAndroid Build Coastguard Worker VkPipelineShaderStageCreateInfo fMSAALoadShaderStageInfo[2]; 125*c8dee2aaSAndroid Build Coastguard Worker VkPipelineLayout fMSAALoadPipelineLayout = VK_NULL_HANDLE; 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker SkLRUCache<UniformBindGroupKey, sk_sp<VulkanDescriptorSet>, 128*c8dee2aaSAndroid Build Coastguard Worker UniformBindGroupKey::Hash> fUniformBufferDescSetCache; 129*c8dee2aaSAndroid Build Coastguard Worker }; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_VulkanResourceProvider_DEFINED 134