Flutter Impeller
render_pass_vk.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_RENDER_PASS_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_RENDER_PASS_VK_H_
7 
15 #include "vulkan/vulkan_handles.hpp"
16 
17 namespace impeller {
18 
19 class CommandBufferVK;
20 class SamplerVK;
21 
22 class RenderPassVK final : public RenderPass {
23  public:
24  // |RenderPass|
25  ~RenderPassVK() override;
26 
27  private:
28  friend class CommandBufferVK;
29 
30  std::shared_ptr<CommandBufferVK> command_buffer_;
31  std::string debug_label_;
32  SharedHandleVK<vk::RenderPass> render_pass_;
33  bool is_valid_ = false;
34 
35  vk::CommandBuffer command_buffer_vk_;
36  std::shared_ptr<Texture> color_image_vk_;
37  std::shared_ptr<Texture> resolve_image_vk_;
38 
39  // Per-command state.
40  std::array<vk::DescriptorImageInfo, kMaxBindings> image_workspace_;
41  std::array<vk::DescriptorBufferInfo, kMaxBindings> buffer_workspace_;
42  std::array<vk::WriteDescriptorSet, kMaxBindings + kMaxBindings>
43  write_workspace_;
44  size_t bound_image_offset_ = 0u;
45  size_t bound_buffer_offset_ = 0u;
46  size_t descriptor_write_offset_ = 0u;
47  size_t instance_count_ = 1u;
48  size_t base_vertex_ = 0u;
49  size_t vertex_count_ = 0u;
50  bool has_index_buffer_ = false;
51  bool has_label_ = false;
52  std::shared_ptr<Pipeline<PipelineDescriptor>> pipeline_;
53  bool pipeline_uses_input_attachments_ = false;
54  std::shared_ptr<SamplerVK> immutable_sampler_;
55 
56  RenderPassVK(const std::shared_ptr<const Context>& context,
57  const RenderTarget& target,
58  std::shared_ptr<CommandBufferVK> command_buffer);
59 
60  // |RenderPass|
61  void SetPipeline(
62  const std::shared_ptr<Pipeline<PipelineDescriptor>>& pipeline) override;
63 
64  // |RenderPass|
65  void SetCommandLabel(std::string_view label) override;
66 
67  // |RenderPass|
68  void SetStencilReference(uint32_t value) override;
69 
70  // |RenderPass|
71  void SetBaseVertex(uint64_t value) override;
72 
73  // |RenderPass|
74  void SetViewport(Viewport viewport) override;
75 
76  // |RenderPass|
77  void SetScissor(IRect scissor) override;
78 
79  // |RenderPass|
80  void SetInstanceCount(size_t count) override;
81 
82  // |RenderPass|
83  bool SetVertexBuffer(VertexBuffer buffer) override;
84 
85  // |RenderPass|
86  fml::Status Draw() override;
87 
88  // |RenderPass|
89  void ReserveCommands(size_t command_count) override {}
90 
91  // |ResourceBinder|
92  bool BindResource(ShaderStage stage,
93  DescriptorType type,
94  const ShaderUniformSlot& slot,
95  const ShaderMetadata& metadata,
96  BufferView view) override;
97 
98  // |RenderPass|
99  bool BindResource(ShaderStage stage,
100  DescriptorType type,
101  const ShaderUniformSlot& slot,
102  const std::shared_ptr<const ShaderMetadata>& metadata,
103  BufferView view) override;
104 
105  // |ResourceBinder|
106  bool BindResource(ShaderStage stage,
107  DescriptorType type,
108  const SampledImageSlot& slot,
109  const ShaderMetadata& metadata,
110  std::shared_ptr<const Texture> texture,
111  const std::unique_ptr<const Sampler>& sampler) override;
112 
113  bool BindResource(size_t binding,
114  DescriptorType type,
115  const BufferView& view);
116 
117  // |RenderPass|
118  bool IsValid() const override;
119 
120  // |RenderPass|
121  void OnSetLabel(std::string label) override;
122 
123  // |RenderPass|
124  bool OnEncodeCommands(const Context& context) const override;
125 
126  SharedHandleVK<vk::RenderPass> CreateVKRenderPass(
127  const ContextVK& context,
128  const SharedHandleVK<vk::RenderPass>& recycled_renderpass,
129  const std::shared_ptr<CommandBufferVK>& command_buffer) const;
130 
131  SharedHandleVK<vk::Framebuffer> CreateVKFramebuffer(
132  const ContextVK& context,
133  const vk::RenderPass& pass) const;
134 
135  RenderPassVK(const RenderPassVK&) = delete;
136 
137  RenderPassVK& operator=(const RenderPassVK&) = delete;
138 };
139 
140 } // namespace impeller
141 
142 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_RENDER_PASS_VK_H_
impeller::Pipeline< PipelineDescriptor >
impeller::ShaderUniformSlot
Metadata required to bind a buffer.
Definition: shader_types.h:81
shared_object_vk.h
impeller::ShaderMetadata
Definition: shader_types.h:72
impeller::VertexBuffer
Definition: vertex_buffer.h:13
impeller::ShaderStage
ShaderStage
Definition: shader_types.h:22
pipeline_vk.h
render_pass.h
impeller::SampledImageSlot
Metadata required to bind a combined texture and sampler.
Definition: shader_types.h:98
impeller::RenderTarget
Definition: render_target.h:38
impeller::CommandBufferVK
Definition: command_buffer_vk.h:18
impeller::ContextVK
Definition: context_vk.h:42
impeller::RenderPass
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition: render_pass.h:33
impeller::Viewport
Definition: formats.h:398
command_buffer.h
impeller::BufferView
Definition: buffer_view.h:15
impeller::Context
To do anything rendering related with Impeller, you need a context.
Definition: context.h:46
impeller::RenderPassVK
Definition: render_pass_vk.h:22
buffer_view.h
impeller::SharedHandleVK
std::shared_ptr< SharedObjectVKT< T > > SharedHandleVK
Definition: shared_object_vk.h:52
impeller::RenderPassVK::~RenderPassVK
~RenderPassVK() override
render_target.h
context_vk.h
impeller
Definition: aiks_blur_unittests.cc:20
impeller::TRect< int64_t >
impeller::DescriptorType
DescriptorType
Definition: shader_types.h:153