diff --git a/impeller/entity/contents/atlas_contents.cc b/impeller/entity/contents/atlas_contents.cc index 206273d554765..b45b41ea5b727 100644 --- a/impeller/entity/contents/atlas_contents.cc +++ b/impeller/entity/contents/atlas_contents.cc @@ -235,13 +235,14 @@ bool AtlasContents::Render(const ContentContext& renderer, } } - 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 @@ bool AtlasContents::Render(const ContentContext& renderer, } 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 @@ bool AtlasContents::Render(const ContentContext& renderer, 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 @@ bool AtlasTextureContents::Render(const ContentContext& renderer, return true; } - Command cmd; - DEBUG_COMMAND_INFO(cmd, "AtlasTexture"); + pass.SetCommandLabel("AtlasTexture"); auto& host_buffer = renderer.GetTransientsBuffer(); @@ -407,14 +407,14 @@ bool AtlasTextureContents::Render(const ContentContext& renderer, 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 @@ bool AtlasColorContents::Render(const ContentContext& renderer, return true; } - Command cmd; - DEBUG_COMMAND_INFO(cmd, "AtlasColors"); + pass.SetCommandLabel("AtlasColors"); auto& host_buffer = renderer.GetTransientsBuffer(); @@ -496,12 +495,12 @@ bool AtlasColorContents::Render(const ContentContext& renderer, 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 16f10b0603fc4..873622256e79c 100644 --- a/impeller/entity/contents/clip_contents.cc +++ b/impeller/entity/contents/clip_contents.cc @@ -80,59 +80,58 @@ bool ClipContents::Render(const ContentContext& renderer, 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{} .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 @@ bool ClipRestoreContents::Render(const ContentContext& renderer, 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 @@ bool ClipRestoreContents::Render(const ContentContext& renderer, {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 e1789f1a9f78c..3bd8ab55e7fec 100644 --- a/impeller/entity/contents/conical_gradient_contents.cc +++ b/impeller/entity/contents/conical_gradient_contents.cc @@ -158,9 +158,8 @@ bool ConicalGradientContents::RenderTexture(const ContentContext& renderer, 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 @@ bool ConicalGradientContents::RenderTexture(const ContentContext& renderer, 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 6cec6f769b083..7cb8e403303ac 100644 --- a/impeller/entity/contents/filters/blend_filter_contents.cc +++ b/impeller/entity/contents/filters/blend_filter_contents.cc @@ -164,11 +164,12 @@ static std::optional AdvancedBlend( std::shared_ptr> 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 @@ static std::optional AdvancedBlend( } 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 @@ static std::optional AdvancedBlend( // 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 @@ static std::optional AdvancedBlend( 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 render_target = renderer.MakeSubpass( @@ -284,59 +284,60 @@ std::optional BlendFilterContents::CreateForegroundAdvancedBlend( }); 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 @@ std::optional BlendFilterContents::CreateForegroundAdvancedBlend( } 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 @@ std::optional BlendFilterContents::CreateForegroundAdvancedBlend( // 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 { @@ -454,14 +455,15 @@ std::optional BlendFilterContents::CreateForegroundPorterDuffBlend( }); 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 @@ std::optional BlendFilterContents::CreateForegroundPorterDuffBlend( } 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 @@ std::optional BlendFilterContents::CreateForegroundPorterDuffBlend( 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 @@ static std::optional PipelineBlend( 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 @@ static std::optional PipelineBlend( 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 vtx_builder; @@ -579,7 +582,7 @@ static std::optional PipelineBlend( {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 @@ static std::optional PipelineBlend( 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 @@ static std::optional PipelineBlend( 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 837416118210d..23d32def99b91 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 @@ std::optional ColorMatrixFilterContents::RenderFilter( 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 @@ std::optional ColorMatrixFilterContents::RenderFilter( {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 @@ std::optional ColorMatrixFilterContents::RenderFilter( ? 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 3115d9624b48b..ff394a98d0c05 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 @@ std::optional DirectionalGaussianBlurFilterContents::RenderFilter( 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 @@ std::optional DirectionalGaussianBlurFilterContents::RenderFilter( !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 c83f0e0d79647..22d49a3397a06 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 @@ SamplerDescriptor MakeSamplerDescriptor(MinMagFilter filter, } template -void BindVertices(Command& cmd, +void BindVertices(RenderPass& pass, HostBuffer& host_buffer, std::initializer_list&& vertices) { VertexBufferBuilder 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 @@ fml::StatusOr MakeDownsampleSubpass( [&](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(cmd, host_buffer, + BindVertices(pass, host_buffer, { {Point(0, 0), uvs[0]}, {Point(1, 0), uvs[1]}, @@ -101,15 +100,13 @@ fml::StatusOr MakeDownsampleSubpass( 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 render_target = renderer.MakeSubpass( "Gaussian Blur Filter", subpass_size, subpass_callback); @@ -141,19 +138,18 @@ fml::StatusOr MakeBlurSubpass( 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(cmd, host_buffer, + BindVertices(pass, host_buffer, { {blur_uvs[0], blur_uvs[0]}, {blur_uvs[1], blur_uvs[1]}, @@ -165,16 +161,14 @@ fml::StatusOr MakeBlurSubpass( 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 3c7d864b06dfa..e34bef9573dad 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 @@ std::optional LinearToSrgbFilterContents::RenderFilter( 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 @@ std::optional LinearToSrgbFilterContents::RenderFilter( }); 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 @@ std::optional LinearToSrgbFilterContents::RenderFilter( ? 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 9b7bb80e64d7b..5aa0e35ac9e7d 100644 --- a/impeller/entity/contents/filters/morphology_filter_contents.cc +++ b/impeller/entity/contents/filters/morphology_filter_contents.cc @@ -112,13 +112,12 @@ std::optional DirectionalMorphologyFilterContents::RenderFilter( .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 @@ std::optional DirectionalMorphologyFilterContents::RenderFilter( } 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 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 567e6c204a983..a5199835e0e30 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 @@ std::optional SrgbToLinearFilterContents::RenderFilter( 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 @@ std::optional SrgbToLinearFilterContents::RenderFilter( }); 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 @@ std::optional SrgbToLinearFilterContents::RenderFilter( : 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 78874b335ce4a..38c5f5d2992ed 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 @@ std::optional YUVToRGBFilterContents::RenderFilter( 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 @@ std::optional YUVToRGBFilterContents::RenderFilter( }); 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 @@ std::optional YUVToRGBFilterContents::RenderFilter( } 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 0b1e049aeef21..e9b767e02ddcb 100644 --- a/impeller/entity/contents/runtime_effect_contents.cc +++ b/impeller/entity/contents/runtime_effect_contents.cc @@ -137,10 +137,9 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, 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 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, 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 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, 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 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, auto buffer_view = renderer.GetTransientsBuffer().Emplace( reinterpret_cast(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 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, 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 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer, 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 89438851afaf0..57188666b04b1 100644 --- a/impeller/entity/contents/text_contents.cc +++ b/impeller/entity/contents/text_contents.cc @@ -91,16 +91,15 @@ bool TextContents::Render(const ContentContext& renderer, } // 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 @@ bool TextContents::Render(const ContentContext& renderer, 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 @@ bool TextContents::Render(const ContentContext& renderer, 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 @@ bool TextContents::Render(const ContentContext& renderer, } }); - 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 dddbf879d360b..9acffab9e88f4 100644 --- a/impeller/entity/contents/texture_contents.cc +++ b/impeller/entity/contents/texture_contents.cc @@ -146,12 +146,13 @@ bool TextureContents::Render(const ContentContext& renderer, 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 @@ bool TextureContents::Render(const ContentContext& renderer, #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 28d5af604b168..96ba9f359e0c8 100644 --- a/impeller/entity/contents/tiled_texture_contents.cc +++ b/impeller/entity/contents/tiled_texture_contents.cc @@ -141,14 +141,13 @@ bool TiledTextureContents::Render(const ContentContext& renderer, 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 @@ bool TiledTextureContents::Render(const ContentContext& renderer, #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(x_tile_mode_); frag_info.y_tile_mode = static_cast(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(x_tile_mode_); frag_info.y_tile_mode = static_cast(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 @@ bool TiledTextureContents::Render(const ContentContext& renderer, << "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 @@ bool TiledTextureContents::Render(const ContentContext& renderer, 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 0825ac6b0a33c..597a0546c2172 100644 --- a/impeller/entity/contents/vertices_contents.cc +++ b/impeller/entity/contents/vertices_contents.cc @@ -121,8 +121,7 @@ bool VerticesUVContents::Render(const ContentContext& renderer, return false; } - Command cmd; - DEBUG_COMMAND_INFO(cmd, "VerticesUV"); + pass.SetCommandLabel("VerticesUV"); auto& host_buffer = renderer.GetTransientsBuffer(); const std::shared_ptr& geometry = parent_.GetGeometry(); @@ -134,22 +133,22 @@ bool VerticesUVContents::Render(const ContentContext& renderer, 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 @@ bool VerticesColorContents::Render(const ContentContext& renderer, 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& geometry = parent_.GetGeometry(); @@ -184,19 +182,19 @@ bool VerticesColorContents::Render(const ContentContext& renderer, 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 520d2ee9ee3db..202cd771997ca 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -874,22 +874,21 @@ TEST_P(EntityTest, BlendingModeOptions) { }); } - 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 6d61f369f197e..ada717b742ea8 100644 --- a/impeller/playground/imgui/imgui_impl_impeller.cc +++ b/impeller/playground/imgui/imgui_impl_impeller.cc @@ -236,17 +236,13 @@ void ImGui_ImplImpeller_RenderDrawData(ImDrawData* draw_data, 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 @@ void ImGui_ImplImpeller_RenderDrawData(ImDrawData* draw_data, 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 49bc9ea9a17e9..441edd9b0181a 100644 --- a/impeller/renderer/compute_subgroup_unittests.cc +++ b/impeller/renderer/compute_subgroup_unittests.cc @@ -133,9 +133,8 @@ TEST_P(ComputeSubgroupTest, PathPlayground) { 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 @@ TEST_P(ComputeSubgroupTest, PathPlayground) { options.stencil_compare = CompareFunction::kEqual; options.stencil_operation = StencilOperation::kIncrementClamp; - cmd.pipeline = renderer.GetSolidFillPipeline(options); + pass.SetPipeline(renderer.GetSolidFillPipeline(options)); auto count = reinterpret_cast( 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 @@ TEST_P(ComputeSubgroupTest, PathPlayground) { 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 @@ TEST_P(ComputeSubgroupTest, LargePath) { 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 @@ TEST_P(ComputeSubgroupTest, LargePath) { options.stencil_compare = CompareFunction::kEqual; options.stencil_operation = StencilOperation::kIncrementClamp; - cmd.pipeline = renderer.GetSolidFillPipeline(options); + pass.SetPipeline(renderer.GetSolidFillPipeline(options)); auto count = reinterpret_cast( 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 @@ TEST_P(ComputeSubgroupTest, LargePath) { 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 @@ TEST_P(ComputeSubgroupTest, QuadAndCubicInOnePath) { 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 @@ TEST_P(ComputeSubgroupTest, QuadAndCubicInOnePath) { options.stencil_compare = CompareFunction::kEqual; options.stencil_operation = StencilOperation::kIncrementClamp; - cmd.pipeline = renderer.GetSolidFillPipeline(options); + pass.SetPipeline(renderer.GetSolidFillPipeline(options)); auto count = reinterpret_cast( 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 @@ TEST_P(ComputeSubgroupTest, QuadAndCubicInOnePath) { frame_info.mvp = pass.GetOrthographicTransform() * world_matrix; frame_info.color = Color::Red().Premultiply(); VS::BindFrameInfo( - cmd, renderer.GetTransientsBuffer().EmplaceUniform(frame_info)); - - if (!pass.AddCommand(std::move(cmd))) { - return false; - } + pass, renderer.GetTransientsBuffer().EmplaceUniform(frame_info)); - 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 b09503003c673..c2bd755c58f9b 100644 --- a/impeller/renderer/render_pass.h +++ b/impeller/renderer/render_pass.h @@ -53,17 +53,6 @@ class RenderPass : public ResourceBinder { commands_.reserve(command_count); } - //---------------------------------------------------------------------------- - /// @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( @@ -181,6 +170,17 @@ class RenderPass : public ResourceBinder { std::vector 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 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 60514ce234762..e36f6345c3adf 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/impeller/renderer/renderer_unittests.cc @@ -84,11 +84,9 @@ TEST_P(RendererTest, CanCreateBoxPrimitive) { 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 @@ TEST_P(RendererTest, CanCreateBoxPrimitive) { 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 @@ TEST_P(RendererTest, CanCreateBoxPrimitive) { 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 @@ TEST_P(RendererTest, CanRenderPerspectiveCube) { 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 @@ TEST_P(RendererTest, CanRenderPerspectiveCube) { 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 @@ TEST_P(RendererTest, CanRenderMultiplePrimitives) { 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); + 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::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); + FS::BindFrameInfo(pass, host_buffer->EmplaceUniform(frame_info)); + FS::BindContents1(pass, boston, sampler); + FS::BindContents2(pass, bridge, sampler); - for (size_t i = 0; i < 1; i++) { - for (size_t j = 0; j < 1; j++) { 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 @@ TEST_P(RendererTest, CanRenderToTexture) { 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 @@ TEST_P(RendererTest, CanRenderToTexture) { 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 @@ TEST_P(RendererTest, CanRenderInstanced) { .Get(); ASSERT_TRUE(pipeline && pipeline->IsValid()); - Command cmd; - cmd.pipeline = pipeline; - DEBUG_COMMAND_INFO(cmd, "InstancedDraw"); - static constexpr size_t kInstancesCount = 5u; VS::InstanceInfo instances; for (size_t i = 0; i < kInstancesCount; i++) { @@ -439,17 +421,20 @@ TEST_P(RendererTest, CanRenderInstanced) { 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 @@ TEST_P(RendererTest, CanBlitTextureToTexture) { } 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 @@ TEST_P(RendererTest, CanBlitTextureToBuffer) { } 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 @@ TEST_P(RendererTest, CanBlitTextureToBuffer) { 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 @@ TEST_P(RendererTest, CanGenerateMipmaps) { } 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 @@ TEST_P(RendererTest, TheImpeller) { 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 builder; builder.AddVertices({{Point()}, {Point(0, size.height)}, @@ -874,21 +852,21 @@ TEST_P(RendererTest, TheImpeller) { {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 @@ TEST_P(RendererTest, ArrayUniforms) { 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 builder; builder.AddVertices({{Point()}, {Point(0, size.height)}, @@ -923,13 +900,13 @@ TEST_P(RendererTest, ArrayUniforms) { {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 @@ TEST_P(RendererTest, ArrayUniforms) { 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 @@ TEST_P(RendererTest, InactiveUniforms) { 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 builder; builder.AddVertices({{Point()}, {Point(0, size.height)}, @@ -981,19 +958,19 @@ TEST_P(RendererTest, InactiveUniforms) { {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 @@ TEST_P(RendererTest, StencilMask) { 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 @@ TEST_P(RendererTest, StencilMask) { 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 @@ TEST_P(RendererTest, StencilMask) { 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 f8c2071839ac5..00f7cfb665bb0 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 @@ VertexBuffer CuboidGeometry::GetVertexBuffer(Allocator& allocator) const { 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 @@ void UnskinnedVertexBufferGeometry::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)); } //------------------------------------------------------------------------------ @@ -237,8 +238,8 @@ void SkinnedVertexBufferGeometry::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())); SamplerDescriptor sampler_desc; @@ -249,7 +250,7 @@ void SkinnedVertexBufferGeometry::BindToCommand( 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 @@ void SkinnedVertexBufferGeometry::BindToCommand( 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 de8f975633ef5..99aa6f280a650 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 @@ class Geometry { 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); }; @@ -68,7 +69,7 @@ class CuboidGeometry final : public Geometry { 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 @@ class UnskinnedVertexBufferGeometry final : public Geometry { 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 @@ class SkinnedVertexBufferGeometry final : public Geometry { 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) override; diff --git a/impeller/scene/material.cc b/impeller/scene/material.cc index 62e681b61c769..5794c95425148 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 @@ MaterialType UnlitMaterial::GetMaterialType() const { // |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 @@ void UnlitMaterial::BindToCommand(const SceneContext& scene_context, 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 @@ MaterialType PhysicallyBasedMaterial::GetMaterialType() const { // |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 c8954d540aa2b..fda78807241bf 100644 --- a/impeller/scene/material.h +++ b/impeller/scene/material.h @@ -61,7 +61,7 @@ class Material { 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 @@ class UnlitMaterial final : public Material { // |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 @@ class PhysicallyBasedMaterial final : public Material { // |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 43c9c85af8caa..9f934f39e4fee 100644 --- a/impeller/scene/scene_encoder.cc +++ b/impeller/scene/scene_encoder.cc @@ -26,22 +26,23 @@ static void EncodeCommand(const SceneContext& scene_context, 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 SceneEncoder::BuildSceneCommandBuffer( diff --git a/lib/gpu/render_pass.cc b/lib/gpu/render_pass.cc index a1b0fd8fe7606..35a43793fb637 100644 --- a/lib/gpu/render_pass.cc +++ b/lib/gpu/render_pass.cc @@ -137,7 +137,40 @@ impeller::Command RenderPass::ProvisionRasterCommand() { 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