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

Commit 79237ad

Browse files
author
Jonah Williams
authored
Reland: [Impeller] Use a device buffer for SkBitmap allocation, use Linear texture on Metal backend. (#41538)
Original PR: #41374 This was reverted because it broke on simulators as they do not support linear textures. To fix this, I've ifdef'd out the DeviceBufferMTL implementation of AsTexture so that it falls back to the slow path copy. Also updated the capabilities check so that the glyph atlas updates the texture contents when it changes.
1 parent 99b7fc1 commit 79237ad

16 files changed

+287
-85
lines changed

impeller/renderer/backend/metal/context_mtl.mm

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ static bool DeviceSupportsComputeSubgroups(id<MTLDevice> device) {
4545
return supports_subgroups;
4646
}
4747

48+
static constexpr bool SupportsLinearTexture() {
49+
#ifdef FML_OS_IOS_SIMULATOR
50+
return false;
51+
#else
52+
return true;
53+
#endif // FML_OS_IOS_SIMULATOR
54+
}
55+
4856
static std::unique_ptr<Capabilities> InferMetalCapabilities(
4957
id<MTLDevice> device,
5058
PixelFormat color_format) {
@@ -55,6 +63,7 @@ static bool DeviceSupportsComputeSubgroups(id<MTLDevice> device) {
5563
.SetSupportsBufferToTextureBlits(true)
5664
.SetSupportsTextureToTextureBlits(true)
5765
.SetSupportsDecalTileMode(true)
66+
.SetSupportsSharedDeviceBufferTextureMemory(SupportsLinearTexture())
5867
.SetSupportsFramebufferFetch(DeviceSupportsFramebufferFetch(device))
5968
.SetDefaultColorFormat(color_format)
6069
.SetDefaultStencilFormat(PixelFormat::kS8UInt)

impeller/renderer/backend/metal/device_buffer_mtl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ class DeviceBufferMTL final : public DeviceBuffer,
3535
// |DeviceBuffer|
3636
uint8_t* OnGetContents() const override;
3737

38+
#ifndef FML_OS_IOS_SIMULATOR
3839
// |DeviceBuffer|
3940
std::shared_ptr<Texture> AsTexture(Allocator& allocator,
4041
const TextureDescriptor& descriptor,
4142
uint16_t row_bytes) const override;
43+
#endif // FML_OS_IOS_SIMULATOR
4244

4345
// |DeviceBuffer|
4446
bool OnCopyHostBuffer(const uint8_t* source,

impeller/renderer/backend/metal/device_buffer_mtl.mm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
return reinterpret_cast<uint8_t*>(buffer_.contents);
3030
}
3131

32+
#ifndef FML_OS_IOS_SIMULATOR
3233
std::shared_ptr<Texture> DeviceBufferMTL::AsTexture(
3334
Allocator& allocator,
3435
const TextureDescriptor& descriptor,
@@ -52,6 +53,7 @@
5253
}
5354
return std::make_shared<TextureMTL>(descriptor, texture);
5455
}
56+
#endif // FML_OS_IOS_SIMULATOR
5557

5658
[[nodiscard]] bool DeviceBufferMTL::OnCopyHostBuffer(const uint8_t* source,
5759
Range source_range,

impeller/renderer/backend/vulkan/capabilities_vk.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,10 +348,16 @@ bool CapabilitiesVK::SupportsReadFromOnscreenTexture() const {
348348
return false;
349349
}
350350

351+
// |Capabilities|
351352
bool CapabilitiesVK::SupportsDecalTileMode() const {
352353
return true;
353354
}
354355

356+
// |Capabilities|
357+
bool CapabilitiesVK::SupportsSharedDeviceBufferTextureMemory() const {
358+
return false;
359+
}
360+
355361
// |Capabilities|
356362
PixelFormat CapabilitiesVK::GetDefaultColorFormat() const {
357363
return color_format_;

impeller/renderer/backend/vulkan/capabilities_vk.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ class CapabilitiesVK final : public Capabilities,
7979
// |Capabilities|
8080
bool SupportsDecalTileMode() const override;
8181

82+
// |Capabilities|
83+
bool SupportsSharedDeviceBufferTextureMemory() const override;
84+
8285
// |Capabilities|
8386
PixelFormat GetDefaultColorFormat() const override;
8487

impeller/renderer/capabilities.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ class StandardCapabilities final : public Capabilities {
6666
return supports_decal_tile_mode_;
6767
}
6868

69+
// |Capabilities|
70+
bool SupportsSharedDeviceBufferTextureMemory() const override {
71+
return supports_shared_device_buffer_texture_memory_;
72+
}
73+
6974
// |Capabilities|
7075
PixelFormat GetDefaultColorFormat() const override {
7176
return default_color_format_;
@@ -88,6 +93,7 @@ class StandardCapabilities final : public Capabilities {
8893
bool supports_read_from_onscreen_texture,
8994
bool supports_read_from_resolve,
9095
bool supports_decal_tile_mode,
96+
bool supports_shared_device_buffer_texture_memory,
9197
PixelFormat default_color_format,
9298
PixelFormat default_stencil_format)
9399
: has_threading_restrictions_(has_threading_restrictions),
@@ -102,6 +108,8 @@ class StandardCapabilities final : public Capabilities {
102108
supports_read_from_onscreen_texture),
103109
supports_read_from_resolve_(supports_read_from_resolve),
104110
supports_decal_tile_mode_(supports_decal_tile_mode),
111+
supports_shared_device_buffer_texture_memory_(
112+
supports_shared_device_buffer_texture_memory),
105113
default_color_format_(default_color_format),
106114
default_stencil_format_(default_stencil_format) {}
107115

@@ -118,6 +126,7 @@ class StandardCapabilities final : public Capabilities {
118126
bool supports_read_from_onscreen_texture_ = false;
119127
bool supports_read_from_resolve_ = false;
120128
bool supports_decal_tile_mode_ = false;
129+
bool supports_shared_device_buffer_texture_memory_ = false;
121130
PixelFormat default_color_format_ = PixelFormat::kUnknown;
122131
PixelFormat default_stencil_format_ = PixelFormat::kUnknown;
123132

@@ -202,6 +211,12 @@ CapabilitiesBuilder& CapabilitiesBuilder::SetSupportsDecalTileMode(bool value) {
202211
return *this;
203212
}
204213

214+
CapabilitiesBuilder&
215+
CapabilitiesBuilder::SetSupportsSharedDeviceBufferTextureMemory(bool value) {
216+
supports_shared_device_buffer_texture_memory_ = value;
217+
return *this;
218+
}
219+
205220
std::unique_ptr<Capabilities> CapabilitiesBuilder::Build() {
206221
return std::unique_ptr<StandardCapabilities>(new StandardCapabilities( //
207222
has_threading_restrictions_, //
@@ -215,6 +230,7 @@ std::unique_ptr<Capabilities> CapabilitiesBuilder::Build() {
215230
supports_read_from_onscreen_texture_, //
216231
supports_read_from_resolve_, //
217232
supports_decal_tile_mode_, //
233+
supports_shared_device_buffer_texture_memory_, //
218234
*default_color_format_, //
219235
*default_stencil_format_ //
220236
));

impeller/renderer/capabilities.h

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

3838
virtual bool SupportsDecalTileMode() const = 0;
3939

40+
virtual bool SupportsSharedDeviceBufferTextureMemory() const = 0;
41+
4042
virtual PixelFormat GetDefaultColorFormat() const = 0;
4143

4244
virtual PixelFormat GetDefaultStencilFormat() const = 0;
@@ -79,6 +81,8 @@ class CapabilitiesBuilder {
7981

8082
CapabilitiesBuilder& SetSupportsDecalTileMode(bool value);
8183

84+
CapabilitiesBuilder& SetSupportsSharedDeviceBufferTextureMemory(bool value);
85+
8286
std::unique_ptr<Capabilities> Build();
8387

8488
private:
@@ -93,6 +97,7 @@ class CapabilitiesBuilder {
9397
bool supports_read_from_onscreen_texture_ = false;
9498
bool supports_read_from_resolve_ = false;
9599
bool supports_decal_tile_mode_ = false;
100+
bool supports_shared_device_buffer_texture_memory_ = false;
96101
std::optional<PixelFormat> default_color_format_ = std::nullopt;
97102
std::optional<PixelFormat> default_stencil_format_ = std::nullopt;
98103

impeller/renderer/capabilities_unittests.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ CAPABILITY_TEST(SupportsComputeSubgroups, false);
2929
CAPABILITY_TEST(SupportsReadFromOnscreenTexture, false);
3030
CAPABILITY_TEST(SupportsReadFromResolve, false);
3131
CAPABILITY_TEST(SupportsDecalTileMode, false);
32+
CAPABILITY_TEST(SupportsSharedDeviceBufferTextureMemory, false);
3233

3334
} // namespace testing
3435
} // namespace impeller

0 commit comments

Comments
 (0)