blob: 94b7d5faebccaf87dfd37d27de88a4995dbce29f [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 <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_