Flutter Impeller
scene_encoder.cc
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
#include "flutter/fml/macros.h"
6
7
#include "flutter/fml/logging.h"
8
#include "
impeller/renderer/command.h
"
9
#include "
impeller/renderer/render_target.h
"
10
#include "
impeller/scene/scene_context.h
"
11
#include "
impeller/scene/scene_encoder.h
"
12
13
namespace
impeller
{
14
namespace
scene {
15
16
SceneEncoder::SceneEncoder() =
default
;
17
18
void
SceneEncoder::Add
(
const
SceneCommand
& command) {
19
// TODO(bdero): Manage multi-pass translucency ordering.
20
commands_.push_back(command);
21
}
22
23
static
void
EncodeCommand
(
const
SceneContext
& scene_context,
24
const
Matrix
& view_transform,
25
RenderPass
& render_pass,
26
const
SceneCommand
& scene_command) {
27
auto
& host_buffer = render_pass.
GetTransientsBuffer
();
28
29
Command
cmd;
30
DEBUG_COMMAND_INFO
(cmd, scene_command.
label
);
31
cmd.
stencil_reference
=
32
0;
// TODO(bdero): Configurable stencil ref per-command.
33
34
cmd.
pipeline
= scene_context.
GetPipeline
(
35
PipelineKey
{scene_command.
geometry
->
GetGeometryType
(),
36
scene_command.
material
->
GetMaterialType
()},
37
scene_command.
material
->
GetContextOptions
(render_pass));
38
39
scene_command.
geometry
->
BindToCommand
(
40
scene_context, host_buffer, view_transform * scene_command.
transform
,
41
cmd);
42
scene_command.
material
->
BindToCommand
(scene_context, host_buffer, cmd);
43
44
render_pass.
AddCommand
(std::move(cmd));
45
}
46
47
std::shared_ptr<CommandBuffer> SceneEncoder::BuildSceneCommandBuffer(
48
const
SceneContext& scene_context,
49
const
Matrix
& camera_transform,
50
RenderTarget
render_target)
const
{
51
{
52
TextureDescriptor
ds_texture;
53
ds_texture.
type
=
TextureType::kTexture2DMultisample
;
54
ds_texture.
format
=
PixelFormat::kD32FloatS8UInt
;
55
ds_texture.
size
= render_target.
GetRenderTargetSize
();
56
ds_texture.
usage
=
57
static_cast<
TextureUsageMask
>
(
TextureUsage::kRenderTarget
);
58
ds_texture.
sample_count
=
SampleCount::kCount4
;
59
ds_texture.
storage_mode
=
StorageMode::kDeviceTransient
;
60
auto
texture =
61
scene_context.GetContext()->GetResourceAllocator()->CreateTexture(
62
ds_texture);
63
64
DepthAttachment
depth;
65
depth.
load_action
=
LoadAction::kClear
;
66
depth.
store_action
=
StoreAction::kDontCare
;
67
depth.
clear_depth
= 1.0;
68
depth.
texture
= texture;
69
render_target.
SetDepthAttachment
(depth);
70
71
// The stencil and depth buffers must be the same texture for MacOS ARM
72
// and Vulkan.
73
StencilAttachment
stencil;
74
stencil.
load_action
=
LoadAction::kClear
;
75
stencil.
store_action
=
StoreAction::kDontCare
;
76
stencil.
clear_stencil
= 0u;
77
stencil.
texture
= texture;
78
render_target.
SetStencilAttachment
(stencil);
79
}
80
81
auto
command_buffer = scene_context.GetContext()->CreateCommandBuffer();
82
if
(!command_buffer) {
83
FML_LOG(ERROR) <<
"Failed to create command buffer."
;
84
return
nullptr
;
85
}
86
87
auto
render_pass = command_buffer->CreateRenderPass(render_target);
88
if
(!render_pass) {
89
FML_LOG(ERROR) <<
"Failed to create render pass."
;
90
return
nullptr
;
91
}
92
93
for
(
auto
& command : commands_) {
94
EncodeCommand
(scene_context, camera_transform, *render_pass, command);
95
}
96
97
if
(!render_pass->EncodeCommands()) {
98
FML_LOG(ERROR) <<
"Failed to encode render pass commands."
;
99
return
nullptr
;
100
}
101
102
return
command_buffer;
103
}
104
105
}
// namespace scene
106
}
// namespace impeller
impeller::Command
An object used to specify work to the GPU along with references to resources the GPU will used when d...
Definition:
command.h:99
DEBUG_COMMAND_INFO
#define DEBUG_COMMAND_INFO(obj, arg)
Definition:
command.h:31
impeller::scene::Material::GetMaterialType
virtual MaterialType GetMaterialType() const =0
impeller::scene::SceneCommand::material
Material * material
Definition:
scene_encoder.h:26
impeller::TextureUsageMask
uint64_t TextureUsageMask
Definition:
formats.h:274
impeller::Attachment::store_action
StoreAction store_action
Definition:
formats.h:594
scene_context.h
impeller::TextureDescriptor::format
PixelFormat format
Definition:
texture_descriptor.h:42
impeller::scene::SceneCommand::geometry
Geometry * geometry
Definition:
scene_encoder.h:25
impeller::TextureUsage::kRenderTarget
@ kRenderTarget
impeller::StoreAction::kDontCare
@ kDontCare
impeller::scene::SceneContext
Definition:
scene_context.h:39
impeller::scene::Material::GetContextOptions
SceneContextOptions GetContextOptions(const RenderPass &pass) const
Definition:
material.cc:62
impeller::TextureDescriptor::sample_count
SampleCount sample_count
Definition:
texture_descriptor.h:47
impeller::scene::Material::BindToCommand
virtual void BindToCommand(const SceneContext &scene_context, HostBuffer &buffer, Command &command) const =0
impeller::TextureDescriptor::usage
TextureUsageMask usage
Definition:
texture_descriptor.h:45
impeller::SampleCount::kCount4
@ kCount4
scene_encoder.h
impeller::scene::SceneEncoder::Add
void Add(const SceneCommand &command)
Definition:
scene_encoder.cc:18
impeller::TextureDescriptor::type
TextureType type
Definition:
texture_descriptor.h:41
impeller::scene::EncodeCommand
static void EncodeCommand(const SceneContext &scene_context, const Matrix &view_transform, RenderPass &render_pass, const SceneCommand &scene_command)
Definition:
scene_encoder.cc:23
command.h
impeller::TextureType::kTexture2DMultisample
@ kTexture2DMultisample
impeller::scene::PipelineKey
Definition:
pipeline_key.h:22
impeller::StencilAttachment
Definition:
formats.h:607
impeller::LoadAction::kClear
@ kClear
impeller::StorageMode::kDeviceTransient
@ kDeviceTransient
impeller::Attachment::texture
std::shared_ptr< Texture > texture
Definition:
formats.h:591
impeller::PixelFormat::kD32FloatS8UInt
@ kD32FloatS8UInt
impeller::RenderTarget
Definition:
render_target.h:48
impeller::StencilAttachment::clear_stencil
uint32_t clear_stencil
Definition:
formats.h:608
impeller::scene::SceneCommand::transform
Matrix transform
Definition:
scene_encoder.h:24
impeller::RenderTarget::GetRenderTargetSize
ISize GetRenderTargetSize() const
Definition:
render_target.cc:150
impeller::RenderPass
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition:
render_pass.h:27
impeller::TextureDescriptor::size
ISize size
Definition:
texture_descriptor.h:43
impeller::Command::stencil_reference
uint32_t stencil_reference
Definition:
command.h:152
impeller::RenderTarget::SetStencilAttachment
RenderTarget & SetStencilAttachment(std::optional< StencilAttachment > attachment)
Definition:
render_target.cc:199
impeller::scene::SceneCommand
Definition:
scene_encoder.h:22
impeller::Attachment::load_action
LoadAction load_action
Definition:
formats.h:593
impeller::scene::Geometry::BindToCommand
virtual void BindToCommand(const SceneContext &scene_context, HostBuffer &buffer, const Matrix &transform, Command &command) const =0
impeller::scene::SceneContext::GetPipeline
std::shared_ptr< Pipeline< PipelineDescriptor > > GetPipeline(PipelineKey key, SceneContextOptions opts) const
Definition:
scene_context.cc:76
impeller::DepthAttachment::clear_depth
double clear_depth
Definition:
formats.h:604
impeller::TextureDescriptor::storage_mode
StorageMode storage_mode
Definition:
texture_descriptor.h:40
impeller::DepthAttachment
Definition:
formats.h:603
impeller::TextureDescriptor
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
Definition:
texture_descriptor.h:39
impeller::Command::pipeline
std::shared_ptr< Pipeline< PipelineDescriptor > > pipeline
Definition:
command.h:103
render_target.h
impeller::RenderTarget::SetDepthAttachment
RenderTarget & SetDepthAttachment(std::optional< DepthAttachment > attachment)
Definition:
render_target.cc:189
impeller::scene::SceneCommand::label
std::string label
Definition:
scene_encoder.h:23
impeller::RenderPass::AddCommand
bool AddCommand(Command &&command)
Record a command for subsequent encoding to the underlying command buffer. No work is encoded into th...
Definition:
render_pass.cc:46
impeller
Definition:
aiks_context.cc:10
impeller::Matrix
A 4x4 matrix using column-major storage.
Definition:
matrix.h:36
impeller::RenderPass::GetTransientsBuffer
HostBuffer & GetTransientsBuffer()
Definition:
render_pass.cc:34
impeller::scene::Geometry::GetGeometryType
virtual GeometryType GetGeometryType() const =0
impeller
scene
scene_encoder.cc
Generated by
1.8.17