Skip to content

Commit 964c94a

Browse files
authored
Update TextureView validation (#3410)
* update TextureView validation * add changelog entry * remove call to clone * dereference instead
1 parent 5a999e6 commit 964c94a

File tree

6 files changed

+229
-139
lines changed

6 files changed

+229
-139
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ let texture = device.create_texture(&wgpu::TextureDescriptor {
182182
- Add validation in accordance with WebGPU `GPUSamplerDescriptor` valid usage for `lodMinClamp` and `lodMaxClamp`. By @James2022-rgb in [#3353](https://github.com/gfx-rs/wgpu/pull/3353)
183183
- Remove panics in `Deref` implementations for `QueueWriteBufferView` and `BufferViewMut`. Instead, warnings are logged, since reading from these types is not recommended. By @botahamec in [#3336]
184184
- Implement `view_formats` in TextureDescriptor to match the WebGPU spec. By @jinleili in [#3237](https://github.com/gfx-rs/wgpu/pull/3237)
185+
- Update `TextureView` validation according to the WebGPU spec. By @teoxoy in [#3410](https://github.com/gfx-rs/wgpu/pull/3410)
185186

186187
#### WebGPU
187188

wgpu-core/src/command/clear.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
165165
if let Some(ref mut list) = cmd_buf.commands {
166166
list.push(TraceCommand::ClearTexture {
167167
dst,
168-
subresource_range: subresource_range.clone(),
168+
subresource_range: *subresource_range,
169169
});
170170
}
171171

@@ -408,9 +408,8 @@ fn clear_texture_via_render_passes<A: hal::Api>(
408408
};
409409

410410
let sample_count = dst_texture.desc.sample_count;
411-
let is_3d_texture = dst_texture.desc.dimension == wgt::TextureDimension::D3;
412411
for mip_level in range.mip_range {
413-
let extent = extent_base.mip_level_size(mip_level, is_3d_texture);
412+
let extent = extent_base.mip_level_size(mip_level, dst_texture.desc.dimension);
414413
let layer_or_depth_range = if dst_texture.desc.dimension == wgt::TextureDimension::D3 {
415414
// TODO: We assume that we're allowed to do clear operations on
416415
// volume texture slices, this is not properly specified.

wgpu-core/src/command/render.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ pub enum RenderPassErrorInner {
451451
UnsupportedResolveTargetFormat(wgt::TextureFormat),
452452
#[error("missing color or depth_stencil attachments, at least one is required.")]
453453
MissingAttachments,
454+
#[error("attachment texture view is not renderable")]
455+
TextureViewIsNotRenderable,
454456
#[error("attachments have differing sizes: {previous:?} is followed by {mismatch:?}")]
455457
AttachmentsDimensionMismatch {
456458
previous: (&'static str, wgt::Extent3d),
@@ -714,15 +716,18 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
714716
Ok(())
715717
};
716718
let mut add_view = |view: &TextureView<A>, type_name| {
719+
let render_extent = view
720+
.render_extent
721+
.ok_or(RenderPassErrorInner::TextureViewIsNotRenderable)?;
717722
if let Some(ex) = extent {
718-
if ex != view.extent {
723+
if ex != render_extent {
719724
return Err(RenderPassErrorInner::AttachmentsDimensionMismatch {
720725
previous: (attachment_type_name, ex),
721-
mismatch: (type_name, view.extent),
726+
mismatch: (type_name, render_extent),
722727
});
723728
}
724729
} else {
725-
extent = Some(view.extent);
730+
extent = Some(render_extent);
726731
}
727732
if sample_count == 0 {
728733
sample_count = view.samples;
@@ -910,10 +915,14 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
910915
.ok_or(RenderPassErrorInner::InvalidAttachment(resolve_target))?;
911916

912917
check_multiview(resolve_view)?;
913-
if color_view.extent != resolve_view.extent {
918+
919+
let render_extent = resolve_view
920+
.render_extent
921+
.ok_or(RenderPassErrorInner::TextureViewIsNotRenderable)?;
922+
if color_view.render_extent.unwrap() != render_extent {
914923
return Err(RenderPassErrorInner::AttachmentsDimensionMismatch {
915924
previous: (attachment_type_name, extent.unwrap_or_default()),
916-
mismatch: ("resolve", resolve_view.extent),
925+
mismatch: ("resolve", render_extent),
917926
});
918927
}
919928
if color_view.samples == 1 || resolve_view.samples != 1 {
@@ -1071,7 +1080,7 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
10711080
};
10721081
let desc = hal::RenderPassDescriptor {
10731082
label: Some("(wgpu internal) Zero init discarded depth/stencil aspect"),
1074-
extent: view.extent,
1083+
extent: view.render_extent.unwrap(),
10751084
sample_count: view.samples,
10761085
color_attachments: &[],
10771086
depth_stencil_attachment: Some(hal::DepthStencilAttachment {

0 commit comments

Comments
 (0)