[Impeller] finish migration to new render pass API. (#49740)
Part of https://github.com/flutter/flutter/issues/140804
Migrate the rest of the commands in impeller to use the new API. Hide RenderPass::AddCommand. On subsequent changes I will be able to begin making some of these methods virtual so we can add more direct pass through. Though the vulkan backend will be blocked on changes to descriptor sets: https://github.com/flutter/engine/pull/49686
diff --git a/impeller/entity/contents/atlas_contents.cc b/impeller/entity/contents/atlas_contents.cc
index 206273d..b45b41e 100644
--- a/impeller/entity/contents/atlas_contents.cc
+++ b/impeller/entity/contents/atlas_contents.cc
@@ -235,13 +235,14 @@
}
}
- Command cmd;
- DEBUG_COMMAND_INFO(
- cmd, SPrintF("DrawAtlas Blend (%s)", BlendModeToString(blend_mode_)));
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
- cmd.stencil_reference = entity.GetClipDepth();
- auto options = OptionsFromPass(pass);
- cmd.pipeline = renderer.GetPorterDuffBlendPipeline(options);
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(
+ SPrintF("DrawAtlas Blend (%s)", BlendModeToString(blend_mode_)));
+#endif // IMPELLER_DEBUG
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetPipeline(
+ renderer.GetPorterDuffBlendPipeline(OptionsFromPass(pass)));
FS::FragInfo frag_info;
VS::FrameInfo frame_info;
@@ -253,7 +254,7 @@
}
auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
dst_sampler_descriptor);
- FS::BindTextureSamplerDst(cmd, texture_, dst_sampler);
+ FS::BindTextureSamplerDst(pass, texture_, dst_sampler);
frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
frag_info.output_alpha = alpha_;
@@ -269,14 +270,14 @@
frag_info.dst_coeff_src_alpha = blend_coefficients[3];
frag_info.dst_coeff_src_color = blend_coefficients[4];
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform();
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
- VS::BindFrameInfo(cmd, uniform_view);
+ VS::BindFrameInfo(pass, uniform_view);
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
}
// Advanced blends.
@@ -396,8 +397,7 @@
return true;
}
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "AtlasTexture");
+ pass.SetCommandLabel("AtlasTexture");
auto& host_buffer = renderer.GetTransientsBuffer();
@@ -407,14 +407,14 @@
frame_info.alpha = alpha_;
auto options = OptionsFromPassAndEntity(pass, entity);
- cmd.pipeline = renderer.GetTexturePipeline(options);
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(vertex_builder.CreateVertexBuffer(host_buffer));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
- FS::BindTextureSampler(cmd, texture,
+ pass.SetPipeline(renderer.GetTexturePipeline(options));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(vertex_builder.CreateVertexBuffer(host_buffer));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
+ FS::BindTextureSampler(pass, texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
parent_.GetSamplerDescriptor()));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
}
// AtlasColorContents
@@ -483,8 +483,7 @@
return true;
}
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "AtlasColors");
+ pass.SetCommandLabel("AtlasColors");
auto& host_buffer = renderer.GetTransientsBuffer();
@@ -496,12 +495,12 @@
auto opts = OptionsFromPassAndEntity(pass, entity);
opts.blend_mode = BlendMode::kSourceOver;
- cmd.pipeline = renderer.GetGeometryColorPipeline(opts);
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(vertex_builder.CreateVertexBuffer(host_buffer));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
- return pass.AddCommand(std::move(cmd));
+ pass.SetPipeline(renderer.GetGeometryColorPipeline(opts));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(vertex_builder.CreateVertexBuffer(host_buffer));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
+ return pass.Draw().ok();
}
} // namespace impeller
diff --git a/impeller/entity/contents/clip_contents.cc b/impeller/entity/contents/clip_contents.cc
index 16f10b0..8736222 100644
--- a/impeller/entity/contents/clip_contents.cc
+++ b/impeller/entity/contents/clip_contents.cc
@@ -80,59 +80,58 @@
VS::FrameInfo info;
- Command cmd;
-
auto options = OptionsFromPass(pass);
options.blend_mode = BlendMode::kDestination;
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetStencilReference(entity.GetClipDepth());
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kIncrementClamp;
if (clip_op_ == Entity::ClipOperation::kDifference) {
{
- DEBUG_COMMAND_INFO(cmd, "Difference Clip (Increment)");
+ pass.SetCommandLabel("Difference Clip (Increment)");
auto points = Rect::MakeSize(pass.GetRenderTargetSize()).GetPoints();
auto vertices =
VertexBufferBuilder<VS::PerVertexData>{}
.AddVertices({{points[0]}, {points[1]}, {points[2]}, {points[3]}})
.CreateVertexBuffer(renderer.GetTransientsBuffer());
- cmd.BindVertices(std::move(vertices));
+
+ pass.SetVertexBuffer(std::move(vertices));
info.mvp = pass.GetOrthographicTransform();
- VS::BindFrameInfo(cmd,
+ VS::BindFrameInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(info));
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetClipPipeline(options);
- pass.AddCommand(Command(cmd));
+ pass.SetPipeline(renderer.GetClipPipeline(options));
+ pass.Draw();
}
{
- DEBUG_COMMAND_INFO(cmd, "Difference Clip (Punch)");
+ pass.SetCommandLabel("Difference Clip (Punch)");
+ pass.SetStencilReference(entity.GetClipDepth() + 1);
- cmd.stencil_reference = entity.GetClipDepth() + 1;
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kDecrementClamp;
}
} else {
- DEBUG_COMMAND_INFO(cmd, "Intersect Clip");
+ pass.SetCommandLabel("Intersect Clip");
+
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kIncrementClamp;
}
auto geometry_result = geometry_->GetPositionBuffer(renderer, entity, pass);
options.primitive_type = geometry_result.type;
- cmd.pipeline = renderer.GetClipPipeline(options);
+ pass.SetPipeline(renderer.GetClipPipeline(options));
auto allocator = renderer.GetContext()->GetResourceAllocator();
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
info.mvp = geometry_result.transform;
- VS::BindFrameInfo(cmd, renderer.GetTransientsBuffer().EmplaceUniform(info));
+ VS::BindFrameInfo(pass, renderer.GetTransientsBuffer().EmplaceUniform(info));
- pass.AddCommand(std::move(cmd));
- return true;
+ return pass.Draw().ok();
}
/*******************************************************************************
@@ -176,15 +175,14 @@
RenderPass& pass) const {
using VS = ClipPipeline::VertexShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Restore Clip");
+ pass.SetCommandLabel("Restore Clip");
auto options = OptionsFromPass(pass);
options.blend_mode = BlendMode::kDestination;
options.stencil_compare = CompareFunction::kLess;
options.stencil_operation = StencilOperation::kSetToReferenceValue;
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetClipPipeline(options);
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetPipeline(renderer.GetClipPipeline(options));
+ pass.SetStencilReference(entity.GetClipDepth());
// Create a rect that covers either the given restore area, or the whole
// render target texture.
@@ -198,15 +196,14 @@
{Point(ltrb[0], ltrb[3])},
{Point(ltrb[2], ltrb[3])},
});
- cmd.BindVertices(
+ pass.SetVertexBuffer(
vtx_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()));
VS::FrameInfo info;
info.mvp = pass.GetOrthographicTransform();
- VS::BindFrameInfo(cmd, renderer.GetTransientsBuffer().EmplaceUniform(info));
+ VS::BindFrameInfo(pass, renderer.GetTransientsBuffer().EmplaceUniform(info));
- pass.AddCommand(std::move(cmd));
- return true;
+ return pass.Draw().ok();
}
}; // namespace impeller
diff --git a/impeller/entity/contents/conical_gradient_contents.cc b/impeller/entity/contents/conical_gradient_contents.cc
index e1789f1..3bd8ab5 100644
--- a/impeller/entity/contents/conical_gradient_contents.cc
+++ b/impeller/entity/contents/conical_gradient_contents.cc
@@ -158,9 +158,8 @@
frame_info.mvp = geometry_result.transform;
frame_info.matrix = GetInverseEffectTransform();
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "ConicalGradientFill");
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetCommandLabel("ConicalGradientFill");
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
if (geometry_result.prevent_overdraw) {
@@ -168,21 +167,21 @@
options.stencil_operation = StencilOperation::kIncrementClamp;
}
options.primitive_type = geometry_result.type;
- cmd.pipeline = renderer.GetConicalGradientFillPipeline(options);
+ pass.SetPipeline(renderer.GetConicalGradientFillPipeline(options));
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
- FS::BindFragInfo(cmd,
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
+ FS::BindFragInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
SamplerDescriptor sampler_desc;
sampler_desc.min_filter = MinMagFilter::kLinear;
sampler_desc.mag_filter = MinMagFilter::kLinear;
FS::BindTextureSampler(
- cmd, gradient_texture,
+ pass, gradient_texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
- VS::BindFrameInfo(cmd,
+ VS::BindFrameInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
- if (!pass.AddCommand(std::move(cmd))) {
+ if (!pass.Draw().ok()) {
return false;
}
diff --git a/impeller/entity/contents/filters/blend_filter_contents.cc b/impeller/entity/contents/filters/blend_filter_contents.cc
index 6cec6f7..7cb8e40 100644
--- a/impeller/entity/contents/filters/blend_filter_contents.cc
+++ b/impeller/entity/contents/filters/blend_filter_contents.cc
@@ -164,11 +164,12 @@
std::shared_ptr<Pipeline<PipelineDescriptor>> pipeline =
std::invoke(pipeline_proc, renderer, options);
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, SPrintF("Advanced Blend Filter (%s)",
- BlendModeToString(blend_mode)));
- cmd.BindVertices(std::move(vtx_buffer));
- cmd.pipeline = std::move(pipeline);
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(
+ SPrintF("Advanced Blend Filter (%s)", BlendModeToString(blend_mode)));
+#endif // IMPELLER_DEBUG
+ pass.SetVertexBuffer(std::move(vtx_buffer));
+ pass.SetPipeline(pipeline);
typename FS::BlendInfo blend_info;
typename VS::FrameInfo frame_info;
@@ -180,7 +181,7 @@
}
auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
dst_sampler_descriptor);
- FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler);
+ FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
frame_info.dst_y_coord_scale = dst_snapshot->texture->GetYCoordScale();
blend_info.dst_input_alpha =
absorb_opacity == ColorFilterContents::AbsorbOpacity::kYes
@@ -193,7 +194,7 @@
// This texture will not be sampled from due to the color factor. But
// this is present so that validation doesn't trip on a missing
// binding.
- FS::BindTextureSamplerSrc(cmd, dst_snapshot->texture, dst_sampler);
+ FS::BindTextureSamplerSrc(pass, dst_snapshot->texture, dst_sampler);
} else {
auto src_sampler_descriptor = src_snapshot->sampler_descriptor;
if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
@@ -204,21 +205,20 @@
src_sampler_descriptor);
blend_info.color_factor = 0;
blend_info.src_input_alpha = src_snapshot->opacity;
- FS::BindTextureSamplerSrc(cmd, src_snapshot->texture, src_sampler);
+ FS::BindTextureSamplerSrc(pass, src_snapshot->texture, src_sampler);
frame_info.src_y_coord_scale = src_snapshot->texture->GetYCoordScale();
}
auto blend_uniform = host_buffer.EmplaceUniform(blend_info);
- FS::BindBlendInfo(cmd, blend_uniform);
+ FS::BindBlendInfo(pass, blend_uniform);
frame_info.mvp = pass.GetOrthographicTransform() *
Matrix::MakeTranslation(coverage.GetOrigin() -
subpass_coverage.GetOrigin());
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
- VS::BindFrameInfo(cmd, uniform_view);
- pass.AddCommand(std::move(cmd));
+ VS::BindFrameInfo(pass, uniform_view);
- return true;
+ return pass.Draw().ok();
};
fml::StatusOr<RenderTarget> render_target = renderer.MakeSubpass(
@@ -284,59 +284,60 @@
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, SPrintF("Foreground Advanced Blend Filter (%s)",
- BlendModeToString(blend_mode)));
- cmd.BindVertices(std::move(vtx_buffer));
- cmd.stencil_reference = entity.GetClipDepth();
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(SPrintF("Foreground Advanced Blend Filter (%s)",
+ BlendModeToString(blend_mode)));
+#endif // IMPELLER_DEBUG
+ pass.SetVertexBuffer(std::move(vtx_buffer));
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
switch (blend_mode) {
case BlendMode::kScreen:
- cmd.pipeline = renderer.GetBlendScreenPipeline(options);
+ pass.SetPipeline(renderer.GetBlendScreenPipeline(options));
break;
case BlendMode::kOverlay:
- cmd.pipeline = renderer.GetBlendOverlayPipeline(options);
+ pass.SetPipeline(renderer.GetBlendOverlayPipeline(options));
break;
case BlendMode::kDarken:
- cmd.pipeline = renderer.GetBlendDarkenPipeline(options);
+ pass.SetPipeline(renderer.GetBlendDarkenPipeline(options));
break;
case BlendMode::kLighten:
- cmd.pipeline = renderer.GetBlendLightenPipeline(options);
+ pass.SetPipeline(renderer.GetBlendLightenPipeline(options));
break;
case BlendMode::kColorDodge:
- cmd.pipeline = renderer.GetBlendColorDodgePipeline(options);
+ pass.SetPipeline(renderer.GetBlendColorDodgePipeline(options));
break;
case BlendMode::kColorBurn:
- cmd.pipeline = renderer.GetBlendColorBurnPipeline(options);
+ pass.SetPipeline(renderer.GetBlendColorBurnPipeline(options));
break;
case BlendMode::kHardLight:
- cmd.pipeline = renderer.GetBlendHardLightPipeline(options);
+ pass.SetPipeline(renderer.GetBlendHardLightPipeline(options));
break;
case BlendMode::kSoftLight:
- cmd.pipeline = renderer.GetBlendSoftLightPipeline(options);
+ pass.SetPipeline(renderer.GetBlendSoftLightPipeline(options));
break;
case BlendMode::kDifference:
- cmd.pipeline = renderer.GetBlendDifferencePipeline(options);
+ pass.SetPipeline(renderer.GetBlendDifferencePipeline(options));
break;
case BlendMode::kExclusion:
- cmd.pipeline = renderer.GetBlendExclusionPipeline(options);
+ pass.SetPipeline(renderer.GetBlendExclusionPipeline(options));
break;
case BlendMode::kMultiply:
- cmd.pipeline = renderer.GetBlendMultiplyPipeline(options);
+ pass.SetPipeline(renderer.GetBlendMultiplyPipeline(options));
break;
case BlendMode::kHue:
- cmd.pipeline = renderer.GetBlendHuePipeline(options);
+ pass.SetPipeline(renderer.GetBlendHuePipeline(options));
break;
case BlendMode::kSaturation:
- cmd.pipeline = renderer.GetBlendSaturationPipeline(options);
+ pass.SetPipeline(renderer.GetBlendSaturationPipeline(options));
break;
case BlendMode::kColor:
- cmd.pipeline = renderer.GetBlendColorPipeline(options);
+ pass.SetPipeline(renderer.GetBlendColorPipeline(options));
break;
case BlendMode::kLuminosity:
- cmd.pipeline = renderer.GetBlendLuminosityPipeline(options);
+ pass.SetPipeline(renderer.GetBlendLuminosityPipeline(options));
break;
default:
return false;
@@ -352,7 +353,7 @@
}
auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
dst_sampler_descriptor);
- FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler);
+ FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
frame_info.dst_y_coord_scale = dst_snapshot->texture->GetYCoordScale();
blend_info.dst_input_alpha =
absorb_opacity == ColorFilterContents::AbsorbOpacity::kYes
@@ -364,17 +365,17 @@
// This texture will not be sampled from due to the color factor. But
// this is present so that validation doesn't trip on a missing
// binding.
- FS::BindTextureSamplerSrc(cmd, dst_snapshot->texture, dst_sampler);
+ FS::BindTextureSamplerSrc(pass, dst_snapshot->texture, dst_sampler);
auto blend_uniform = host_buffer.EmplaceUniform(blend_info);
- FS::BindBlendInfo(cmd, blend_uniform);
+ FS::BindBlendInfo(pass, blend_uniform);
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform();
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
- VS::BindFrameInfo(cmd, uniform_view);
+ VS::BindFrameInfo(pass, uniform_view);
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
[coverage](const Entity& entity) -> std::optional<Rect> {
@@ -454,14 +455,15 @@
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, SPrintF("Foreground PorterDuff Blend Filter (%s)",
- BlendModeToString(blend_mode)));
- cmd.BindVertices(std::move(vtx_buffer));
- cmd.stencil_reference = entity.GetClipDepth();
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(SPrintF("Foreground PorterDuff Blend Filter (%s)",
+ BlendModeToString(blend_mode)));
+#endif // IMPELLER_DEBUG
+ pass.SetVertexBuffer(std::move(vtx_buffer));
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetPorterDuffBlendPipeline(options);
+ pass.SetPipeline(renderer.GetPorterDuffBlendPipeline(options));
FS::FragInfo frag_info;
VS::FrameInfo frame_info;
@@ -473,7 +475,7 @@
}
auto dst_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
dst_sampler_descriptor);
- FS::BindTextureSamplerDst(cmd, dst_snapshot->texture, dst_sampler);
+ FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
frame_info.texture_sampler_y_coord_scale =
dst_snapshot->texture->GetYCoordScale();
@@ -491,14 +493,14 @@
frag_info.dst_coeff_src_alpha = blend_coefficients[3];
frag_info.dst_coeff_src_color = blend_coefficients[4];
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform();
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
- VS::BindFrameInfo(cmd, uniform_view);
+ VS::BindFrameInfo(pass, uniform_view);
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
@@ -552,9 +554,10 @@
RenderPass& pass) {
auto& host_buffer = renderer.GetTransientsBuffer();
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, SPrintF("Pipeline Blend Filter (%s)",
- BlendModeToString(blend_mode)));
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(
+ SPrintF("Pipeline Blend Filter (%s)", BlendModeToString(blend_mode)));
+#endif // IMPELLER_DEBUG
auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
@@ -569,7 +572,7 @@
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
input->sampler_descriptor);
- FS::BindTextureSamplerSrc(cmd, input->texture, sampler);
+ FS::BindTextureSamplerSrc(pass, input->texture, sampler);
auto size = input->texture->GetSize();
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
@@ -579,7 +582,7 @@
{Point(0, size.height), Point(0, 1)},
{Point(size.width, size.height), Point(1, 1)},
});
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() *
@@ -593,16 +596,15 @@
absorb_opacity == ColorFilterContents::AbsorbOpacity::kYes
? input->opacity
: 1.0;
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- pass.AddCommand(std::move(cmd));
- return true;
+ return pass.Draw().ok();
};
// Draw the first texture using kSource.
options.blend_mode = BlendMode::kSource;
- cmd.pipeline = renderer.GetBlendPipeline(options);
+ pass.SetPipeline(renderer.GetBlendPipeline(options));
if (!add_blend_command(dst_snapshot)) {
return true;
}
@@ -611,7 +613,7 @@
if (inputs.size() >= 2) {
options.blend_mode = blend_mode;
- cmd.pipeline = renderer.GetBlendPipeline(options);
+ pass.SetPipeline(renderer.GetBlendPipeline(options));
for (auto texture_i = inputs.begin() + 1; texture_i < inputs.end();
texture_i++) {
diff --git a/impeller/entity/contents/filters/color_matrix_filter_contents.cc b/impeller/entity/contents/filters/color_matrix_filter_contents.cc
index 8374161..23d32de 100644
--- a/impeller/entity/contents/filters/color_matrix_filter_contents.cc
+++ b/impeller/entity/contents/filters/color_matrix_filter_contents.cc
@@ -55,13 +55,12 @@
absorb_opacity = GetAbsorbOpacity()](
const ContentContext& renderer,
const Entity& entity, RenderPass& pass) -> bool {
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Color Matrix Filter");
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetCommandLabel("Color Matrix Filter");
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetColorMatrixColorFilterPipeline(options);
+ pass.SetPipeline(renderer.GetColorMatrixColorFilterPipeline(options));
auto size = input_snapshot->texture->GetSize();
@@ -73,7 +72,7 @@
{Point(1, 1)},
});
auto& host_buffer = renderer.GetTransientsBuffer();
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform() *
@@ -98,12 +97,12 @@
? input_snapshot->opacity
: 1.0f;
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
- FS::BindInputTexture(cmd, input_snapshot->texture, sampler);
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FS::BindInputTexture(pass, input_snapshot->texture, sampler);
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
diff --git a/impeller/entity/contents/filters/directional_gaussian_blur_filter_contents.cc b/impeller/entity/contents/filters/directional_gaussian_blur_filter_contents.cc
index 3115d96..ff394a9 100644
--- a/impeller/entity/contents/filters/directional_gaussian_blur_filter_contents.cc
+++ b/impeller/entity/contents/filters/directional_gaussian_blur_filter_contents.cc
@@ -181,10 +181,11 @@
pass_transform.Invert().TransformDirection(Vector2(1, 0)).Normalize() /
Point(input_snapshot->GetCoverage().value().GetSize());
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, SPrintF("Gaussian Blur Filter (Radius=%.2f)",
- transformed_blur_radius_length));
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+#ifdef IMPELLER_DEBUG
+ pass.SetCommandLabel(SPrintF("Gaussian Blur Filter (Radius=%.2f)",
+ transformed_blur_radius_length));
+#endif // IMPELLER_DEBUG
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
@@ -219,19 +220,19 @@
!renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode();
if (has_decal_specialization) {
- cmd.pipeline = renderer.GetGaussianBlurDecalPipeline(options);
+ pass.SetPipeline(renderer.GetGaussianBlurDecalPipeline(options));
} else {
- cmd.pipeline = renderer.GetGaussianBlurPipeline(options);
+ pass.SetPipeline(renderer.GetGaussianBlurPipeline(options));
}
FS::BindTextureSampler(
- cmd, input_snapshot->texture,
+ pass, input_snapshot->texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
input_descriptor));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
- FS::BindBlurInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
+ FS::BindBlurInfo(pass, host_buffer.EmplaceUniform(frag_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
Vector2 scale;
diff --git a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc
index c83f0e0..22d49a3 100644
--- a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc
+++ b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc
@@ -31,12 +31,12 @@
}
template <typename T>
-void BindVertices(Command& cmd,
+void BindVertices(RenderPass& pass,
HostBuffer& host_buffer,
std::initializer_list<typename T::PerVertexData>&& vertices) {
VertexBufferBuilder<typename T::PerVertexData> vtx_builder;
vtx_builder.AddVertices(vertices);
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
}
void SetTileMode(SamplerDescriptor* descriptor,
@@ -77,18 +77,17 @@
[&](const ContentContext& renderer, RenderPass& pass) {
HostBuffer& host_buffer = renderer.GetTransientsBuffer();
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Gaussian blur downsample");
+ pass.SetCommandLabel("Gaussian blur downsample");
auto pipeline_options = OptionsFromPass(pass);
pipeline_options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetTexturePipeline(pipeline_options);
+ pass.SetPipeline(renderer.GetTexturePipeline(pipeline_options));
TextureFillVertexShader::FrameInfo frame_info;
frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));
frame_info.texture_sampler_y_coord_scale = 1.0;
frame_info.alpha = 1.0;
- BindVertices<TextureFillVertexShader>(cmd, host_buffer,
+ BindVertices<TextureFillVertexShader>(pass, host_buffer,
{
{Point(0, 0), uvs[0]},
{Point(1, 0), uvs[1]},
@@ -101,15 +100,13 @@
linear_sampler_descriptor.mag_filter = MinMagFilter::kLinear;
linear_sampler_descriptor.min_filter = MinMagFilter::kLinear;
TextureFillVertexShader::BindFrameInfo(
- cmd, host_buffer.EmplaceUniform(frame_info));
+ pass, host_buffer.EmplaceUniform(frame_info));
TextureFillFragmentShader::BindTextureSampler(
- cmd, input_texture,
+ pass, input_texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
linear_sampler_descriptor));
- pass.AddCommand(std::move(cmd));
-
- return true;
+ return pass.Draw().ok();
};
fml::StatusOr<RenderTarget> render_target = renderer.MakeSubpass(
"Gaussian Blur Filter", subpass_size, subpass_callback);
@@ -141,19 +138,18 @@
HostBuffer& host_buffer = renderer.GetTransientsBuffer();
- Command cmd;
ContentContextOptions options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
if (tile_mode == Entity::TileMode::kDecal &&
!renderer.GetDeviceCapabilities()
.SupportsDecalSamplerAddressMode()) {
- cmd.pipeline = renderer.GetKernelDecalPipeline(options);
+ pass.SetPipeline(renderer.GetKernelDecalPipeline(options));
} else {
- cmd.pipeline = renderer.GetKernelPipeline(options);
+ pass.SetPipeline(renderer.GetKernelPipeline(options));
}
- BindVertices<GaussianBlurVertexShader>(cmd, host_buffer,
+ BindVertices<GaussianBlurVertexShader>(pass, host_buffer,
{
{blur_uvs[0], blur_uvs[0]},
{blur_uvs[1], blur_uvs[1]},
@@ -165,16 +161,14 @@
linear_sampler_descriptor.mag_filter = MinMagFilter::kLinear;
linear_sampler_descriptor.min_filter = MinMagFilter::kLinear;
GaussianBlurFragmentShader::BindTextureSampler(
- cmd, input_texture,
+ pass, input_texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
linear_sampler_descriptor));
GaussianBlurVertexShader::BindFrameInfo(
- cmd, host_buffer.EmplaceUniform(frame_info));
+ pass, host_buffer.EmplaceUniform(frame_info));
GaussianBlurFragmentShader::BindKernelSamples(
- cmd, host_buffer.EmplaceUniform(GenerateBlurInfo(blur_info)));
- pass.AddCommand(std::move(cmd));
-
- return true;
+ pass, host_buffer.EmplaceUniform(GenerateBlurInfo(blur_info)));
+ return pass.Draw().ok();
};
if (destination_target.has_value()) {
return renderer.MakeSubpass("Gaussian Blur Filter",
diff --git a/impeller/entity/contents/filters/linear_to_srgb_filter_contents.cc b/impeller/entity/contents/filters/linear_to_srgb_filter_contents.cc
index 3c7d864..e34bef9 100644
--- a/impeller/entity/contents/filters/linear_to_srgb_filter_contents.cc
+++ b/impeller/entity/contents/filters/linear_to_srgb_filter_contents.cc
@@ -44,13 +44,12 @@
absorb_opacity = GetAbsorbOpacity()](
const ContentContext& renderer,
const Entity& entity, RenderPass& pass) -> bool {
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Linear to sRGB Filter");
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetCommandLabel("Linear to sRGB Filter");
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetLinearToSrgbFilterPipeline(options);
+ pass.SetPipeline(renderer.GetLinearToSrgbFilterPipeline(options));
auto size = input_snapshot->texture->GetSize();
@@ -63,7 +62,7 @@
});
auto& host_buffer = renderer.GetTransientsBuffer();
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform() *
@@ -78,12 +77,13 @@
? input_snapshot->opacity
: 1.0f;
- auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
- FS::BindInputTexture(cmd, input_snapshot->texture, sampler);
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ FS::BindInputTexture(
+ pass, input_snapshot->texture,
+ renderer.GetContext()->GetSamplerLibrary()->GetSampler({}));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
diff --git a/impeller/entity/contents/filters/morphology_filter_contents.cc b/impeller/entity/contents/filters/morphology_filter_contents.cc
index 9b7bb80..5aa0e35 100644
--- a/impeller/entity/contents/filters/morphology_filter_contents.cc
+++ b/impeller/entity/contents/filters/morphology_filter_contents.cc
@@ -112,13 +112,12 @@
.Normalize() /
Point(transformed_texture_width, transformed_texture_height);
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Morphology Filter");
+ pass.SetCommandLabel("Morphology Filter");
auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
options.blend_mode = BlendMode::kSource;
- cmd.pipeline = renderer.GetMorphologyFilterPipeline(options);
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetPipeline(renderer.GetMorphologyFilterPipeline(options));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
auto sampler_descriptor = input_snapshot->sampler_descriptor;
if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
@@ -127,13 +126,13 @@
}
FS::BindTextureSampler(
- cmd, input_snapshot->texture,
+ pass, input_snapshot->texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_descriptor));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
fml::StatusOr<RenderTarget> render_target = renderer.MakeSubpass(
diff --git a/impeller/entity/contents/filters/srgb_to_linear_filter_contents.cc b/impeller/entity/contents/filters/srgb_to_linear_filter_contents.cc
index 567e6c2..a519983 100644
--- a/impeller/entity/contents/filters/srgb_to_linear_filter_contents.cc
+++ b/impeller/entity/contents/filters/srgb_to_linear_filter_contents.cc
@@ -44,13 +44,12 @@
absorb_opacity = GetAbsorbOpacity()](
const ContentContext& renderer,
const Entity& entity, RenderPass& pass) -> bool {
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "sRGB to Linear Filter");
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetCommandLabel("sRGB to Linear Filter");
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetSrgbToLinearFilterPipeline(options);
+ pass.SetPipeline(renderer.GetSrgbToLinearFilterPipeline(options));
auto size = input_snapshot->texture->GetSize();
@@ -63,7 +62,7 @@
});
auto& host_buffer = renderer.GetTransientsBuffer();
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform() *
@@ -79,11 +78,11 @@
: 1.0f;
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
- FS::BindInputTexture(cmd, input_snapshot->texture, sampler);
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ FS::BindInputTexture(pass, input_snapshot->texture, sampler);
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
diff --git a/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.cc b/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.cc
index 78874b3..38c5f5d 100644
--- a/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.cc
+++ b/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.cc
@@ -73,13 +73,12 @@
yuv_color_space = yuv_color_space_](
const ContentContext& renderer,
const Entity& entity, RenderPass& pass) -> bool {
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "YUV to RGB Filter");
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetCommandLabel("YUV to RGB Filter");
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
options.primitive_type = PrimitiveType::kTriangleStrip;
- cmd.pipeline = renderer.GetYUVToRGBFilterPipeline(options);
+ pass.SetPipeline(renderer.GetYUVToRGBFilterPipeline(options));
auto size = y_input_snapshot->texture->GetSize();
@@ -92,7 +91,7 @@
});
auto& host_buffer = renderer.GetTransientsBuffer();
- cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
+ pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform() *
@@ -113,13 +112,13 @@
}
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
- FS::BindYTexture(cmd, y_input_snapshot->texture, sampler);
- FS::BindUvTexture(cmd, uv_input_snapshot->texture, sampler);
+ FS::BindYTexture(pass, y_input_snapshot->texture, sampler);
+ FS::BindUvTexture(pass, uv_input_snapshot->texture, sampler);
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
CoverageProc coverage_proc =
diff --git a/impeller/entity/contents/runtime_effect_contents.cc b/impeller/entity/contents/runtime_effect_contents.cc
index 0b1e049..e9b767e 100644
--- a/impeller/entity/contents/runtime_effect_contents.cc
+++ b/impeller/entity/contents/runtime_effect_contents.cc
@@ -137,10 +137,9 @@
using VS = RuntimeEffectVertexShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "RuntimeEffectContents");
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
+ pass.SetCommandLabel("RuntimeEffectContents");
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
//--------------------------------------------------------------------------
/// Vertex stage uniforms.
@@ -148,7 +147,7 @@
VS::FrameInfo frame_info;
frame_info.mvp = geometry_result.transform;
- VS::BindFrameInfo(cmd,
+ VS::BindFrameInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
//--------------------------------------------------------------------------
@@ -192,8 +191,8 @@
ShaderUniformSlot uniform_slot;
uniform_slot.name = uniform.name.c_str();
uniform_slot.ext_res_0 = uniform.location;
- cmd.BindResource(ShaderStage::kFragment, uniform_slot, metadata,
- buffer_view);
+ pass.BindResource(ShaderStage::kFragment, uniform_slot, metadata,
+ buffer_view);
buffer_index++;
buffer_offset += uniform.GetSize();
break;
@@ -230,8 +229,8 @@
auto buffer_view = renderer.GetTransientsBuffer().Emplace(
reinterpret_cast<const void*>(uniform_buffer.data()), alignment,
alignment);
- cmd.BindResource(ShaderStage::kFragment, uniform_slot, ShaderMetadata{},
- buffer_view);
+ pass.BindResource(ShaderStage::kFragment, uniform_slot,
+ ShaderMetadata{}, buffer_view);
}
}
}
@@ -264,8 +263,8 @@
image_slot.binding = sampler_binding_location;
image_slot.texture_index = uniform.location - minimum_sampler_index;
- cmd.BindResource(ShaderStage::kFragment, image_slot, *metadata,
- input.texture, sampler);
+ pass.BindResource(ShaderStage::kFragment, image_slot, *metadata,
+ input.texture, sampler);
sampler_index++;
break;
@@ -317,10 +316,12 @@
return pipeline;
};
- cmd.pipeline = renderer.GetCachedRuntimeEffectPipeline(
- runtime_stage_->GetEntrypoint(), options, create_callback);
+ pass.SetPipeline(renderer.GetCachedRuntimeEffectPipeline(
+ runtime_stage_->GetEntrypoint(), options, create_callback));
- pass.AddCommand(std::move(cmd));
+ if (!pass.Draw().ok()) {
+ return false;
+ }
if (geometry_result.prevent_overdraw) {
auto restore = ClipRestoreContents();
diff --git a/impeller/entity/contents/text_contents.cc b/impeller/entity/contents/text_contents.cc
index 8943885..5718866 100644
--- a/impeller/entity/contents/text_contents.cc
+++ b/impeller/entity/contents/text_contents.cc
@@ -91,16 +91,15 @@
}
// Information shared by all glyph draw calls.
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "TextFrame");
+ pass.SetCommandLabel("TextFrame");
auto opts = OptionsFromPassAndEntity(pass, entity);
opts.primitive_type = PrimitiveType::kTriangle;
if (type == GlyphAtlas::Type::kAlphaBitmap) {
- cmd.pipeline = renderer.GetGlyphAtlasPipeline(opts);
+ pass.SetPipeline(renderer.GetGlyphAtlasPipeline(opts));
} else {
- cmd.pipeline = renderer.GetGlyphAtlasColorPipeline(opts);
+ pass.SetPipeline(renderer.GetGlyphAtlasColorPipeline(opts));
}
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetStencilReference(entity.GetClipDepth());
using VS = GlyphAtlasPipeline::VertexShader;
using FS = GlyphAtlasPipeline::FragmentShader;
@@ -117,14 +116,14 @@
frame_info.entity_transform = entity.GetTransform();
frame_info.text_color = ToVector(color.Premultiply());
- VS::BindFrameInfo(cmd,
+ VS::BindFrameInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
if (type == GlyphAtlas::Type::kColorBitmap) {
using FSS = GlyphAtlasColorPipeline::FragmentShader;
FSS::FragInfo frag_info;
frag_info.use_text_color = force_text_color_ ? 1.0 : 0.0;
- FSS::BindFragInfo(cmd,
+ FSS::BindFragInfo(pass,
renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
}
@@ -144,7 +143,7 @@
sampler_desc.mip_filter = MipFilter::kNearest;
FS::BindGlyphAtlasSampler(
- cmd, // command
+ pass, // command
atlas->GetTexture(), // texture
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_desc) // sampler
@@ -206,14 +205,14 @@
}
});
- cmd.BindVertices({
- .vertex_buffer = buffer_view,
+ pass.SetVertexBuffer({
+ .vertex_buffer = std::move(buffer_view),
.index_buffer = {},
.vertex_count = vertex_count,
.index_type = IndexType::kNone,
});
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
}
} // namespace impeller
diff --git a/impeller/entity/contents/texture_contents.cc b/impeller/entity/contents/texture_contents.cc
index dddbf87..9acffab 100644
--- a/impeller/entity/contents/texture_contents.cc
+++ b/impeller/entity/contents/texture_contents.cc
@@ -146,12 +146,13 @@
frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
frame_info.alpha = capture.AddScalar("Alpha", GetOpacity());
- Command cmd;
+#ifdef IMPELLER_DEBUG
if (label_.empty()) {
- DEBUG_COMMAND_INFO(cmd, "Texture Fill");
+ pass.SetCommandLabel("Texture Fill");
} else {
- DEBUG_COMMAND_INFO(cmd, "Texture Fill: " + label_);
+ pass.SetCommandLabel("Texture Fill: " + label_);
}
+#endif // IMPELLER_DEBUG
auto pipeline_options = OptionsFromPassAndEntity(pass, entity);
if (!stencil_enabled_) {
@@ -161,31 +162,29 @@
#ifdef IMPELLER_ENABLE_OPENGLES
if (is_external_texture) {
- cmd.pipeline = renderer.GetTextureExternalPipeline(pipeline_options);
+ pass.SetPipeline(renderer.GetTextureExternalPipeline(pipeline_options));
} else {
- cmd.pipeline = renderer.GetTexturePipeline(pipeline_options);
+ pass.SetPipeline(renderer.GetTexturePipeline(pipeline_options));
}
#else
- cmd.pipeline = renderer.GetTexturePipeline(pipeline_options);
+ pass.SetPipeline(renderer.GetTexturePipeline(pipeline_options));
#endif // IMPELLER_ENABLE_OPENGLES
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(vertex_builder.CreateVertexBuffer(host_buffer));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(vertex_builder.CreateVertexBuffer(host_buffer));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
if (is_external_texture) {
FSExternal::BindSAMPLEREXTERNALOESTextureSampler(
- cmd, texture_,
+ pass, texture_,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_descriptor_));
} else {
FS::BindTextureSampler(
- cmd, texture_,
+ pass, texture_,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_descriptor_));
}
- pass.AddCommand(std::move(cmd));
-
- return true;
+ return pass.Draw().ok();
}
void TextureContents::SetSourceRect(const Rect& source_rect) {
diff --git a/impeller/entity/contents/tiled_texture_contents.cc b/impeller/entity/contents/tiled_texture_contents.cc
index 28d5af6..96ba9f3 100644
--- a/impeller/entity/contents/tiled_texture_contents.cc
+++ b/impeller/entity/contents/tiled_texture_contents.cc
@@ -141,14 +141,13 @@
frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
frame_info.alpha = GetOpacityFactor();
- Command cmd;
if (uses_emulated_tile_mode) {
- DEBUG_COMMAND_INFO(cmd, "TiledTextureFill");
+ pass.SetCommandLabel("TiledTextureFill");
} else {
- DEBUG_COMMAND_INFO(cmd, "TextureFill");
+ pass.SetCommandLabel("TextureFill");
}
- cmd.stencil_reference = entity.GetClipDepth();
+ pass.SetStencilReference(entity.GetClipDepth());
auto options = OptionsFromPassAndEntity(pass, entity);
if (geometry_result.prevent_overdraw) {
@@ -159,31 +158,31 @@
#ifdef IMPELLER_ENABLE_OPENGLES
if (is_external_texture) {
- cmd.pipeline = renderer.GetTiledTextureExternalPipeline(options);
+ pass.SetPipeline(renderer.GetTiledTextureExternalPipeline(options));
} else {
- cmd.pipeline = uses_emulated_tile_mode
- ? renderer.GetTiledTexturePipeline(options)
- : renderer.GetTexturePipeline(options);
+ pass.SetPipeline(uses_emulated_tile_mode
+ ? renderer.GetTiledTexturePipeline(options)
+ : renderer.GetTexturePipeline(options));
}
#else
- cmd.pipeline = uses_emulated_tile_mode
- ? renderer.GetTiledTexturePipeline(options)
- : renderer.GetTexturePipeline(options);
+ pass.SetPipeline(uses_emulated_tile_mode
+ ? renderer.GetTiledTexturePipeline(options)
+ : renderer.GetTexturePipeline(options));
#endif // IMPELLER_ENABLE_OPENGLES
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
if (is_external_texture) {
FSExternal::FragInfo frag_info;
frag_info.x_tile_mode = static_cast<Scalar>(x_tile_mode_);
frag_info.y_tile_mode = static_cast<Scalar>(y_tile_mode_);
- FSExternal::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FSExternal::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
} else if (uses_emulated_tile_mode) {
FS::FragInfo frag_info;
frag_info.x_tile_mode = static_cast<Scalar>(x_tile_mode_);
frag_info.y_tile_mode = static_cast<Scalar>(y_tile_mode_);
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
}
if (is_external_texture) {
@@ -199,7 +198,7 @@
<< "Color filters are not currently supported for external textures.";
FSExternal::BindSAMPLEREXTERNALOESTextureSampler(
- cmd, texture_,
+ pass, texture_,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
} else {
if (color_filter_) {
@@ -208,18 +207,18 @@
return false;
}
FS::BindTextureSampler(
- cmd, filtered_texture,
+ pass, filtered_texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
CreateSamplerDescriptor(renderer.GetDeviceCapabilities())));
} else {
FS::BindTextureSampler(
- cmd, texture_,
+ pass, texture_,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
CreateSamplerDescriptor(renderer.GetDeviceCapabilities())));
}
}
- if (!pass.AddCommand(std::move(cmd))) {
+ if (!pass.Draw().ok()) {
return false;
}
diff --git a/impeller/entity/contents/vertices_contents.cc b/impeller/entity/contents/vertices_contents.cc
index 0825ac6..597a054 100644
--- a/impeller/entity/contents/vertices_contents.cc
+++ b/impeller/entity/contents/vertices_contents.cc
@@ -121,8 +121,7 @@
return false;
}
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "VerticesUV");
+ pass.SetCommandLabel("VerticesUV");
auto& host_buffer = renderer.GetTransientsBuffer();
const std::shared_ptr<Geometry>& geometry = parent_.GetGeometry();
@@ -134,22 +133,22 @@
coverage.value(), Matrix(), renderer, entity, pass);
auto opts = OptionsFromPassAndEntity(pass, entity);
opts.primitive_type = geometry_result.type;
- cmd.pipeline = renderer.GetTexturePipeline(opts);
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
+ pass.SetPipeline(renderer.GetTexturePipeline(opts));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = geometry_result.transform;
frame_info.texture_sampler_y_coord_scale =
snapshot->texture->GetYCoordScale();
frame_info.alpha = alpha_ * snapshot->opacity;
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
- FS::BindTextureSampler(cmd, snapshot->texture,
+ FS::BindTextureSampler(pass, snapshot->texture,
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
snapshot->sampler_descriptor));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
}
//------------------------------------------------------
@@ -175,8 +174,7 @@
using VS = GeometryColorPipeline::VertexShader;
using FS = GeometryColorPipeline::FragmentShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "VerticesColors");
+ pass.SetCommandLabel("VerticesColors");
auto& host_buffer = renderer.GetTransientsBuffer();
const std::shared_ptr<VerticesGeometry>& geometry = parent_.GetGeometry();
@@ -184,19 +182,19 @@
geometry->GetPositionColorBuffer(renderer, entity, pass);
auto opts = OptionsFromPassAndEntity(pass, entity);
opts.primitive_type = geometry_result.type;
- cmd.pipeline = renderer.GetGeometryColorPipeline(opts);
- cmd.stencil_reference = entity.GetClipDepth();
- cmd.BindVertices(std::move(geometry_result.vertex_buffer));
+ pass.SetPipeline(renderer.GetGeometryColorPipeline(opts));
+ pass.SetStencilReference(entity.GetClipDepth());
+ pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
VS::FrameInfo frame_info;
frame_info.mvp = geometry_result.transform;
- VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
FS::FragInfo frag_info;
frag_info.alpha = alpha_;
- FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
+ FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
}
} // namespace impeller
diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc
index 520d2ee..202cd77 100644
--- a/impeller/entity/entity_unittests.cc
+++ b/impeller/entity/entity_unittests.cc
@@ -874,22 +874,21 @@
});
}
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Blended Rectangle");
+ pass.SetCommandLabel("Blended Rectangle");
auto options = OptionsFromPass(pass);
options.blend_mode = blend_mode;
options.primitive_type = PrimitiveType::kTriangle;
- cmd.pipeline = context.GetSolidFillPipeline(options);
- cmd.BindVertices(
+ pass.SetPipeline(context.GetSolidFillPipeline(options));
+ pass.SetVertexBuffer(
vtx_builder.CreateVertexBuffer(context.GetTransientsBuffer()));
VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() * world_matrix;
frame_info.color = color.Premultiply();
VS::BindFrameInfo(
- cmd, context.GetTransientsBuffer().EmplaceUniform(frame_info));
+ pass, context.GetTransientsBuffer().EmplaceUniform(frame_info));
- return pass.AddCommand(std::move(cmd));
+ return pass.Draw().ok();
};
ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
diff --git a/impeller/playground/imgui/imgui_impl_impeller.cc b/impeller/playground/imgui/imgui_impl_impeller.cc
index 6d61f36..ada717b 100644
--- a/impeller/playground/imgui/imgui_impl_impeller.cc
+++ b/impeller/playground/imgui/imgui_impl_impeller.cc
@@ -236,17 +236,13 @@
clip_rect = visible_clip.value();
}
- impeller::Command cmd;
- DEBUG_COMMAND_INFO(cmd,
- impeller::SPrintF("ImGui draw list %d (command %d)",
- draw_list_i, cmd_i));
-
- cmd.viewport = viewport;
- cmd.scissor = impeller::IRect(clip_rect);
-
- cmd.pipeline = bd->pipeline;
- VS::BindUniformBuffer(cmd, vtx_uniforms);
- FS::BindTex(cmd, bd->font_texture, bd->sampler);
+ render_pass.SetCommandLabel(impeller::SPrintF(
+ "ImGui draw list %d (command %d)", draw_list_i, cmd_i));
+ render_pass.SetViewport(viewport);
+ render_pass.SetScissor(impeller::IRect(clip_rect));
+ render_pass.SetPipeline(bd->pipeline);
+ VS::BindUniformBuffer(render_pass, vtx_uniforms);
+ FS::BindTex(render_pass, bd->font_texture, bd->sampler);
size_t vb_start =
vertex_buffer_offset + pcmd->VtxOffset * sizeof(ImDrawVert);
@@ -262,10 +258,10 @@
pcmd->ElemCount * sizeof(ImDrawIdx))};
vertex_buffer.vertex_count = pcmd->ElemCount;
vertex_buffer.index_type = impeller::IndexType::k16bit;
- cmd.BindVertices(std::move(vertex_buffer));
- cmd.base_vertex = pcmd->VtxOffset;
+ render_pass.SetVertexBuffer(std::move(vertex_buffer));
+ render_pass.SetBaseVertex(pcmd->VtxOffset);
- render_pass.AddCommand(std::move(cmd));
+ render_pass.Draw().ok();
}
}
diff --git a/impeller/renderer/compute_subgroup_unittests.cc b/impeller/renderer/compute_subgroup_unittests.cc
index 49bc9ea..441edd9 100644
--- a/impeller/renderer/compute_subgroup_unittests.cc
+++ b/impeller/renderer/compute_subgroup_unittests.cc
@@ -133,9 +133,8 @@
using VS = SolidFillPipeline::VertexShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Draw Stroke");
- cmd.stencil_reference = 0;
+ pass.SetCommandLabel("Draw Stroke");
+ pass.SetStencilReference(0);
ContentContextOptions options;
options.sample_count = pass.GetRenderTarget().GetSampleCount();
@@ -148,13 +147,13 @@
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kIncrementClamp;
- cmd.pipeline = renderer.GetSolidFillPipeline(options);
+ pass.SetPipeline(renderer.GetSolidFillPipeline(options));
auto count = reinterpret_cast<SS::VertexBufferCount*>(
vertex_buffer_count->OnGetContents())
->count;
- cmd.BindVertices(
+ pass.SetVertexBuffer(
VertexBuffer{.vertex_buffer = DeviceBuffer::AsBufferView(vertex_buffer),
.vertex_count = count,
.index_type = IndexType::kNone});
@@ -164,13 +163,9 @@
frame_info.mvp = pass.GetOrthographicTransform() * world_matrix;
frame_info.color = Color::Red().Premultiply();
VS::BindFrameInfo(
- cmd, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
+ pass, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
- if (!pass.AddCommand(std::move(cmd))) {
- return false;
- }
-
- return true;
+ return pass.Draw().ok();
};
ASSERT_TRUE(OpenPlaygroundHere(callback));
}
@@ -335,9 +330,8 @@
using VS = SolidFillPipeline::VertexShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Draw Stroke");
- cmd.stencil_reference = 0;
+ pass.SetCommandLabel("Draw Stroke");
+ pass.SetStencilReference(0);
ContentContextOptions options;
options.sample_count = pass.GetRenderTarget().GetSampleCount();
@@ -350,13 +344,13 @@
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kIncrementClamp;
- cmd.pipeline = renderer.GetSolidFillPipeline(options);
+ pass.SetPipeline(renderer.GetSolidFillPipeline(options));
auto count = reinterpret_cast<SS::VertexBufferCount*>(
vertex_buffer_count->OnGetContents())
->count;
- cmd.BindVertices(
+ pass.SetVertexBuffer(
VertexBuffer{.vertex_buffer = DeviceBuffer::AsBufferView(vertex_buffer),
.vertex_count = count,
.index_type = IndexType::kNone});
@@ -366,13 +360,9 @@
frame_info.mvp = pass.GetOrthographicTransform() * world_matrix;
frame_info.color = Color::Red().Premultiply();
VS::BindFrameInfo(
- cmd, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
+ pass, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
- if (!pass.AddCommand(std::move(cmd))) {
- return false;
- }
-
- return true;
+ return pass.Draw().ok();
};
ASSERT_TRUE(OpenPlaygroundHere(callback));
}
@@ -418,9 +408,8 @@
using VS = SolidFillPipeline::VertexShader;
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Draw Stroke");
- cmd.stencil_reference = 0;
+ pass.SetCommandLabel("Draw Stroke");
+ pass.SetStencilReference(0);
ContentContextOptions options;
options.sample_count = pass.GetRenderTarget().GetSampleCount();
@@ -433,13 +422,13 @@
options.stencil_compare = CompareFunction::kEqual;
options.stencil_operation = StencilOperation::kIncrementClamp;
- cmd.pipeline = renderer.GetSolidFillPipeline(options);
+ pass.SetPipeline(renderer.GetSolidFillPipeline(options));
auto count = reinterpret_cast<SS::VertexBufferCount*>(
vertex_buffer_count->OnGetContents())
->count;
- cmd.BindVertices(
+ pass.SetVertexBuffer(
VertexBuffer{.vertex_buffer = DeviceBuffer::AsBufferView(vertex_buffer),
.vertex_count = count,
.index_type = IndexType::kNone});
@@ -449,13 +438,9 @@
frame_info.mvp = pass.GetOrthographicTransform() * world_matrix;
frame_info.color = Color::Red().Premultiply();
VS::BindFrameInfo(
- cmd, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
+ pass, renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
- if (!pass.AddCommand(std::move(cmd))) {
- return false;
- }
-
- return true;
+ return pass.Draw().ok();
};
ASSERT_TRUE(OpenPlaygroundHere(callback));
diff --git a/impeller/renderer/render_pass.h b/impeller/renderer/render_pass.h
index b095030..c2bd755 100644
--- a/impeller/renderer/render_pass.h
+++ b/impeller/renderer/render_pass.h
@@ -54,17 +54,6 @@
}
//----------------------------------------------------------------------------
- /// @brief Record a command for subsequent encoding to the underlying
- /// command buffer. No work is encoded into the command buffer at
- /// this time.
- ///
- /// @param[in] command The command
- ///
- /// @return If the command was valid for subsequent commitment.
- ///
- bool AddCommand(Command&& command);
-
- //----------------------------------------------------------------------------
/// The pipeline to use for this command.
void SetPipeline(
const std::shared_ptr<Pipeline<PipelineDescriptor>>& pipeline);
@@ -181,6 +170,17 @@
std::vector<Command> commands_;
const Matrix orthographic_;
+ //----------------------------------------------------------------------------
+ /// @brief Record a command for subsequent encoding to the underlying
+ /// command buffer. No work is encoded into the command buffer at
+ /// this time.
+ ///
+ /// @param[in] command The command
+ ///
+ /// @return If the command was valid for subsequent commitment.
+ ///
+ bool AddCommand(Command&& command);
+
RenderPass(std::weak_ptr<const Context> context, const RenderTarget& target);
virtual void OnSetLabel(std::string label) = 0;
diff --git a/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc
index 60514ce..e36f634 100644
--- a/impeller/renderer/renderer_unittests.cc
+++ b/impeller/renderer/renderer_unittests.cc
@@ -84,11 +84,9 @@
assert(pipeline && pipeline->IsValid());
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Box");
- cmd.pipeline = pipeline;
-
- cmd.BindVertices(
+ pass.SetCommandLabel("Box");
+ pass.SetPipeline(pipeline);
+ pass.SetVertexBuffer(
vertex_builder.CreateVertexBuffer(*context->GetResourceAllocator()));
VS::UniformBuffer uniforms;
@@ -96,7 +94,7 @@
Matrix::MakeOrthographic(pass.GetRenderTargetSize()));
uniforms.mvp =
pass.GetOrthographicTransform() * Matrix::MakeScale(GetContentScale());
- VS::BindUniformBuffer(cmd, host_buffer->EmplaceUniform(uniforms));
+ VS::BindUniformBuffer(pass, host_buffer->EmplaceUniform(uniforms));
FS::FrameInfo frame_info;
frame_info.current_time = GetSecondsElapsed();
@@ -104,15 +102,12 @@
frame_info.window_size.x = GetWindowSize().width;
frame_info.window_size.y = GetWindowSize().height;
- FS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
- FS::BindContents1(cmd, boston, sampler);
- FS::BindContents2(cmd, bridge, sampler);
+ FS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
+ FS::BindContents1(pass, boston, sampler);
+ FS::BindContents2(pass, bridge, sampler);
host_buffer->Reset();
- if (!pass.AddCommand(std::move(cmd))) {
- return false;
- }
- return true;
+ return pass.Draw().ok();
};
OpenPlaygroundHere(callback);
}
@@ -183,11 +178,9 @@
ImGui::SliderFloat("Camera distance", &distance, 0, 30);
ImGui::End();
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Perspective Cube");
- cmd.pipeline = pipeline;
-
- cmd.BindVertices(vertex_buffer);
+ pass.SetCommandLabel("Perspective Cube");
+ pass.SetPipeline(pipeline);
+ pass.SetVertexBuffer(vertex_buffer);
VS::UniformBuffer uniforms;
Scalar time = GetSecondsElapsed();
@@ -199,13 +192,10 @@
Matrix::MakeRotationX(Radians(euler_angles.x)) *
Matrix::MakeRotationY(Radians(euler_angles.y)) *
Matrix::MakeRotationZ(Radians(euler_angles.z));
- VS::BindUniformBuffer(cmd, host_buffer->EmplaceUniform(uniforms));
+ VS::BindUniformBuffer(pass, host_buffer->EmplaceUniform(uniforms));
host_buffer->Reset();
- if (!pass.AddCommand(std::move(cmd))) {
- return false;
- }
- return true;
+ return pass.Draw().ok();
};
OpenPlaygroundHere(callback);
}
@@ -247,32 +237,30 @@
auto host_buffer = HostBuffer::Create(context->GetResourceAllocator());
SinglePassCallback callback = [&](RenderPass& pass) {
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Box");
- cmd.pipeline = box_pipeline;
-
- cmd.BindVertices(vertex_buffer);
-
- FS::FrameInfo frame_info;
- frame_info.current_time = GetSecondsElapsed();
- frame_info.cursor_position = GetCursorPosition();
- frame_info.window_size.x = GetWindowSize().width;
- frame_info.window_size.y = GetWindowSize().height;
-
- FS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
- FS::BindContents1(cmd, boston, sampler);
- FS::BindContents2(cmd, bridge, sampler);
-
for (size_t i = 0; i < 1; i++) {
for (size_t j = 0; j < 1; j++) {
+ pass.SetCommandLabel("Box");
+ pass.SetPipeline(box_pipeline);
+ pass.SetVertexBuffer(vertex_buffer);
+
+ FS::FrameInfo frame_info;
+ frame_info.current_time = GetSecondsElapsed();
+ frame_info.cursor_position = GetCursorPosition();
+ frame_info.window_size.x = GetWindowSize().width;
+ frame_info.window_size.y = GetWindowSize().height;
+
+ FS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
+ FS::BindContents1(pass, boston, sampler);
+ FS::BindContents2(pass, bridge, sampler);
+
VS::UniformBuffer uniforms;
EXPECT_EQ(pass.GetOrthographicTransform(),
Matrix::MakeOrthographic(pass.GetRenderTargetSize()));
uniforms.mvp = pass.GetOrthographicTransform() *
Matrix::MakeScale(GetContentScale()) *
Matrix::MakeTranslation({i * 50.0f, j * 50.0f, 0.0f});
- VS::BindUniformBuffer(cmd, host_buffer->EmplaceUniform(uniforms));
- if (!pass.AddCommand(std::move(cmd))) {
+ VS::BindUniformBuffer(pass, host_buffer->EmplaceUniform(uniforms));
+ if (!pass.Draw().ok()) {
return false;
}
}
@@ -363,11 +351,9 @@
ASSERT_TRUE(r2t_pass && r2t_pass->IsValid());
}
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Box");
- cmd.pipeline = box_pipeline;
-
- cmd.BindVertices(vertex_buffer);
+ r2t_pass->SetCommandLabel("Box");
+ r2t_pass->SetPipeline(box_pipeline);
+ r2t_pass->SetVertexBuffer(vertex_buffer);
FS::FrameInfo frame_info;
frame_info.current_time = GetSecondsElapsed();
@@ -375,15 +361,15 @@
frame_info.window_size.x = GetWindowSize().width;
frame_info.window_size.y = GetWindowSize().height;
- FS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
- FS::BindContents1(cmd, boston, sampler);
- FS::BindContents2(cmd, bridge, sampler);
+ FS::BindFrameInfo(*r2t_pass, host_buffer->EmplaceUniform(frame_info));
+ FS::BindContents1(*r2t_pass, boston, sampler);
+ FS::BindContents2(*r2t_pass, bridge, sampler);
VS::UniformBuffer uniforms;
uniforms.mvp = Matrix::MakeOrthographic(ISize{1024, 768}) *
Matrix::MakeTranslation({50.0f, 50.0f, 0.0f});
- VS::BindUniformBuffer(cmd, host_buffer->EmplaceUniform(uniforms));
- ASSERT_TRUE(r2t_pass->AddCommand(std::move(cmd)));
+ VS::BindUniformBuffer(*r2t_pass, host_buffer->EmplaceUniform(uniforms));
+ ASSERT_TRUE(r2t_pass->Draw().ok());
ASSERT_TRUE(r2t_pass->EncodeCommands());
}
@@ -427,10 +413,6 @@
.Get();
ASSERT_TRUE(pipeline && pipeline->IsValid());
- Command cmd;
- cmd.pipeline = pipeline;
- DEBUG_COMMAND_INFO(cmd, "InstancedDraw");
-
static constexpr size_t kInstancesCount = 5u;
VS::InstanceInfo<kInstancesCount> instances;
for (size_t i = 0; i < kInstancesCount; i++) {
@@ -439,17 +421,20 @@
auto host_buffer = HostBuffer::Create(GetContext()->GetResourceAllocator());
ASSERT_TRUE(OpenPlaygroundHere([&](RenderPass& pass) -> bool {
+ pass.SetPipeline(pipeline);
+ pass.SetCommandLabel("InstancedDraw");
+
VS::FrameInfo frame_info;
EXPECT_EQ(pass.GetOrthographicTransform(),
Matrix::MakeOrthographic(pass.GetRenderTargetSize()));
frame_info.mvp =
pass.GetOrthographicTransform() * Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
- VS::BindInstanceInfo(cmd, host_buffer->EmplaceStorageBuffer(instances));
- cmd.BindVertices(builder.CreateVertexBuffer(*host_buffer));
+ VS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
+ VS::BindInstanceInfo(pass, host_buffer->EmplaceStorageBuffer(instances));
+ pass.SetVertexBuffer(builder.CreateVertexBuffer(*host_buffer));
- cmd.instance_count = kInstancesCount;
- pass.AddCommand(std::move(cmd));
+ pass.SetInstanceCount(kInstancesCount);
+ pass.Draw();
host_buffer->Reset();
return true;
@@ -540,27 +525,25 @@
}
pass->SetLabel("Playground Render Pass");
{
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Image");
- cmd.pipeline = mipmaps_pipeline;
-
- cmd.BindVertices(vertex_buffer);
+ pass->SetCommandLabel("Image");
+ pass->SetPipeline(mipmaps_pipeline);
+ pass->SetVertexBuffer(vertex_buffer);
VS::FrameInfo frame_info;
EXPECT_EQ(pass->GetOrthographicTransform(),
Matrix::MakeOrthographic(pass->GetRenderTargetSize()));
frame_info.mvp = pass->GetOrthographicTransform() *
Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(*pass, host_buffer->EmplaceUniform(frame_info));
FS::FragInfo frag_info;
frag_info.lod = 0;
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(frag_info));
+ FS::BindFragInfo(*pass, host_buffer->EmplaceUniform(frag_info));
auto sampler = context->GetSamplerLibrary()->GetSampler({});
- FS::BindTex(cmd, texture, sampler);
+ FS::BindTex(*pass, texture, sampler);
- pass->AddCommand(std::move(cmd));
+ pass->Draw();
}
pass->EncodeCommands();
}
@@ -670,22 +653,20 @@
}
pass->SetLabel("Playground Render Pass");
{
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Image");
- cmd.pipeline = mipmaps_pipeline;
-
- cmd.BindVertices(vertex_buffer);
+ pass->SetCommandLabel("Image");
+ pass->SetPipeline(mipmaps_pipeline);
+ pass->SetVertexBuffer(vertex_buffer);
VS::FrameInfo frame_info;
EXPECT_EQ(pass->GetOrthographicTransform(),
Matrix::MakeOrthographic(pass->GetRenderTargetSize()));
frame_info.mvp = pass->GetOrthographicTransform() *
Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(*pass, host_buffer->EmplaceUniform(frame_info));
FS::FragInfo frag_info;
frag_info.lod = 0;
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(frag_info));
+ FS::BindFragInfo(*pass, host_buffer->EmplaceUniform(frag_info));
auto sampler = context->GetSamplerLibrary()->GetSampler({});
auto buffer_view = DeviceBuffer::AsBufferView(device_buffer);
@@ -696,9 +677,9 @@
VALIDATION_LOG << "Could not upload texture to device memory";
return false;
}
- FS::BindTex(cmd, texture, sampler);
+ FS::BindTex(*pass, texture, sampler);
- pass->AddCommand(std::move(cmd));
+ pass->Draw().ok();
}
pass->EncodeCommands();
if (!buffer->SubmitCommands()) {
@@ -796,30 +777,28 @@
}
pass->SetLabel("Playground Render Pass");
{
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Image LOD");
- cmd.pipeline = mipmaps_pipeline;
-
- cmd.BindVertices(vertex_buffer);
+ pass->SetCommandLabel("Image LOD");
+ pass->SetPipeline(mipmaps_pipeline);
+ pass->SetVertexBuffer(vertex_buffer);
VS::FrameInfo frame_info;
EXPECT_EQ(pass->GetOrthographicTransform(),
Matrix::MakeOrthographic(pass->GetRenderTargetSize()));
frame_info.mvp = pass->GetOrthographicTransform() *
Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(*pass, host_buffer->EmplaceUniform(frame_info));
FS::FragInfo frag_info;
frag_info.lod = lod;
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(frag_info));
+ FS::BindFragInfo(*pass, host_buffer->EmplaceUniform(frag_info));
SamplerDescriptor sampler_desc;
sampler_desc.mip_filter = mip_filters[selected_mip_filter];
sampler_desc.min_filter = min_filters[selected_min_filter];
auto sampler = context->GetSamplerLibrary()->GetSampler(sampler_desc);
- FS::BindTex(cmd, boston, sampler);
+ FS::BindTex(*pass, boston, sampler);
- pass->AddCommand(std::move(cmd));
+ pass->Draw();
}
pass->EncodeCommands();
}
@@ -864,9 +843,8 @@
SinglePassCallback callback = [&](RenderPass& pass) {
auto size = pass.GetRenderTargetSize();
- Command cmd;
- cmd.pipeline = pipeline;
- DEBUG_COMMAND_INFO(cmd, "Impeller SDF scene");
+ pass.SetPipeline(pipeline);
+ pass.SetCommandLabel("Impeller SDF scene");
VertexBufferBuilder<VS::PerVertexData> builder;
builder.AddVertices({{Point()},
{Point(0, size.height)},
@@ -874,21 +852,21 @@
{Point(size.width, 0)},
{Point(0, size.height)},
{Point(size.width, size.height)}});
- cmd.BindVertices(builder.CreateVertexBuffer(*host_buffer));
+ pass.SetVertexBuffer(builder.CreateVertexBuffer(*host_buffer));
VS::FrameInfo frame_info;
EXPECT_EQ(pass.GetOrthographicTransform(), Matrix::MakeOrthographic(size));
frame_info.mvp = pass.GetOrthographicTransform();
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
FS::FragInfo fs_uniform;
fs_uniform.texture_size = Point(size);
fs_uniform.time = GetSecondsElapsed();
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(fs_uniform));
- FS::BindBlueNoise(cmd, blue_noise, noise_sampler);
- FS::BindCubeMap(cmd, cube_map, cube_map_sampler);
+ FS::BindFragInfo(pass, host_buffer->EmplaceUniform(fs_uniform));
+ FS::BindBlueNoise(pass, blue_noise, noise_sampler);
+ FS::BindCubeMap(pass, cube_map, cube_map_sampler);
- pass.AddCommand(std::move(cmd));
+ pass.Draw().ok();
host_buffer->Reset();
return true;
};
@@ -913,9 +891,8 @@
SinglePassCallback callback = [&](RenderPass& pass) {
auto size = pass.GetRenderTargetSize();
- Command cmd;
- cmd.pipeline = pipeline;
- DEBUG_COMMAND_INFO(cmd, "Google Dots");
+ pass.SetPipeline(pipeline);
+ pass.SetCommandLabel("Google Dots");
VertexBufferBuilder<VS::PerVertexData> builder;
builder.AddVertices({{Point()},
{Point(0, size.height)},
@@ -923,13 +900,13 @@
{Point(size.width, 0)},
{Point(0, size.height)},
{Point(size.width, size.height)}});
- cmd.BindVertices(builder.CreateVertexBuffer(*host_buffer));
+ pass.SetVertexBuffer(builder.CreateVertexBuffer(*host_buffer));
VS::FrameInfo frame_info;
EXPECT_EQ(pass.GetOrthographicTransform(), Matrix::MakeOrthographic(size));
frame_info.mvp =
pass.GetOrthographicTransform() * Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
auto time = GetSecondsElapsed();
auto y_pos = [&time](float x) {
@@ -944,9 +921,9 @@
Color::MakeRGBA8(244, 180, 0, 255),
Color::MakeRGBA8(15, 157, 88, 255)},
};
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(fs_uniform));
+ FS::BindFragInfo(pass, host_buffer->EmplaceUniform(fs_uniform));
- pass.AddCommand(std::move(cmd));
+ pass.Draw();
host_buffer->Reset();
return true;
};
@@ -971,9 +948,9 @@
SinglePassCallback callback = [&](RenderPass& pass) {
auto size = pass.GetRenderTargetSize();
- Command cmd;
- cmd.pipeline = pipeline;
- DEBUG_COMMAND_INFO(cmd, "Inactive Uniform");
+ pass.SetPipeline(pipeline);
+ pass.SetCommandLabel("Inactive Uniform");
+
VertexBufferBuilder<VS::PerVertexData> builder;
builder.AddVertices({{Point()},
{Point(0, size.height)},
@@ -981,19 +958,19 @@
{Point(size.width, 0)},
{Point(0, size.height)},
{Point(size.width, size.height)}});
- cmd.BindVertices(builder.CreateVertexBuffer(*host_buffer));
+ pass.SetVertexBuffer(builder.CreateVertexBuffer(*host_buffer));
VS::FrameInfo frame_info;
EXPECT_EQ(pass.GetOrthographicTransform(), Matrix::MakeOrthographic(size));
frame_info.mvp =
pass.GetOrthographicTransform() * Matrix::MakeScale(GetContentScale());
- VS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
+ VS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info));
FS::FragInfo fs_uniform = {.unused_color = Color::Red(),
.color = Color::Green()};
- FS::BindFragInfo(cmd, host_buffer->EmplaceUniform(fs_uniform));
+ FS::BindFragInfo(pass, host_buffer->EmplaceUniform(fs_uniform));
- pass.AddCommand(std::move(cmd));
+ pass.Draw().ok();
host_buffer->Reset();
return true;
};
@@ -1239,12 +1216,10 @@
assert(pipeline && pipeline->IsValid());
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, "Box");
- cmd.pipeline = pipeline;
- cmd.stencil_reference = stencil_reference_read;
-
- cmd.BindVertices(vertex_buffer);
+ pass->SetCommandLabel("Box");
+ pass->SetPipeline(pipeline);
+ pass->SetStencilReference(stencil_reference_read);
+ pass->SetVertexBuffer(vertex_buffer);
VS::UniformBuffer uniforms;
EXPECT_EQ(pass->GetOrthographicTransform(),
@@ -1254,7 +1229,7 @@
if (mirror) {
uniforms.mvp = Matrix::MakeScale(Vector2(-1, 1)) * uniforms.mvp;
}
- VS::BindUniformBuffer(cmd, host_buffer->EmplaceUniform(uniforms));
+ VS::BindUniformBuffer(*pass, host_buffer->EmplaceUniform(uniforms));
FS::FrameInfo frame_info;
frame_info.current_time = GetSecondsElapsed();
@@ -1262,10 +1237,10 @@
frame_info.window_size.x = GetWindowSize().width;
frame_info.window_size.y = GetWindowSize().height;
- FS::BindFrameInfo(cmd, host_buffer->EmplaceUniform(frame_info));
- FS::BindContents1(cmd, boston, sampler);
- FS::BindContents2(cmd, bridge, sampler);
- if (!pass->AddCommand(std::move(cmd))) {
+ FS::BindFrameInfo(*pass, host_buffer->EmplaceUniform(frame_info));
+ FS::BindContents1(*pass, boston, sampler);
+ FS::BindContents2(*pass, bridge, sampler);
+ if (!pass->Draw().ok()) {
return false;
}
pass->EncodeCommands();
diff --git a/impeller/scene/geometry.cc b/impeller/scene/geometry.cc
index f8c2071..00f7cfb 100644
--- a/impeller/scene/geometry.cc
+++ b/impeller/scene/geometry.cc
@@ -13,6 +13,7 @@
#include "impeller/core/vertex_buffer.h"
#include "impeller/geometry/point.h"
#include "impeller/geometry/vector.h"
+#include "impeller/renderer/render_pass.h"
#include "impeller/renderer/vertex_buffer_builder.h"
#include "impeller/scene/importer/scene_flatbuffers.h"
#include "impeller/scene/shaders/skinned.vert.h"
@@ -162,13 +163,13 @@
void CuboidGeometry::BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const {
- command.BindVertices(
+ RenderPass& pass) const {
+ pass.SetVertexBuffer(
GetVertexBuffer(*scene_context.GetContext()->GetResourceAllocator()));
UnskinnedVertexShader::FrameInfo info;
info.mvp = transform;
- UnskinnedVertexShader::BindFrameInfo(command, buffer.EmplaceUniform(info));
+ UnskinnedVertexShader::BindFrameInfo(pass, buffer.EmplaceUniform(info));
}
//------------------------------------------------------------------------------
@@ -200,13 +201,13 @@
const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const {
- command.BindVertices(
+ RenderPass& pass) const {
+ pass.SetVertexBuffer(
GetVertexBuffer(*scene_context.GetContext()->GetResourceAllocator()));
UnskinnedVertexShader::FrameInfo info;
info.mvp = transform;
- UnskinnedVertexShader::BindFrameInfo(command, buffer.EmplaceUniform(info));
+ UnskinnedVertexShader::BindFrameInfo(pass, buffer.EmplaceUniform(info));
}
//------------------------------------------------------------------------------
@@ -237,8 +238,8 @@
const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const {
- command.BindVertices(
+ RenderPass& pass) const {
+ pass.SetVertexBuffer(
GetVertexBuffer(*scene_context.GetContext()->GetResourceAllocator()));
SamplerDescriptor sampler_desc;
@@ -249,7 +250,7 @@
sampler_desc.label = "NN Repeat";
SkinnedVertexShader::BindJointsTexture(
- command,
+ pass,
joints_texture_ ? joints_texture_ : scene_context.GetPlaceholderTexture(),
scene_context.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_desc));
@@ -259,7 +260,7 @@
info.enable_skinning = joints_texture_ ? 1 : 0;
info.joint_texture_size =
joints_texture_ ? joints_texture_->GetSize().width : 1;
- SkinnedVertexShader::BindFrameInfo(command, buffer.EmplaceUniform(info));
+ SkinnedVertexShader::BindFrameInfo(pass, buffer.EmplaceUniform(info));
}
// |Geometry|
diff --git a/impeller/scene/geometry.h b/impeller/scene/geometry.h
index de8f975..99aa6f2 100644
--- a/impeller/scene/geometry.h
+++ b/impeller/scene/geometry.h
@@ -15,6 +15,7 @@
#include "impeller/geometry/matrix.h"
#include "impeller/geometry/vector.h"
#include "impeller/renderer/command.h"
+#include "impeller/renderer/render_pass.h"
#include "impeller/scene/importer/scene_flatbuffers.h"
#include "impeller/scene/pipeline_key.h"
#include "impeller/scene/scene_context.h"
@@ -45,7 +46,7 @@
virtual void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const = 0;
+ RenderPass& pass) const = 0;
virtual void SetJointsTexture(const std::shared_ptr<Texture>& texture);
};
@@ -68,7 +69,7 @@
void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const override;
+ RenderPass& pass) const override;
private:
Vector3 size_;
@@ -96,7 +97,7 @@
void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const override;
+ RenderPass& pass) const override;
private:
VertexBuffer vertex_buffer_;
@@ -125,7 +126,7 @@
void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
const Matrix& transform,
- Command& command) const override;
+ RenderPass& pass) const override;
// |Geometry|
void SetJointsTexture(const std::shared_ptr<Texture>& texture) override;
diff --git a/impeller/scene/material.cc b/impeller/scene/material.cc
index 62e681b..5794c95 100644
--- a/impeller/scene/material.cc
+++ b/impeller/scene/material.cc
@@ -6,6 +6,7 @@
#include "impeller/base/validation.h"
#include "impeller/core/formats.h"
#include "impeller/core/sampler_descriptor.h"
+#include "impeller/renderer/render_pass.h"
#include "impeller/scene/importer/conversions.h"
#include "impeller/scene/importer/scene_flatbuffers.h"
#include "impeller/scene/pipeline_key.h"
@@ -108,12 +109,12 @@
// |Material|
void UnlitMaterial::BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
- Command& command) const {
+ RenderPass& pass) const {
// Uniform buffer.
UnlitFragmentShader::FragInfo info;
info.color = color_;
info.vertex_color_weight = vertex_color_weight_;
- UnlitFragmentShader::BindFragInfo(command, buffer.EmplaceUniform(info));
+ UnlitFragmentShader::BindFragInfo(pass, buffer.EmplaceUniform(info));
// Textures.
SamplerDescriptor sampler_descriptor;
@@ -122,7 +123,7 @@
sampler_descriptor.mag_filter = MinMagFilter::kLinear;
sampler_descriptor.mip_filter = MipFilter::kLinear;
UnlitFragmentShader::BindBaseColorTexture(
- command,
+ pass,
color_texture_ ? color_texture_ : scene_context.GetPlaceholderTexture(),
scene_context.GetContext()->GetSamplerLibrary()->GetSampler(
sampler_descriptor));
@@ -221,7 +222,7 @@
// |Material|
void PhysicallyBasedMaterial::BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
- Command& command) const {}
+ RenderPass& pass) const {}
} // namespace scene
} // namespace impeller
diff --git a/impeller/scene/material.h b/impeller/scene/material.h
index c8954d5..fda7880 100644
--- a/impeller/scene/material.h
+++ b/impeller/scene/material.h
@@ -61,7 +61,7 @@
virtual void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
- Command& command) const = 0;
+ RenderPass& pass) const = 0;
protected:
Scalar vertex_color_weight_ = 1;
@@ -88,7 +88,7 @@
// |Material|
void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
- Command& command) const override;
+ RenderPass& pass) const override;
private:
Color color_ = Color::White();
@@ -121,7 +121,7 @@
// |Material|
void BindToCommand(const SceneContext& scene_context,
HostBuffer& buffer,
- Command& command) const override;
+ RenderPass& pass) const override;
private:
Color albedo_ = Color::White();
diff --git a/impeller/scene/scene_encoder.cc b/impeller/scene/scene_encoder.cc
index 43c9c85..9f934f3 100644
--- a/impeller/scene/scene_encoder.cc
+++ b/impeller/scene/scene_encoder.cc
@@ -26,22 +26,23 @@
const SceneCommand& scene_command) {
auto& host_buffer = scene_context.GetTransientsBuffer();
- Command cmd;
- DEBUG_COMMAND_INFO(cmd, scene_command.label);
- cmd.stencil_reference =
- 0; // TODO(bdero): Configurable stencil ref per-command.
+ render_pass.SetCommandLabel(scene_command.label);
+ // TODO(bdero): Configurable stencil ref per-command.
+ render_pass.SetStencilReference(0);
- cmd.pipeline = scene_context.GetPipeline(
+ render_pass.SetPipeline(scene_context.GetPipeline(
PipelineKey{scene_command.geometry->GetGeometryType(),
scene_command.material->GetMaterialType()},
- scene_command.material->GetContextOptions(render_pass));
+ scene_command.material->GetContextOptions(render_pass)));
scene_command.geometry->BindToCommand(
scene_context, host_buffer, view_transform * scene_command.transform,
- cmd);
- scene_command.material->BindToCommand(scene_context, host_buffer, cmd);
+ render_pass);
+ scene_command.material->BindToCommand(scene_context, host_buffer,
+ render_pass);
- render_pass.AddCommand(std::move(cmd));
+ render_pass.Draw();
+ ;
}
std::shared_ptr<CommandBuffer> SceneEncoder::BuildSceneCommandBuffer(
diff --git a/lib/gpu/render_pass.cc b/lib/gpu/render_pass.cc
index a1b0fd8..35a4379 100644
--- a/lib/gpu/render_pass.cc
+++ b/lib/gpu/render_pass.cc
@@ -137,7 +137,40 @@
bool RenderPass::Draw() {
impeller::Command result = ProvisionRasterCommand();
- return render_pass_->AddCommand(std::move(result));
+#ifdef IMPELLER_DEBUG
+ render_pass_->SetCommandLabel(result.label);
+#endif // IMPELLER_DEBUG
+ render_pass_->SetPipeline(result.pipeline);
+ render_pass_->SetStencilReference(result.stencil_reference);
+ render_pass_->SetBaseVertex(result.base_vertex);
+ if (result.viewport.has_value()) {
+ render_pass_->SetViewport(result.viewport.value());
+ }
+ if (result.scissor.has_value()) {
+ render_pass_->SetScissor(result.scissor.value());
+ }
+ render_pass_->SetVertexBuffer(result.vertex_buffer);
+ for (const auto& buffer : result.vertex_bindings.buffers) {
+ render_pass_->BindResource(impeller::ShaderStage::kVertex, buffer.slot,
+ *buffer.view.GetMetadata(),
+ buffer.view.resource);
+ }
+ for (const auto& texture : result.vertex_bindings.sampled_images) {
+ render_pass_->BindResource(impeller::ShaderStage::kVertex, texture.slot,
+ *texture.texture.GetMetadata(),
+ texture.texture.resource, texture.sampler);
+ }
+ for (const auto& buffer : result.fragment_bindings.buffers) {
+ render_pass_->BindResource(impeller::ShaderStage::kFragment, buffer.slot,
+ *buffer.view.GetMetadata(),
+ buffer.view.resource);
+ }
+ for (const auto& texture : result.fragment_bindings.sampled_images) {
+ render_pass_->BindResource(impeller::ShaderStage::kFragment, texture.slot,
+ *texture.texture.GetMetadata(),
+ texture.texture.resource, texture.sampler);
+ }
+ return render_pass_->Draw().ok();
}
} // namespace gpu