Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[naga] Add phony as naga-ir statement #6308

Closed
wants to merge 4 commits into from
Closed

Conversation

sagudev
Copy link
Contributor

@sagudev sagudev commented Sep 22, 2024

Connections
Fix #6095

Description
Currently phony statements get removed when compacting and when emitting, we can solve both problems by introducing new phony statement that are not compacted away and are always emitted.

Why not reusing emit? Because it makes reasoning easier (we would need to somehow encode phonies in emit statements and this gets very ugly) and phonies are just different enough to deserve special treatment. Also per emit docs: Emit a range of expressions, visible to all statements that follow in this block, but phony statements are not visible to other statements. This was also discussed in gfx-rs/naga#1866 (comment), but naga changed (and regressed) as compacting was introduced, so instead of hacking around more I think this is the most elegant solution.

Testing
Existing tests, new tests and servo CTS run.

Checklist

  • Run cargo fmt.
  • Run cargo clippy. If applicable, add:
    • --target wasm32-unknown-unknown
    • --target wasm32-unknown-emscripten
  • Run cargo xtask test to run tests.
  • Add change to CHANGELOG.md. See simple instructions inside file.

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
@sagudev
Copy link
Contributor Author

sagudev commented Sep 22, 2024

CTS results from servo:

     • TIMEOUT /_webgpu/webgpu/cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxSampledTexturesPerShaderStage:createPipeline,at_over:*
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="atDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="fragment";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=false;bindingCombination="compute";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="fragment";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleVertexStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="shiftByHalf";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="forward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="backward";bindGroupTest="sameGroup"
       • PASS [expected FAIL] subtest: :limitTest="underDefault";testValueName="overLimit";async=true;bindingCombination="compute";order="shiftByHalf";bindGroupTest="sameGroup"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,compute_pass:*
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=false;empty=false;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=false;empty=false;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=false;empty=true;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=false;empty=true;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=true;empty=false;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=true;empty=false;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=true;empty=true;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto0";swap=true;empty=true;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="explicit";swap=false;empty=false;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="explicit";swap=false;empty=false;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="explicit";swap=false;empty=true;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="explicit";swap=false;empty=true;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto1";swap=false;empty=false;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto1";swap=false;empty=false;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto1";swap=false;empty=true;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="auto0";bindingType="auto1";swap=false;empty=true;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="explicit";bindingType="auto0";swap=false;empty=false;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="explicit";bindingType="auto0";swap=false;empty=false;computeCommand="dispatch"
       • PASS [expected FAIL] subtest: :pipelineType="explicit";bindingType="auto0";swap=false;empty=true;computeCommand="dispatchIndirect"
       • PASS [expected FAIL] subtest: :pipelineType="explicit";bindingType="auto0";swap=false;empty=true;computeCommand="dispatch"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:api,validation,getBindGroupLayout:index_range,auto_layout:*
       • PASS [expected FAIL] subtest: :index=0
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:api,validation,getBindGroupLayout:unique_js_object,auto_layout:*
       • PASS [expected FAIL] subtest: :
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:api,validation,layout_shader_compat:pipeline_layout_shader_exact_match:*
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="uniformBuf";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="storageBuf";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="readonlyStorageBuf";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="filtSamp";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="nonFiltSamp";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="compareSamp";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="sampledTex";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="sampledTexMS";bindingInShader="storageBuf"
       • PASS [expected FAIL] subtest: :bindingInPipelineLayout="writeonlyStorageTex";bindingInShader="storageBuf"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:binding_collisions:*
       • PASS [expected FAIL] subtest: :a_group=0;b_group=0;a_binding=0;b_binding=0;b_use="same"
       • PASS [expected FAIL] subtest: :a_group=0;b_group=0;a_binding=1;b_binding=1;b_use="same"
       • PASS [expected FAIL] subtest: :a_group=1;b_group=1;a_binding=0;b_binding=0;b_use="same"
       • PASS [expected FAIL] subtest: :a_group=1;b_group=1;a_binding=1;b_binding=1;b_use="same"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:scalar_vector_out_of_range:*
       • PASS [expected FAIL] subtest: :op="add";lhs="f32";rhs="f32"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec2%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec3%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="add";lhs="vec4%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="sub";lhs="f32";rhs="f32"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec2%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec3%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="sub";lhs="vec4%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="mul";lhs="f32";rhs="f32"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec2%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec3%3Cf32%3E";rhs="f32"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :op="mul";lhs="vec4%3Cf32%3E";rhs="f32"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,abs:parameters:*
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acos:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acosh:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:arguments:*
       • PASS [expected FAIL] subtest: :test="i32"
       • PASS [expected FAIL] subtest: :test="u32"
       • PASS [expected FAIL] subtest: :test="f32"
       • PASS [expected FAIL] subtest: :test="vec_i32"
       • PASS [expected FAIL] subtest: :test="vec_u32"
       • PASS [expected FAIL] subtest: :test="vec_f32"
       • PASS [expected FAIL] subtest: :test="matrix"
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:arguments:*
       • PASS [expected FAIL] subtest: :test="i32"
       • PASS [expected FAIL] subtest: :test="u32"
       • PASS [expected FAIL] subtest: :test="f32"
       • PASS [expected FAIL] subtest: :test="vec_i32"
       • PASS [expected FAIL] subtest: :test="vec_u32"
       • PASS [expected FAIL] subtest: :test="vec_f32"
       • PASS [expected FAIL] subtest: :test="matrix"
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:bool_type:*
       • PASS [expected FAIL] subtest: :
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:type:*
       • PASS [expected FAIL] subtest: :type="i32"
       • PASS [expected FAIL] subtest: :type="u32"
       • PASS [expected FAIL] subtest: :type="f32"
       • PASS [expected FAIL] subtest: :type="mat2x2f"
       • PASS [expected FAIL] subtest: :type="mat2x3f"
       • PASS [expected FAIL] subtest: :type="mat2x4f"
       • PASS [expected FAIL] subtest: :type="mat3x2f"
       • PASS [expected FAIL] subtest: :type="mat3x3f"
       • PASS [expected FAIL] subtest: :type="mat3x4f"
       • PASS [expected FAIL] subtest: :type="mat4x2f"
       • PASS [expected FAIL] subtest: :type="mat4x3f"
       • PASS [expected FAIL] subtest: :type="mat4x4f"
       • PASS [expected FAIL] subtest: :type="vec2%3Ci32%3E"
       • PASS [expected FAIL] subtest: :type="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :type="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :type="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :type="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :type="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :type="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :type="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :type="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :type="atomic%3Cu32%3E"
       • PASS [expected FAIL] subtest: :type="atomic%3Ci32%3E"
       • PASS [expected FAIL] subtest: :type="T"
       • PASS [expected FAIL] subtest: :type="array%3Ci32,%202%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asin:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asinh:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:must_use:*
       • FAIL [expected PASS] subtest: :use=true
        - EXCEPTION: Error: Unexpected validation error occurred:
            Shader validation error:
            ┌─ :1:1
            │
            1 │ fn f() { _ = atan2(1, 2); }
            │ ^^^^^^^^^^^^^^^^^^^^^^^^^
            │ │            │
            │ │            naga::Expression [2]
            │ naga::Function [0]
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:parameters:*
       • FAIL [expected PASS] subtest: :test="ai"
        - EXCEPTION: Error: Unexpected validation error occurred:
            Shader validation error:
                ┌─ :21:7
                │
             21 │   _ = atan2(1, 2);
                │       ^^^^^ naga::Expression [2]
       • FAIL [expected PASS] subtest: :test="ai_af"
       • FAIL [expected PASS] subtest: :test="af_ai"
       • FAIL [expected PASS] subtest: :test="ai_f32"
       ...
       • PASS [expected FAIL] subtest: :test="mixed_types"
       • PASS [expected FAIL] subtest: :test="mixed_types_2"
       • PASS [expected FAIL] subtest: :test="u32_f32"
       • PASS [expected FAIL] subtest: :test="f32_u32"
       • PASS [expected FAIL] subtest: :test="f32_i32"
       • PASS [expected FAIL] subtest: :test="i32_f32"
       • PASS [expected FAIL] subtest: :test="f32_bool"
       • PASS [expected FAIL] subtest: :test="bool_f32"
       • PASS [expected FAIL] subtest: :test="vec_f32"
       • PASS [expected FAIL] subtest: :test="f32_vec"
       • PASS [expected FAIL] subtest: :test="matrix"
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atanh:parameters:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:arguments:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:arguments:*
       • PASS [expected FAIL] subtest: :type="array"
       • PASS [expected FAIL] subtest: :type="array_runtime"
       • PASS [expected FAIL] subtest: :type="struct"
       • PASS [expected FAIL] subtest: :type="sampler"
       • PASS [expected FAIL] subtest: :type="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:must_use:*
       • FAIL [expected PASS] subtest: :use=true
        - EXCEPTION: Error: Unexpected validation error occurred:
            Shader validation error:
            ┌─ :1:1
            │
            1 │ fn f() { _ = cross(vec3(0), vec3(1)); }
            │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            │ │            │
            │ │            naga::Expression [4]
            │ naga::Function [0]
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:only_in_fragment:*
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdx"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdxCoarse"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdxFine"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdy"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdyCoarse"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="dpdyFine"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="fwidth"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="fwidthCoarse"
       • PASS [expected FAIL] subtest: :entry_point="vertex";call="fwidthFine"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdx"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdxCoarse"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdxFine"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdy"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdyCoarse"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="dpdyFine"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="fwidth"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="fwidthCoarse"
       • PASS [expected FAIL] subtest: :entry_point="compute";call="fwidthFine"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdx"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdxCoarse"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdxFine"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdy"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdyCoarse"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="dpdyFine"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="fwidth"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="fwidthCoarse"
       • PASS [expected FAIL] subtest: :entry_point="fragment_and_compute";call="fwidthFine"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:must_use:*
       • FAIL [expected PASS] subtest: :use=true
        - EXCEPTION: Error: Unexpected validation error occurred:
            Shader validation error:
            ┌─ :1:1
            │
            1 │ fn f() { _ = distance(vec3(0), vec3(1)); }
            │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            │ │            │
            │ │            naga::Expression [4]
            │ naga::Function [0]
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:must_use:*
       • FAIL [expected PASS] subtest: :use=true 
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:must_use:*
       • FAIL [expected PASS] subtest: :arg="vec2f";use=true
       • FAIL [expected PASS] subtest: :arg="vec3f";use=true
       • FAIL [expected PASS] subtest: :arg="vec4f";use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:arguments:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:arguments:*
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:arguments:*
       • FAIL [expected PASS] subtest: :test="mixed_aint_afloat" 
       • PASS [expected FAIL] subtest: :test="mixed_i32_u32"
       • PASS [expected FAIL] subtest: :test="matrix"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:arguments:*
       • PASS [expected FAIL] subtest: :test="bool"
       • PASS [expected FAIL] subtest: :test="i32"
       • PASS [expected FAIL] subtest: :test="u32"
       • FAIL [expected PASS] subtest: :test="mixed_aint_afloat" 
       • PASS [expected FAIL] subtest: :test="vec_bool"
       • PASS [expected FAIL] subtest: :test="vec_i32"
       • PASS [expected FAIL] subtest: :test="vec_u32"
       • PASS [expected FAIL] subtest: :test="matrix"
       • PASS [expected FAIL] subtest: :test="atomic"
       • PASS [expected FAIL] subtest: :test="array"
       • PASS [expected FAIL] subtest: :test="array_runtime"
       • PASS [expected FAIL] subtest: :test="struct"
       • PASS [expected FAIL] subtest: :test="sampler"
       • PASS [expected FAIL] subtest: :test="texture"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:must_use:*
       • FAIL [expected PASS] subtest: :use=true 
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:must_use:*
       • FAIL [expected PASS] subtest: :use=true 
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:array_index_argument,non_storage:*
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";arrayIndexType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,non_storage:*
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";coordType="vec4%3Cu32%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:level_argument,non_storage:*
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_1d";levelType="u32" 
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_1d";levelType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_2d";levelType="u32" 
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d";levelType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array";levelType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array";levelType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_3d";levelType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_3d";levelType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d";levelType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";levelType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d_array";levelType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";levelType="vec4%3Cu32%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:sample_index_argument,non_storage:*
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_multisampled_2d";sampleIndexType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cf32%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cu32%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:only_in_fragment:*
       • PASS [expected FAIL] subtest: :textureType="texture_1d%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_1d%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_1d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_cube%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_cube%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_cube%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_cube_array%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_cube_array%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_cube_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube_array";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube_array";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_depth_cube_array";entryPoint="fragment_and_compute";offset=false
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:only_in_fragment:*
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=true
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=true
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=true
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=true
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false
       • PASS [expected FAIL] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=true
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=false
       • FAIL [expected PASS] subtest: :textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=true
       ... (PASS/FAIL)
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:array_index_argument:*
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d_array";arrayIndexType="abstract-int" 
        ... (PASS/FAIL)
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:coords_argument:*
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";coordType="f32"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"
       ... (PASS/FAIL)
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:depth_ref_argument:*
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";depthRefType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";depthRefType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";depthRefType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";depthRefType="vec4%3Cbool%3E"
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d";depthRefType="abstract-int" 
       ... (PASS/FAIL)
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument:*
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="bool"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="abstract-int"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="abstract-float"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="f32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="i32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="u32"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"
       • PASS [expected FAIL] subtest: :textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:only_in_fragment:*
       • FAIL [expected PASS] subtest: :textureType="texture_depth_2d";entryPoint="none";offset=false
       ... (PASS/FAIL)
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:must_use:*
       • FAIL [expected PASS] subtest: :use=true
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,group_and_binding:single_entry_point:*
       • PASS [expected FAIL] subtest: :stage="vertex";a_kind="storage";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="vertex";a_kind="storage";b_kind="uniform";usage="transitive"
       • PASS [expected FAIL] subtest: :stage="vertex";a_kind="uniform";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="vertex";a_kind="uniform";b_kind="uniform";usage="transitive"
       • PASS [expected FAIL] subtest: :stage="fragment";a_kind="storage";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="fragment";a_kind="storage";b_kind="uniform";usage="transitive"
       • PASS [expected FAIL] subtest: :stage="fragment";a_kind="uniform";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="fragment";a_kind="uniform";b_kind="uniform";usage="transitive"
       • PASS [expected FAIL] subtest: :stage="compute";a_kind="storage";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="compute";a_kind="storage";b_kind="uniform";usage="transitive"
       • PASS [expected FAIL] subtest: :stage="compute";a_kind="uniform";b_kind="uniform";usage="direct"
       • PASS [expected FAIL] subtest: :stage="compute";a_kind="uniform";b_kind="uniform";usage="transitive"
     • OK /_webgpu/webgpu/cts.https.html?q=webgpu:shader,validation,statement,phony:rhs_with_decl:*
       • PASS [expected FAIL] :test="storage_unsized"

@sagudev
Copy link
Contributor Author

sagudev commented Sep 22, 2024

All FAIL [expected PASS] are similar:
Before this pr fn f() { _ = atan2(1, 2); } did not error but rewriting it with let (fn f() { let a = atan2(1, 2); }) makes it error, so my guess is that _ did not properly eval some stuff. fn f() { atan2(1, 2); } does not raise any error either, so I guess it's not evaled (it should raise must_use error actually).

So I think all new FAILs were actually fake PASS.

@sagudev sagudev marked this pull request as ready for review September 22, 2024 07:37
@sagudev sagudev requested a review from a team September 22, 2024 07:37
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Copy link
Member

@ErichDonGubler ErichDonGubler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, minus the questions I have. The only other person in @gfx-rs/naga that I know is on-duty for this is @jimblandy, though, so I'll ask for his review explicitly.

Comment on lines +1605 to +1614
Statement::Phony(expr) => {
write!(self.out, "{level}")?;
self.write_named_expr(
module,
expr,
format!("_phony_{}", expr.index()),
expr,
func_ctx,
)?;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: @gfx-rs/naga, should we be using self.namer here? I think so, since I don't think this logic has any guarantee of a hygienic name?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The catch, as hinted at in #6095 (comment), is that even ignored expressions affect WGSL's rules for which declarations are statically accessed. In other words, when you've got

let _  = buffer;

in some function body, according to WGSL's rules, that means that buffer is "statically accessed" by that function - even though the expression is ignored.

Comment on lines +2933 to +2934
self.start_baking_expression(expr, &context.expression, &name)?;
self.put_expression(expr, &context.expression, true)?;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: I actually don't know when we should start baking expressions; this is something I need to learn about Naga internals, too.

@gfx-rs/naga, should we be baking expressions here? I presume so, since we may have an arbitrary expression on the RHS of a phony assignment.

Comment on lines +838 to +847
if self
.flags
.contains(ValidationFlags::CONTROL_FLOW_UNIFORMITY)
&& !req.is_empty()
{
if let Some(cause) = disruptor {
return Err(FunctionError::NonUniformControlFlow(req, expr, cause)
.with_span_handle(expr, expression_arena));
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: @gfx-rs/naga, does this look right? I'm not sure, since AFAIK the RHS of an assignment shouldn't have any visible effects. Therefore, it shouldn't matter if we have any uniformity obligations here, maybe?

@ErichDonGubler ErichDonGubler added area: correctness We're behaving incorrectly area: cts Issues stemming from the WebGPU Conformance Test Suite area: naga back-end Outputs of naga shader conversion naga Shader Translator area: naga middle-end Intermediate representation area: naga front-end area: naga processing Passes over IR in the middle labels Sep 25, 2024
Copy link
Member

@jimblandy jimblandy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm actually somewhat concerned here that the whole compaction process is going to be running into this kind of problem all over the place.

Compaction was originally introduced to help out with constant evaluation: we wanted the validator to simply reject modules that contained any abstract types, but the constant evaluator tended to leave expressions with abstract types lying around in the arenas. The idea was that compaction would reduce the module to "the parts that actually matter", and all traces of the module's state before constant evaluation would be gone.

I'm concerned that let _ = statements are only one manifestation of this problem: we can fix it here, but as long as we have compaction, we'll have to discover and remove other situations case by case.

This PR certainly fixes a lot of failures, but I think the right approach might simply be to change the validator to permit abstract types in the type arena, and only reject them when they are used as globals' types, local var types, components of structs, etc. Then the ordinary type rules should prevent abstract types from appearing within expressions. Then we could remove compaction altogether; I don't think we need it for anything else, and it's complex.

@sagudev, does that make sense? Is that a project you'd be willing to take on?

If not, a simpler approach to this bug might be to simply have the WGSL front end introduce an anonymous local variable, and have the let _ store the expression's value in there, like a let x would.

In either case, I would rather not have the new Statement variant.

@jimblandy
Copy link
Member

Another possible example of where compaction goes awry:

I'm not sure, but I suspect the WGSL spec requires us to issue an error if derivative operations are used in a compute shader. But we could say let _ = dpdx(foo); in a compute shader, compaction will eliminate it, and then validation won't report the error.

@sagudev
Copy link
Contributor Author

sagudev commented Sep 26, 2024

Then we could remove compaction altogether; I don't think we need it for anything else, and it's complex.

I think compacting also removes unused expressions, maybe it does even more I am not really that familiar, but I know that WGSL specifically:

// Constant evaluation may leave abstract-typed literals and
// compositions in expression arenas, so we need to compact the module
// to remove unused expressions and types.
crate::compact::compact(&mut module);

@sagudev, Is that a project you'd be willing to take on?

I think this is way over my head.

If not, a simpler approach to this bug might be to simply have the WGSL front end introduce an anonymous local variable, and have the let _ store the expression's value in there, like a let x would.

Initially I was actually trying to do this, but I was scared that compacting will eliminate some let statements, but I checked and it's not that aggressive, so I will try it again.

btw WGSL doesn't have let _ = only _ = (I know it bothers me too).

@sagudev
Copy link
Contributor Author

sagudev commented Sep 26, 2024

Closing this in favor of #6328

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: correctness We're behaving incorrectly area: cts Issues stemming from the WebGPU Conformance Test Suite area: naga back-end Outputs of naga shader conversion area: naga front-end area: naga middle-end Intermediate representation area: naga processing Passes over IR in the middle naga Shader Translator
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

get_bind_group_layout fails when layout is auto
3 participants