From 5052f30d24758eaaba58b89037af63167536804e Mon Sep 17 00:00:00 2001 From: ColdPaleLight Date: Thu, 23 Jun 2022 18:34:46 +0800 Subject: [PATCH 1/2] [Impeller] Metal:Reset Encoder viewport and scissor rect in case the command specifies no opinion --- .../renderer/backend/metal/render_pass_mtl.mm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index 2d0876dcbdf76..474dd62eb7a97 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -440,6 +440,16 @@ static bool Bind(PassBindingsCache& pass, .zfar = v.depth_range.z_far, }; [encoder setViewport:viewport]; + } else { + MTLViewport viewport = { + .originX = 0.0, + .originY = 0.0, + .width = static_cast(GetRenderTargetSize().width), + .height = static_cast(GetRenderTargetSize().height), + .znear = 0.0, + .zfar = 1.0, + }; + [encoder setViewport:viewport]; } if (command.scissor.has_value()) { auto s = command.scissor.value(); @@ -450,6 +460,13 @@ static bool Bind(PassBindingsCache& pass, .height = static_cast(s.size.height), }; [encoder setScissorRect:scissor]; + } else { + MTLScissorRect scissor = { + .x = 0, + .y = 0, + .width = static_cast(GetRenderTargetSize().width), + .height = static_cast(GetRenderTargetSize().height)}; + [encoder setScissorRect:scissor]; } if (!bind_stage_resources(command.vertex_bindings, ShaderStage::kVertex)) { return false; From 3f9a428f7f01d519cb6744b947e8cd9d03894ac7 Mon Sep 17 00:00:00 2001 From: ColdPaleLight Date: Fri, 24 Jun 2022 10:56:55 +0800 Subject: [PATCH 2/2] clean code --- .../renderer/backend/metal/render_pass_mtl.mm | 61 +++++++------------ 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index 474dd62eb7a97..a257754b4c04f 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -429,45 +429,28 @@ static bool Bind(PassBindingsCache& pass, : MTLWindingCounterClockwise]; [encoder setCullMode:ToMTLCullMode(command.cull_mode)]; [encoder setStencilReferenceValue:command.stencil_reference]; - if (command.viewport.has_value()) { - auto v = command.viewport.value(); - MTLViewport viewport = { - .originX = v.rect.origin.x, - .originY = v.rect.origin.y, - .width = v.rect.size.width, - .height = v.rect.size.height, - .znear = v.depth_range.z_near, - .zfar = v.depth_range.z_far, - }; - [encoder setViewport:viewport]; - } else { - MTLViewport viewport = { - .originX = 0.0, - .originY = 0.0, - .width = static_cast(GetRenderTargetSize().width), - .height = static_cast(GetRenderTargetSize().height), - .znear = 0.0, - .zfar = 1.0, - }; - [encoder setViewport:viewport]; - } - if (command.scissor.has_value()) { - auto s = command.scissor.value(); - MTLScissorRect scissor = { - .x = static_cast(s.origin.x), - .y = static_cast(s.origin.y), - .width = static_cast(s.size.width), - .height = static_cast(s.size.height), - }; - [encoder setScissorRect:scissor]; - } else { - MTLScissorRect scissor = { - .x = 0, - .y = 0, - .width = static_cast(GetRenderTargetSize().width), - .height = static_cast(GetRenderTargetSize().height)}; - [encoder setScissorRect:scissor]; - } + + auto v = command.viewport.value_or( + {.rect = Rect::MakeSize(Size(GetRenderTargetSize()))}); + MTLViewport viewport = { + .originX = v.rect.origin.x, + .originY = v.rect.origin.y, + .width = v.rect.size.width, + .height = v.rect.size.height, + .znear = v.depth_range.z_near, + .zfar = v.depth_range.z_far, + }; + [encoder setViewport:viewport]; + + auto s = command.scissor.value_or(IRect::MakeSize(GetRenderTargetSize())); + MTLScissorRect scissor = { + .x = static_cast(s.origin.x), + .y = static_cast(s.origin.y), + .width = static_cast(s.size.width), + .height = static_cast(s.size.height), + }; + [encoder setScissorRect:scissor]; + if (!bind_stage_resources(command.vertex_bindings, ShaderStage::kVertex)) { return false; }