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

Commit aa98a9d

Browse files
authored
[Impeller] Fix stencil buffer format selection on Vulkan backend, add support for D24UnormS8Uint (#45025)
Vulkan was checking for D24 and using D32. This is part of the problem on the Samsung A02. There is still some other problem. Fixes flutter/flutter#133188
1 parent 0e6113a commit aa98a9d

File tree

6 files changed

+44
-1
lines changed

6 files changed

+44
-1
lines changed

impeller/core/formats.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ enum class PixelFormat {
107107
kB10G10R10A10XR,
108108
// Depth and stencil formats.
109109
kS8UInt,
110+
kD24UnormS8Uint,
110111
kD32FloatS8UInt,
111112
};
112113

@@ -140,6 +141,8 @@ constexpr const char* PixelFormatToString(PixelFormat format) {
140141
return "B10G10R10A10XR";
141142
case PixelFormat::kS8UInt:
142143
return "S8UInt";
144+
case PixelFormat::kD24UnormS8Uint:
145+
return "D24UnormS8Uint";
143146
case PixelFormat::kD32FloatS8UInt:
144147
return "D32FloatS8UInt";
145148
}
@@ -410,6 +413,8 @@ constexpr size_t BytesPerPixelForPixelFormat(PixelFormat format) {
410413
case PixelFormat::kB10G10R10XRSRGB:
411414
case PixelFormat::kB10G10R10XR:
412415
return 4u;
416+
case PixelFormat::kD24UnormS8Uint:
417+
return 4u;
413418
case PixelFormat::kD32FloatS8UInt:
414419
return 5u;
415420
case PixelFormat::kR16G16B16A16Float:

impeller/renderer/backend/gles/texture_gles.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ struct TexImage2DData {
119119
break;
120120
case PixelFormat::kUnknown:
121121
case PixelFormat::kS8UInt:
122+
case PixelFormat::kD24UnormS8Uint:
122123
case PixelFormat::kD32FloatS8UInt:
123124
case PixelFormat::kR8UNormInt:
124125
case PixelFormat::kR8G8UNormInt:
@@ -167,6 +168,7 @@ struct TexImage2DData {
167168
case PixelFormat::kB8G8R8A8UNormInt:
168169
case PixelFormat::kB8G8R8A8UNormIntSRGB:
169170
case PixelFormat::kS8UInt:
171+
case PixelFormat::kD24UnormS8Uint:
170172
case PixelFormat::kD32FloatS8UInt:
171173
case PixelFormat::kR8UNormInt:
172174
case PixelFormat::kR8G8UNormInt:
@@ -314,6 +316,8 @@ static std::optional<GLenum> ToRenderBufferFormat(PixelFormat format) {
314316
return GL_RGBA16F;
315317
case PixelFormat::kS8UInt:
316318
return GL_STENCIL_INDEX8;
319+
case PixelFormat::kD24UnormS8Uint:
320+
return GL_DEPTH24_STENCIL8;
317321
case PixelFormat::kD32FloatS8UInt:
318322
return GL_DEPTH32F_STENCIL8;
319323
case PixelFormat::kUnknown:

impeller/renderer/backend/metal/formats_mtl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ constexpr PixelFormat FromMTLPixelFormat(MTLPixelFormat format) {
3636
return PixelFormat::kR16G16B16A16Float;
3737
case MTLPixelFormatStencil8:
3838
return PixelFormat::kS8UInt;
39+
#if !FML_OS_IOS
40+
case MTLPixelFormatDepth24Unorm_Stencil8:
41+
return PixelFormat::kD24UnormS8Uint;
42+
#endif // FML_OS_IOS
3943
case MTLPixelFormatDepth32Float_Stencil8:
4044
return PixelFormat::kD32FloatS8UInt;
4145
case MTLPixelFormatBGR10_XR_sRGB:
@@ -50,6 +54,11 @@ constexpr PixelFormat FromMTLPixelFormat(MTLPixelFormat format) {
5054
return PixelFormat::kUnknown;
5155
}
5256

57+
/// Safe accessor for MTLPixelFormatDepth24Unorm_Stencil8.
58+
/// Returns PixelFormat::kUnknown if MTLPixelFormatDepth24Unorm_Stencil8 isn't
59+
/// supported.
60+
MTLPixelFormat SafeMTLPixelFormatDepth24Unorm_Stencil8();
61+
5362
/// Safe accessor for MTLPixelFormatBGR10_XR_sRGB.
5463
/// Returns PixelFormat::kUnknown if MTLPixelFormatBGR10_XR_sRGB isn't
5564
/// supported.
@@ -87,6 +96,8 @@ constexpr MTLPixelFormat ToMTLPixelFormat(PixelFormat format) {
8796
return MTLPixelFormatRGBA16Float;
8897
case PixelFormat::kS8UInt:
8998
return MTLPixelFormatStencil8;
99+
case PixelFormat::kD24UnormS8Uint:
100+
return SafeMTLPixelFormatDepth24Unorm_Stencil8();
90101
case PixelFormat::kD32FloatS8UInt:
91102
return MTLPixelFormatDepth32Float_Stencil8;
92103
case PixelFormat::kB10G10R10XRSRGB:

impeller/renderer/backend/metal/formats_mtl.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// found in the LICENSE file.
44

55
#include "impeller/renderer/backend/metal/formats_mtl.h"
6+
#include <Metal/Metal.h>
67

78
#include <memory>
89

@@ -109,6 +110,15 @@
109110
return mtl_desc;
110111
}
111112

113+
MTLPixelFormat SafeMTLPixelFormatDepth24Unorm_Stencil8() {
114+
#if !FML_OS_IOS
115+
if (@available(macOS 10.11, *)) {
116+
return MTLPixelFormatDepth24Unorm_Stencil8;
117+
}
118+
#endif // FML_OS_IOS
119+
return MTLPixelFormatInvalid;
120+
}
121+
112122
MTLPixelFormat SafeMTLPixelFormatBGR10_XR_sRGB() {
113123
if (@available(iOS 11, macOS 11.0, *)) {
114124
return MTLPixelFormatBGR10_XR_sRGB;

impeller/renderer/backend/vulkan/capabilities_vk.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <algorithm>
88

99
#include "impeller/base/validation.h"
10+
#include "impeller/core/formats.h"
1011
#include "impeller/renderer/backend/vulkan/vk.h"
1112

1213
namespace impeller {
@@ -250,6 +251,7 @@ static bool PhysicalDeviceSupportsRequiredFormats(
250251
HasSuitableColorFormat(device, vk::Format::eB8G8R8A8Unorm);
251252
const auto has_depth_stencil_format =
252253
HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint) ||
254+
HasSuitableDepthStencilFormat(device, vk::Format::eD32SfloatS8Uint) ||
253255
HasSuitableDepthStencilFormat(device, vk::Format::eD24UnormS8Uint);
254256
return has_color_format && has_depth_stencil_format;
255257
}
@@ -337,8 +339,11 @@ bool CapabilitiesVK::SetPhysicalDevice(const vk::PhysicalDevice& device) {
337339
if (HasSuitableDepthStencilFormat(device, vk::Format::eS8Uint)) {
338340
depth_stencil_format_ = PixelFormat::kS8UInt;
339341
} else if (HasSuitableDepthStencilFormat(device,
340-
vk::Format::eD24UnormS8Uint)) {
342+
vk::Format::eD32SfloatS8Uint)) {
341343
depth_stencil_format_ = PixelFormat::kD32FloatS8UInt;
344+
} else if (HasSuitableDepthStencilFormat(device,
345+
vk::Format::eD24UnormS8Uint)) {
346+
depth_stencil_format_ = PixelFormat::kD24UnormS8Uint;
342347
} else {
343348
return false;
344349
}

impeller/renderer/backend/vulkan/formats_vk.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ constexpr vk::Format ToVKImageFormat(PixelFormat format) {
157157
return vk::Format::eR16G16B16A16Sfloat;
158158
case PixelFormat::kS8UInt:
159159
return vk::Format::eS8Uint;
160+
case PixelFormat::kD24UnormS8Uint:
161+
return vk::Format::eD24UnormS8Uint;
160162
case PixelFormat::kD32FloatS8UInt:
161163
return vk::Format::eD32SfloatS8Uint;
162164
case PixelFormat::kR8UNormInt:
@@ -186,6 +188,8 @@ constexpr PixelFormat ToPixelFormat(vk::Format format) {
186188
return PixelFormat::kR16G16B16A16Float;
187189
case vk::Format::eS8Uint:
188190
return PixelFormat::kS8UInt;
191+
case vk::Format::eD24UnormS8Uint:
192+
return PixelFormat::kD24UnormS8Uint;
189193
case vk::Format::eD32SfloatS8Uint:
190194
return PixelFormat::kD32FloatS8UInt;
191195
case vk::Format::eR8Unorm:
@@ -385,6 +389,7 @@ constexpr bool PixelFormatIsDepthStencil(PixelFormat format) {
385389
case PixelFormat::kB10G10R10A10XR:
386390
return false;
387391
case PixelFormat::kS8UInt:
392+
case PixelFormat::kD24UnormS8Uint:
388393
case PixelFormat::kD32FloatS8UInt:
389394
return true;
390395
}
@@ -416,6 +421,7 @@ constexpr AttachmentKind AttachmentKindFromFormat(PixelFormat format) {
416421
return AttachmentKind::kColor;
417422
case PixelFormat::kS8UInt:
418423
return AttachmentKind::kStencil;
424+
case PixelFormat::kD24UnormS8Uint:
419425
case PixelFormat::kD32FloatS8UInt:
420426
return AttachmentKind::kDepthStencil;
421427
}
@@ -574,6 +580,7 @@ constexpr vk::ImageAspectFlags ToVKImageAspectFlags(PixelFormat format) {
574580
return vk::ImageAspectFlagBits::eColor;
575581
case PixelFormat::kS8UInt:
576582
return vk::ImageAspectFlagBits::eStencil;
583+
case PixelFormat::kD24UnormS8Uint:
577584
case PixelFormat::kD32FloatS8UInt:
578585
return vk::ImageAspectFlagBits::eDepth |
579586
vk::ImageAspectFlagBits::eStencil;
@@ -647,6 +654,7 @@ constexpr vk::ImageAspectFlags ToImageAspectFlags(PixelFormat format) {
647654
return vk::ImageAspectFlagBits::eColor;
648655
case PixelFormat::kS8UInt:
649656
return vk::ImageAspectFlagBits::eStencil;
657+
case PixelFormat::kD24UnormS8Uint:
650658
case PixelFormat::kD32FloatS8UInt:
651659
return vk::ImageAspectFlagBits::eDepth |
652660
vk::ImageAspectFlagBits::eStencil;

0 commit comments

Comments
 (0)