fix(ext/webgpu): Allow depthClearValue to be undefined when depthLoadOp is not "clear" (#23850)

This commit is contained in:
chirsz 2024-05-21 04:47:04 +08:00 committed by GitHub
parent c89f9f9ad1
commit 529356cc12
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 2 deletions

View File

@ -79,7 +79,7 @@ pub struct GpuRenderPassColorAttachment {
#[serde(rename_all = "camelCase")]
pub struct GpuRenderPassDepthStencilAttachment {
view: ResourceId,
depth_clear_value: f32,
depth_clear_value: Option<f32>,
depth_load_op: Option<wgpu_core::command::LoadOp>,
depth_store_op: Option<wgpu_core::command::StoreOp>,
depth_read_only: bool,
@ -168,7 +168,9 @@ pub fn op_webgpu_command_encoder_begin_render_pass(
store_op: attachment
.depth_store_op
.unwrap_or(wgpu_core::command::StoreOp::Store),
clear_value: attachment.depth_clear_value,
// In "01_webgpu.js", `depthLoadOp` is cheked to ensure its value is not "clear"
// when `depthClearValue` is undefined, so the default 0.0 doesn't matter.
clear_value: attachment.depth_clear_value.unwrap_or(0.0),
read_only: attachment.depth_read_only,
},
stencil: wgpu_core::command::PassChannel {

View File

@ -496,6 +496,36 @@ Deno.test({
device.destroy();
});
Deno.test({
ignore: isWsl || isLinuxOrMacCI,
}, async function beginRenderPassWithoutDepthClearValue() {
const adapter = await navigator.gpu.requestAdapter();
assert(adapter);
const device = await adapter.requestDevice();
assert(device);
const encoder = device.createCommandEncoder();
const depthTexture = device.createTexture({
size: [256, 256],
format: "depth32float",
usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
const depthView = depthTexture.createView();
const renderPass = encoder.beginRenderPass({
colorAttachments: [],
depthStencilAttachment: {
view: depthView,
depthLoadOp: "load",
},
});
assert(renderPass);
device.destroy();
});
async function checkIsWsl() {
return Deno.build.os === "linux" && await hasMicrosoftProcVersion();