// 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 #include #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 { DEFINE_WRAPPERTYPEINFO(); FML_FRIEND_MAKE_REF_COUNTED(RenderPass); public: RenderPass(); ~RenderPass() override; const std::shared_ptr& 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::StencilAttachmentDescriptor& GetStencilFrontAttachmentDescriptor(); impeller::StencilAttachmentDescriptor& GetStencilBackAttachmentDescriptor(); impeller::VertexBuffer& GetVertexBuffer(); impeller::PipelineDescriptor& GetPipelineDescriptor(); bool Begin(flutter::gpu::CommandBuffer& command_buffer); void SetPipeline(fml::RefPtr pipeline); /// Lookup an Impeller pipeline by building a descriptor based on the current /// command state. std::shared_ptr> GetOrCreatePipeline(); impeller::Command ProvisionRasterCommand(); bool Draw(); private: impeller::RenderTarget render_target_; std::shared_ptr render_pass_; // Command encoding state. impeller::Command command_; fml::RefPtr 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 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, float clear_color_r, float clear_color_g, float clear_color_b, float clear_color_a, 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 void InternalFlutterGpu_RenderPass_SetStencilReference( flutter::gpu::RenderPass* wrapper, int stencil_reference); FLUTTER_GPU_EXPORT extern void InternalFlutterGpu_RenderPass_SetStencilConfig( flutter::gpu::RenderPass* wrapper, int stencil_compare_operation, int stencil_fail_operation, int depth_fail_operation, int depth_stencil_pass_operation, int read_mask, int write_mask, int target); FLUTTER_GPU_EXPORT extern void InternalFlutterGpu_RenderPass_SetCullMode( flutter::gpu::RenderPass* wrapper, int cull_mode); FLUTTER_GPU_EXPORT extern void InternalFlutterGpu_RenderPass_SetPrimitiveType( flutter::gpu::RenderPass* wrapper, int primitive_type); FLUTTER_GPU_EXPORT extern void InternalFlutterGpu_RenderPass_SetWindingOrder( flutter::gpu::RenderPass* wrapper, int winding_order); FLUTTER_GPU_EXPORT extern bool InternalFlutterGpu_RenderPass_Draw( flutter::gpu::RenderPass* wrapper); } // extern "C" #endif // FLUTTER_LIB_GPU_RENDER_PASS_H_