Skip to content

Commit 56d648a

Browse files
committed
Preliminary implementation
1 parent c7fd582 commit 56d648a

File tree

12 files changed

+78
-17
lines changed

12 files changed

+78
-17
lines changed

examples/features/src/msaa_line/mod.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ impl Example {
112112
sample_count,
113113
dimension: wgpu::TextureDimension::D2,
114114
format: config.view_formats[0],
115-
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
115+
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TRANSIENT,
116116
label: None,
117117
view_formats: &[],
118118
};
@@ -128,6 +128,10 @@ impl crate::framework::Example for Example {
128128
wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES
129129
}
130130

131+
fn required_features() -> wgpu::Features {
132+
wgpu::Features::TRANSIENT_ATTACHMENTS
133+
}
134+
131135
fn init(
132136
config: &wgpu::SurfaceConfiguration,
133137
_adapter: &wgpu::Adapter,
@@ -214,6 +218,17 @@ impl crate::framework::Example for Example {
214218
}
215219
}
216220

221+
fn resize(
222+
&mut self,
223+
config: &wgpu::SurfaceConfiguration,
224+
device: &wgpu::Device,
225+
_queue: &wgpu::Queue,
226+
) {
227+
self.config = config.clone();
228+
self.multisampled_framebuffer =
229+
Example::create_multisampled_framebuffer(device, config, self.sample_count);
230+
}
231+
217232
#[expect(clippy::single_match)]
218233
fn update(&mut self, event: winit::event::WindowEvent) {
219234
match event {
@@ -246,17 +261,6 @@ impl crate::framework::Example for Example {
246261
}
247262
}
248263

249-
fn resize(
250-
&mut self,
251-
config: &wgpu::SurfaceConfiguration,
252-
device: &wgpu::Device,
253-
_queue: &wgpu::Queue,
254-
) {
255-
self.config = config.clone();
256-
self.multisampled_framebuffer =
257-
Example::create_multisampled_framebuffer(device, config, self.sample_count);
258-
}
259-
260264
fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, queue: &wgpu::Queue) {
261265
if self.rebuild_bundle {
262266
self.bundle = Example::create_bundle(

wgpu-core/src/conv.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ pub fn map_texture_usage(
124124
wgt::TextureUses::STORAGE_ATOMIC,
125125
usage.contains(wgt::TextureUsages::STORAGE_ATOMIC),
126126
);
127+
u.set(
128+
wgt::TextureUses::TRANSIENT,
129+
usage.contains(wgt::TextureUsages::TRANSIENT),
130+
);
127131
u
128132
}
129133

@@ -183,6 +187,10 @@ pub fn map_texture_usage_from_hal(uses: wgt::TextureUses) -> wgt::TextureUsages
183187
wgt::TextureUsages::STORAGE_ATOMIC,
184188
uses.contains(wgt::TextureUses::STORAGE_ATOMIC),
185189
);
190+
u.set(
191+
wgt::TextureUsages::TRANSIENT,
192+
uses.contains(wgt::TextureUses::TRANSIENT),
193+
);
186194
u
187195
}
188196

wgpu-core/src/instance.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ impl Adapter {
706706
wgt::TextureUsages::STORAGE_ATOMIC,
707707
caps.contains(Tfc::STORAGE_ATOMIC),
708708
);
709+
allowed_usages.set(wgt::TextureUsages::TRANSIENT, caps.contains(Tfc::TRANSIENT));
709710

710711
let mut flags = wgt::TextureFormatFeatureFlags::empty();
711712
flags.set(

wgpu-hal/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,6 +1675,9 @@ bitflags!(
16751675
const COPY_SRC = 1 << 15;
16761676
/// Format can be copied to.
16771677
const COPY_DST = 1 << 16;
1678+
1679+
/// Format can be created as transient.
1680+
const TRANSIENT = 1 << 17;
16781681
}
16791682
);
16801683

wgpu-hal/src/metal/adapter.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl crate::Adapter for super::Adapter {
149149
| msaa_count
150150
| Tfc::MULTISAMPLE_RESOLVE;
151151

152-
let extra = match format {
152+
let mut extra = match format {
153153
Tf::R8Unorm | Tf::R16Float | Tf::Rgba8Unorm | Tf::Rgba16Float => {
154154
read_write_tier2_if | all_caps
155155
}
@@ -352,6 +352,11 @@ impl crate::Adapter for super::Adapter {
352352
}
353353
};
354354

355+
extra.set(
356+
Tfc::TRANSIENT,
357+
self.shared.private_caps.supports_memoryless_storage,
358+
);
359+
355360
Tfc::COPY_SRC | Tfc::COPY_DST | Tfc::SAMPLED | Tfc::STORAGE_READ_ONLY | extra
356361
}
357362

@@ -902,6 +907,7 @@ impl super::PrivateCapabilities {
902907
&& (device.supports_family(MTLGPUFamily::Apple7)
903908
|| device.supports_family(MTLGPUFamily::Mac2)),
904909
supports_shared_event: version.at_least((10, 14), (12, 0), os_is_mac),
910+
supports_memoryless_storage: version.at_least((11, 0), (10, 0), os_is_mac),
905911
}
906912
}
907913

@@ -1001,6 +1007,8 @@ impl super::PrivateCapabilities {
10011007
features.insert(F::SUBGROUP | F::SUBGROUP_BARRIER);
10021008
}
10031009

1010+
features.set(F::TRANSIENT_ATTACHMENTS, self.supports_memoryless_storage);
1011+
10041012
features
10051013
}
10061014

wgpu-hal/src/metal/device.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,13 +452,21 @@ impl crate::Device for super::Device {
452452
}
453453
};
454454

455+
let mtl_storage_mode = if desc.usage.contains(wgt::TextureUses::TRANSIENT)
456+
&& self.features.contains(wgt::Features::TRANSIENT_ATTACHMENTS)
457+
{
458+
MTLStorageMode::Memoryless
459+
} else {
460+
MTLStorageMode::Private
461+
};
462+
455463
descriptor.set_texture_type(mtl_type);
456464
descriptor.set_width(desc.size.width as u64);
457465
descriptor.set_height(desc.size.height as u64);
458466
descriptor.set_mipmap_level_count(desc.mip_level_count as u64);
459467
descriptor.set_pixel_format(mtl_format);
460468
descriptor.set_usage(conv::map_texture_usage(desc.format, desc.usage));
461-
descriptor.set_storage_mode(MTLStorageMode::Private);
469+
descriptor.set_storage_mode(mtl_storage_mode);
462470

463471
let raw = self.shared.device.lock().new_texture(&descriptor);
464472
if raw.as_ptr().is_null() {

wgpu-hal/src/metal/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ struct PrivateCapabilities {
300300
int64_atomics: bool,
301301
float_atomics: bool,
302302
supports_shared_event: bool,
303+
supports_memoryless_storage: bool,
303304
}
304305

305306
#[derive(Clone, Debug)]

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,8 @@ impl PhysicalDeviceFeatures {
560560
| F::PIPELINE_CACHE
561561
| F::SHADER_EARLY_DEPTH_TEST
562562
| F::TEXTURE_ATOMIC
563-
| F::EXPERIMENTAL_PASSTHROUGH_SHADERS;
563+
| F::EXPERIMENTAL_PASSTHROUGH_SHADERS
564+
| F::TRANSIENT_ATTACHMENTS;
564565

565566
let mut dl_flags = Df::COMPUTE_SHADERS
566567
| Df::BASE_VERTEX
@@ -2445,7 +2446,7 @@ impl crate::Adapter for super::Adapter {
24452446
};
24462447
let features = properties.optimal_tiling_features;
24472448

2448-
let mut flags = Tfc::empty();
2449+
let mut flags = Tfc::TRANSIENT;
24492450
flags.set(
24502451
Tfc::SAMPLED,
24512452
features.contains(vk::FormatFeatureFlags::SAMPLED_IMAGE),

wgpu-hal/src/vulkan/conv.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@ pub fn map_texture_usage(usage: wgt::TextureUses) -> vk::ImageUsageFlags {
259259
) {
260260
flags |= vk::ImageUsageFlags::STORAGE;
261261
}
262+
if usage.contains(wgt::TextureUses::TRANSIENT) {
263+
flags |= vk::ImageUsageFlags::TRANSIENT_ATTACHMENT;
264+
}
262265
flags
263266
}
264267

@@ -348,6 +351,9 @@ pub fn map_vk_image_usage(usage: vk::ImageUsageFlags) -> wgt::TextureUses {
348351
| wgt::TextureUses::STORAGE_READ_WRITE
349352
| wgt::TextureUses::STORAGE_ATOMIC;
350353
}
354+
if usage.contains(vk::ImageUsageFlags::TRANSIENT_ATTACHMENT) {
355+
bits |= wgt::TextureUses::TRANSIENT;
356+
}
351357
bits
352358
}
353359

wgpu-hal/src/vulkan/device.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1264,13 +1264,19 @@ impl crate::Device for super::Device {
12641264
unsafe { self.shared.raw.destroy_image(image.raw, None) };
12651265
})?;
12661266

1267+
let mut alloc_usage = gpu_alloc::UsageFlags::FAST_DEVICE_ACCESS;
1268+
alloc_usage.set(
1269+
gpu_alloc::UsageFlags::TRANSIENT,
1270+
desc.usage.contains(wgt::TextureUses::TRANSIENT),
1271+
);
1272+
12671273
let block = unsafe {
12681274
self.mem_allocator.lock().alloc(
12691275
&*self.shared,
12701276
gpu_alloc::Request {
12711277
size: image.requirements.size,
12721278
align_mask: image.requirements.alignment - 1,
1273-
usage: gpu_alloc::UsageFlags::FAST_DEVICE_ACCESS,
1279+
usage: alloc_usage,
12741280
memory_types: image.requirements.memory_type_bits & self.valid_ash_memory_types,
12751281
},
12761282
)

0 commit comments

Comments
 (0)