Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions impeller/renderer/backend/gles/context_gles.cc
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ ContextGLES::ContextGLES(std::unique_ptr<ProcTableGLES> gl,
.SetSupportsFramebufferFetch(false)
.SetDefaultColorFormat(PixelFormat::kR8G8B8A8UNormInt)
.SetDefaultStencilFormat(PixelFormat::kS8UInt)
.SetDefaultDepthStencilFormat(PixelFormat::kD24UnormS8Uint)
.SetSupportsCompute(false)
.SetSupportsComputeSubgroups(false)
.SetSupportsReadFromResolve(false)
Expand Down
1 change: 1 addition & 0 deletions impeller/renderer/backend/metal/context_mtl.mm
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ static bool DeviceSupportsComputeSubgroups(id<MTLDevice> device) {
.SetSupportsFramebufferFetch(DeviceSupportsFramebufferFetch(device))
.SetDefaultColorFormat(color_format)
.SetDefaultStencilFormat(PixelFormat::kS8UInt)
.SetDefaultDepthStencilFormat(PixelFormat::kD32FloatS8UInt)
.SetSupportsCompute(true)
.SetSupportsComputeSubgroups(DeviceSupportsComputeSubgroups(device))
.SetSupportsReadFromResolve(true)
Expand Down
32 changes: 21 additions & 11 deletions impeller/renderer/backend/vulkan/capabilities_vk.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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&
Expand Down
8 changes: 6 additions & 2 deletions impeller/renderer/backend/vulkan/capabilities_vk.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string, std::set<std::string>> exts_;
std::set<OptionalDeviceExtensionVK> 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;
Expand Down
21 changes: 18 additions & 3 deletions impeller/renderer/capabilities.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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_;
}
Expand All @@ -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),
Expand All @@ -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;

Expand All @@ -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);
};
Expand Down Expand Up @@ -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;
Expand All @@ -215,7 +229,8 @@ std::unique_ptr<Capabilities> 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) //
));
}

Expand Down
5 changes: 5 additions & 0 deletions impeller/renderer/capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ class Capabilities {

virtual PixelFormat GetDefaultStencilFormat() const = 0;

virtual PixelFormat GetDefaultDepthStencilFormat() const = 0;

protected:
Capabilities();

Expand Down Expand Up @@ -75,6 +77,8 @@ class CapabilitiesBuilder {

CapabilitiesBuilder& SetDefaultStencilFormat(PixelFormat value);

CapabilitiesBuilder& SetDefaultDepthStencilFormat(PixelFormat value);

CapabilitiesBuilder& SetSupportsDecalTileMode(bool value);

CapabilitiesBuilder& SetSupportsMemorylessTextures(bool value);
Expand All @@ -95,6 +99,7 @@ class CapabilitiesBuilder {
bool supports_memoryless_textures_ = false;
std::optional<PixelFormat> default_color_format_ = std::nullopt;
std::optional<PixelFormat> default_stencil_format_ = std::nullopt;
std::optional<PixelFormat> default_depth_stencil_format_ = std::nullopt;

FML_DISALLOW_COPY_AND_ASSIGN(CapabilitiesBuilder);
};
Expand Down
28 changes: 28 additions & 0 deletions impeller/renderer/capabilities_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 4 additions & 3 deletions impeller/scene/scene_context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -79,7 +80,7 @@ std::shared_ptr<Pipeline<PipelineDescriptor>> 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;
}
Expand Down
15 changes: 10 additions & 5 deletions impeller/scene/scene_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ struct SceneContextOptions {
}
};

void ApplyToPipelineDescriptor(PipelineDescriptor& desc) const;
void ApplyToPipelineDescriptor(const Capabilities& capabilities,
PipelineDescriptor& desc) const;
};

class SceneContext {
Expand All @@ -57,6 +58,7 @@ class SceneContext {
virtual ~PipelineVariants() = default;

virtual std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
Context& context,
SceneContextOptions opts) = 0;
};

Expand All @@ -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<PipelineT>(context, desc);
};

// |PipelineCollection|
// |PipelineVariants|
std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
Context& context,
SceneContextOptions opts) {
if (auto found = variants_.find(opts); found != variants_.end()) {
return found->second->WaitAndGet();
Expand All @@ -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));
});
Expand Down