Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 5e05c14

Browse files
committed
[Impeller] Add GetDefaultDepthStencil to capabilities.
1 parent db3ecf8 commit 5e05c14

File tree

9 files changed

+94
-24
lines changed

9 files changed

+94
-24
lines changed

impeller/renderer/backend/gles/context_gles.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ ContextGLES::ContextGLES(std::unique_ptr<ProcTableGLES> gl,
7070
.SetSupportsFramebufferFetch(false)
7171
.SetDefaultColorFormat(PixelFormat::kR8G8B8A8UNormInt)
7272
.SetDefaultStencilFormat(PixelFormat::kS8UInt)
73+
.SetDefaultDepthStencilFormat(PixelFormat::kD24UnormS8Uint)
7374
.SetSupportsCompute(false)
7475
.SetSupportsComputeSubgroups(false)
7576
.SetSupportsReadFromResolve(false)

impeller/renderer/backend/metal/context_mtl.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ static bool DeviceSupportsComputeSubgroups(id<MTLDevice> device) {
6060
.SetSupportsFramebufferFetch(DeviceSupportsFramebufferFetch(device))
6161
.SetDefaultColorFormat(color_format)
6262
.SetDefaultStencilFormat(PixelFormat::kS8UInt)
63+
.SetDefaultDepthStencilFormat(PixelFormat::kD32FloatS8UInt)
6364
.SetSupportsCompute(true)
6465
.SetSupportsComputeSubgroups(DeviceSupportsComputeSubgroups(device))
6566
.SetSupportsReadFromResolve(true)

impeller/renderer/backend/vulkan/capabilities_vk.cc

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,11 @@ static bool PhysicalDeviceSupportsRequiredFormats(
249249
const vk::PhysicalDevice& device) {
250250
const auto has_color_format =
251251
HasSuitableColorFormat(device, vk::Format::eB8G8R8A8Unorm);
252-
const auto has_depth_stencil_format =
252+
const auto has_stencil_format =
253253
HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint) ||
254254
HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint) ||
255255
HasSuitableDepthStencilFormat(device, vk::Format::eD24UnormS8Uint);
256-
return has_color_format && has_depth_stencil_format;
256+
return has_color_format && has_stencil_format;
257257
}
258258

259259
static bool HasRequiredProperties(const vk::PhysicalDevice& physical_device) {
@@ -332,18 +332,23 @@ bool CapabilitiesVK::HasExtension(const std::string& ext) const {
332332
}
333333

334334
void CapabilitiesVK::SetOffscreenFormat(PixelFormat pixel_format) const {
335-
color_format_ = pixel_format;
335+
default_color_format_ = pixel_format;
336336
}
337337

338338
bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) {
339-
if (HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint)) {
340-
depth_stencil_format_ = PixelFormat::kS8UInt;
341-
} else if (HasSuitableDepthStencilFormat(device,
342-
vk::Format::eD32SfloatS8Uint)) {
343-
depth_stencil_format_ = PixelFormat::kD32FloatS8UInt;
339+
if (HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint)) {
340+
default_depth_stencil_format_ = PixelFormat::kD32FloatS8UInt;
344341
} else if (HasSuitableDepthStencilFormat(device,
345342
vk::Format::eD24UnormS8Uint)) {
346-
depth_stencil_format_ = PixelFormat::kD24UnormS8Uint;
343+
default_depth_stencil_format_ = PixelFormat::kD24UnormS8Uint;
344+
} else {
345+
default_depth_stencil_format_ = PixelFormat::kUnknown;
346+
}
347+
348+
if (HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint)) {
349+
default_stencil_format_ = PixelFormat::kS8UInt;
350+
} else if (default_stencil_format_ != PixelFormat::kUnknown) {
351+
default_stencil_format_ = default_depth_stencil_format_;
347352
} else {
348353
return false;
349354
}
@@ -454,12 +459,17 @@ bool CapabilitiesVK::SupportsMemorylessTextures() const {
454459

455460
// |Capabilities|
456461
PixelFormat CapabilitiesVK::GetDefaultColorFormat() const {
457-
return color_format_;
462+
return default_color_format_;
458463
}
459464

460465
// |Capabilities|
461466
PixelFormat CapabilitiesVK::GetDefaultStencilFormat() const {
462-
return depth_stencil_format_;
467+
return default_stencil_format_;
468+
}
469+
470+
// |Capabilities|
471+
PixelFormat CapabilitiesVK::GetDefaultDepthStencilFormat() const {
472+
return default_depth_stencil_format_;
463473
}
464474

465475
const vk::PhysicalDeviceProperties&

impeller/renderer/backend/vulkan/capabilities_vk.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,16 @@ class CapabilitiesVK final : public Capabilities,
9696
// |Capabilities|
9797
PixelFormat GetDefaultStencilFormat() const override;
9898

99+
// |Capabilities|
100+
PixelFormat GetDefaultDepthStencilFormat() const override;
101+
99102
private:
100103
const bool enable_validations_;
101104
std::map<std::string, std::set<std::string>> exts_;
102105
std::set<OptionalDeviceExtensionVK> optional_device_extensions_;
103-
mutable PixelFormat color_format_ = PixelFormat::kUnknown;
104-
PixelFormat depth_stencil_format_ = PixelFormat::kUnknown;
106+
mutable PixelFormat default_color_format_ = PixelFormat::kUnknown;
107+
PixelFormat default_stencil_format_ = PixelFormat::kUnknown;
108+
PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown;
105109
vk::PhysicalDeviceProperties device_properties_;
106110
bool supports_compute_subgroups_ = false;
107111
bool supports_memoryless_textures_ = false;

impeller/renderer/capabilities.cc

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ class StandardCapabilities final : public Capabilities {
7171
return default_stencil_format_;
7272
}
7373

74+
// |Capabilities|
75+
PixelFormat GetDefaultDepthStencilFormat() const override {
76+
return default_depth_stencil_format_;
77+
}
78+
7479
bool SupportsMemorylessTextures() const override {
7580
return supports_memoryless_textures_;
7681
}
@@ -88,7 +93,8 @@ class StandardCapabilities final : public Capabilities {
8893
bool supports_decal_tile_mode,
8994
bool supports_memoryless_textures,
9095
PixelFormat default_color_format,
91-
PixelFormat default_stencil_format)
96+
PixelFormat default_stencil_format,
97+
PixelFormat default_depth_stencil_format)
9298
: supports_offscreen_msaa_(supports_offscreen_msaa),
9399
supports_ssbo_(supports_ssbo),
94100
supports_buffer_to_texture_blits_(supports_buffer_to_texture_blits),
@@ -102,7 +108,8 @@ class StandardCapabilities final : public Capabilities {
102108
supports_decal_tile_mode_(supports_decal_tile_mode),
103109
supports_memoryless_textures_(supports_memoryless_textures),
104110
default_color_format_(default_color_format),
105-
default_stencil_format_(default_stencil_format) {}
111+
default_stencil_format_(default_stencil_format),
112+
default_depth_stencil_format_(default_depth_stencil_format) {}
106113

107114
friend class CapabilitiesBuilder;
108115

@@ -119,6 +126,7 @@ class StandardCapabilities final : public Capabilities {
119126
bool supports_memoryless_textures_ = false;
120127
PixelFormat default_color_format_ = PixelFormat::kUnknown;
121128
PixelFormat default_stencil_format_ = PixelFormat::kUnknown;
129+
PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown;
122130

123131
FML_DISALLOW_COPY_AND_ASSIGN(StandardCapabilities);
124132
};
@@ -190,6 +198,12 @@ CapabilitiesBuilder& CapabilitiesBuilder::SetDefaultStencilFormat(
190198
return *this;
191199
}
192200

201+
CapabilitiesBuilder& CapabilitiesBuilder::SetDefaultDepthStencilFormat(
202+
PixelFormat value) {
203+
default_depth_stencil_format_ = value;
204+
return *this;
205+
}
206+
193207
CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsDecalTileMode(bool value) {
194208
supports_decal_tile_mode_ = value;
195209
return *this;
@@ -215,7 +229,8 @@ std::unique_ptr<Capabilities> CapabilitiesBuilder::Build() {
215229
supports_decal_tile_mode_, //
216230
supports_memoryless_textures_, //
217231
default_color_format_.value_or(PixelFormat::kUnknown), //
218-
default_stencil_format_.value_or(PixelFormat::kUnknown) //
232+
default_stencil_format_.value_or(PixelFormat::kUnknown), //
233+
default_depth_stencil_format_.value_or(PixelFormat::kUnknown) //
219234
));
220235
}
221236

impeller/renderer/capabilities.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class Capabilities {
4141

4242
virtual PixelFormat GetDefaultStencilFormat() const = 0;
4343

44+
virtual PixelFormat GetDefaultDepthStencilFormat() const = 0;
45+
4446
protected:
4547
Capabilities();
4648

@@ -75,6 +77,8 @@ class CapabilitiesBuilder {
7577

7678
CapabilitiesBuilder& SetDefaultStencilFormat(PixelFormat value);
7779

80+
CapabilitiesBuilder& SetDefaultDepthStencilFormat(PixelFormat value);
81+
7882
CapabilitiesBuilder& SetSupportsDecalTileMode(bool value);
7983

8084
CapabilitiesBuilder& SetSupportsMemorylessTextures(bool value);
@@ -95,6 +99,7 @@ class CapabilitiesBuilder {
9599
bool supports_memoryless_textures_ = false;
96100
std::optional<PixelFormat> default_color_format_ = std::nullopt;
97101
std::optional<PixelFormat> default_stencil_format_ = std::nullopt;
102+
std::optional<PixelFormat> default_depth_stencil_format_ = std::nullopt;
98103

99104
FML_DISALLOW_COPY_AND_ASSIGN(CapabilitiesBuilder);
100105
};

impeller/renderer/capabilities_unittests.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,33 @@ CAPABILITY_TEST(SupportsReadFromResolve, false);
3030
CAPABILITY_TEST(SupportsDecalTileMode, false);
3131
CAPABILITY_TEST(SupportsMemorylessTextures, false);
3232

33+
TEST(CapabilitiesTest, DefaultColorFormat) {
34+
auto defaults = CapabilitiesBuilder().Build();
35+
ASSERT_EQ(defaults->GetDefaultColorFormat(), PixelFormat::kUnknown);
36+
auto mutated = CapabilitiesBuilder()
37+
.SetDefaultColorFormat(PixelFormat::kB10G10R10A10XR)
38+
.Build();
39+
ASSERT_EQ(mutated->GetDefaultColorFormat(), PixelFormat::kB10G10R10A10XR);
40+
}
41+
42+
TEST(CapabilitiesTest, DefaultStencilFormat) {
43+
auto defaults = CapabilitiesBuilder().Build();
44+
ASSERT_EQ(defaults->GetDefaultStencilFormat(), PixelFormat::kUnknown);
45+
auto mutated = CapabilitiesBuilder()
46+
.SetDefaultStencilFormat(PixelFormat::kS8UInt)
47+
.Build();
48+
ASSERT_EQ(mutated->GetDefaultStencilFormat(), PixelFormat::kS8UInt);
49+
}
50+
51+
TEST(CapabilitiesTest, DefaultDepthStencilFormat) {
52+
auto defaults = CapabilitiesBuilder().Build();
53+
ASSERT_EQ(defaults->GetDefaultDepthStencilFormat(), PixelFormat::kUnknown);
54+
auto mutated = CapabilitiesBuilder()
55+
.SetDefaultDepthStencilFormat(PixelFormat::kD32FloatS8UInt)
56+
.Build();
57+
ASSERT_EQ(mutated->GetDefaultDepthStencilFormat(),
58+
PixelFormat::kD32FloatS8UInt);
59+
}
60+
3361
} // namespace testing
3462
} // namespace impeller

impeller/scene/scene_context.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,19 @@ namespace impeller {
1313
namespace scene {
1414

1515
void SceneContextOptions::ApplyToPipelineDescriptor(
16+
const Capabilities& capabilities,
1617
PipelineDescriptor& desc) const {
1718
DepthAttachmentDescriptor depth;
1819
depth.depth_compare = CompareFunction::kLess;
1920
depth.depth_write_enabled = true;
2021
desc.SetDepthStencilAttachmentDescriptor(depth);
21-
desc.SetDepthPixelFormat(PixelFormat::kD32FloatS8UInt);
22+
desc.SetDepthPixelFormat(capabilities.GetDefaultDepthStencilFormat());
2223

2324
StencilAttachmentDescriptor stencil;
2425
stencil.stencil_compare = CompareFunction::kAlways;
2526
stencil.depth_stencil_pass = StencilOperation::kKeep;
2627
desc.SetStencilAttachmentDescriptors(stencil);
27-
desc.SetStencilPixelFormat(PixelFormat::kD32FloatS8UInt);
28+
desc.SetStencilPixelFormat(capabilities.GetDefaultDepthStencilFormat());
2829

2930
desc.SetSampleCount(sample_count);
3031
desc.SetPrimitiveType(primitive_type);
@@ -79,7 +80,7 @@ std::shared_ptr<Pipeline<PipelineDescriptor>> SceneContext::GetPipeline(
7980
return nullptr;
8081
}
8182
if (auto found = pipelines_.find(key); found != pipelines_.end()) {
82-
return found->second->GetPipeline(opts);
83+
return found->second->GetPipeline(*context_, opts);
8384
}
8485
return nullptr;
8586
}

impeller/scene/scene_context.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ struct SceneContextOptions {
3232
}
3333
};
3434

35-
void ApplyToPipelineDescriptor(PipelineDescriptor& desc) const;
35+
void ApplyToPipelineDescriptor(const Capabilities& capabilities,
36+
PipelineDescriptor& desc) const;
3637
};
3738

3839
class SceneContext {
@@ -57,6 +58,7 @@ class SceneContext {
5758
virtual ~PipelineVariants() = default;
5859

5960
virtual std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
61+
Context& context,
6062
SceneContextOptions opts) = 0;
6163
};
6264

@@ -66,12 +68,14 @@ class SceneContext {
6668
explicit PipelineVariantsT(Context& context) {
6769
auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
6870
// Apply default ContentContextOptions to the descriptor.
69-
SceneContextOptions{}.ApplyToPipelineDescriptor(*desc);
71+
SceneContextOptions{}.ApplyToPipelineDescriptor(
72+
*context.GetCapabilities(), *desc);
7073
variants_[{}] = std::make_unique<PipelineT>(context, desc);
7174
};
7275

73-
// |PipelineCollection|
76+
// |PipelineVariants|
7477
std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
78+
Context& context,
7579
SceneContextOptions opts) {
7680
if (auto found = variants_.find(opts); found != variants_.end()) {
7781
return found->second->WaitAndGet();
@@ -83,8 +87,9 @@ class SceneContext {
8387
FML_CHECK(prototype != variants_.end());
8488

8589
auto variant_future = prototype->second->WaitAndGet()->CreateVariant(
86-
[&opts, variants_count = variants_.size()](PipelineDescriptor& desc) {
87-
opts.ApplyToPipelineDescriptor(desc);
90+
[&context, &opts,
91+
variants_count = variants_.size()](PipelineDescriptor& desc) {
92+
opts.ApplyToPipelineDescriptor(*context.GetCapabilities(), desc);
8893
desc.SetLabel(
8994
SPrintF("%s V#%zu", desc.GetLabel().c_str(), variants_count));
9095
});

0 commit comments

Comments
 (0)