From 545da740e0850e468ad4c4b57ab008a9be9136a1 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 18 Oct 2023 18:24:15 -0700 Subject: [PATCH 01/12] [Impeller] support native advanced blend equations. --- impeller/core/formats.h | 18 ++++-- impeller/entity/contents/content_context.cc | 16 +++--- impeller/entity/entity_pass.cc | 16 ++++-- .../backend/gles/capabilities_gles.cc | 4 ++ .../renderer/backend/gles/capabilities_gles.h | 3 + .../renderer/backend/metal/context_mtl.mm | 1 + .../backend/vulkan/capabilities_vk.cc | 4 ++ .../renderer/backend/vulkan/capabilities_vk.h | 3 + impeller/renderer/backend/vulkan/formats_vk.h | 56 ++++++++++++++++++- .../backend/vulkan/pipeline_library_vk.cc | 8 +++ impeller/renderer/capabilities.cc | 14 +++++ impeller/renderer/capabilities.h | 7 +++ 12 files changed, 131 insertions(+), 19 deletions(-) diff --git a/impeller/core/formats.h b/impeller/core/formats.h index 6cc151e81939c..d3463a593139c 100644 --- a/impeller/core/formats.h +++ b/impeller/core/formats.h @@ -460,6 +460,13 @@ struct ColorAttachmentDescriptor { BlendOperation alpha_blend_op = BlendOperation::kAdd; BlendFactor dst_alpha_blend_factor = BlendFactor::kOneMinusSourceAlpha; + /// @brief If the advanced blend override is specified, then all other fields + /// are ignored. + /// + /// This is only valid if the platform has native support for advanced + /// blend modes. + std::optional advanced_blend_override = std::nullopt; + std::underlying_type_t write_mask = static_cast(ColorWriteMask::kAll); @@ -472,14 +479,15 @@ struct ColorAttachmentDescriptor { src_alpha_blend_factor == o.src_alpha_blend_factor && // alpha_blend_op == o.alpha_blend_op && // dst_alpha_blend_factor == o.dst_alpha_blend_factor && // - write_mask == o.write_mask; + write_mask == o.write_mask && // + advanced_blend_override == o.advanced_blend_override; } constexpr size_t Hash() const { - return fml::HashCombine(format, blending_enabled, src_color_blend_factor, - color_blend_op, dst_color_blend_factor, - src_alpha_blend_factor, alpha_blend_op, - dst_alpha_blend_factor, write_mask); + return fml::HashCombine( + format, blending_enabled, src_color_blend_factor, color_blend_op, + dst_color_blend_factor, src_alpha_blend_factor, alpha_blend_op, + dst_alpha_blend_factor, write_mask, advanced_blend_override); } }; diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index 560c9d804800e..2cc95ec3b6b8c 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -23,11 +23,12 @@ namespace impeller { void ContentContextOptions::ApplyToPipelineDescriptor( PipelineDescriptor& desc) const { auto pipeline_blend = blend_mode; - if (blend_mode > Entity::kLastPipelineBlendMode) { - VALIDATION_LOG << "Cannot use blend mode " << static_cast(blend_mode) - << " as a pipeline blend."; - pipeline_blend = BlendMode::kSourceOver; - } + + // if (blend_mode > Entity::kLastPipelineBlendMode) { + // VALIDATION_LOG << "Cannot use blend mode " << static_cast(blend_mode) + // << " as a pipeline blend."; + // pipeline_blend = BlendMode::kSourceOver; + // } desc.SetSampleCount(sample_count); @@ -132,7 +133,9 @@ void ContentContextOptions::ApplyToPipelineDescriptor( color0.src_color_blend_factor = BlendFactor::kZero; break; default: - FML_UNREACHABLE(); + // This is an advanced blend, set the override. + color0.advanced_blend_override = blend_mode; + break; } desc.SetColorAttachmentDescriptor(0u, color0); @@ -149,7 +152,6 @@ void ContentContextOptions::ApplyToPipelineDescriptor( } desc.SetPrimitiveType(primitive_type); - desc.SetPolygonMode(wireframe ? PolygonMode::kLine : PolygonMode::kFill); } diff --git a/impeller/entity/entity_pass.cc b/impeller/entity/entity_pass.cc index 4d6897b5b3445..d0746b9a60aee 100644 --- a/impeller/entity/entity_pass.cc +++ b/impeller/entity/entity_pass.cc @@ -312,10 +312,12 @@ static EntityPassTarget CreateRenderTarget(ContentContext& renderer, } uint32_t EntityPass::GetTotalPassReads(ContentContext& renderer) const { - return renderer.GetDeviceCapabilities().SupportsFramebufferFetch() - ? backdrop_filter_reads_from_pass_texture_ - : backdrop_filter_reads_from_pass_texture_ + - advanced_blend_reads_from_pass_texture_; + if (renderer.GetDeviceCapabilities().SupportsFramebufferFetch() || + renderer.GetDeviceCapabilities().SupportsNativeAdvancedBlends()) { + return backdrop_filter_reads_from_pass_texture_; + } + return backdrop_filter_reads_from_pass_texture_ + + advanced_blend_reads_from_pass_texture_; } bool EntityPass::Render(ContentContext& renderer, @@ -934,7 +936,11 @@ bool EntityPass::OnRender( /// if (result.entity.GetBlendMode() > Entity::kLastPipelineBlendMode) { - if (renderer.GetDeviceCapabilities().SupportsFramebufferFetch()) { + if (renderer.GetDeviceCapabilities().SupportsNativeAdvancedBlends()) { + // If native support for advanced blends is present, pass the entity + // through as-is. + continue; + } else if (renderer.GetDeviceCapabilities().SupportsFramebufferFetch()) { auto src_contents = result.entity.GetContents(); auto contents = std::make_shared(); contents->SetChildContents(src_contents); diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc index 37bd3e665d90d..546a5f3152062 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/impeller/renderer/backend/gles/capabilities_gles.cc @@ -167,6 +167,10 @@ bool CapabilitiesGLES::SupportsDeviceTransientTextures() const { return false; } +bool CapabilitiesGLES::SupportsNativeAdvancedBlends() const { + return false; +} + PixelFormat CapabilitiesGLES::GetDefaultColorFormat() const { return PixelFormat::kR8G8B8A8UNormInt; } diff --git a/impeller/renderer/backend/gles/capabilities_gles.h b/impeller/renderer/backend/gles/capabilities_gles.h index 3bcd0cfd85d27..ef9d1b213eeeb 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.h +++ b/impeller/renderer/backend/gles/capabilities_gles.h @@ -106,6 +106,9 @@ class CapabilitiesGLES final // |Capabilities| bool SupportsDeviceTransientTextures() const override; + // |Capabilities| + bool SupportsNativeAdvancedBlends() const override; + // |Capabilities| PixelFormat GetDefaultColorFormat() const override; diff --git a/impeller/renderer/backend/metal/context_mtl.mm b/impeller/renderer/backend/metal/context_mtl.mm index 06fd34724685a..5e1a17e285f24 100644 --- a/impeller/renderer/backend/metal/context_mtl.mm +++ b/impeller/renderer/backend/metal/context_mtl.mm @@ -68,6 +68,7 @@ static bool DeviceSupportsComputeSubgroups(id device) { .SetSupportsReadFromResolve(true) .SetSupportsReadFromOnscreenTexture(true) .SetSupportsDeviceTransientTextures(true) + .SetSupportsNativeAdvancedBlends(false) .Build(); } diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index 52b39fc9bd860..7f056ddf6f1a8 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -455,6 +455,10 @@ bool CapabilitiesVK::SupportsDecalSamplerAddressMode() const { return true; } +bool CapabilitiesVK::SupportsNativeAdvancedBlends() const { + return false; +} + // |Capabilities| bool CapabilitiesVK::SupportsDeviceTransientTextures() const { return supports_device_transient_textures_; diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.h b/impeller/renderer/backend/vulkan/capabilities_vk.h index 34e763927d8db..30c49759f7414 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.h +++ b/impeller/renderer/backend/vulkan/capabilities_vk.h @@ -90,6 +90,9 @@ class CapabilitiesVK final : public Capabilities, // |Capabilities| bool SupportsDeviceTransientTextures() const override; + // |Capabilities| + bool SupportsNativeAdvancedBlends() const override; + // |Capabilities| PixelFormat GetDefaultColorFormat() const override; diff --git a/impeller/renderer/backend/vulkan/formats_vk.h b/impeller/renderer/backend/vulkan/formats_vk.h index a865659764655..2a05093127206 100644 --- a/impeller/renderer/backend/vulkan/formats_vk.h +++ b/impeller/renderer/backend/vulkan/formats_vk.h @@ -9,6 +9,9 @@ #include "impeller/core/formats.h" #include "impeller/core/shader_types.h" #include "impeller/renderer/backend/vulkan/vk.h" +#include "vulkan/vulkan.hpp" +#include "vulkan/vulkan_enums.hpp" +#include "vulkan/vulkan_structs.hpp" namespace impeller { @@ -70,6 +73,45 @@ constexpr vk::BlendOp ToVKBlendOp(BlendOperation op) { FML_UNREACHABLE(); } +constexpr vk::BlendOp ToAdvancedVKBlendOp(BlendMode blend_mode) { + switch (blend_mode) { + case BlendMode::kScreen: + return vk::BlendOp::eScreenEXT; + case BlendMode::kOverlay: + return vk::BlendOp::eOverlayEXT; + case BlendMode::kDarken: + return vk::BlendOp::eDarkenEXT; + case BlendMode::kLighten: + return vk::BlendOp::eLightenEXT; + case BlendMode::kColorDodge: + return vk::BlendOp::eColordodgeEXT; + case BlendMode::kColorBurn: + return vk::BlendOp::eColorburnEXT; + case BlendMode::kHardLight: + return vk::BlendOp::eHardlightEXT; + case BlendMode::kSoftLight: + return vk::BlendOp::eSoftlightEXT; + case BlendMode::kDifference: + return vk::BlendOp::eDifferenceEXT; + case BlendMode::kExclusion: + return vk::BlendOp::eExclusionEXT; + case BlendMode::kMultiply: + return vk::BlendOp::eMultiplyEXT; + case BlendMode::kHue: + return vk::BlendOp::eHslHueEXT; // Is this right? + case BlendMode::kSaturation: + return vk::BlendOp::eHslSaturationEXT; // Is this right? + case BlendMode::kColor: + return vk::BlendOp::eHslColorEXT; // Is this right? + case BlendMode::kLuminosity: + return vk::BlendOp::eHslLuminosityEXT; // Is this right? + break; + default: + break; + } + FML_UNREACHABLE(); +} + constexpr vk::ColorComponentFlags ToVKColorComponentFlags( std::underlying_type_t type) { using UnderlyingType = decltype(type); @@ -102,11 +144,21 @@ ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) { res.setBlendEnable(desc.blending_enabled); res.setSrcColorBlendFactor(ToVKBlendFactor(desc.src_color_blend_factor)); - res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op)); + if (desc.advanced_blend_override.has_value()) { + res.setColorBlendOp(ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); + } else { + res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op)); + } res.setDstColorBlendFactor(ToVKBlendFactor(desc.dst_color_blend_factor)); res.setSrcAlphaBlendFactor(ToVKBlendFactor(desc.src_alpha_blend_factor)); - res.setAlphaBlendOp(ToVKBlendOp(desc.alpha_blend_op)); + + if (desc.advanced_blend_override.has_value()) { + res.setAlphaBlendOp(ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); + } else { + res.setAlphaBlendOp(ToVKBlendOp(desc.alpha_blend_op)); + } + res.setDstAlphaBlendFactor(ToVKBlendFactor(desc.dst_alpha_blend_factor)); res.setColorWriteMask(ToVKColorComponentFlags(desc.write_mask)); diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index 830d2d08120e1..4ff511a5f629e 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -335,6 +335,14 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( blend_state.setAttachments(attachment_blend_state); pipeline_info.setPColorBlendState(&blend_state); + vk::PipelineColorBlendAdvancedStateCreateInfoEXT state; + if (desc.GetColorAttachmentDescriptors().find(0u)->second.advanced_blend_override.has_value()) { + state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno + state.setSrcPremultiplied(true); // double check + state.setDstPremultiplied(true); + blend_state.pNext = &state; + } + std::shared_ptr strong_device = device_holder_.lock(); if (!strong_device) { return nullptr; diff --git a/impeller/renderer/capabilities.cc b/impeller/renderer/capabilities.cc index 928d96f73865d..8988a687b03a5 100644 --- a/impeller/renderer/capabilities.cc +++ b/impeller/renderer/capabilities.cc @@ -80,6 +80,10 @@ class StandardCapabilities final : public Capabilities { return supports_device_transient_textures_; } + bool SupportsNativeAdvancedBlends() const override { + return supports_native_advanced_blends_; + } + private: StandardCapabilities(bool supports_offscreen_msaa, bool supports_ssbo, @@ -92,6 +96,7 @@ class StandardCapabilities final : public Capabilities { bool supports_read_from_resolve, bool supports_decal_sampler_address_mode, bool supports_device_transient_textures, + bool supports_native_advanced_blends, PixelFormat default_color_format, PixelFormat default_stencil_format, PixelFormat default_depth_stencil_format) @@ -108,6 +113,7 @@ class StandardCapabilities final : public Capabilities { supports_decal_sampler_address_mode_( supports_decal_sampler_address_mode), supports_device_transient_textures_(supports_device_transient_textures), + supports_native_advanced_blends_(supports_native_advanced_blends), default_color_format_(default_color_format), default_stencil_format_(default_stencil_format), default_depth_stencil_format_(default_depth_stencil_format) {} @@ -125,6 +131,7 @@ class StandardCapabilities final : public Capabilities { bool supports_read_from_resolve_ = false; bool supports_decal_sampler_address_mode_ = false; bool supports_device_transient_textures_ = false; + bool supports_native_advanced_blends_ = false; PixelFormat default_color_format_ = PixelFormat::kUnknown; PixelFormat default_stencil_format_ = PixelFormat::kUnknown; PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown; @@ -217,6 +224,12 @@ CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsDeviceTransientTextures( return *this; } +CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsNativeAdvancedBlends( + bool value) { + supports_native_advanced_blends_ = value; + return *this; +} + std::unique_ptr CapabilitiesBuilder::Build() { return std::unique_ptr(new StandardCapabilities( // supports_offscreen_msaa_, // @@ -230,6 +243,7 @@ std::unique_ptr CapabilitiesBuilder::Build() { supports_read_from_resolve_, // supports_decal_sampler_address_mode_, // supports_device_transient_textures_, // + supports_native_advanced_blends_, // default_color_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 21085ae41994f..cb8ebe577495d 100644 --- a/impeller/renderer/capabilities.h +++ b/impeller/renderer/capabilities.h @@ -79,6 +79,10 @@ class Capabilities { /// @brief Whether the context backend supports `SamplerAddressMode::Decal`. virtual bool SupportsDecalSamplerAddressMode() const = 0; + /// @brief Whether the "non-pipeline" advanced blends are supported via + /// Additional blend configuration. + virtual bool SupportsNativeAdvancedBlends() const = 0; + /// @brief Whether the context backend supports allocating /// `StorageMode::kDeviceTransient` (aka "memoryless") textures, which /// are temporary textures kept in tile memory for the duration of the @@ -143,6 +147,8 @@ class CapabilitiesBuilder { CapabilitiesBuilder& SetSupportsDeviceTransientTextures(bool value); + CapabilitiesBuilder& SetSupportsNativeAdvancedBlends(bool value); + std::unique_ptr Build(); private: @@ -157,6 +163,7 @@ class CapabilitiesBuilder { bool supports_read_from_resolve_ = false; bool supports_decal_sampler_address_mode_ = false; bool supports_device_transient_textures_ = false; + bool supports_native_advanced_blends_ = false; std::optional default_color_format_ = std::nullopt; std::optional default_stencil_format_ = std::nullopt; std::optional default_depth_stencil_format_ = std::nullopt; From 51de8d7915cbea50b91e641878270c46530b4f04 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 18 Oct 2023 18:24:56 -0700 Subject: [PATCH 02/12] ++ --- impeller/entity/contents/content_context.cc | 3 ++- impeller/renderer/backend/vulkan/formats_vk.h | 14 ++++++++------ .../renderer/backend/vulkan/pipeline_library_vk.cc | 8 +++++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index 2cc95ec3b6b8c..44c496da27ffa 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -25,7 +25,8 @@ void ContentContextOptions::ApplyToPipelineDescriptor( auto pipeline_blend = blend_mode; // if (blend_mode > Entity::kLastPipelineBlendMode) { - // VALIDATION_LOG << "Cannot use blend mode " << static_cast(blend_mode) + // VALIDATION_LOG << "Cannot use blend mode " << + // static_cast(blend_mode) // << " as a pipeline blend."; // pipeline_blend = BlendMode::kSourceOver; // } diff --git a/impeller/renderer/backend/vulkan/formats_vk.h b/impeller/renderer/backend/vulkan/formats_vk.h index 2a05093127206..752d764d4483f 100644 --- a/impeller/renderer/backend/vulkan/formats_vk.h +++ b/impeller/renderer/backend/vulkan/formats_vk.h @@ -98,13 +98,13 @@ constexpr vk::BlendOp ToAdvancedVKBlendOp(BlendMode blend_mode) { case BlendMode::kMultiply: return vk::BlendOp::eMultiplyEXT; case BlendMode::kHue: - return vk::BlendOp::eHslHueEXT; // Is this right? + return vk::BlendOp::eHslHueEXT; // Is this right? case BlendMode::kSaturation: - return vk::BlendOp::eHslSaturationEXT; // Is this right? + return vk::BlendOp::eHslSaturationEXT; // Is this right? case BlendMode::kColor: - return vk::BlendOp::eHslColorEXT; // Is this right? + return vk::BlendOp::eHslColorEXT; // Is this right? case BlendMode::kLuminosity: - return vk::BlendOp::eHslLuminosityEXT; // Is this right? + return vk::BlendOp::eHslLuminosityEXT; // Is this right? break; default: break; @@ -145,7 +145,8 @@ ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) { res.setSrcColorBlendFactor(ToVKBlendFactor(desc.src_color_blend_factor)); if (desc.advanced_blend_override.has_value()) { - res.setColorBlendOp(ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); + res.setColorBlendOp( + ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); } else { res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op)); } @@ -154,7 +155,8 @@ ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) { res.setSrcAlphaBlendFactor(ToVKBlendFactor(desc.src_alpha_blend_factor)); if (desc.advanced_blend_override.has_value()) { - res.setAlphaBlendOp(ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); + res.setAlphaBlendOp( + ToAdvancedVKBlendOp(desc.advanced_blend_override.value())); } else { res.setAlphaBlendOp(ToVKBlendOp(desc.alpha_blend_op)); } diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index 4ff511a5f629e..4b52183d32715 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -336,9 +336,11 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( pipeline_info.setPColorBlendState(&blend_state); vk::PipelineColorBlendAdvancedStateCreateInfoEXT state; - if (desc.GetColorAttachmentDescriptors().find(0u)->second.advanced_blend_override.has_value()) { - state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno - state.setSrcPremultiplied(true); // double check + if (desc.GetColorAttachmentDescriptors() + .find(0u) + ->second.advanced_blend_override.has_value()) { + state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno + state.setSrcPremultiplied(true); // double check state.setDstPremultiplied(true); blend_state.pNext = &state; } From d8ce49cfd89a3f2ce3155b7f64dba26d0e5d5077 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 19 Oct 2023 14:27:38 -0700 Subject: [PATCH 03/12] ++ --- .../backend/vulkan/capabilities_vk.cc | 23 +++++++++++++++---- .../renderer/backend/vulkan/capabilities_vk.h | 3 +++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index 7f056ddf6f1a8..7a1c05c2857d0 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -9,6 +9,8 @@ #include "impeller/base/validation.h" #include "impeller/core/formats.h" #include "impeller/renderer/backend/vulkan/vk.h" +#include "vulkan/vulkan_core.h" +#include "vulkan/vulkan_structs.hpp" namespace impeller { @@ -156,6 +158,8 @@ static const char* GetDeviceExtensionName(OptionalDeviceExtensionVK ext) { switch (ext) { case OptionalDeviceExtensionVK::kEXTPipelineCreationFeedback: return VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME; + case OptionalDeviceExtensionVK::kEXTBlendOperationAdvanced: + return VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME; case OptionalDeviceExtensionVK::kLast: return "Unknown"; } @@ -182,6 +186,7 @@ static std::optional> GetSupportedDeviceExtensions( std::set exts; for (const auto& device_extension : device_extensions.value) { + FML_LOG(ERROR) << "EXT: " << device_extension.extensionName; exts.insert(device_extension.extensionName); }; @@ -358,9 +363,9 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { device_properties_ = device.getProperties(); - auto physical_properties_2 = - device.getProperties2(); + auto physical_properties_2 = device.getProperties2< + vk::PhysicalDeviceProperties2, vk::PhysicalDeviceSubgroupProperties, + vk::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>(); // Currently shaders only want access to arithmetic subgroup features. // If that changes this needs to get updated, and so does Metal (which right @@ -401,6 +406,16 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { }); } + supports_native_advanced_blends_ = + physical_properties_2 + .get() + .advancedBlendAllOperations; + FML_LOG(ERROR) + << physical_properties_2 + .get() + .advancedBlendAllOperations; + FML_LOG(ERROR) << "Supports advanced blends: " + << supports_native_advanced_blends_; return true; } @@ -456,7 +471,7 @@ bool CapabilitiesVK::SupportsDecalSamplerAddressMode() const { } bool CapabilitiesVK::SupportsNativeAdvancedBlends() const { - return false; + return supports_native_advanced_blends_; } // |Capabilities| diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.h b/impeller/renderer/backend/vulkan/capabilities_vk.h index 30c49759f7414..87ceb335b1ed6 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.h +++ b/impeller/renderer/backend/vulkan/capabilities_vk.h @@ -21,6 +21,8 @@ class ContextVK; enum class OptionalDeviceExtensionVK : uint32_t { // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_pipeline_creation_feedback.html kEXTPipelineCreationFeedback, + // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_blend_operation_advanced.html + kEXTBlendOperationAdvanced, kLast, }; @@ -112,6 +114,7 @@ class CapabilitiesVK final : public Capabilities, vk::PhysicalDeviceProperties device_properties_; bool supports_compute_subgroups_ = false; bool supports_device_transient_textures_ = false; + bool supports_native_advanced_blends_ = false; bool is_valid_ = false; bool HasExtension(const std::string& ext) const; From 7b0f81895838f67ef8d69c4aa36106bffc9fd72c Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 20 Oct 2023 08:22:27 -0700 Subject: [PATCH 04/12] ++ --- impeller/compiler/compiler.cc | 6 ++ impeller/entity/contents/content_context.cc | 1 + impeller/entity/entity_pass.cc | 1 - .../backend/gles/capabilities_gles.cc | 5 +- .../renderer/backend/gles/capabilities_gles.h | 1 + .../renderer/backend/gles/proc_table_gles.h | 1 + .../renderer/backend/gles/render_pass_gles.cc | 93 +++++++++++++++++-- 7 files changed, 96 insertions(+), 12 deletions(-) diff --git a/impeller/compiler/compiler.cc b/impeller/compiler/compiler.cc index fa8cbc865d658..bdafb2e15731b 100644 --- a/impeller/compiler/compiler.cc +++ b/impeller/compiler/compiler.cc @@ -159,6 +159,12 @@ static CompilerBackend CreateGLSLCompiler(const spirv_cross::ParsedIR& ir, source_options.type == SourceType::kFragmentShader) { gl_compiler->remap_ext_framebuffer_fetch(0, 0, true); } + if (source_options.type == SourceType::kFragmentShader) { + gl_compiler->add_header_line( + "#ifdef GL_KHR_blend_equation_advanced\n" + "layout(blend_support_all_equations) out;\n" + "#endif\n"); + } gl_compiler->set_variable_type_remap_callback( [&](const spirv_cross::SPIRType& type, const std::string& var_name, std::string& name_of_type) { diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index 44c496da27ffa..a283fa3cd3d86 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -135,6 +135,7 @@ void ContentContextOptions::ApplyToPipelineDescriptor( break; default: // This is an advanced blend, set the override. + FML_LOG(ERROR) << "advanced blend set override"; color0.advanced_blend_override = blend_mode; break; } diff --git a/impeller/entity/entity_pass.cc b/impeller/entity/entity_pass.cc index d0746b9a60aee..c6631307233d8 100644 --- a/impeller/entity/entity_pass.cc +++ b/impeller/entity/entity_pass.cc @@ -939,7 +939,6 @@ bool EntityPass::OnRender( if (renderer.GetDeviceCapabilities().SupportsNativeAdvancedBlends()) { // If native support for advanced blends is present, pass the entity // through as-is. - continue; } else if (renderer.GetDeviceCapabilities().SupportsFramebufferFetch()) { auto src_contents = result.entity.GetContents(); auto contents = std::make_shared(); diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc index 546a5f3152062..1d137a67c96ab 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/impeller/renderer/backend/gles/capabilities_gles.cc @@ -106,6 +106,9 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) { gl.GetDescription()->HasExtension(kOESTextureBorderClampExt)) { supports_decal_sampler_address_mode_ = true; } + + supports_native_advanced_blend_ = gl.GetDescription()->HasExtension("GL_KHR_blend_equation_advanced"); + FML_LOG(ERROR) << "supports native advanced blend: " << supports_native_advanced_blend_; } size_t CapabilitiesGLES::GetMaxTextureUnits(ShaderStage stage) const { @@ -168,7 +171,7 @@ bool CapabilitiesGLES::SupportsDeviceTransientTextures() const { } bool CapabilitiesGLES::SupportsNativeAdvancedBlends() const { - return false; + return supports_native_advanced_blend_; } PixelFormat CapabilitiesGLES::GetDefaultColorFormat() const { diff --git a/impeller/renderer/backend/gles/capabilities_gles.h b/impeller/renderer/backend/gles/capabilities_gles.h index ef9d1b213eeeb..a601cf0280692 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.h +++ b/impeller/renderer/backend/gles/capabilities_gles.h @@ -121,6 +121,7 @@ class CapabilitiesGLES final private: bool supports_framebuffer_fetch_ = false; bool supports_decal_sampler_address_mode_ = false; + bool supports_native_advanced_blend_ = false; }; } // namespace impeller diff --git a/impeller/renderer/backend/gles/proc_table_gles.h b/impeller/renderer/backend/gles/proc_table_gles.h index bbf94a23ea985..5033558c0371c 100644 --- a/impeller/renderer/backend/gles/proc_table_gles.h +++ b/impeller/renderer/backend/gles/proc_table_gles.h @@ -111,6 +111,7 @@ struct GLProc { PROC(BindTexture); \ PROC(BlendEquationSeparate); \ PROC(BlendFuncSeparate); \ + PROC(BlendEquation); \ PROC(BufferData); \ PROC(CheckFramebufferStatus); \ PROC(Clear); \ diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index 4816a2973b0da..d1f50648cae4e 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -4,9 +4,12 @@ #include "impeller/renderer/backend/gles/render_pass_gles.h" +#include "GLES3/gl3.h" #include "flutter/fml/trace_event.h" #include "fml/closure.h" +#include "fml/logging.h" #include "impeller/base/validation.h" +#include "impeller/geometry/color.h" #include "impeller/renderer/backend/gles/device_buffer_gles.h" #include "impeller/renderer/backend/gles/formats_gles.h" #include "impeller/renderer/backend/gles/pipeline_gles.h" @@ -34,20 +37,90 @@ void RenderPassGLES::OnSetLabel(std::string label) { label_ = std::move(label); } +#define MULTIPLY_KHR 0x9294 +#define SCREEN_KHR 0x9295 +#define OVERLAY_KHR 0x9296 +#define DARKEN_KHR 0x9297 +#define LIGHTEN_KHR 0x9298 +#define COLORDODGE_KHR 0x9299 +#define COLORBURN_KHR 0x929A +#define HARDLIGHT_KHR 0x929B +#define SOFTLIGHT_KHR 0x929C +#define DIFFERENCE_KHR 0x929E +#define EXCLUSION_KHR 0x92A0 +#define HSL_HUE_KHR 0x92AD +#define HSL_SATURATION_KHR 0x92AE +#define HSL_COLOR_KHR 0x92AF +#define HSL_LUMINOSITY_KHR 0x92B0 + +GLenum AdvancedBlendToBlendFactor(BlendMode blend_mode) { + switch (blend_mode) { + case BlendMode::kScreen: + return SCREEN_KHR; + case BlendMode::kOverlay: + return OVERLAY_KHR; + case BlendMode::kDarken: + return DARKEN_KHR; + case BlendMode::kLighten: + return LIGHTEN_KHR; + case BlendMode::kColorDodge: + return COLORDODGE_KHR; + case BlendMode::kColorBurn: + return COLORBURN_KHR; + case BlendMode::kHardLight: + return HARDLIGHT_KHR; + case BlendMode::kSoftLight: + return SOFTLIGHT_KHR; + case BlendMode::kDifference: + return DIFFERENCE_KHR; + case BlendMode::kExclusion: + return EXCLUSION_KHR; + case BlendMode::kMultiply: + return MULTIPLY_KHR; + case BlendMode::kHue: + return HSL_HUE_KHR; + case BlendMode::kSaturation: + return HSL_SATURATION_KHR; + case BlendMode::kColor: + return HSL_COLOR_KHR; + case BlendMode::kLuminosity: + case BlendMode::kClear: + case BlendMode::kSource: + case BlendMode::kDestination: + case BlendMode::kSourceOver: + case BlendMode::kDestinationOver: + case BlendMode::kSourceIn: + case BlendMode::kDestinationIn: + case BlendMode::kSourceOut: + case BlendMode::kDestinationOut: + case BlendMode::kSourceATop: + case BlendMode::kDestinationATop: + case BlendMode::kXor: + case BlendMode::kPlus: + case BlendMode::kModulate: + FML_UNREACHABLE(); + } +} + void ConfigureBlending(const ProcTableGLES& gl, const ColorAttachmentDescriptor* color) { if (color->blending_enabled) { gl.Enable(GL_BLEND); - gl.BlendFuncSeparate( - ToBlendFactor(color->src_color_blend_factor), // src color - ToBlendFactor(color->dst_color_blend_factor), // dst color - ToBlendFactor(color->src_alpha_blend_factor), // src alpha - ToBlendFactor(color->dst_alpha_blend_factor) // dst alpha - ); - gl.BlendEquationSeparate( - ToBlendOperation(color->color_blend_op), // mode color - ToBlendOperation(color->alpha_blend_op) // mode alpha - ); + if (color->advanced_blend_override.has_value()) { + FML_LOG(ERROR) << "Configured blending: " << static_cast(color->advanced_blend_override.value()); + gl.BlendEquation(AdvancedBlendToBlendFactor(color->advanced_blend_override.value())); + } else { + gl.BlendFuncSeparate( + ToBlendFactor(color->src_color_blend_factor), // src color + ToBlendFactor(color->dst_color_blend_factor), // dst color + ToBlendFactor(color->src_alpha_blend_factor), // src alpha + ToBlendFactor(color->dst_alpha_blend_factor) // dst alpha + ); + gl.BlendEquationSeparate( + ToBlendOperation(color->color_blend_op), // mode color + ToBlendOperation(color->alpha_blend_op) // mode alpha + ); + } } else { gl.Disable(GL_BLEND); } From 70d833adcc29f115f3a65f0e2e4ae09523a8171b Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 20 Oct 2023 08:23:06 -0700 Subject: [PATCH 05/12] ++ --- impeller/renderer/backend/gles/capabilities_gles.cc | 6 ++++-- impeller/renderer/backend/gles/render_pass_gles.cc | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc index 1d137a67c96ab..ffc91e4b85198 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/impeller/renderer/backend/gles/capabilities_gles.cc @@ -107,8 +107,10 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) { supports_decal_sampler_address_mode_ = true; } - supports_native_advanced_blend_ = gl.GetDescription()->HasExtension("GL_KHR_blend_equation_advanced"); - FML_LOG(ERROR) << "supports native advanced blend: " << supports_native_advanced_blend_; + supports_native_advanced_blend_ = + gl.GetDescription()->HasExtension("GL_KHR_blend_equation_advanced"); + FML_LOG(ERROR) << "supports native advanced blend: " + << supports_native_advanced_blend_; } size_t CapabilitiesGLES::GetMaxTextureUnits(ShaderStage stage) const { diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index d1f50648cae4e..c9468ea430c19 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -107,8 +107,11 @@ void ConfigureBlending(const ProcTableGLES& gl, if (color->blending_enabled) { gl.Enable(GL_BLEND); if (color->advanced_blend_override.has_value()) { - FML_LOG(ERROR) << "Configured blending: " << static_cast(color->advanced_blend_override.value()); - gl.BlendEquation(AdvancedBlendToBlendFactor(color->advanced_blend_override.value())); + FML_LOG(ERROR) << "Configured blending: " + << static_cast( + color->advanced_blend_override.value()); + gl.BlendEquation( + AdvancedBlendToBlendFactor(color->advanced_blend_override.value())); } else { gl.BlendFuncSeparate( ToBlendFactor(color->src_color_blend_factor), // src color From 8c4c751dbc4f799af199f7f613b0578d35f54b8a Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 4 Dec 2023 13:40:13 -0800 Subject: [PATCH 06/12] ++ --- impeller/compiler/compiler.cc | 6 -- .../backend/gles/capabilities_gles.cc | 7 +- .../renderer/backend/gles/capabilities_gles.h | 1 - .../renderer/backend/gles/render_pass_gles.cc | 94 +++---------------- .../backend/vulkan/capabilities_vk.cc | 17 +++- .../backend/vulkan/pipeline_library_vk.cc | 1 - 6 files changed, 25 insertions(+), 101 deletions(-) diff --git a/impeller/compiler/compiler.cc b/impeller/compiler/compiler.cc index e2c71b6029a73..261ab60a64360 100644 --- a/impeller/compiler/compiler.cc +++ b/impeller/compiler/compiler.cc @@ -166,12 +166,6 @@ static CompilerBackend CreateGLSLCompiler(const spirv_cross::ParsedIR& ir, source_options.type == SourceType::kFragmentShader) { gl_compiler->remap_ext_framebuffer_fetch(0, 0, true); } - if (source_options.type == SourceType::kFragmentShader) { - gl_compiler->add_header_line( - "#ifdef GL_KHR_blend_equation_advanced\n" - "layout(blend_support_all_equations) out;\n" - "#endif\n"); - } gl_compiler->set_variable_type_remap_callback( [&](const spirv_cross::SPIRType& type, const std::string& var_name, std::string& name_of_type) { diff --git a/impeller/renderer/backend/gles/capabilities_gles.cc b/impeller/renderer/backend/gles/capabilities_gles.cc index 348521e79cb81..be3df649d2aa4 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/impeller/renderer/backend/gles/capabilities_gles.cc @@ -109,11 +109,6 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) { supports_decal_sampler_address_mode_ = true; } - supports_native_advanced_blend_ = - gl.GetDescription()->HasExtension("GL_KHR_blend_equation_advanced"); - FML_LOG(ERROR) << "supports native advanced blend: " - << supports_native_advanced_blend_; - if (desc->HasExtension(kMultisampledRenderToTextureExt)) { supports_implicit_msaa_ = true; @@ -184,7 +179,7 @@ bool CapabilitiesGLES::SupportsDeviceTransientTextures() const { } bool CapabilitiesGLES::SupportsNativeAdvancedBlends() const { - return supports_native_advanced_blend_; + return false; } PixelFormat CapabilitiesGLES::GetDefaultColorFormat() const { diff --git a/impeller/renderer/backend/gles/capabilities_gles.h b/impeller/renderer/backend/gles/capabilities_gles.h index d70c6aa7a1512..07843c103a950 100644 --- a/impeller/renderer/backend/gles/capabilities_gles.h +++ b/impeller/renderer/backend/gles/capabilities_gles.h @@ -121,7 +121,6 @@ class CapabilitiesGLES final private: bool supports_framebuffer_fetch_ = false; bool supports_decal_sampler_address_mode_ = false; - bool supports_native_advanced_blend_ = false; bool supports_offscreen_msaa_ = false; bool supports_implicit_msaa_ = false; }; diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index 6038ce8f7ba81..f0553a4a5ca02 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -42,93 +42,21 @@ void RenderPassGLES::OnSetLabel(std::string label) { label_ = std::move(label); } -#define MULTIPLY_KHR 0x9294 -#define SCREEN_KHR 0x9295 -#define OVERLAY_KHR 0x9296 -#define DARKEN_KHR 0x9297 -#define LIGHTEN_KHR 0x9298 -#define COLORDODGE_KHR 0x9299 -#define COLORBURN_KHR 0x929A -#define HARDLIGHT_KHR 0x929B -#define SOFTLIGHT_KHR 0x929C -#define DIFFERENCE_KHR 0x929E -#define EXCLUSION_KHR 0x92A0 -#define HSL_HUE_KHR 0x92AD -#define HSL_SATURATION_KHR 0x92AE -#define HSL_COLOR_KHR 0x92AF -#define HSL_LUMINOSITY_KHR 0x92B0 - -GLenum AdvancedBlendToBlendFactor(BlendMode blend_mode) { - switch (blend_mode) { - case BlendMode::kScreen: - return SCREEN_KHR; - case BlendMode::kOverlay: - return OVERLAY_KHR; - case BlendMode::kDarken: - return DARKEN_KHR; - case BlendMode::kLighten: - return LIGHTEN_KHR; - case BlendMode::kColorDodge: - return COLORDODGE_KHR; - case BlendMode::kColorBurn: - return COLORBURN_KHR; - case BlendMode::kHardLight: - return HARDLIGHT_KHR; - case BlendMode::kSoftLight: - return SOFTLIGHT_KHR; - case BlendMode::kDifference: - return DIFFERENCE_KHR; - case BlendMode::kExclusion: - return EXCLUSION_KHR; - case BlendMode::kMultiply: - return MULTIPLY_KHR; - case BlendMode::kHue: - return HSL_HUE_KHR; - case BlendMode::kSaturation: - return HSL_SATURATION_KHR; - case BlendMode::kColor: - return HSL_COLOR_KHR; - case BlendMode::kLuminosity: - case BlendMode::kClear: - case BlendMode::kSource: - case BlendMode::kDestination: - case BlendMode::kSourceOver: - case BlendMode::kDestinationOver: - case BlendMode::kSourceIn: - case BlendMode::kDestinationIn: - case BlendMode::kSourceOut: - case BlendMode::kDestinationOut: - case BlendMode::kSourceATop: - case BlendMode::kDestinationATop: - case BlendMode::kXor: - case BlendMode::kPlus: - case BlendMode::kModulate: - FML_UNREACHABLE(); - } -} - void ConfigureBlending(const ProcTableGLES& gl, const ColorAttachmentDescriptor* color) { if (color->blending_enabled) { + FML_DCHECK(!color->advanced_blend_override.has_value()); gl.Enable(GL_BLEND); - if (color->advanced_blend_override.has_value()) { - FML_LOG(ERROR) << "Configured blending: " - << static_cast( - color->advanced_blend_override.value()); - gl.BlendEquation( - AdvancedBlendToBlendFactor(color->advanced_blend_override.value())); - } else { - gl.BlendFuncSeparate( - ToBlendFactor(color->src_color_blend_factor), // src color - ToBlendFactor(color->dst_color_blend_factor), // dst color - ToBlendFactor(color->src_alpha_blend_factor), // src alpha - ToBlendFactor(color->dst_alpha_blend_factor) // dst alpha - ); - gl.BlendEquationSeparate( - ToBlendOperation(color->color_blend_op), // mode color - ToBlendOperation(color->alpha_blend_op) // mode alpha - ); - } + gl.BlendFuncSeparate( + ToBlendFactor(color->src_color_blend_factor), // src color + ToBlendFactor(color->dst_color_blend_factor), // dst color + ToBlendFactor(color->src_alpha_blend_factor), // src alpha + ToBlendFactor(color->dst_alpha_blend_factor) // dst alpha + ); + gl.BlendEquationSeparate( + ToBlendOperation(color->color_blend_op), // mode color + ToBlendOperation(color->alpha_blend_op) // mode alpha + ); } else { gl.Disable(GL_BLEND); } diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index 1e93250b4b504..5cb096c947df8 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -407,10 +407,19 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { }); } - supports_native_advanced_blends_ = - physical_properties_2 - .get() - .advancedBlendAllOperations; + { + supports_native_advanced_blends_ = + optional_device_extensions_.find( + OptionalDeviceExtensionVK::kEXTBlendOperationAdvanced) != + optional_device_extensions_.end(); + } + + // supports_native_advanced_blends_ = + // physical_properties_2 + // .get() + // .advancedBlendAllOperations; + FML_LOG(ERROR) << "Supports native advanced blends: " + << supports_native_advanced_blends_; return true; } diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index a45d36176ee3e..cfbb10b8b02c4 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -106,7 +106,6 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( desc.GetDepthPixelFormat(), sample_count)); } if (desc.HasStencilAttachmentDescriptors()) { - FML_LOG(ERROR) << "Stencil format: " << PixelFormatToString(desc.GetStencilPixelFormat()); depth_stencil_ref = vk::AttachmentReference{ static_cast(attachments.size()), vk::ImageLayout::eDepthStencilAttachmentOptimal}; From 2243614c3c6056902f22624a257e3d70d862f5c8 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 4 Dec 2023 13:40:35 -0800 Subject: [PATCH 07/12] ++ --- impeller/renderer/backend/gles/render_pass_gles.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index f0553a4a5ca02..642afaedff324 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -11,8 +11,8 @@ #include "fml/closure.h" #include "fml/logging.h" #include "impeller/base/validation.h" -#include "impeller/geometry/color.h" #include "impeller/core/texture_descriptor.h" +#include "impeller/geometry/color.h" #include "impeller/renderer/backend/gles/context_gles.h" #include "impeller/renderer/backend/gles/device_buffer_gles.h" #include "impeller/renderer/backend/gles/formats_gles.h" From 3838a52e2f897aacde37e38cfec8ec98eed2dc50 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 4 Dec 2023 14:37:55 -0800 Subject: [PATCH 08/12] cleanups --- impeller/entity/contents/content_context.cc | 14 ++++---------- .../renderer/backend/vulkan/capabilities_vk.cc | 10 +--------- impeller/renderer/backend/vulkan/formats_vk.h | 12 ++++++------ .../renderer/backend/vulkan/pipeline_library_vk.cc | 4 ++-- 4 files changed, 13 insertions(+), 27 deletions(-) diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index ee9cc6ddbd305..dc57f981f4483 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -9,7 +9,6 @@ #include "impeller/base/strings.h" #include "impeller/core/formats.h" #include "impeller/entity/contents/framebuffer_blend_contents.h" -#include "impeller/entity/entity.h" #include "impeller/entity/render_target_cache.h" #include "impeller/renderer/command_buffer.h" #include "impeller/renderer/pipeline_descriptor.h" @@ -24,15 +23,7 @@ void ContentContextOptions::ApplyToPipelineDescriptor( PipelineDescriptor& desc) const { auto pipeline_blend = blend_mode; - // if (blend_mode > Entity::kLastPipelineBlendMode) { - // VALIDATION_LOG << "Cannot use blend mode " << - // static_cast(blend_mode) - // << " as a pipeline blend."; - // pipeline_blend = BlendMode::kSourceOver; - // } - desc.SetSampleCount(sample_count); - ColorAttachmentDescriptor color0 = *desc.GetColorAttachmentDescriptor(0u); color0.format = color_attachment_pixel_format; color0.alpha_blend_op = BlendOperation::kAdd; @@ -135,8 +126,11 @@ void ContentContextOptions::ApplyToPipelineDescriptor( break; default: // This is an advanced blend, set the override. - FML_LOG(ERROR) << "advanced blend set override"; color0.advanced_blend_override = blend_mode; + color0.dst_alpha_blend_factor = BlendFactor::kOne; + color0.dst_color_blend_factor = BlendFactor::kOne; + color0.src_alpha_blend_factor = BlendFactor::kOne; + color0.src_color_blend_factor = BlendFactor::kOne; break; } desc.SetColorAttachmentDescriptor(0u, color0); diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index 5cb096c947df8..83d3a9f208af7 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -345,11 +345,9 @@ void CapabilitiesVK::SetOffscreenFormat(PixelFormat pixel_format) const { bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { if (HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint)) { default_depth_stencil_format_ = PixelFormat::kD32FloatS8UInt; - default_stencil_format_ = PixelFormat::kD32FloatS8UInt; } else if (HasSuitableDepthStencilFormat(device, vk::Format::eD24UnormS8Uint)) { default_depth_stencil_format_ = PixelFormat::kD24UnormS8Uint; - default_stencil_format_ = PixelFormat::kD24UnormS8Uint; } else { default_depth_stencil_format_ = PixelFormat::kUnknown; } @@ -358,7 +356,7 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { default_stencil_format_ = PixelFormat::kS8UInt; } else if (default_stencil_format_ != PixelFormat::kUnknown) { default_stencil_format_ = default_depth_stencil_format_; - } else if (default_stencil_format_ == PixelFormat::kUnknown) { + } else { return false; } @@ -414,12 +412,6 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { optional_device_extensions_.end(); } - // supports_native_advanced_blends_ = - // physical_properties_2 - // .get() - // .advancedBlendAllOperations; - FML_LOG(ERROR) << "Supports native advanced blends: " - << supports_native_advanced_blends_; return true; } diff --git a/impeller/renderer/backend/vulkan/formats_vk.h b/impeller/renderer/backend/vulkan/formats_vk.h index 5f3b7268b626e..f921a23f1670a 100644 --- a/impeller/renderer/backend/vulkan/formats_vk.h +++ b/impeller/renderer/backend/vulkan/formats_vk.h @@ -14,6 +14,7 @@ #include "vulkan/vulkan.hpp" #include "vulkan/vulkan_enums.hpp" #include "vulkan/vulkan_structs.hpp" +#include "vulkan/vulkan_to_string.hpp" namespace impeller { @@ -100,13 +101,13 @@ constexpr vk::BlendOp ToAdvancedVKBlendOp(BlendMode blend_mode) { case BlendMode::kMultiply: return vk::BlendOp::eMultiplyEXT; case BlendMode::kHue: - return vk::BlendOp::eHslHueEXT; // Is this right? + return vk::BlendOp::eHslHueEXT; case BlendMode::kSaturation: - return vk::BlendOp::eHslSaturationEXT; // Is this right? + return vk::BlendOp::eHslSaturationEXT; case BlendMode::kColor: - return vk::BlendOp::eHslColorEXT; // Is this right? + return vk::BlendOp::eHslColorEXT; case BlendMode::kLuminosity: - return vk::BlendOp::eHslLuminosityEXT; // Is this right? + return vk::BlendOp::eHslLuminosityEXT; break; default: break; @@ -152,8 +153,8 @@ ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) { } else { res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op)); } - res.setDstColorBlendFactor(ToVKBlendFactor(desc.dst_color_blend_factor)); + res.setDstColorBlendFactor(ToVKBlendFactor(desc.dst_color_blend_factor)); res.setSrcAlphaBlendFactor(ToVKBlendFactor(desc.src_alpha_blend_factor)); if (desc.advanced_blend_override.has_value()) { @@ -164,7 +165,6 @@ ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) { } res.setDstAlphaBlendFactor(ToVKBlendFactor(desc.dst_alpha_blend_factor)); - res.setColorWriteMask(ToVKColorComponentFlags(desc.write_mask)); return res; diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index cfbb10b8b02c4..5aec450d59b2c 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -367,8 +367,8 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( if (desc.GetColorAttachmentDescriptors() .find(0u) ->second.advanced_blend_override.has_value()) { - state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno - state.setSrcPremultiplied(true); // double check + state.setBlendOverlap(vk::BlendOverlapEXT::eConjoint); // dunno + state.setSrcPremultiplied(true); // double check state.setDstPremultiplied(true); blend_state.pNext = &state; } From 6924ae6419fe3fad49ee8e4fdc8b5a2437150bfd Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 5 Dec 2023 20:25:41 -0800 Subject: [PATCH 09/12] WIP --- .../renderer/backend/vulkan/allocator_vk.cc | 3 + .../backend/vulkan/capabilities_vk.cc | 10 ---- .../backend/vulkan/pipeline_library_vk.cc | 25 ++++++++- .../renderer/backend/vulkan/render_pass_vk.cc | 55 +++++++++++++++++-- 4 files changed, 76 insertions(+), 17 deletions(-) diff --git a/impeller/renderer/backend/vulkan/allocator_vk.cc b/impeller/renderer/backend/vulkan/allocator_vk.cc index a5dd9b7f14b00..dc87901c904fe 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -172,6 +172,7 @@ static constexpr vk::ImageUsageFlags ToVKImageUsageFlags( bool supports_memoryless_textures, bool supports_framebuffer_fetch) { vk::ImageUsageFlags vk_usage; + bool supports_advanced_blends = true; switch (mode) { case StorageMode::kHostVisible: @@ -192,6 +193,8 @@ static constexpr vk::ImageUsageFlags ToVKImageUsageFlags( } if (supports_framebuffer_fetch) { vk_usage |= vk::ImageUsageFlagBits::eInputAttachment; + } else if (supports_advanced_blends) { + vk_usage |= vk::ImageUsageFlagBits::eInputAttachment; } } diff --git a/impeller/renderer/backend/vulkan/capabilities_vk.cc b/impeller/renderer/backend/vulkan/capabilities_vk.cc index be3f0bed61d76..e1db66c720030 100644 --- a/impeller/renderer/backend/vulkan/capabilities_vk.cc +++ b/impeller/renderer/backend/vulkan/capabilities_vk.cc @@ -10,10 +10,6 @@ #include "impeller/core/formats.h" #include "impeller/renderer/backend/vulkan/vk.h" #include "vulkan/vulkan_core.h" -<<<<<<< HEAD -#include "vulkan/vulkan_structs.hpp" -======= ->>>>>>> fe96317750ff70f91306d1a46050fc81bd3690a9 namespace impeller { @@ -161,15 +157,12 @@ static const char* GetDeviceExtensionName(OptionalDeviceExtensionVK ext) { switch (ext) { case OptionalDeviceExtensionVK::kEXTPipelineCreationFeedback: return VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME; -<<<<<<< HEAD case OptionalDeviceExtensionVK::kEXTBlendOperationAdvanced: return VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME; -======= case OptionalDeviceExtensionVK::kARMRasterizationOrderAttachmentAccess: return VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME; case OptionalDeviceExtensionVK::kEXTRasterizationOrderAttachmentAccess: return VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME; ->>>>>>> fe96317750ff70f91306d1a46050fc81bd3690a9 case OptionalDeviceExtensionVK::kLast: return "Unknown"; } @@ -416,12 +409,10 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { } { -<<<<<<< HEAD supports_native_advanced_blends_ = optional_device_extensions_.find( OptionalDeviceExtensionVK::kEXTBlendOperationAdvanced) != optional_device_extensions_.end(); -======= supports_framebuffer_fetch_ = (optional_device_extensions_.find( OptionalDeviceExtensionVK:: @@ -431,7 +422,6 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) { OptionalDeviceExtensionVK:: kEXTRasterizationOrderAttachmentAccess) != optional_device_extensions_.end()); ->>>>>>> fe96317750ff70f91306d1a46050fc81bd3690a9 } return true; diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index eaa993c9c2a37..1f6459359483e 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -86,6 +86,7 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( bool supports_framebuffer_fetch) { std::vector attachments; + bool supports_advanced_blend = true; std::vector color_refs; std::vector subpass_color_ref; vk::AttachmentReference depth_stencil_ref = kUnusedAttachmentReference; @@ -133,10 +134,30 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( subpass_desc.setFlags(vk::SubpassDescriptionFlagBits:: eRasterizationOrderAttachmentColorAccessARM); subpass_desc.setInputAttachments(subpass_color_ref); + } else if (supports_advanced_blend) { + subpass_desc.setInputAttachments(subpass_color_ref); } subpass_desc.setColorAttachments(color_refs); subpass_desc.setPDepthStencilAttachment(&depth_stencil_ref); + if (supports_advanced_blend) { + vk::SubpassDependency subpass_dependency; + subpass_dependency.setSrcSubpass(0); + subpass_dependency.setDstSubpass(0); + subpass_dependency.dependencyFlags = vk::DependencyFlagBits::eByRegion; + subpass_dependency.srcStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput; + subpass_dependency.srcAccessMask = + vk::AccessFlagBits::eColorAttachmentWrite; + subpass_dependency.dstStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput; + subpass_dependency.dstAccessMask = + vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT; + subpass_dependencies.emplace_back(subpass_dependency); + // subpass_dependency.dstStageMask = 0; + // subpass_dependency.dstAccessMask = 0; + } + vk::RenderPassCreateInfo render_pass_desc; render_pass_desc.setAttachments(attachments); render_pass_desc.setPSubpasses(&subpass_desc); @@ -387,8 +408,8 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( if (desc.GetColorAttachmentDescriptors() .find(0u) ->second.advanced_blend_override.has_value()) { - state.setBlendOverlap(vk::BlendOverlapEXT::eConjoint); // dunno - state.setSrcPremultiplied(true); // double check + state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno + state.setSrcPremultiplied(true); // double check state.setDstPremultiplied(true); blend_state.pNext = &state; } diff --git a/impeller/renderer/backend/vulkan/render_pass_vk.cc b/impeller/renderer/backend/vulkan/render_pass_vk.cc index e5d313748881f..538b8c902d551 100644 --- a/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -23,6 +23,7 @@ #include "impeller/renderer/backend/vulkan/texture_vk.h" #include "vulkan/vulkan_enums.hpp" #include "vulkan/vulkan_handles.hpp" +#include "vulkan/vulkan_structs.hpp" #include "vulkan/vulkan_to_string.hpp" namespace impeller { @@ -107,6 +108,7 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( std::vector color_refs; std::vector resolve_refs; vk::AttachmentReference depth_stencil_ref = kUnusedAttachmentReference; + bool supports_advanced_blend = true; // Spec says: "Each element of the pColorAttachments array corresponds to an // output location in the shader, i.e. if the shader declares an output @@ -124,8 +126,9 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( for (const auto& [bind_point, color] : render_target_.GetColorAttachments()) { color_refs[bind_point] = vk::AttachmentReference{ static_cast(attachments.size()), - supports_framebuffer_fetch ? vk::ImageLayout::eGeneral - : vk::ImageLayout::eColorAttachmentOptimal}; + (supports_framebuffer_fetch || supports_advanced_blend) + ? vk::ImageLayout::eGeneral + : vk::ImageLayout::eColorAttachmentOptimal}; attachments.emplace_back(CreateAttachmentDescription( color, &Attachment::texture, supports_framebuffer_fetch)); SetTextureLayout(color, attachments.back(), command_buffer, @@ -133,7 +136,7 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( if (color.resolve_texture) { resolve_refs[bind_point] = vk::AttachmentReference{ static_cast(attachments.size()), - supports_framebuffer_fetch + (supports_framebuffer_fetch || supports_advanced_blend) ? vk::ImageLayout::eGeneral : vk::ImageLayout::eColorAttachmentOptimal}; attachments.emplace_back(CreateAttachmentDescription( @@ -178,12 +181,31 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( subpass_desc.setFlags(vk::SubpassDescriptionFlagBits:: eRasterizationOrderAttachmentColorAccessARM); subpass_desc.setInputAttachments(subpass_color_ref); + } else if (supports_advanced_blend) { + subpass_desc.setInputAttachments(subpass_color_ref); + } + + if (supports_advanced_blend) { + vk::SubpassDependency subpass_dependency; + subpass_dependency.setSrcSubpass(0); + subpass_dependency.setDstSubpass(0); + subpass_dependency.dependencyFlags = vk::DependencyFlagBits::eByRegion; + subpass_dependency.srcStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput; + subpass_dependency.srcAccessMask = + vk::AccessFlagBits::eColorAttachmentWrite; + subpass_dependency.dstStageMask = + vk::PipelineStageFlagBits::eColorAttachmentOutput; + subpass_dependency.dstAccessMask = + vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT; + subpass_dependencies.emplace_back(subpass_dependency); } vk::RenderPassCreateInfo render_pass_desc; render_pass_desc.setAttachments(attachments); render_pass_desc.setPSubpasses(&subpass_desc); render_pass_desc.setSubpassCount(1u); + render_pass_desc.setDependencies(subpass_dependencies); auto [result, pass] = context.GetDevice().createRenderPassUnique(render_pass_desc); @@ -368,7 +390,8 @@ static bool EncodeCommand(const Context& context, CommandEncoderVK& encoder, PassBindingsCache& command_buffer_cache, const ISize& target_size, - const vk::DescriptorSet vk_desc_set) { + const vk::DescriptorSet vk_desc_set, + const TextureVK& texture) { #ifdef IMPELLER_DEBUG fml::ScopedCleanupClosure pop_marker( [&encoder]() { encoder.PopDebugGroup(); }); @@ -382,6 +405,28 @@ static bool EncodeCommand(const Context& context, const auto& cmd_buffer = encoder.GetCommandBuffer(); const auto& pipeline_vk = PipelineVK::Cast(*command.pipeline); + if (pipeline_vk.GetDescriptor() + .GetColorAttachmentDescriptor(0u) + ->advanced_blend_override.has_value()) { + auto dstStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + auto dstAccess = VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT; + vk::ImageMemoryBarrier barrier; + barrier.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite; + barrier.dstAccessMask = + vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT; + barrier.oldLayout = vk::ImageLayout::eGeneral; + barrier.newLayout = vk::ImageLayout::eGeneral; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = texture.GetImage(); + barrier.subresourceRange = {vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}; + + cmd_buffer.pipelineBarrier( + vk::PipelineStageFlagBits::eColorAttachmentOutput, + vk::PipelineStageFlagBits::eColorAttachmentOutput, + vk::DependencyFlagBits::eByRegion, nullptr, nullptr, {barrier}); + } + encoder.GetCommandBuffer().bindDescriptorSets( vk::PipelineBindPoint::eGraphics, // bind point pipeline_vk.GetPipelineLayout(), // layout @@ -555,7 +600,7 @@ bool RenderPassVK::OnEncodeCommands(const Context& context) const { auto desc_index = 0u; for (const auto& command : commands_) { if (!EncodeCommand(context, command, *encoder, pass_bindings_cache_, - target_size, desc_sets[desc_index])) { + target_size, desc_sets[desc_index], color_image_vk)) { return false; } desc_index += 1; From 8f3381a0d1ef2b22db63d96c2213be8a80fdc93c Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 7 Dec 2023 18:56:43 -0800 Subject: [PATCH 10/12] ++ --- impeller/entity/contents/content_context.h | 1 - .../backend/vulkan/pipeline_library_vk.cc | 23 ++++++++----------- .../renderer/backend/vulkan/render_pass_vk.cc | 12 ++++------ 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index e23ddcc1c06f1..5aca5312af0bd 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -12,7 +12,6 @@ #include "flutter/fml/build_config.h" #include "flutter/fml/hash_combine.h" #include "flutter/fml/logging.h" -#include "flutter/fml/macros.h" #include "impeller/base/validation.h" #include "impeller/core/formats.h" #include "impeller/entity/entity.h" diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index 1f6459359483e..1dd3737452eb2 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -134,12 +134,11 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( subpass_desc.setFlags(vk::SubpassDescriptionFlagBits:: eRasterizationOrderAttachmentColorAccessARM); subpass_desc.setInputAttachments(subpass_color_ref); - } else if (supports_advanced_blend) { - subpass_desc.setInputAttachments(subpass_color_ref); } subpass_desc.setColorAttachments(color_refs); subpass_desc.setPDepthStencilAttachment(&depth_stencil_ref); + // See https://github.com/google/angle/blob/46817856888e74d23169e79ac98064600fd00127/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp#L672-L693 if (supports_advanced_blend) { vk::SubpassDependency subpass_dependency; subpass_dependency.setSrcSubpass(0); @@ -154,8 +153,6 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( subpass_dependency.dstAccessMask = vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT; subpass_dependencies.emplace_back(subpass_dependency); - // subpass_dependency.dstStageMask = 0; - // subpass_dependency.dstAccessMask = 0; } vk::RenderPassCreateInfo render_pass_desc; @@ -404,15 +401,15 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( blend_state.setAttachments(attachment_blend_state); pipeline_info.setPColorBlendState(&blend_state); - vk::PipelineColorBlendAdvancedStateCreateInfoEXT state; - if (desc.GetColorAttachmentDescriptors() - .find(0u) - ->second.advanced_blend_override.has_value()) { - state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno - state.setSrcPremultiplied(true); // double check - state.setDstPremultiplied(true); - blend_state.pNext = &state; - } + // vk::PipelineColorBlendAdvancedStateCreateInfoEXT state; + // if (desc.GetColorAttachmentDescriptors() + // .find(0u) + // ->second.advanced_blend_override.has_value()) { + // state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno + // state.setSrcPremultiplied(true); // double check + // state.setDstPremultiplied(true); + // blend_state.pNext = &state; + // } std::shared_ptr strong_device = device_holder_.lock(); if (!strong_device) { diff --git a/impeller/renderer/backend/vulkan/render_pass_vk.cc b/impeller/renderer/backend/vulkan/render_pass_vk.cc index d3511a95adde8..259e73c6215a1 100644 --- a/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -127,7 +127,7 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( for (const auto& [bind_point, color] : render_target_.GetColorAttachments()) { color_refs[bind_point] = vk::AttachmentReference{ static_cast(attachments.size()), - (supports_framebuffer_fetch || supports_advanced_blend) + (supports_framebuffer_fetch) ? vk::ImageLayout::eGeneral : vk::ImageLayout::eColorAttachmentOptimal}; attachments.emplace_back(CreateAttachmentDescription( @@ -137,7 +137,7 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( if (color.resolve_texture) { resolve_refs[bind_point] = vk::AttachmentReference{ static_cast(attachments.size()), - (supports_framebuffer_fetch || supports_advanced_blend) + (supports_framebuffer_fetch) ? vk::ImageLayout::eGeneral : vk::ImageLayout::eColorAttachmentOptimal}; attachments.emplace_back(CreateAttachmentDescription( @@ -182,8 +182,6 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( subpass_desc.setFlags(vk::SubpassDescriptionFlagBits:: eRasterizationOrderAttachmentColorAccessARM); subpass_desc.setInputAttachments(subpass_color_ref); - } else if (supports_advanced_blend) { - subpass_desc.setInputAttachments(subpass_color_ref); } if (supports_advanced_blend) { @@ -409,14 +407,12 @@ static bool EncodeCommand(const Context& context, if (pipeline_vk.GetDescriptor() .GetColorAttachmentDescriptor(0u) ->advanced_blend_override.has_value()) { - auto dstStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - auto dstAccess = VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT; vk::ImageMemoryBarrier barrier; barrier.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite; barrier.dstAccessMask = vk::AccessFlagBits::eColorAttachmentReadNoncoherentEXT; - barrier.oldLayout = vk::ImageLayout::eGeneral; - barrier.newLayout = vk::ImageLayout::eGeneral; + barrier.oldLayout = vk::ImageLayout::eColorAttachmentOptimal; + barrier.newLayout = vk::ImageLayout::eColorAttachmentOptimal; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = texture.GetImage(); From 30969737435f96d7a74f4803f7940859c4fd5382 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 7 Dec 2023 18:57:13 -0800 Subject: [PATCH 11/12] ++ --- .../renderer/backend/vulkan/pipeline_library_vk.cc | 8 ++++---- impeller/renderer/backend/vulkan/render_pass_vk.cc | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc index 1dd3737452eb2..2993c8e1a4b8e 100644 --- a/impeller/renderer/backend/vulkan/pipeline_library_vk.cc +++ b/impeller/renderer/backend/vulkan/pipeline_library_vk.cc @@ -138,7 +138,8 @@ static vk::UniqueRenderPass CreateCompatRenderPassForPipeline( subpass_desc.setColorAttachments(color_refs); subpass_desc.setPDepthStencilAttachment(&depth_stencil_ref); - // See https://github.com/google/angle/blob/46817856888e74d23169e79ac98064600fd00127/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp#L672-L693 + // See + // https://github.com/google/angle/blob/46817856888e74d23169e79ac98064600fd00127/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp#L672-L693 if (supports_advanced_blend) { vk::SubpassDependency subpass_dependency; subpass_dependency.setSrcSubpass(0); @@ -406,9 +407,8 @@ std::unique_ptr PipelineLibraryVK::CreatePipeline( // .find(0u) // ->second.advanced_blend_override.has_value()) { // state.setBlendOverlap(vk::BlendOverlapEXT::eUncorrelated); // dunno - // state.setSrcPremultiplied(true); // double check - // state.setDstPremultiplied(true); - // blend_state.pNext = &state; + // state.setSrcPremultiplied(true); // double + // check state.setDstPremultiplied(true); blend_state.pNext = &state; // } std::shared_ptr strong_device = device_holder_.lock(); diff --git a/impeller/renderer/backend/vulkan/render_pass_vk.cc b/impeller/renderer/backend/vulkan/render_pass_vk.cc index 259e73c6215a1..2fa4bd0ec125d 100644 --- a/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -125,11 +125,11 @@ SharedHandleVK RenderPassVK::CreateVKRenderPass( kUnusedAttachmentReference); for (const auto& [bind_point, color] : render_target_.GetColorAttachments()) { - color_refs[bind_point] = vk::AttachmentReference{ - static_cast(attachments.size()), - (supports_framebuffer_fetch) - ? vk::ImageLayout::eGeneral - : vk::ImageLayout::eColorAttachmentOptimal}; + color_refs[bind_point] = + vk::AttachmentReference{static_cast(attachments.size()), + (supports_framebuffer_fetch) + ? vk::ImageLayout::eGeneral + : vk::ImageLayout::eColorAttachmentOptimal}; attachments.emplace_back(CreateAttachmentDescription( color, &Attachment::texture, supports_framebuffer_fetch)); SetTextureLayout(color, attachments.back(), command_buffer, From b0bd7c496014543382934c91329adbb20c94801a Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 7 Dec 2023 20:08:23 -0800 Subject: [PATCH 12/12] ++ --- impeller/core/formats.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/impeller/core/formats.h b/impeller/core/formats.h index a79a963d40a8e..d0809defc59d4 100644 --- a/impeller/core/formats.h +++ b/impeller/core/formats.h @@ -522,14 +522,16 @@ struct ColorAttachmentDescriptor { alpha_blend_op == o.alpha_blend_op && // dst_alpha_blend_factor == o.dst_alpha_blend_factor && // write_mask == o.write_mask && // - advanced_blend_override == o.advanced_blend_override; + advanced_blend_override.value_or(BlendMode::kClear) == + o.advanced_blend_override.value_or(BlendMode::kClear); } constexpr size_t Hash() const { return fml::HashCombine( format, blending_enabled, src_color_blend_factor, color_blend_op, dst_color_blend_factor, src_alpha_blend_factor, alpha_blend_op, - dst_alpha_blend_factor, write_mask, advanced_blend_override); + dst_alpha_blend_factor, write_mask, + advanced_blend_override.value_or(BlendMode::kClear)); } };