diff --git a/impeller/renderer/backend/gles/context_gles.cc b/impeller/renderer/backend/gles/context_gles.cc index c7564a750f867..2fa3ce9e0f1ab 100644 --- a/impeller/renderer/backend/gles/context_gles.cc +++ b/impeller/renderer/backend/gles/context_gles.cc @@ -70,6 +70,7 @@ ContextGLES::ContextGLES(std::unique_ptr gl, .SetSupportsFramebufferFetch(false) .SetDefaultColorFormat(PixelFormat::kR8G8B8A8UNormInt) .SetDefaultStencilFormat(PixelFormat::kS8UInt) + .SetDefaultDepthStencilFormat(PixelFormat::kD24UnormS8Uint) .SetSupportsCompute(false) .SetSupportsComputeSubgroups(false) .SetSupportsReadFromResolve(false) diff --git a/impeller/renderer/backend/metal/context_mtl.mm b/impeller/renderer/backend/metal/context_mtl.mm index 11faf74d96552..24b3a94b904e7 100644 --- a/impeller/renderer/backend/metal/context_mtl.mm +++ b/impeller/renderer/backend/metal/context_mtl.mm @@ -60,6 +60,7 @@ static bool DeviceSupportsComputeSubgroups(id device) { .SetSupportsFramebufferFetch(DeviceSupportsFramebufferFetch(device)) .SetDefaultColorFormat(color_format) .SetDefaultStencilFormat(PixelFormat::kS8UInt) + .SetDefaultDepthStencilFormat(PixelFormat::kD32FloatS8UInt) .SetSupportsCompute(true) .SetSupportsComputeSubgroups(DeviceSupportsComputeSubgroups(device)) .SetSupportsReadFromResolve(true) diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index 520e701bb4ed0..cc5ca77f6e5ea 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -249,11 +249,11 @@ static bool PhysicalDeviceSupportsRequiredFormats( const vk::PhysicalDevice& device) { const auto has_color_format = HasSuitableColorFormat(device, vk::Format::eB8G8R8A8Unorm); - const auto has_depth_stencil_format = + const auto has_stencil_format = HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint) || HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint) || HasSuitableDepthStencilFormat(device, vk::Format::eD24UnormS8Uint); - return has_color_format && has_depth_stencil_format; + return has_color_format && has_stencil_format; } static bool HasRequiredProperties(const vk::PhysicalDevice& physical_device) { @@ -332,18 +332,23 @@ bool CapabilitiesVK::HasExtension(const std::string& ext) const { } void CapabilitiesVK::SetOffscreenFormat(PixelFormat pixel_format) const { - color_format_ = pixel_format; + default_color_format_ = pixel_format; } bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { - if (HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint)) { - depth_stencil_format_ = PixelFormat::kS8UInt; - } else if (HasSuitableDepthStencilFormat(device, - vk::Format::eD32SfloatS8Uint)) { - depth_stencil_format_ = PixelFormat::kD32FloatS8UInt; + if (HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint)) { + default_depth_stencil_format_ = PixelFormat::kD32FloatS8UInt; } else if (HasSuitableDepthStencilFormat(device, vk::Format::eD24UnormS8Uint)) { - depth_stencil_format_ = PixelFormat::kD24UnormS8Uint; + default_depth_stencil_format_ = PixelFormat::kD24UnormS8Uint; + } else { + default_depth_stencil_format_ = PixelFormat::kUnknown; + } + + if (HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint)) { + default_stencil_format_ = PixelFormat::kS8UInt; + } else if (default_stencil_format_ != PixelFormat::kUnknown) { + default_stencil_format_ = default_depth_stencil_format_; } else { return false; } @@ -454,12 +459,17 @@ bool CapabilitiesVK::SupportsMemorylessTextures() const { // |Capabilities| PixelFormat CapabilitiesVK::GetDefaultColorFormat() const { - return color_format_; + return default_color_format_; } // |Capabilities| PixelFormat CapabilitiesVK::GetDefaultStencilFormat() const { - return depth_stencil_format_; + return default_stencil_format_; +} + +// |Capabilities| +PixelFormat CapabilitiesVK::GetDefaultDepthStencilFormat() const { + return default_depth_stencil_format_; } const vk::PhysicalDeviceProperties& diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.h b/impeller/renderer/backend/vulkan/capabilities_vk.h index 66344bd8598df..d6afdbfc37920 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.h +++ b/impeller/renderer/backend/vulkan/capabilities_vk.h @@ -96,12 +96,16 @@ class CapabilitiesVK final : public Capabilities, // |Capabilities| PixelFormat GetDefaultStencilFormat() const override; + // |Capabilities| + PixelFormat GetDefaultDepthStencilFormat() const override; + private: const bool enable_validations_; std::map> exts_; std::set optional_device_extensions_; - mutable PixelFormat color_format_ = PixelFormat::kUnknown; - PixelFormat depth_stencil_format_ = PixelFormat::kUnknown; + mutable PixelFormat default_color_format_ = PixelFormat::kUnknown; + PixelFormat default_stencil_format_ = PixelFormat::kUnknown; + PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown; vk::PhysicalDeviceProperties device_properties_; bool supports_compute_subgroups_ = false; bool supports_memoryless_textures_ = false; diff --git a/impeller/renderer/capabilities.cc b/impeller/renderer/capabilities.cc index 0457289f604e4..73ac155175c18 100644 --- a/impeller/renderer/capabilities.cc +++ b/impeller/renderer/capabilities.cc @@ -71,6 +71,11 @@ class StandardCapabilities final : public Capabilities { return default_stencil_format_; } + // |Capabilities| + PixelFormat GetDefaultDepthStencilFormat() const override { + return default_depth_stencil_format_; + } + bool SupportsMemorylessTextures() const override { return supports_memoryless_textures_; } @@ -88,7 +93,8 @@ class StandardCapabilities final : public Capabilities { bool supports_decal_tile_mode, bool supports_memoryless_textures, PixelFormat default_color_format, - PixelFormat default_stencil_format) + PixelFormat default_stencil_format, + PixelFormat default_depth_stencil_format) : supports_offscreen_msaa_(supports_offscreen_msaa), supports_ssbo_(supports_ssbo), supports_buffer_to_texture_blits_(supports_buffer_to_texture_blits), @@ -102,7 +108,8 @@ class StandardCapabilities final : public Capabilities { supports_decal_tile_mode_(supports_decal_tile_mode), supports_memoryless_textures_(supports_memoryless_textures), default_color_format_(default_color_format), - default_stencil_format_(default_stencil_format) {} + default_stencil_format_(default_stencil_format), + default_depth_stencil_format_(default_depth_stencil_format) {} friend class CapabilitiesBuilder; @@ -119,6 +126,7 @@ class StandardCapabilities final : public Capabilities { bool supports_memoryless_textures_ = false; PixelFormat default_color_format_ = PixelFormat::kUnknown; PixelFormat default_stencil_format_ = PixelFormat::kUnknown; + PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown; FML_DISALLOW_COPY_AND_ASSIGN(StandardCapabilities); }; @@ -190,6 +198,12 @@ CapabilitiesBuilder& CapabilitiesBuilder::SetDefaultStencilFormat( return *this; } +CapabilitiesBuilder& CapabilitiesBuilder::SetDefaultDepthStencilFormat( + PixelFormat value) { + default_depth_stencil_format_ = value; + return *this; +} + CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsDecalTileMode(bool value) { supports_decal_tile_mode_ = value; return *this; @@ -215,7 +229,8 @@ std::unique_ptr CapabilitiesBuilder::Build() { supports_decal_tile_mode_, // supports_memoryless_textures_, // default_color_format_.value_or(PixelFormat::kUnknown), // - default_stencil_format_.value_or(PixelFormat::kUnknown) // + default_stencil_format_.value_or(PixelFormat::kUnknown), // + default_depth_stencil_format_.value_or(PixelFormat::kUnknown) // )); } diff --git a/impeller/renderer/capabilities.h b/impeller/renderer/capabilities.h index 2b830f717e4d4..50f3eb8ac41aa 100644 --- a/impeller/renderer/capabilities.h +++ b/impeller/renderer/capabilities.h @@ -41,6 +41,8 @@ class Capabilities { virtual PixelFormat GetDefaultStencilFormat() const = 0; + virtual PixelFormat GetDefaultDepthStencilFormat() const = 0; + protected: Capabilities(); @@ -75,6 +77,8 @@ class CapabilitiesBuilder { CapabilitiesBuilder& SetDefaultStencilFormat(PixelFormat value); + CapabilitiesBuilder& SetDefaultDepthStencilFormat(PixelFormat value); + CapabilitiesBuilder& SetSupportsDecalTileMode(bool value); CapabilitiesBuilder& SetSupportsMemorylessTextures(bool value); @@ -95,6 +99,7 @@ class CapabilitiesBuilder { bool supports_memoryless_textures_ = false; std::optional default_color_format_ = std::nullopt; std::optional default_stencil_format_ = std::nullopt; + std::optional default_depth_stencil_format_ = std::nullopt; FML_DISALLOW_COPY_AND_ASSIGN(CapabilitiesBuilder); }; diff --git a/impeller/renderer/capabilities_unittests.cc b/impeller/renderer/capabilities_unittests.cc index db2ccf3f605e2..2fd9eca70aa32 100644 --- a/impeller/renderer/capabilities_unittests.cc +++ b/impeller/renderer/capabilities_unittests.cc @@ -30,5 +30,33 @@ CAPABILITY_TEST(SupportsReadFromResolve, false); CAPABILITY_TEST(SupportsDecalTileMode, false); CAPABILITY_TEST(SupportsMemorylessTextures, false); +TEST(CapabilitiesTest, DefaultColorFormat) { + auto defaults = CapabilitiesBuilder().Build(); + ASSERT_EQ(defaults->GetDefaultColorFormat(), PixelFormat::kUnknown); + auto mutated = CapabilitiesBuilder() + .SetDefaultColorFormat(PixelFormat::kB10G10R10A10XR) + .Build(); + ASSERT_EQ(mutated->GetDefaultColorFormat(), PixelFormat::kB10G10R10A10XR); +} + +TEST(CapabilitiesTest, DefaultStencilFormat) { + auto defaults = CapabilitiesBuilder().Build(); + ASSERT_EQ(defaults->GetDefaultStencilFormat(), PixelFormat::kUnknown); + auto mutated = CapabilitiesBuilder() + .SetDefaultStencilFormat(PixelFormat::kS8UInt) + .Build(); + ASSERT_EQ(mutated->GetDefaultStencilFormat(), PixelFormat::kS8UInt); +} + +TEST(CapabilitiesTest, DefaultDepthStencilFormat) { + auto defaults = CapabilitiesBuilder().Build(); + ASSERT_EQ(defaults->GetDefaultDepthStencilFormat(), PixelFormat::kUnknown); + auto mutated = CapabilitiesBuilder() + .SetDefaultDepthStencilFormat(PixelFormat::kD32FloatS8UInt) + .Build(); + ASSERT_EQ(mutated->GetDefaultDepthStencilFormat(), + PixelFormat::kD32FloatS8UInt); +} + } // namespace testing } // namespace impeller diff --git a/impeller/scene/scene_context.cc b/impeller/scene/scene_context.cc index dbd09eec0e48b..66c8b07db1989 100644 --- a/impeller/scene/scene_context.cc +++ b/impeller/scene/scene_context.cc @@ -13,18 +13,19 @@ namespace impeller { namespace scene { void SceneContextOptions::ApplyToPipelineDescriptor( + const Capabilities& capabilities, PipelineDescriptor& desc) const { DepthAttachmentDescriptor depth; depth.depth_compare = CompareFunction::kLess; depth.depth_write_enabled = true; desc.SetDepthStencilAttachmentDescriptor(depth); - desc.SetDepthPixelFormat(PixelFormat::kD32FloatS8UInt); + desc.SetDepthPixelFormat(capabilities.GetDefaultDepthStencilFormat()); StencilAttachmentDescriptor stencil; stencil.stencil_compare = CompareFunction::kAlways; stencil.depth_stencil_pass = StencilOperation::kKeep; desc.SetStencilAttachmentDescriptors(stencil); - desc.SetStencilPixelFormat(PixelFormat::kD32FloatS8UInt); + desc.SetStencilPixelFormat(capabilities.GetDefaultDepthStencilFormat()); desc.SetSampleCount(sample_count); desc.SetPrimitiveType(primitive_type); @@ -79,7 +80,7 @@ std::shared_ptr> SceneContext::GetPipeline( return nullptr; } if (auto found = pipelines_.find(key); found != pipelines_.end()) { - return found->second->GetPipeline(opts); + return found->second->GetPipeline(*context_, opts); } return nullptr; } diff --git a/impeller/scene/scene_context.h b/impeller/scene/scene_context.h index 40c0643d28f21..5b4463a059971 100644 --- a/impeller/scene/scene_context.h +++ b/impeller/scene/scene_context.h @@ -32,7 +32,8 @@ struct SceneContextOptions { } }; - void ApplyToPipelineDescriptor(PipelineDescriptor& desc) const; + void ApplyToPipelineDescriptor(const Capabilities& capabilities, + PipelineDescriptor& desc) const; }; class SceneContext { @@ -57,6 +58,7 @@ class SceneContext { virtual ~PipelineVariants() = default; virtual std::shared_ptr> GetPipeline( + Context& context, SceneContextOptions opts) = 0; }; @@ -66,12 +68,14 @@ class SceneContext { explicit PipelineVariantsT(Context& context) { auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context); // Apply default ContentContextOptions to the descriptor. - SceneContextOptions{}.ApplyToPipelineDescriptor(*desc); + SceneContextOptions{}.ApplyToPipelineDescriptor( + *context.GetCapabilities(), *desc); variants_[{}] = std::make_unique(context, desc); }; - // |PipelineCollection| + // |PipelineVariants| std::shared_ptr> GetPipeline( + Context& context, SceneContextOptions opts) { if (auto found = variants_.find(opts); found != variants_.end()) { return found->second->WaitAndGet(); @@ -83,8 +87,9 @@ class SceneContext { FML_CHECK(prototype != variants_.end()); auto variant_future = prototype->second->WaitAndGet()->CreateVariant( - [&opts, variants_count = variants_.size()](PipelineDescriptor& desc) { - opts.ApplyToPipelineDescriptor(desc); + [&context, &opts, + variants_count = variants_.size()](PipelineDescriptor& desc) { + opts.ApplyToPipelineDescriptor(*context.GetCapabilities(), desc); desc.SetLabel( SPrintF("%s V#%zu", desc.GetLabel().c_str(), variants_count)); });