blob: 1b33a5ebaef3d1334aaeff38b26dd6cc01742cd2 [file] [log] [blame]
// 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 <cstdint>
#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/renderer/command.h"
#include "impeller/renderer/render_pass.h"
#include "impeller/renderer/render_target.h"
#include "lib/gpu/device_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::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::PipelineDescriptor& GetPipelineDescriptor();
bool Begin(flutter::gpu::CommandBuffer& command_buffer);
void SetPipeline(fml::RefPtr<RenderPipeline> pipeline);
void ClearBindings();
bool Draw();
using BufferUniformMap =
std::unordered_map<const flutter::gpu::Shader::UniformBinding*,
impeller::BufferAndUniformSlot>;
using TextureUniformMap =
std::unordered_map<const flutter::gpu::Shader::TextureBinding*,
impeller::TextureAndSampler>;
BufferUniformMap vertex_uniform_bindings;
TextureUniformMap vertex_texture_bindings;
BufferUniformMap fragment_uniform_bindings;
TextureUniformMap fragment_texture_bindings;
impeller::BufferView vertex_buffer;
impeller::BufferView index_buffer;
impeller::IndexType index_buffer_type = impeller::IndexType::kNone;
size_t element_count = 0;
uint32_t stencil_reference = 0;
// Helper flag to determine whether the vertex_count should override the
// element count. The index count takes precedent.
bool has_index_buffer = false;
private:
/// Lookup an Impeller pipeline by building a descriptor based on the current
/// command state.
std::shared_ptr<impeller::Pipeline<impeller::PipelineDescriptor>>
GetOrCreatePipeline();
impeller::RenderTarget render_target_;
std::shared_ptr<impeller::RenderPass> render_pass_;
// Command encoding state.
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_;
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,
flutter::gpu::Context* context,
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_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 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_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 void InternalFlutterGpu_RenderPass_SetPolygonMode(
flutter::gpu::RenderPass* wrapper,
int polygon_mode);
FLUTTER_GPU_EXPORT
extern bool InternalFlutterGpu_RenderPass_Draw(
flutter::gpu::RenderPass* wrapper);
} // extern "C"
#endif // FLUTTER_LIB_GPU_RENDER_PASS_H_