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

Commit fddd5ad

Browse files
author
Jonah Williams
authored
[Impeller] Use a device buffer for SkBitmap allocation, use Linear texture on Metal backend. (#41374)
This reduces the cost of uploading the glyph atlas, as we can exploit metal's capabilies to create a texture from a device buffer and share the underlying memory with a linear texture. This also means that subsequent updates don't require uploads or copies either. From scrolling through wonderous, this shaves off about 0.2 ms (0.6 ms -> 0.4 ms) of fresh atlas construction.
1 parent ff92235 commit fddd5ad

14 files changed

+275
-85
lines changed

impeller/renderer/backend/metal/context_mtl.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ static bool DeviceSupportsComputeSubgroups(id<MTLDevice> device) {
5555
.SetSupportsBufferToTextureBlits(true)
5656
.SetSupportsTextureToTextureBlits(true)
5757
.SetSupportsDecalTileMode(true)
58+
.SetSupportsSharedDeviceBufferTextureMemory(true)
5859
.SetSupportsFramebufferFetch(DeviceSupportsFramebufferFetch(device))
5960
.SetDefaultColorFormat(color_format)
6061
.SetDefaultStencilFormat(PixelFormat::kS8UInt)

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)