| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_LIB_GPU_RENDER_PASS_H_ | |
| #define FLUTTER_LIB_GPU_RENDER_PASS_H_ | |
| #include <map> | |
| #include <memory> | |
| #include "flutter/lib/gpu/command_buffer.h" | |
| #include "flutter/lib/gpu/export.h" | |
| #include "flutter/lib/ui/dart_wrapper.h" | |
| #include "fml/memory/ref_ptr.h" | |
| #include "impeller/core/formats.h" | |
| #include "impeller/core/vertex_buffer.h" | |
| #include "impeller/renderer/command.h" | |
| #include "impeller/renderer/render_pass.h" | |
| #include "impeller/renderer/render_target.h" | |
| #include "lib/gpu/device_buffer.h" | |
| #include "lib/gpu/host_buffer.h" | |
| #include "lib/gpu/render_pipeline.h" | |
| #include "lib/gpu/texture.h" | |
| namespace flutter { | |
| namespace gpu { | |
| class RenderPass : public RefCountedDartWrappable<RenderPass> { | |
| DEFINE_WRAPPERTYPEINFO(); | |
| FML_FRIEND_MAKE_REF_COUNTED(RenderPass); | |
| public: | |
| RenderPass(); | |
| ~RenderPass() override; | |
| const std::shared_ptr<const impeller::Context>& GetContext() const; | |
| impeller::Command& GetCommand(); | |
| const impeller::Command& GetCommand() const; | |
| impeller::RenderTarget& GetRenderTarget(); | |
| const impeller::RenderTarget& GetRenderTarget() const; | |
| impeller::ColorAttachmentDescriptor& GetColorAttachmentDescriptor( | |
| size_t color_attachment_index); | |
| impeller::DepthAttachmentDescriptor& GetDepthAttachmentDescriptor(); | |
| impeller::VertexBuffer& GetVertexBuffer(); | |
| bool Begin(flutter::gpu::CommandBuffer& command_buffer); | |
| void SetPipeline(fml::RefPtr<RenderPipeline> pipeline); | |
| /// Lookup an Impeller pipeline by building a descriptor based on the current | |
| /// command state. | |
| std::shared_ptr<impeller::Pipeline<impeller::PipelineDescriptor>> | |
| GetOrCreatePipeline(); | |
| impeller::Command ProvisionRasterCommand(); | |
| bool Draw(); | |
| private: | |
| impeller::RenderTarget render_target_; | |
| std::shared_ptr<impeller::RenderPass> render_pass_; | |
| // Command encoding state. | |
| impeller::Command command_; | |
| fml::RefPtr<RenderPipeline> render_pipeline_; | |
| impeller::PipelineDescriptor pipeline_descriptor_; | |
| // Pipeline descriptor layout state. We always keep track of this state, but | |
| // we'll only apply it as necessary to match the RenderTarget. | |
| std::map<size_t, impeller::ColorAttachmentDescriptor> color_descriptors_; | |
| impeller::StencilAttachmentDescriptor stencil_front_desc_; | |
| impeller::StencilAttachmentDescriptor stencil_back_desc_; | |
| impeller::DepthAttachmentDescriptor depth_desc_; | |
| // Command state. | |
| impeller::VertexBuffer vertex_buffer_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(RenderPass); | |
| }; | |
| } // namespace gpu | |
| } // namespace flutter | |
| //---------------------------------------------------------------------------- | |
| /// Exports | |
| /// | |
| extern "C" { | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_Initialize(Dart_Handle wrapper); | |
| FLUTTER_GPU_EXPORT | |
| extern Dart_Handle InternalFlutterGpu_RenderPass_SetColorAttachment( | |
| flutter::gpu::RenderPass* wrapper, | |
| int color_attachment_index, | |
| int load_action, | |
| int store_action, | |
| int clear_color, | |
| flutter::gpu::Texture* texture, | |
| Dart_Handle resolve_texture_wrapper); | |
| FLUTTER_GPU_EXPORT | |
| extern Dart_Handle InternalFlutterGpu_RenderPass_SetDepthStencilAttachment( | |
| flutter::gpu::RenderPass* wrapper, | |
| int depth_load_action, | |
| int depth_store_action, | |
| float depth_clear_value, | |
| int stencil_load_action, | |
| int stencil_store_action, | |
| int stencil_clear_value, | |
| flutter::gpu::Texture* texture); | |
| FLUTTER_GPU_EXPORT | |
| extern Dart_Handle InternalFlutterGpu_RenderPass_Begin( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::CommandBuffer* command_buffer); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_BindPipeline( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::RenderPipeline* pipeline); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_BindVertexBufferDevice( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::DeviceBuffer* device_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes, | |
| int vertex_count); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_BindVertexBufferHost( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::HostBuffer* host_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes, | |
| int vertex_count); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_BindIndexBufferDevice( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::DeviceBuffer* device_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes, | |
| int index_type, | |
| int index_count); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_BindIndexBufferHost( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::HostBuffer* host_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes, | |
| int index_type, | |
| int index_count); | |
| FLUTTER_GPU_EXPORT | |
| extern bool InternalFlutterGpu_RenderPass_BindUniformDevice( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::Shader* shader, | |
| Dart_Handle uniform_name_handle, | |
| flutter::gpu::DeviceBuffer* device_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes); | |
| FLUTTER_GPU_EXPORT | |
| extern bool InternalFlutterGpu_RenderPass_BindUniformHost( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::Shader* shader, | |
| Dart_Handle uniform_name_handle, | |
| flutter::gpu::HostBuffer* host_buffer, | |
| int offset_in_bytes, | |
| int length_in_bytes); | |
| FLUTTER_GPU_EXPORT | |
| extern bool InternalFlutterGpu_RenderPass_BindTexture( | |
| flutter::gpu::RenderPass* wrapper, | |
| flutter::gpu::Shader* shader, | |
| Dart_Handle uniform_name_handle, | |
| flutter::gpu::Texture* texture, | |
| int min_filter, | |
| int mag_filter, | |
| int mip_filter, | |
| int width_address_mode, | |
| int height_address_mode); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_ClearBindings( | |
| flutter::gpu::RenderPass* wrapper); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_SetColorBlendEnable( | |
| flutter::gpu::RenderPass* wrapper, | |
| int color_attachment_index, | |
| bool enable); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_SetColorBlendEquation( | |
| flutter::gpu::RenderPass* wrapper, | |
| int color_attachment_index, | |
| int color_blend_operation, | |
| int source_color_blend_factor, | |
| int destination_color_blend_factor, | |
| int alpha_blend_operation, | |
| int source_alpha_blend_factor, | |
| int destination_alpha_blend_factor); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_SetDepthWriteEnable( | |
| flutter::gpu::RenderPass* wrapper, | |
| bool enable); | |
| FLUTTER_GPU_EXPORT | |
| extern void InternalFlutterGpu_RenderPass_SetDepthCompareOperation( | |
| flutter::gpu::RenderPass* wrapper, | |
| int compare_operation); | |
| FLUTTER_GPU_EXPORT | |
| extern bool InternalFlutterGpu_RenderPass_Draw( | |
| flutter::gpu::RenderPass* wrapper); | |
| } // extern "C" | |
| #endif // FLUTTER_LIB_GPU_RENDER_PASS_H_ |