/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_VulkanGraphicsPipeline_DEFINED #define skgpu_graphite_VulkanGraphicsPipeline_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkSpan.h" #include "include/gpu/vk/VulkanTypes.h" #include "include/private/base/SkTArray.h" #include "src/gpu/Blend.h" #include "src/gpu/graphite/DrawTypes.h" #include "src/gpu/graphite/GraphicsPipeline.h" #include "src/gpu/graphite/vk/VulkanGraphiteUtils.h" #include "src/gpu/graphite/vk/VulkanSampler.h" namespace SkSL { class Compiler; } namespace skgpu::graphite { class Attribute; class GraphicsPipelineDesc; class RuntimeEffectDictionary; class VulkanResourceProvider; class VulkanSharedContext; struct RenderPassDesc; class TextureInfo; class VulkanRenderPass; class VulkanGraphicsPipeline final : public GraphicsPipeline { public: inline static constexpr unsigned int kRenderStepUniformBufferIndex = 0; inline static constexpr unsigned int kPaintUniformBufferIndex = 1; inline static constexpr unsigned int kGradientBufferIndex = 2; inline static constexpr unsigned int kNumUniformBuffers = 3; // For now, rigidly assign all descriptor types to be at statically-defined set indices. // TODO(b/274762935): Make the bindings and descriptor set organization more flexible. inline static constexpr unsigned int kDstAsInputDescSetIndex = 0; inline static constexpr unsigned int kUniformBufferDescSetIndex = 1; inline static constexpr unsigned int kTextureBindDescSetIndex = 2; inline static constexpr unsigned int kLoadMsaaFromResolveInputDescSetIndex = 3; inline static constexpr unsigned int kMaxNumDescSets = 4; inline static constexpr unsigned int kVertexBufferIndex = 0; inline static constexpr unsigned int kInstanceBufferIndex = 1; inline static constexpr unsigned int kNumInputBuffers = 2; // Define a static DescriptorData to represent input attachments which have the same values // across all pipelines (we currently only ever use one input attachment within a set). inline static const DescriptorData kInputAttachmentDescriptor = { DescriptorType::kInputAttachment, /*count=*/1, /*bindingIdx=*/0, // We only expect to encounter one input attachment PipelineStageFlags::kFragmentShader}; static sk_sp Make(VulkanResourceProvider*, const RuntimeEffectDictionary*, const UniqueKey&, const GraphicsPipelineDesc&, const RenderPassDesc&, SkEnumBitMask, uint32_t compilationID); static sk_sp MakeLoadMSAAPipeline( const VulkanSharedContext*, VkShaderModule vsModule, VkShaderModule fsModule, VkPipelineShaderStageCreateInfo* pipelineShaderStages, VkPipelineLayout, sk_sp compatibleRenderPass, VkPipelineCache, const TextureInfo& dstColorAttachmentTexInfo); static bool InitializeMSAALoadPipelineStructs( const VulkanSharedContext*, VkShaderModule* outVertexShaderModule, VkShaderModule* outFragShaderModule, VkPipelineShaderStageCreateInfo* outShaderStageInfo, VkPipelineLayout* outPipelineLayout); ~VulkanGraphicsPipeline() override {} VkPipelineLayout layout() const { SkASSERT(fPipelineLayout != VK_NULL_HANDLE); return fPipelineLayout; } VkPipeline pipeline() const { SkASSERT(fPipeline != VK_NULL_HANDLE); return fPipeline; } private: VulkanGraphicsPipeline(const VulkanSharedContext* sharedContext, const PipelineInfo& pipelineInfo, VkPipelineLayout, VkPipeline, bool ownsPipelineLayout, skia_private::TArray> immutableSamplers); void freeGpuData() override; VkPipelineLayout fPipelineLayout = VK_NULL_HANDLE; VkPipeline fPipeline = VK_NULL_HANDLE; bool fOwnsPipelineLayout = true; // Hold a ref to immutable samplers used such that their lifetime is properly managed. const skia_private::TArray> fImmutableSamplers; }; } // namespace skgpu::graphite #endif // skgpu_graphite_MtlGraphicsPipeline_DEFINED