diff --git a/reftests/scenes/basic.ron b/reftests/scenes/basic.ron index f56c0b3ad0c..6d2f7fcdf5f 100644 --- a/reftests/scenes/basic.ron +++ b/reftests/scenes/basic.ron @@ -4,7 +4,7 @@ kind: D2(1, 1, 1, 1), num_levels: 1, format: Rgba8Unorm, - usage: (bits: 0x24), //COLOR_ATTACHMENT | SAMPLED (temporary for GL) + usage: (bits: 0x14), //COLOR_ATTACHMENT | SAMPLED (temporary for GL) ), "pass": RenderPass( attachments: { diff --git a/reftests/scenes/compute.ron b/reftests/scenes/compute.ron index 512123dd203..1c4d06ec558 100644 --- a/reftests/scenes/compute.ron +++ b/reftests/scenes/compute.ron @@ -2,7 +2,7 @@ resources: { "buffer.output": Buffer( size: 4, - usage: (bits: 0x8), //STORAGE + usage: (bits: 0x20), //STORAGE ), "desc-layout": DescriptorSetLayout( bindings: [ diff --git a/src/backend/dx12/src/command.rs b/src/backend/dx12/src/command.rs index 1b9b0c0dd7c..04470d58683 100644 --- a/src/backend/dx12/src/command.rs +++ b/src/backend/dx12/src/command.rs @@ -1027,9 +1027,12 @@ impl com::RawCommandBuffer for CommandBuffer { range: image::SubresourceRange, value: com::ClearColorRaw, ) { - assert_eq!(range, image.to_subresource_range(Aspects::COLOR)); - let rtv = image.clear_cv.unwrap(); - self.clear_render_target_view(rtv, value, &[]); + assert_eq!(range.aspects, Aspects::COLOR); + assert_eq!(range.levels, 0 .. 1); //TODO + for layer in range.layers { + let rtv = image.clear_cv[layer as usize]; + self.clear_render_target_view(rtv, value, &[]); + } } fn clear_depth_stencil_image_raw( @@ -1040,14 +1043,16 @@ impl com::RawCommandBuffer for CommandBuffer { value: com::ClearDepthStencilRaw, ) { assert!((Aspects::DEPTH | Aspects::STENCIL).contains(range.aspects)); - assert_eq!(range, image.to_subresource_range(range.aspects)); - if range.aspects.contains(Aspects::DEPTH) { - let dsv = image.clear_dv.unwrap(); - self.clear_depth_stencil_view(dsv, Some(value.depth), None, &[]); - } - if range.aspects.contains(Aspects::STENCIL) { - let dsv = image.clear_sv.unwrap(); - self.clear_depth_stencil_view(dsv, None, Some(value.stencil as _), &[]); + assert_eq!(range.levels, 0 .. 1); //TODO + for layer in range.layers { + if range.aspects.contains(Aspects::DEPTH) { + let dsv = image.clear_dv[layer as usize]; + self.clear_depth_stencil_view(dsv, Some(value.depth), None, &[]); + } + if range.aspects.contains(Aspects::STENCIL) { + let dsv = image.clear_sv[layer as usize]; + self.clear_depth_stencil_view(dsv, None, Some(value.stencil as _), &[]); + } } } diff --git a/src/backend/dx12/src/device.rs b/src/backend/dx12/src/device.rs index bd6acf575dd..234a1c2f919 100644 --- a/src/backend/dx12/src/device.rs +++ b/src/backend/dx12/src/device.rs @@ -1778,9 +1778,9 @@ impl d::Device for Device { }, format: image.desc.Format, range: image::SubresourceRange { - aspects: Aspects::COLOR, - levels: 0 .. 1, //TODO? - layers: 0 .. num_layers, + aspects: Aspects::empty(), + levels: 0 .. 0, + layers: 0 .. 0, }, }; @@ -1798,35 +1798,57 @@ impl d::Device for Device { block_dim: image.block_dim, num_levels: image.num_levels, clear_cv: if image.aspects.contains(Aspects::COLOR) && image.usage.contains(Usage::COLOR_ATTACHMENT) { - Some(self.view_image_as_render_target(info.clone()).unwrap()) + (0 .. num_layers) + .map(|layer| { + self.view_image_as_render_target( + ViewInfo { + range: image::SubresourceRange { + aspects: Aspects::COLOR, + levels: 0 .. 1, //TODO? + layers: layer .. layer + 1, + }, + .. info.clone() + }).unwrap() + }) + .collect() } else { - None + Vec::new() }, clear_dv: if image.aspects.contains(Aspects::DEPTH) && image.usage.contains(Usage::DEPTH_STENCIL_ATTACHMENT) { - Some(self.view_image_as_depth_stencil(ViewInfo { - format: image.dsv_format, - range: image::SubresourceRange { - aspects: Aspects::DEPTH, - levels: 0 .. 1, //TODO? - layers: 0 .. num_layers, - }, - .. info.clone() - }).unwrap()) + (0 .. num_layers) + .map(|layer| { + self.view_image_as_depth_stencil( + ViewInfo { + format: image.dsv_format, + range: image::SubresourceRange { + aspects: Aspects::DEPTH, + levels: 0 .. 1, //TODO? + layers: layer .. layer + 1, + }, + .. info.clone() + }).unwrap() + }) + .collect() } else { - None + Vec::new() }, clear_sv: if image.aspects.contains(Aspects::STENCIL) && image.usage.contains(Usage::DEPTH_STENCIL_ATTACHMENT) { - Some(self.view_image_as_depth_stencil(ViewInfo { - format: image.dsv_format, - range: image::SubresourceRange { - aspects: Aspects::STENCIL, - levels: 0 .. 1, //TODO? - layers: 0 .. num_layers, - }, - .. info.clone() - }).unwrap()) + (0 .. num_layers) + .map(|layer| { + self.view_image_as_depth_stencil( + ViewInfo { + format: image.dsv_format, + range: image::SubresourceRange { + aspects: Aspects::STENCIL, + levels: 0 .. 1, //TODO? + layers: layer .. layer + 1, + }, + .. info.clone() + }).unwrap() + }) + .collect() } else { - None + Vec::new() }, }) } @@ -2602,9 +2624,9 @@ impl d::Device for Device { bytes_per_block, block_dim, num_levels: 1, - clear_cv: Some(rtv_handle), - clear_dv: None, - clear_sv: None, + clear_cv: vec![rtv_handle], + clear_dv: Vec::new(), + clear_sv: Vec::new(), } }).collect(); diff --git a/src/backend/dx12/src/lib.rs b/src/backend/dx12/src/lib.rs index 65f9276468b..72193ff9ed9 100644 --- a/src/backend/dx12/src/lib.rs +++ b/src/backend/dx12/src/lib.rs @@ -494,7 +494,7 @@ impl Device { present_queue: ComPtr, ) -> Self { // Allocate descriptor heaps - let max_rtvs = 256; // TODO + let max_rtvs = 512; // TODO let rtv_pool = native::DescriptorCpuPool { heap: Self::create_descriptor_heap_impl( &mut device, diff --git a/src/backend/dx12/src/native.rs b/src/backend/dx12/src/native.rs index fbe118a26f2..49ac2414813 100644 --- a/src/backend/dx12/src/native.rs +++ b/src/backend/dx12/src/native.rs @@ -159,11 +159,11 @@ pub struct Image { pub(crate) block_dim: (u8, u8), pub(crate) num_levels: image::Level, #[derivative(Debug="ignore")] - pub(crate) clear_cv: Option, + pub(crate) clear_cv: Vec, #[derivative(Debug="ignore")] - pub(crate) clear_dv: Option, + pub(crate) clear_dv: Vec, #[derivative(Debug="ignore")] - pub(crate) clear_sv: Option, + pub(crate) clear_sv: Vec, } unsafe impl Send for Image { } unsafe impl Sync for Image { }