From 2af0fe76af11333f650159ee6d5a0ec8ca757766 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 24 Aug 2022 21:53:59 -0700 Subject: [PATCH] [Impeller] Render on Simulator --- flow/surface_frame.cc | 5 ++- flow/surface_frame_unittests.cc | 12 +++++++ .../renderer/backend/metal/render_pass_mtl.mm | 31 +++++++++++++------ impeller/renderer/platform.h | 2 +- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/flow/surface_frame.cc b/flow/surface_frame.cc index c8a6bbf6bc3c1..d3133daa07385 100644 --- a/flow/surface_frame.cc +++ b/flow/surface_frame.cc @@ -6,6 +6,7 @@ #include +#include "flutter/flow/layers/layer.h" #include "flutter/fml/logging.h" #include "flutter/fml/trace_event.h" #include "third_party/skia/include/utils/SkNWayCanvas.h" @@ -25,9 +26,7 @@ SurfaceFrame::SurfaceFrame(sk_sp surface, if (surface_) { canvas_ = surface_->getCanvas(); } else if (display_list_fallback) { - dl_recorder_ = sk_make_sp( - SkRect::MakeWH(std::numeric_limits::max(), - std::numeric_limits::max())); + dl_recorder_ = sk_make_sp(kGiantRect); canvas_ = dl_recorder_.get(); } } diff --git a/flow/surface_frame_unittests.cc b/flow/surface_frame_unittests.cc index c7a0bc5132af9..7bc4d07ef564f 100644 --- a/flow/surface_frame_unittests.cc +++ b/flow/surface_frame_unittests.cc @@ -20,4 +20,16 @@ TEST(FlowTest, SurfaceFrameDoesNotSubmitInDtor) { surface_frame.reset(); } +TEST(FlowTest, SurfaceFrameDoesNotHaveEmptyCanvas) { + SurfaceFrame::FramebufferInfo framebuffer_info; + SurfaceFrame frame( + /*surface=*/nullptr, framebuffer_info, + /*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; }, + /*context_result=*/nullptr, /*display_list_fallback=*/true); + + EXPECT_FALSE(frame.SkiaCanvas()->getLocalClipBounds().isEmpty()); + EXPECT_FALSE( + frame.SkiaCanvas()->quickReject(SkRect::MakeLTRB(10, 10, 50, 50))); +} + } // namespace flutter diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index c277bbb50569b..e8c825af36b2b 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -493,18 +493,31 @@ static bool Bind(PassBindingsCache& pass, if (!mtl_index_buffer) { return false; } + FML_DCHECK(command.index_count * (command.index_type == IndexType::k16bit ? 2 : 4) == command.index_buffer.range.length); - // Returns void. All error checking must be done by this point. - [encoder drawIndexedPrimitives:ToMTLPrimitiveType(command.primitive_type) - indexCount:command.index_count - indexType:ToMTLIndexType(command.index_type) - indexBuffer:mtl_index_buffer - indexBufferOffset:command.index_buffer.range.offset - instanceCount:command.instance_count - baseVertex:command.base_vertex - baseInstance:0u]; + + if (command.instance_count != 1u) { +#if TARGET_OS_SIMULATOR + VALIDATION_LOG << "iOS Simulator does not support instanced rendering."; + return false; +#endif + [encoder drawIndexedPrimitives:ToMTLPrimitiveType(command.primitive_type) + indexCount:command.index_count + indexType:ToMTLIndexType(command.index_type) + indexBuffer:mtl_index_buffer + indexBufferOffset:command.index_buffer.range.offset + instanceCount:command.instance_count + baseVertex:command.base_vertex + baseInstance:0u]; + } else { + [encoder drawIndexedPrimitives:ToMTLPrimitiveType(command.primitive_type) + indexCount:command.index_count + indexType:ToMTLIndexType(command.index_type) + indexBuffer:mtl_index_buffer + indexBufferOffset:command.index_buffer.range.offset]; + } } return true; } diff --git a/impeller/renderer/platform.h b/impeller/renderer/platform.h index c2783d7581e08..6076e810b3d17 100644 --- a/impeller/renderer/platform.h +++ b/impeller/renderer/platform.h @@ -12,7 +12,7 @@ namespace impeller { constexpr size_t DefaultUniformAlignment() { -#if FML_OS_IOS +#if FML_OS_IOS && !TARGET_OS_SIMULATOR return 16u; #elif FML_OS_MACOSX return 256u;