From cce2ee3fb81cf896fbace27a94b3f6cae4ddd5e7 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 25 Aug 2022 07:21:23 -0700 Subject: [PATCH] [Impeller] Render on Simulator (flutter/engine#35692) --- engine/src/flutter/flow/surface_frame.cc | 5 ++- .../flutter/flow/surface_frame_unittests.cc | 12 +++++++ .../renderer/backend/metal/render_pass_mtl.mm | 31 +++++++++++++------ .../src/flutter/impeller/renderer/platform.h | 2 +- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/engine/src/flutter/flow/surface_frame.cc b/engine/src/flutter/flow/surface_frame.cc index c8a6bbf6bc3..d3133daa073 100644 --- a/engine/src/flutter/flow/surface_frame.cc +++ b/engine/src/flutter/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/engine/src/flutter/flow/surface_frame_unittests.cc b/engine/src/flutter/flow/surface_frame_unittests.cc index c7a0bc5132a..7bc4d07ef56 100644 --- a/engine/src/flutter/flow/surface_frame_unittests.cc +++ b/engine/src/flutter/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/engine/src/flutter/impeller/renderer/backend/metal/render_pass_mtl.mm b/engine/src/flutter/impeller/renderer/backend/metal/render_pass_mtl.mm index c277bbb5056..e8c825af36b 100644 --- a/engine/src/flutter/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/engine/src/flutter/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -493,18 +493,31 @@ bool RenderPassMTL::EncodeCommands(const std::shared_ptr& allocator, 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/engine/src/flutter/impeller/renderer/platform.h b/engine/src/flutter/impeller/renderer/platform.h index c2783d7581e..6076e810b3d 100644 --- a/engine/src/flutter/impeller/renderer/platform.h +++ b/engine/src/flutter/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;