From 946af8450cda308bc591db1af4ce7c977846975b Mon Sep 17 00:00:00 2001 From: Samson <16504129+sagudev@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:24:52 +0200 Subject: [PATCH] Update WebGPU CTS (#32783) * Update CTS to https://github.com/gpuweb/cts/commit/20425f60bb00676af386b5c31e7748c0e2cb1702 Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> * expect Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --------- Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- tests/wpt/webgpu/meta/MANIFEST.json | 9499 +- .../wpt/webgpu/meta/webgpu/cts.https.html.ini | 88553 +++++++++++++++- ...as_complex_rgba8unorm_store.https.html.ini | 2 +- ...s_display_after_device_lost.https.html.ini | 3 + tests/wpt/webgpu/tests/checkout_commit.txt | 2 +- .../tests/webgpu/common/framework/fixture.js | 48 +- .../tests/webgpu/common/framework/metadata.js | 1 + .../webgpu/common/framework/test_config.js | 20 +- .../common/internal/logging/log_message.js | 51 +- .../webgpu/common/internal/logging/logger.js | 7 +- .../webgpu/common/internal/logging/result.js | 32 +- .../internal/logging/test_case_recorder.js | 8 +- .../webgpu/common/internal/query/compare.js | 5 +- .../webgpu/common/internal/query/query.js | 6 +- .../webgpu/common/internal/test_group.js | 10 +- .../common/internal/test_suite_listing.js | 2 +- .../tests/webgpu/common/internal/version.js | 2 +- .../common/internal/websocket_logger.js | 17 +- .../webgpu/common/runtime/helper/options.js | 53 +- .../runtime/helper/test_worker-worker.js | 51 +- .../common/runtime/helper/test_worker.js | 198 +- .../common/runtime/helper/utils_worker.js | 35 + .../common/runtime/helper/wrap_for_worker.js | 54 + .../webgpu/tests/webgpu/common/runtime/wpt.js | 18 +- .../tests/webgpu/common/util/navigator_gpu.js | 7 +- .../webgpu/tests/webgpu/common/util/util.js | 7 +- tests/wpt/webgpu/tests/webgpu/cts.https.html | 888 +- .../external/petamoriken/float16/float16.d.js | 27 + .../external/petamoriken/float16/float16.js | 179 +- .../webgpu/tests/webgpu/resources/README.md | 6 +- .../tests/webgpu/resources/cache/hashes.json | 215 +- .../cache/webgpu/shader/execution/abs.bin | Bin 14696 -> 17976 bytes .../cache/webgpu/shader/execution/acos.bin | Bin 22200 -> 26440 bytes .../cache/webgpu/shader/execution/acosh.bin | Bin 24464 -> 30248 bytes .../cache/webgpu/shader/execution/asin.bin | Bin 22200 -> 26440 bytes .../cache/webgpu/shader/execution/asinh.bin | Bin 7144 -> 11664 bytes .../cache/webgpu/shader/execution/atan.bin | Bin 16648 -> 20128 bytes .../cache/webgpu/shader/execution/atan2.bin | Bin 49512 -> 51608 bytes .../cache/webgpu/shader/execution/atanh.bin | Bin 16624 -> 21104 bytes .../shader/execution/binary/af_addition.bin | Bin 237960 -> 237960 bytes .../shader/execution/binary/af_division.bin | Bin 78840 -> 77496 bytes .../shader/execution/binary/af_logical.bin | Bin 24744 -> 12456 bytes .../execution/binary/af_matrix_addition.bin | Bin 914552 -> 194032 bytes .../af_matrix_matrix_multiplication.bin | Bin 0 -> 82608 bytes .../af_matrix_scalar_multiplication.bin | Bin 0 -> 302920 bytes .../binary/af_matrix_subtraction.bin | Bin 921752 -> 169712 bytes .../af_matrix_vector_multiplication.bin | Bin 0 -> 152528 bytes .../execution/binary/af_multiplication.bin | Bin 207864 -> 228600 bytes .../shader/execution/binary/af_remainder.bin | Bin 78840 -> 77496 bytes .../execution/binary/af_subtraction.bin | Bin 237960 -> 237960 bytes .../shader/execution/binary/ai_arithmetic.bin | Bin 0 -> 831992 bytes .../shader/execution/binary/f16_division.bin | Bin 120856 -> 120856 bytes .../shader/execution/binary/f16_logical.bin | Bin 31272 -> 15912 bytes .../shader/execution/binary/f32_logical.bin | Bin 37416 -> 18984 bytes .../execution/binary/i32_arithmetic.bin | Bin 1427640 -> 727864 bytes .../execution/binary/i32_comparison.bin | Bin 7568 -> 3872 bytes .../cache/webgpu/shader/execution/bitcast.bin | Bin 2221448 -> 2240896 bytes .../cache/webgpu/shader/execution/ceil.bin | Bin 8552 -> 16016 bytes .../cache/webgpu/shader/execution/clamp.bin | Bin 1008504 -> 1048136 bytes .../cache/webgpu/shader/execution/cos.bin | Bin 13272 -> 20176 bytes .../cache/webgpu/shader/execution/cosh.bin | Bin 11944 -> 14904 bytes .../cache/webgpu/shader/execution/cross.bin | Bin 3690080 -> 829096 bytes .../cache/webgpu/shader/execution/degrees.bin | Bin 21640 -> 18048 bytes .../webgpu/shader/execution/derivatives.bin | Bin 0 -> 11264 bytes .../webgpu/shader/execution/determinant.bin | Bin 6872 -> 21296 bytes .../webgpu/shader/execution/distance.bin | Bin 1619104 -> 1731496 bytes .../cache/webgpu/shader/execution/dot.bin | Bin 832472 -> 469272 bytes .../cache/webgpu/shader/execution/exp.bin | Bin 26480 -> 34592 bytes .../cache/webgpu/shader/execution/exp2.bin | Bin 26480 -> 34592 bytes .../webgpu/shader/execution/faceForward.bin | Bin 4207088 -> 4214688 bytes .../cache/webgpu/shader/execution/floor.bin | Bin 16016 -> 16016 bytes .../cache/webgpu/shader/execution/fma.bin | Bin 1031288 -> 886720 bytes .../cache/webgpu/shader/execution/fract.bin | Bin 8768 -> 10024 bytes .../cache/webgpu/shader/execution/frexp.bin | Bin 37680 -> 47072 bytes .../cache/webgpu/shader/execution/fwidth.bin | Bin 0 -> 5917352 bytes .../webgpu/shader/execution/inverseSqrt.bin | Bin 70440 -> 78424 bytes .../cache/webgpu/shader/execution/ldexp.bin | Bin 23552 -> 33096 bytes .../cache/webgpu/shader/execution/length.bin | Bin 48640 -> 35696 bytes .../cache/webgpu/shader/execution/log.bin | Bin 106968 -> 148848 bytes .../cache/webgpu/shader/execution/log2.bin | Bin 106968 -> 148848 bytes .../cache/webgpu/shader/execution/max.bin | Bin 2202888 -> 37944 bytes .../cache/webgpu/shader/execution/min.bin | Bin 2202888 -> 37944 bytes .../cache/webgpu/shader/execution/mix.bin | Bin 8805016 -> 5817432 bytes .../cache/webgpu/shader/execution/modf.bin | Bin 145936 -> 82448 bytes .../webgpu/shader/execution/normalize.bin | Bin 70128 -> 47608 bytes .../cache/webgpu/shader/execution/pow.bin | Bin 1282944 -> 1308224 bytes .../cache/webgpu/shader/execution/radians.bin | Bin 14696 -> 10992 bytes .../cache/webgpu/shader/execution/reflect.bin | Bin 205288 -> 277720 bytes .../cache/webgpu/shader/execution/refract.bin | Bin 2821432 -> 2828888 bytes .../webgpu/shader/execution/saturate.bin | Bin 17096 -> 17096 bytes .../cache/webgpu/shader/execution/sign.bin | Bin 17136 -> 21224 bytes .../cache/webgpu/shader/execution/sin.bin | Bin 13272 -> 20176 bytes .../cache/webgpu/shader/execution/sinh.bin | Bin 11944 -> 14904 bytes .../webgpu/shader/execution/smoothstep.bin | Bin 502320 -> 629408 bytes .../cache/webgpu/shader/execution/sqrt.bin | Bin 9704 -> 10024 bytes .../cache/webgpu/shader/execution/step.bin | Bin 905320 -> 33160 bytes .../cache/webgpu/shader/execution/tan.bin | Bin 13272 -> 21776 bytes .../cache/webgpu/shader/execution/tanh.bin | Bin 6944 -> 11448 bytes .../shader/execution/unary/ai_arithmetic.bin | Bin 0 -> 3256 bytes .../shader/execution/unary/f16_conversion.bin | Bin 74312 -> 97912 bytes .../shader/execution/unary/f32_conversion.bin | Bin 105744 -> 138624 bytes .../shader/execution/unary/i32_complement.bin | Bin 1648 -> 0 bytes .../shader/execution/unary/i32_conversion.bin | Bin 6448 -> 11856 bytes .../shader/execution/unary/u32_complement.bin | Bin 848 -> 0 bytes .../shader/execution/unary/u32_conversion.bin | Bin 6448 -> 10680 bytes ...equestAdapterInfo.spec.js => info.spec.js} | 23 +- .../operation/adapter/requestAdapter.spec.js | 28 +- .../operation/adapter/requestDevice.spec.js | 92 +- .../webgpu/api/operation/buffers/map.spec.js | 16 +- .../api/operation/buffers/map_detach.spec.js | 14 +- .../api/operation/buffers/map_oom.spec.js | 2 +- .../operation/command_buffer/basic.spec.js | 14 +- .../command_buffer/copyBufferToBuffer.spec.js | 6 +- .../copyTextureToTexture.spec.js | 103 +- .../command_buffer/image_copy.spec.js | 45 +- .../queries/occlusionQuery.spec.js | 25 +- .../render/state_tracking.spec.js | 22 +- .../api/operation/compute/basic.spec.js | 4 +- .../compute_pipeline/overrides.spec.js | 82 +- .../webgpu/api/operation/device/lost.spec.js | 8 +- .../webgpu/api/operation/labels.spec.js | 36 +- .../memory_sync/buffer/buffer_sync_test.js | 116 +- .../memory_sync/operation_context_helper.js | 12 +- .../texture/readonly_depth_stencil.spec.js | 23 +- .../texture/same_subresource.spec.js | 84 +- .../api/operation/onSubmittedWorkDone.spec.js | 2 +- .../webgpu/api/operation/reflection.spec.js | 28 +- .../operation/render_pass/clear_value.spec.js | 7 +- .../api/operation/render_pass/resolve.spec.js | 6 +- .../api/operation/render_pass/storeOp.spec.js | 10 +- .../operation/render_pass/storeop2.spec.js | 6 +- .../render_pipeline/culling_tests.spec.js | 4 +- .../render_pipeline/overrides.spec.js | 18 +- .../pipeline_output_targets.spec.js | 18 +- .../primitive_topology.spec.js | 2 +- .../render_pipeline/sample_mask.spec.js | 28 +- .../rendering/3d_texture_slices.spec.js | 363 + .../api/operation/rendering/basic.spec.js | 27 +- .../rendering/color_target_state.spec.js | 24 +- .../api/operation/rendering/depth.spec.js | 48 +- .../operation/rendering/depth_bias.spec.js | 32 +- .../rendering/depth_clip_clamp.spec.js | 48 +- .../api/operation/rendering/draw.spec.js | 26 +- .../operation/rendering/indirect_draw.spec.js | 2 +- .../api/operation/rendering/stencil.spec.js | 36 +- .../operation/resource_init/buffer.spec.js | 74 +- .../resource_init/check_texture/by_copy.js | 3 +- .../resource_init/check_texture/by_ds_test.js | 10 +- .../check_texture/by_sampling.js | 5 +- .../check_texture/texture_zero_init_test.js | 50 +- .../resource_init/texture_zero.spec.js | 3 +- .../api/operation/sampling/anisotropy.spec.js | 10 +- .../operation/sampling/filter_mode.spec.js | 4 +- .../shader_module/compilation_info.spec.js | 39 +- .../storage_texture/read_only.spec.js | 622 + .../storage_texture/read_write.spec.js | 11 +- .../format_reinterpretation.spec.js | 58 +- .../api/operation/texture_view/write.spec.js | 40 +- .../api/operation/uncapturederror.spec.js | 22 +- .../vertex_state/correctness.spec.js | 6 +- .../vertex_state/index_format.spec.js | 16 +- .../api/validation/buffer/create.spec.js | 8 +- .../api/validation/buffer/destroy.spec.js | 6 +- .../api/validation/buffer/mapping.spec.js | 79 +- .../features/query_types.spec.js | 16 +- .../features/texture_formats.spec.js | 6 +- .../capability_checks/limits/limit_utils.js | 102 +- .../limits/maxBindGroups.spec.js | 4 +- .../maxBindGroupsPlusVertexBuffers.spec.js | 298 + .../limits/maxBufferSize.spec.js | 5 +- .../maxColorAttachmentBytesPerSample.spec.js | 12 +- .../limits/maxColorAttachments.spec.js | 12 +- .../maxComputeWorkgroupsPerDimension.spec.js | 2 +- .../maxInterStageShaderComponents.spec.js | 50 +- .../maxStorageBufferBindingSize.spec.js | 10 +- .../limits/maxTextureArrayLayers.spec.js | 4 +- .../limits/maxTextureDimension1D.spec.js | 4 +- .../limits/maxTextureDimension2D.spec.js | 4 +- .../limits/maxTextureDimension3D.spec.js | 4 +- .../maxUniformBufferBindingSize.spec.js | 10 +- .../limits/maxVertexBuffers.spec.js | 72 +- .../minStorageBufferOffsetAlignment.spec.js | 12 +- .../minUniformBufferOffsetAlignment.spec.js | 12 +- .../api/validation/compute_pipeline.spec.js | 50 + .../api/validation/createBindGroup.spec.js | 28 +- .../api/validation/createTexture.spec.js | 77 +- .../webgpu/api/validation/createView.spec.js | 20 +- .../webgpu/api/validation/debugMarker.spec.js | 3 +- .../encoding/beginComputePass.spec.js | 14 +- .../encoding/beginRenderPass.spec.js | 25 +- .../encoding/cmds/clearBuffer.spec.js | 23 +- .../encoding/cmds/compute_pass.spec.js | 16 +- .../encoding/cmds/copyBufferToBuffer.spec.js | 44 +- .../cmds/copyTextureToTexture.spec.js | 79 +- .../encoding/cmds/index_access.spec.js | 2 +- .../encoding/cmds/render/draw.spec.js | 2 +- .../cmds/render/dynamic_state.spec.js | 6 +- .../cmds/render/indirect_draw.spec.js | 19 +- .../cmds/render/setIndexBuffer.spec.js | 17 +- .../cmds/render/setVertexBuffer.spec.js | 17 +- .../cmds/render/state_tracking.spec.js | 4 +- .../encoding/cmds/setBindGroup.spec.js | 16 +- .../encoding/encoder_open_state.spec.js | 18 +- .../validation/encoding/encoder_state.spec.js | 3 +- .../pipeline_bind_group_compat.spec.js | 321 +- .../api/validation/encoding/queries/common.js | 6 +- .../encoding/queries/general.spec.js | 11 +- .../encoding/queries/resolveQuerySet.spec.js | 38 +- .../webgpu/api/validation/error_scope.spec.js | 108 +- .../gpu_external_texture_expiration.spec.js | 2 +- .../image_copy/buffer_related.spec.js | 23 +- .../image_copy/buffer_texture_copies.spec.js | 46 +- .../api/validation/image_copy/image_copy.js | 12 +- .../image_copy/layout_related.spec.js | 10 +- .../image_copy/texture_related.spec.js | 30 +- .../api/validation/query_set/create.spec.js | 2 +- .../api/validation/query_set/destroy.spec.js | 4 +- .../validation/queue/buffer_mapped.spec.js | 18 +- .../CopyExternalImageToTexture.spec.js | 36 +- .../validation/queue/destroyed/buffer.spec.js | 100 +- .../queue/destroyed/query_set.spec.js | 14 +- .../queue/destroyed/texture.spec.js | 120 +- .../api/validation/queue/submit.spec.js | 102 +- .../api/validation/queue/writeBuffer.spec.js | 15 +- .../api/validation/queue/writeTexture.spec.js | 17 +- .../attachment_compatibility.spec.js | 6 +- .../render_pass_descriptor.spec.js | 136 +- .../validation/render_pass/resolve.spec.js | 8 +- .../api/validation/render_pipeline/common.js | 7 +- .../depth_stencil_state.spec.js | 12 +- .../render_pipeline/fragment_state.spec.js | 88 +- .../render_pipeline/inter_stage.spec.js | 52 +- .../validation/render_pipeline/misc.spec.js | 54 +- .../resource_compatibility.spec.js | 102 + .../render_pipeline/shader_module.spec.js | 7 + .../buffer/in_pass_encoder.spec.js | 4 +- .../texture/in_pass_encoder.spec.js | 56 +- .../texture/in_render_common.spec.js | 18 +- .../texture/in_render_misc.spec.js | 24 +- .../state/device_lost/destroy.spec.js | 42 +- .../texture/bgra8unorm_storage.spec.js | 33 +- .../api/validation/texture/destroy.spec.js | 6 +- .../texture/float32_filterable.spec.js | 2 +- .../texture/rg11b10ufloat_renderable.spec.js | 8 +- .../webgpu/webgpu/api/validation/utils.js | 275 + .../webgpu/api/validation/validation_test.js | 70 +- .../tests/webgpu/webgpu/capability_info.js | 6 +- .../api/validation/createBindGroup.spec.js | 5 +- .../validation/createBindGroupLayout.spec.js | 2 +- .../encoding/cmds/copyTextureToBuffer.spec.js | 17 +- .../cmds/copyTextureToTexture.spec.js | 16 +- .../pipeline_bind_group_compat.spec.js | 10 +- .../depth_stencil_state.spec.js | 2 +- .../render_pipeline/fragment_state.spec.js | 2 +- .../render_pipeline/shader_module.spec.js | 281 - .../render_pipeline/vertex_state.spec.js | 4 +- .../shader_module/shader_module.spec.js | 156 + .../validation/texture/createTexture.spec.js | 43 +- .../api/validation/texture/cubeArray.spec.js | 4 +- .../webgpu/compat/compatibility_test.js | 25 +- .../webgpu/tests/webgpu/webgpu/constants.js | 2 +- .../webgpu/tests/webgpu/webgpu/error_test.js | 110 + .../tests/webgpu/webgpu/examples.spec.js | 4 +- .../webgpu/tests/webgpu/webgpu/format_info.js | 284 +- .../webgpu/tests/webgpu/webgpu/gpu_test.js | 135 +- .../webgpu/tests/webgpu/webgpu/inter_stage.js | 94 + .../wpt/webgpu/tests/webgpu/webgpu/listing.js | 1385 +- .../webgpu/webgpu/print_environment.spec.js | 80 + .../expression/access/array/index.spec.js | 407 + .../expression/access/matrix/index.spec.js | 200 + .../expression/access/structure/index.spec.js | 516 + .../access/vector/components.spec.js | 118 + .../expression/access/vector/index.spec.js | 87 + .../expression/binary/af_addition.cache.js | 36 +- .../expression/binary/af_addition.spec.js | 30 +- .../expression/binary/af_comparison.spec.js | 44 +- .../execution/expression/binary/af_data.js | 823 + .../expression/binary/af_division.cache.js | 9 +- .../expression/binary/af_division.spec.js | 30 +- .../binary/af_matrix_addition.cache.js | 38 +- .../binary/af_matrix_addition.spec.js | 12 +- .../af_matrix_matrix_multiplication.cache.js | 29 + .../af_matrix_matrix_multiplication.spec.js | 45 + .../af_matrix_scalar_multiplication.cache.js | 76 + .../af_matrix_scalar_multiplication.spec.js | 69 + .../binary/af_matrix_subtraction.cache.js | 38 +- .../binary/af_matrix_subtraction.spec.js | 12 +- .../af_matrix_vector_multiplication.cache.js | 51 + .../af_matrix_vector_multiplication.spec.js | 69 + .../binary/af_multiplication.cache.js | 14 +- .../binary/af_multiplication.spec.js | 30 +- .../expression/binary/af_remainder.cache.js | 9 +- .../expression/binary/af_remainder.spec.js | 28 +- .../expression/binary/af_subtraction.cache.js | 36 +- .../expression/binary/af_subtraction.spec.js | 30 +- .../expression/binary/ai_arithmetic.cache.js | 145 + .../expression/binary/ai_arithmetic.spec.js | 303 + .../expression/binary/ai_comparison.spec.js | 124 + .../execution/expression/binary/binary.js | 10 +- .../expression/binary/bitwise.spec.js | 531 +- .../expression/binary/bitwise_shift.spec.js | 520 +- .../expression/binary/bool_logical.spec.js | 18 +- .../expression/binary/f16_addition.spec.js | 20 +- .../expression/binary/f16_comparison.spec.js | 14 +- .../expression/binary/f16_division.spec.js | 20 +- .../binary/f16_matrix_addition.spec.js | 10 +- .../f16_matrix_matrix_multiplication.spec.js | 10 +- .../f16_matrix_scalar_multiplication.spec.js | 14 +- .../binary/f16_matrix_subtraction.spec.js | 10 +- .../f16_matrix_vector_multiplication.spec.js | 14 +- .../binary/f16_multiplication.spec.js | 20 +- .../expression/binary/f16_remainder.spec.js | 20 +- .../expression/binary/f16_subtraction.spec.js | 20 +- .../expression/binary/f32_addition.spec.js | 20 +- .../expression/binary/f32_comparison.spec.js | 14 +- .../expression/binary/f32_division.spec.js | 20 +- .../binary/f32_matrix_addition.spec.js | 10 +- .../f32_matrix_matrix_multiplication.spec.js | 10 +- .../f32_matrix_scalar_multiplication.spec.js | 14 +- .../binary/f32_matrix_subtraction.spec.js | 10 +- .../f32_matrix_vector_multiplication.spec.js | 14 +- .../binary/f32_multiplication.spec.js | 20 +- .../expression/binary/f32_remainder.spec.js | 20 +- .../expression/binary/f32_subtraction.spec.js | 20 +- .../expression/binary/i32_arithmetic.spec.js | 82 +- .../expression/binary/i32_comparison.spec.js | 14 +- .../expression/binary/u32_arithmetic.spec.js | 82 +- .../expression/binary/u32_comparison.spec.js | 14 +- .../expression/call/builtin/abs.cache.js | 33 +- .../expression/call/builtin/abs.spec.js | 44 +- .../expression/call/builtin/acos.cache.js | 10 +- .../expression/call/builtin/acos.spec.js | 28 +- .../expression/call/builtin/acosh.cache.js | 10 +- .../expression/call/builtin/acosh.spec.js | 28 +- .../expression/call/builtin/all.spec.js | 20 +- .../expression/call/builtin/any.spec.js | 20 +- .../call/builtin/arrayLength.spec.js | 4 +- .../expression/call/builtin/asin.cache.js | 10 +- .../expression/call/builtin/asin.spec.js | 28 +- .../expression/call/builtin/asinh.cache.js | 7 +- .../expression/call/builtin/asinh.spec.js | 28 +- .../expression/call/builtin/atan.cache.js | 10 +- .../expression/call/builtin/atan.spec.js | 28 +- .../expression/call/builtin/atan2.cache.js | 24 +- .../expression/call/builtin/atan2.spec.js | 28 +- .../expression/call/builtin/atanh.cache.js | 10 +- .../expression/call/builtin/atanh.spec.js | 28 +- .../atomics/atomicCompareExchangeWeak.spec.js | 33 +- .../builtin/atomics/atomicExchange.spec.js | 24 +- .../call/builtin/atomics/atomicLoad.spec.js | 9 +- .../call/builtin/atomics/atomicStore.spec.js | 6 +- .../call/builtin/atomics/atomicSub.spec.js | 23 + .../call/builtin/atomics/harness.js | 5 +- .../expression/call/builtin/bitcast.cache.js | 41 +- .../expression/call/builtin/bitcast.spec.js | 216 +- .../expression/call/builtin/builtin.js | 10 +- .../expression/call/builtin/ceil.cache.js | 5 +- .../expression/call/builtin/ceil.spec.js | 28 +- .../expression/call/builtin/clamp.cache.js | 49 +- .../expression/call/builtin/clamp.spec.js | 44 +- .../expression/call/builtin/cos.cache.js | 9 +- .../expression/call/builtin/cos.spec.js | 28 +- .../expression/call/builtin/cosh.cache.js | 10 +- .../expression/call/builtin/cosh.spec.js | 28 +- .../call/builtin/countLeadingZeros.spec.js | 6 +- .../call/builtin/countOneBits.spec.js | 6 +- .../call/builtin/countTrailingZeros.spec.js | 6 +- .../expression/call/builtin/cross.cache.js | 3 +- .../expression/call/builtin/cross.spec.js | 30 +- .../expression/call/builtin/degrees.cache.js | 3 +- .../expression/call/builtin/degrees.spec.js | 16 +- .../call/builtin/derivatives.cache.js | 14 + .../expression/call/builtin/derivatives.js | 215 + .../call/builtin/determinant.cache.js | 181 +- .../call/builtin/determinant.spec.js | 27 +- .../expression/call/builtin/distance.cache.js | 20 +- .../expression/call/builtin/distance.spec.js | 130 +- .../expression/call/builtin/dot.cache.js | 104 +- .../expression/call/builtin/dot.spec.js | 218 +- .../call/builtin/dot4I8Packed.spec.js | 4 +- .../call/builtin/dot4U8Packed.spec.js | 4 +- .../expression/call/builtin/dpdx.spec.js | 16 +- .../call/builtin/dpdxCoarse.spec.js | 16 +- .../expression/call/builtin/dpdxFine.spec.js | 16 +- .../expression/call/builtin/dpdy.spec.js | 16 +- .../call/builtin/dpdyCoarse.spec.js | 16 +- .../expression/call/builtin/dpdyFine.spec.js | 16 +- .../expression/call/builtin/exp.cache.js | 4 + .../expression/call/builtin/exp.spec.js | 28 +- .../expression/call/builtin/exp2.cache.js | 4 + .../expression/call/builtin/exp2.spec.js | 28 +- .../call/builtin/extractBits.spec.js | 20 +- .../call/builtin/faceForward.cache.js | 63 +- .../call/builtin/faceForward.spec.js | 84 +- .../call/builtin/firstLeadingBit.spec.js | 6 +- .../call/builtin/firstTrailingBit.spec.js | 6 +- .../expression/call/builtin/floor.spec.js | 19 +- .../expression/call/builtin/fma.cache.js | 3 +- .../expression/call/builtin/fma.spec.js | 16 +- .../expression/call/builtin/fract.cache.js | 25 +- .../expression/call/builtin/fract.spec.js | 28 +- .../expression/call/builtin/frexp.cache.js | 22 +- .../expression/call/builtin/frexp.spec.js | 199 +- .../expression/call/builtin/fwidth.cache.js | 54 + .../expression/call/builtin/fwidth.js | 209 + .../expression/call/builtin/fwidth.spec.js | 16 +- .../call/builtin/fwidthCoarse.spec.js | 16 +- .../call/builtin/fwidthFine.spec.js | 16 +- .../call/builtin/insertBits.spec.js | 18 +- .../call/builtin/inversesqrt.cache.js | 13 + .../call/builtin/inversesqrt.spec.js | 28 +- .../expression/call/builtin/ldexp.cache.js | 26 +- .../expression/call/builtin/ldexp.spec.js | 30 +- .../expression/call/builtin/length.cache.js | 19 +- .../expression/call/builtin/length.spec.js | 90 +- .../expression/call/builtin/log.cache.js | 10 +- .../expression/call/builtin/log.spec.js | 28 +- .../expression/call/builtin/log2.cache.js | 10 +- .../expression/call/builtin/log2.spec.js | 28 +- .../expression/call/builtin/max.cache.js | 4 +- .../expression/call/builtin/max.spec.js | 66 +- .../expression/call/builtin/min.cache.js | 4 +- .../expression/call/builtin/min.spec.js | 66 +- .../expression/call/builtin/mix.cache.js | 15 +- .../expression/call/builtin/mix.spec.js | 90 +- .../expression/call/builtin/modf.spec.js | 78 +- .../call/builtin/normalize.cache.js | 10 +- .../expression/call/builtin/normalize.spec.js | 53 +- .../call/builtin/pack2x16float.spec.js | 4 +- .../call/builtin/pack2x16snorm.spec.js | 12 +- .../call/builtin/pack2x16unorm.spec.js | 12 +- .../call/builtin/pack4x8snorm.spec.js | 18 +- .../call/builtin/pack4x8unorm.spec.js | 18 +- .../expression/call/builtin/pack4xI8.spec.js | 4 +- .../call/builtin/pack4xI8Clamp.spec.js | 4 +- .../expression/call/builtin/pack4xU8.spec.js | 4 +- .../call/builtin/pack4xU8Clamp.spec.js | 4 +- .../expression/call/builtin/pow.cache.js | 10 +- .../expression/call/builtin/pow.spec.js | 28 +- .../call/builtin/quantizeToF16.spec.js | 4 +- .../expression/call/builtin/radians.cache.js | 5 +- .../expression/call/builtin/radians.spec.js | 16 +- .../expression/call/builtin/reflect.cache.js | 10 +- .../expression/call/builtin/reflect.spec.js | 114 +- .../expression/call/builtin/refract.cache.js | 63 +- .../expression/call/builtin/refract.spec.js | 84 +- .../call/builtin/reverseBits.spec.js | 6 +- .../expression/call/builtin/round.spec.js | 19 +- .../expression/call/builtin/saturate.spec.js | 16 +- .../expression/call/builtin/select.spec.js | 118 +- .../expression/call/builtin/sign.cache.js | 9 +- .../expression/call/builtin/sign.spec.js | 32 +- .../expression/call/builtin/sin.cache.js | 9 +- .../expression/call/builtin/sin.spec.js | 28 +- .../expression/call/builtin/sinh.cache.js | 10 +- .../expression/call/builtin/sinh.spec.js | 28 +- .../call/builtin/smoothstep.cache.js | 8 +- .../call/builtin/smoothstep.spec.js | 28 +- .../expression/call/builtin/sqrt.cache.js | 8 +- .../expression/call/builtin/sqrt.spec.js | 28 +- .../expression/call/builtin/step.cache.js | 8 +- .../expression/call/builtin/step.spec.js | 28 +- .../expression/call/builtin/tan.cache.js | 7 +- .../expression/call/builtin/tan.spec.js | 28 +- .../expression/call/builtin/tanh.cache.js | 7 +- .../expression/call/builtin/tanh.spec.js | 28 +- .../call/builtin/textureDimension.spec.js | 160 - .../call/builtin/textureDimensions.spec.js | 518 + .../call/builtin/textureLoad.spec.js | 446 +- .../call/builtin/textureNumLayers.spec.js | 172 +- .../call/builtin/textureNumLevels.spec.js | 139 +- .../call/builtin/textureNumSamples.spec.js | 56 +- .../call/builtin/textureSample.spec.js | 333 +- .../call/builtin/textureSampleBias.spec.js | 22 - .../call/builtin/textureSampleCompare.spec.js | 23 - .../call/builtin/textureStore.spec.js | 740 +- .../expression/call/builtin/texture_utils.js | 2453 + .../expression/call/builtin/transpose.spec.js | 20 +- .../expression/call/builtin/trunc.spec.js | 19 +- .../call/builtin/unpack2x16float.spec.js | 4 +- .../call/builtin/unpack2x16snorm.spec.js | 4 +- .../call/builtin/unpack2x16unorm.spec.js | 4 +- .../call/builtin/unpack4x8snorm.spec.js | 4 +- .../call/builtin/unpack4x8unorm.spec.js | 4 +- .../call/builtin/unpack4xI8.spec.js | 4 +- .../call/builtin/unpack4xU8.spec.js | 4 +- .../expression/call/builtin/utils.js | 110 +- .../call/builtin/workgroupUniformLoad.spec.js | 182 + .../expression/call/user/ptr_params.spec.js | 146 +- .../shader/execution/expression/case.js | 245 +- .../shader/execution/expression/case_cache.js | 12 +- .../expression/constructor/non_zero.spec.js | 802 + .../expression/constructor/zero_value.spec.js | 184 + .../execution/expression/expectation.js | 15 +- .../shader/execution/expression/expression.js | 572 +- .../execution/expression/precedence.spec.js | 113 + ....js => address_of_and_indirection.spec.js} | 23 +- .../expression/unary/af_arithmetic.spec.js | 16 +- .../expression/unary/af_assignment.spec.js | 16 +- .../expression/unary/ai_arithmetic.cache.js | 11 + .../expression/unary/ai_arithmetic.spec.js | 30 + .../expression/unary/ai_assignment.spec.js | 8 +- .../expression/unary/ai_complement.spec.js | 32 + .../expression/unary/bool_conversion.spec.js | 19 +- .../expression/unary/bool_logical.spec.js | 4 +- .../expression/unary/f16_arithmetic.spec.js | 4 +- .../expression/unary/f16_conversion.cache.js | 56 +- .../expression/unary/f16_conversion.spec.js | 113 +- .../expression/unary/f32_arithmetic.spec.js | 4 +- .../expression/unary/f32_conversion.cache.js | 44 +- .../expression/unary/f32_conversion.spec.js | 104 +- .../expression/unary/i32_arithmetic.spec.js | 4 +- .../expression/unary/i32_complement.cache.js | 11 - .../expression/unary/i32_complement.spec.js | 10 +- .../expression/unary/i32_conversion.cache.js | 39 +- .../expression/unary/i32_conversion.spec.js | 66 +- .../expression/unary/u32_complement.cache.js | 11 - .../expression/unary/u32_complement.spec.js | 10 +- .../expression/unary/u32_conversion.cache.js | 50 +- .../expression/unary/u32_conversion.spec.js | 56 +- .../execution/expression/unary/unary.js | 10 +- .../execution/flow_control/call.spec.js | 113 + .../shader/execution/flow_control/for.spec.js | 50 + .../shader/execution/flow_control/harness.js | 2 +- .../execution/flow_control/loop.spec.js | 60 + .../execution/flow_control/switch.spec.js | 33 + .../execution/flow_control/while.spec.js | 54 + .../webgpu/shader/execution/limits.spec.js | 439 + .../shader/execution/memory_layout.spec.js | 139 +- .../execution/memory_model/adjacent.spec.js | 6 +- .../execution/memory_model/barrier.spec.js | 133 +- .../memory_model/memory_model_setup.js | 183 +- ...texture_intra_invocation_coherence.spec.js | 328 + .../shader/execution/robust_access.spec.js | 32 +- .../execution/robust_access_vertex.spec.js | 8 +- .../shader_io/compute_builtins.spec.js | 6 +- .../shader_io/fragment_builtins.spec.js | 281 +- .../shader_io/shared_structs.spec.js | 6 +- .../execution/shader_io/user_io.spec.js | 210 + .../shader_io/workgroup_size.spec.js | 1 - .../webgpu/shader/execution/stage.spec.js | 5 +- .../execution/statement/compound.spec.js | 2 +- .../execution/statement/discard.spec.js | 712 + .../statement/increment_decrement.spec.js | 71 +- .../shader/execution/value_init.spec.js | 329 + .../webgpu/shader/execution/zero_init.spec.js | 14 +- .../tests/webgpu/webgpu/shader/types.js | 202 +- .../shader/validation/decl/const.spec.js | 242 + .../decl/context_dependent_resolution.spec.js | 393 + .../webgpu/shader/validation/decl/let.spec.js | 236 + .../shader/validation/decl/override.spec.js | 196 + .../webgpu/shader/validation/decl/var.spec.js | 332 + .../validation/decl/var_access_mode.spec.js | 116 - .../expression/access/array.spec.js | 236 + .../expression/access/matrix.spec.js | 218 + .../expression/access/structure.spec.js | 116 + .../expression/access/vector.spec.js | 269 +- .../expression/binary/add_sub_mul.spec.js | 317 + .../expression/binary/and_or_xor.spec.js | 176 + .../expression/binary/bitwise_shift.spec.js | 248 +- .../expression/binary/comparison.spec.js | 186 + .../expression/binary/div_rem.spec.js | 285 + .../binary/parse.spec.js} | 6 +- .../expression/binary/result_type.js | 67 + .../expression/call/builtin/abs.spec.js | 118 +- .../expression/call/builtin/acos.spec.js | 167 +- .../expression/call/builtin/acosh.spec.js | 163 +- .../expression/call/builtin/all.spec.js | 191 + .../expression/call/builtin/any.spec.js | 191 + .../call/builtin/arrayLength.spec.js | 12 + .../expression/call/builtin/asin.spec.js | 166 +- .../expression/call/builtin/asinh.spec.js | 158 +- .../expression/call/builtin/atan.spec.js | 151 +- .../expression/call/builtin/atan2.spec.js | 300 +- .../expression/call/builtin/atanh.spec.js | 174 +- .../expression/call/builtin/atomics.spec.js | 266 +- .../expression/call/builtin/bitcast.spec.js | 21 + .../expression/call/builtin/ceil.spec.js | 146 +- .../expression/call/builtin/clamp.spec.js | 267 +- .../call/builtin/const_override_validation.js | 374 +- .../expression/call/builtin/cos.spec.js | 59 +- .../expression/call/builtin/cosh.spec.js | 66 +- .../call/builtin/countLeadingZeros.spec.js | 198 + .../call/builtin/countOneBits.spec.js | 198 + .../call/builtin/countTrailingZeros.spec.js | 198 + .../expression/call/builtin/cross.spec.js | 122 + .../expression/call/builtin/degrees.spec.js | 56 +- .../call/builtin/derivatives.spec.js | 140 + .../call/builtin/determinant.spec.js | 95 + .../expression/call/builtin/distance.spec.js | 129 + .../expression/call/builtin/dot.spec.js | 123 + .../call/builtin/dot4I8Packed.spec.js | 43 +- .../call/builtin/dot4U8Packed.spec.js | 43 +- .../expression/call/builtin/exp.spec.js | 122 +- .../expression/call/builtin/exp2.spec.js | 122 +- .../call/builtin/extractBits.spec.js | 263 + .../call/builtin/faceForward.spec.js | 152 + .../call/builtin/firstLeadingBit.spec.js | 198 + .../call/builtin/firstTrailingBit.spec.js | 198 + .../expression/call/builtin/floor.spec.js | 50 +- .../expression/call/builtin/fma.spec.js | 141 + .../expression/call/builtin/fract.spec.js | 94 + .../expression/call/builtin/frexp.spec.js | 94 + .../call/builtin/insertBits.spec.js | 287 + .../call/builtin/inverseSqrt.spec.js | 76 +- .../expression/call/builtin/ldexp.spec.js | 253 + .../expression/call/builtin/length.spec.js | 90 +- .../expression/call/builtin/log.spec.js | 50 +- .../expression/call/builtin/log2.spec.js | 50 +- .../expression/call/builtin/max.spec.js | 91 + .../expression/call/builtin/min.spec.js | 91 + .../expression/call/builtin/mix.spec.js | 142 + .../expression/call/builtin/modf.spec.js | 146 +- .../expression/call/builtin/normalize.spec.js | 146 + .../call/builtin/pack2x16float.spec.js | 100 + .../call/builtin/pack2x16snorm.spec.js | 58 + .../call/builtin/pack2x16unorm.spec.js | 58 + .../call/builtin/pack4x8snorm.spec.js | 58 + .../call/builtin/pack4x8unorm.spec.js | 58 + .../expression/call/builtin/pack4xI8.spec.js | 40 +- .../call/builtin/pack4xI8Clamp.spec.js | 40 +- .../expression/call/builtin/pack4xU8.spec.js | 40 +- .../call/builtin/pack4xU8Clamp.spec.js | 40 +- .../expression/call/builtin/pow.spec.js | 175 + .../call/builtin/quantizeToF16.spec.js | 113 + .../expression/call/builtin/radians.spec.js | 50 +- .../expression/call/builtin/reflect.spec.js | 131 + .../expression/call/builtin/refract.spec.js | 175 + .../call/builtin/reverseBits.spec.js | 198 + .../expression/call/builtin/round.spec.js | 160 +- .../expression/call/builtin/saturate.spec.js | 146 +- .../expression/call/builtin/select.spec.js | 250 + .../call/builtin/shader_builtin_utils.js | 163 + .../expression/call/builtin/sign.spec.js | 63 +- .../expression/call/builtin/sin.spec.js | 60 +- .../expression/call/builtin/sinh.spec.js | 66 +- .../call/builtin/smoothstep.spec.js | 350 + .../expression/call/builtin/sqrt.spec.js | 66 +- .../expression/call/builtin/step.spec.js | 108 + .../expression/call/builtin/tan.spec.js | 76 +- .../expression/call/builtin/tanh.spec.js | 98 + .../call/builtin/textureDimensions.spec.js | 283 + .../call/builtin/textureGather.spec.js | 503 + .../call/builtin/textureGatherCompare.spec.js | 373 + .../call/builtin/textureLoad.spec.js | 551 + .../call/builtin/textureNumLayers.spec.js | 142 + .../call/builtin/textureNumLevels.spec.js | 109 + .../call/builtin/textureNumSamples.spec.js | 101 + .../call/builtin/textureSample.spec.js | 391 + .../textureSampleBaseClampToEdge.spec.js | 124 + .../call/builtin/textureSampleBias.spec.js | 411 + .../call/builtin/textureSampleCompare.spec.js | 414 + .../builtin/textureSampleCompareLevel.spec.js | 373 + .../call/builtin/textureSampleGrad.spec.js | 420 + .../call/builtin/textureSampleLevel.spec.js | 388 + .../call/builtin/textureStore.spec.js | 227 + .../expression/call/builtin/transpose.spec.js | 139 + .../expression/call/builtin/trunc.spec.js | 94 + .../call/builtin/unpack2x16float.spec.js | 126 + .../call/builtin/unpack2x16snorm.spec.js | 107 + .../call/builtin/unpack2x16unorm.spec.js | 107 + .../call/builtin/unpack4x8snorm.spec.js | 107 + .../call/builtin/unpack4x8unorm.spec.js | 107 + .../call/builtin/unpack4xI8.spec.js | 122 +- .../call/builtin/unpack4xU8.spec.js | 122 +- .../call/builtin/value_constructor.spec.js | 801 + .../call/builtin/workgroupUniformLoad.spec.js | 134 + .../expression/early_evaluation.spec.js | 140 + .../expression/matrix/add_sub.spec.js | 354 + .../expression/matrix/and_or_xor.spec.js | 122 + .../expression/matrix/bitwise_shift.spec.js | 121 + .../expression/matrix/comparison.spec.js | 118 + .../expression/matrix/div_rem.spec.js | 121 + .../validation/expression/matrix/mul.spec.js | 810 + .../expression/overload_resolution.spec.js | 268 + .../validation/expression/precedence.spec.js | 219 + .../unary/address_of_and_indirection.spec.js | 243 + .../unary/arithmetic_negation.spec.js | 114 + .../unary/bitwise_complement.spec.js | 114 + .../expression/unary/logical_negation.spec.js | 155 + .../extension/dual_source_blending.spec.js | 623 + .../pointer_composite_access.spec.js | 24 +- ...nly_and_readwrite_storage_textures.spec.js | 50 + .../validation/functions/restrictions.spec.js | 388 +- .../shader/validation/parse/builtin.spec.js | 144 - .../shader/validation/parse/const.spec.js | 57 - .../validation/parse/diagnostic.spec.js | 256 +- .../shader/validation/parse/must_use.spec.js | 192 +- .../shader/validation/parse/requires.spec.js | 2 - .../validation/parse/shadow_builtins.spec.js | 995 + .../shader/validation/parse/unary_ops.spec.js | 48 - .../validation/parse/var_and_let.spec.js | 106 - .../{parse => shader_io}/align.spec.js | 4 + .../validation/shader_io/builtins.spec.js | 189 +- .../shader_io/group_and_binding.spec.js | 6 + .../validation/shader_io/interpolate.spec.js | 59 +- .../shader_io/layout_constraints.spec.js | 543 + .../validation/shader_io/locations.spec.js | 155 +- .../pipeline_stage.spec.js | 0 .../shader/validation/shader_io/size.spec.js | 10 +- .../shader/validation/shader_io/util.js | 2 +- .../shader_io/workgroup_size.spec.js | 6 +- .../validation/shader_validation_test.js | 7 +- .../{parse => statement}/break.spec.js | 0 .../{parse => statement}/break_if.spec.js | 81 +- .../{parse => statement}/compound.spec.js | 0 .../{parse => statement}/const_assert.spec.js | 0 .../validation/statement/continue.spec.js | 113 + .../{parse => statement}/continuing.spec.js | 0 .../{parse => statement}/discard.spec.js | 0 .../shader/validation/statement/for.spec.js | 94 + .../shader/validation/statement/if.spec.js | 128 + .../statement/increment_decrement.spec.js | 270 + .../shader/validation/statement/loop.spec.js | 95 + .../shader/validation/statement/phony.spec.js | 172 + .../validation/statement/return.spec.js | 156 + .../statement/statement_behavior.spec.js | 143 + .../validation/statement/switch.spec.js | 172 + .../shader/validation/statement/test_types.js | 36 + .../shader/validation/statement/while.spec.js | 71 + .../shader/validation/types/alias.spec.js | 122 + .../shader/validation/types/array.spec.js | 176 + .../shader/validation/types/atomics.spec.js | 199 + .../shader/validation/types/enumerant.spec.js | 89 + .../shader/validation/types/matrix.spec.js | 160 + .../pointer.spec.js} | 159 +- .../shader/validation/types/ref.spec.js | 57 + .../shader/validation/types/struct.spec.js | 200 + .../shader/validation/types/textures.spec.js | 170 + .../validation/uniformity/uniformity.spec.js | 6 + .../webgpu/tests/webgpu/webgpu/util/buffer.js | 23 - .../webgpu/webgpu/util/check_contents.js | 5 +- .../tests/webgpu/webgpu/util/compare.js | 24 +- .../tests/webgpu/webgpu/util/constants.js | 3 + .../tests/webgpu/webgpu/util/conversion.js | 1590 +- .../webgpu/webgpu/util/copy_to_texture.js | 1 - .../tests/webgpu/webgpu/util/device_pool.js | 13 +- .../webgpu/webgpu/util/floating_point.js | 121 +- .../webgpu/tests/webgpu/webgpu/util/math.js | 353 +- .../webgpu/tests/webgpu/webgpu/util/memory.js | 10 +- .../webgpu/tests/webgpu/webgpu/util/prng.js | 39 + .../webgpu/tests/webgpu/webgpu/util/shader.js | 2 + .../tests/webgpu/webgpu/util/texture.js | 27 +- .../tests/webgpu/webgpu/util/texture/base.js | 26 +- .../webgpu/webgpu/util/texture/layout.js | 5 +- .../webgpu/webgpu/util/texture/texel_data.js | 85 +- .../webgpu/util/texture/texel_data.spec.js | 74 +- .../webgpu/webgpu/util/texture/texel_view.js | 10 +- .../webgpu/webgpu/util/texture/texture_ok.js | 13 +- .../webgpu/util/texture/texture_ok.spec.js | 9 +- .../web_platform/canvas/configure.spec.js | 5 +- .../canvas/getCurrentTexture.spec.js | 19 +- .../canvas/readbackFromWebGPUCanvas.spec.js | 29 +- .../copyToTexture/ImageBitmap.spec.js | 8 +- .../copyToTexture/ImageData.spec.js | 4 +- .../web_platform/copyToTexture/canvas.spec.js | 4 +- .../web_platform/copyToTexture/image.spec.js | 74 +- .../web_platform/copyToTexture/video.spec.js | 8 +- .../external_texture/video.spec.js | 139 +- .../canvas_display_after_device_lost.html.js | 65 + ...anvas_display_after_device_lost.https.html | 16 + .../canvas_display_after_device_lost-ref.html | 26 + .../tests/webgpu/webgpu/web_platform/util.js | 15 +- .../webgpu/web_platform/worker/worker.js | 23 +- .../webgpu/web_platform/worker/worker.spec.js | 72 +- .../web_platform/worker/worker_launcher.js | 61 +- .../api/operation/adapter/info.as_worker.js | 6 + .../adapter/requestAdapter.as_worker.js | 6 + .../adapter/requestDevice.as_worker.js | 6 + .../api/operation/buffers/map.as_worker.js | 6 + .../buffers/map_ArrayBuffer.as_worker.js | 6 + .../operation/buffers/map_detach.as_worker.js | 6 + .../operation/buffers/map_oom.as_worker.js | 6 + .../operation/buffers/threading.as_worker.js | 6 + .../command_buffer/basic.as_worker.js | 6 + .../command_buffer/clearBuffer.as_worker.js | 6 + .../copyBufferToBuffer.as_worker.js | 6 + .../copyTextureToTexture.as_worker.js | 6 + .../command_buffer/image_copy.as_worker.js | 6 + .../programmable/state_tracking.as_worker.js | 6 + .../queries/occlusionQuery.as_worker.js | 6 + .../render/dynamic_state.as_worker.js | 6 + .../render/state_tracking.as_worker.js | 6 + .../api/operation/compute/basic.as_worker.js | 6 + .../entry_point_name.as_worker.js | 6 + .../compute_pipeline/overrides.as_worker.js | 6 + .../api/operation/device/lost.as_worker.js | 6 + .../api/operation/labels.as_worker.js | 6 + .../buffer/multiple_buffers.as_worker.js | 6 + .../buffer/single_buffer.as_worker.js | 6 + .../readonly_depth_stencil.as_worker.js | 6 + .../texture/same_subresource.as_worker.js | 6 + .../onSubmittedWorkDone.as_worker.js | 6 + .../pipeline/default_layout.as_worker.js | 6 + .../operation/queue/writeBuffer.as_worker.js | 6 + .../api/operation/reflection.as_worker.js | 6 + .../render_pass/clear_value.as_worker.js | 6 + .../render_pass/resolve.as_worker.js | 6 + .../render_pass/storeOp.as_worker.js | 6 + .../render_pass/storeop2.as_worker.js | 6 + .../culling_tests.as_worker.js | 6 + .../render_pipeline/overrides.as_worker.js | 6 + .../pipeline_output_targets.as_worker.js | 6 + .../primitive_topology.as_worker.js | 6 + .../render_pipeline/sample_mask.as_worker.js | 6 + .../vertex_only_render_pipeline.as_worker.js | 6 + .../rendering/3d_texture_slices.as_worker.js | 6 + .../operation/rendering/basic.as_worker.js | 6 + .../rendering/color_target_state.as_worker.js | 6 + .../operation/rendering/depth.as_worker.js | 6 + .../rendering/depth_bias.as_worker.js | 6 + .../rendering/depth_clip_clamp.as_worker.js | 6 + .../api/operation/rendering/draw.as_worker.js | 6 + .../rendering/indirect_draw.as_worker.js | 6 + .../robust_access_index.as_worker.js | 6 + .../operation/rendering/stencil.as_worker.js | 6 + .../resource_init/buffer.as_worker.js | 6 + .../resource_init/texture_zero.as_worker.js | 6 + .../sampling/anisotropy.as_worker.js | 6 + .../sampling/filter_mode.as_worker.js | 6 + .../operation/sampling/lod_clamp.as_worker.js | 6 + .../compilation_info.as_worker.js | 6 + .../storage_texture/read_only.as_worker.js | 6 + .../storage_texture/read_write.as_worker.js | 6 + .../format_reinterpretation.as_worker.js | 6 + .../operation/texture_view/read.as_worker.js | 6 + .../operation/texture_view/write.as_worker.js | 6 + .../operation/uncapturederror.as_worker.js | 6 + .../vertex_state/correctness.as_worker.js | 6 + .../vertex_state/index_format.as_worker.js | 6 + .../api/validation/buffer/create.as_worker.js | 6 + .../validation/buffer/destroy.as_worker.js | 6 + .../validation/buffer/mapping.as_worker.js | 6 + .../validation/buffer/threading.as_worker.js | 6 + .../features/query_types.as_worker.js | 6 + .../features/texture_formats.as_worker.js | 6 + .../limits/maxBindGroups.as_worker.js | 6 + ...axBindGroupsPlusVertexBuffers.as_worker.js | 6 + .../maxBindingsPerBindGroup.as_worker.js | 6 + .../limits/maxBufferSize.as_worker.js | 6 + ...ColorAttachmentBytesPerSample.as_worker.js | 6 + .../limits/maxColorAttachments.as_worker.js | 6 + ...omputeInvocationsPerWorkgroup.as_worker.js | 6 + .../maxComputeWorkgroupSizeX.as_worker.js | 6 + .../maxComputeWorkgroupSizeY.as_worker.js | 6 + .../maxComputeWorkgroupSizeZ.as_worker.js | 6 + ...axComputeWorkgroupStorageSize.as_worker.js | 6 + ...ComputeWorkgroupsPerDimension.as_worker.js | 6 + ...orageBuffersPerPipelineLayout.as_worker.js | 6 + ...iformBuffersPerPipelineLayout.as_worker.js | 6 + ...maxInterStageShaderComponents.as_worker.js | 6 + .../maxInterStageShaderVariables.as_worker.js | 6 + ...SampledTexturesPerShaderStage.as_worker.js | 6 + .../maxSamplersPerShaderStage.as_worker.js | 6 + .../maxStorageBufferBindingSize.as_worker.js | 6 + ...xStorageBuffersPerShaderStage.as_worker.js | 6 + ...StorageTexturesPerShaderStage.as_worker.js | 6 + .../limits/maxTextureArrayLayers.as_worker.js | 6 + .../limits/maxTextureDimension1D.as_worker.js | 6 + .../limits/maxTextureDimension2D.as_worker.js | 6 + .../limits/maxTextureDimension3D.as_worker.js | 6 + .../maxUniformBufferBindingSize.as_worker.js | 6 + ...xUniformBuffersPerShaderStage.as_worker.js | 6 + .../limits/maxVertexAttributes.as_worker.js | 6 + .../maxVertexBufferArrayStride.as_worker.js | 6 + .../limits/maxVertexBuffers.as_worker.js | 6 + ...nStorageBufferOffsetAlignment.as_worker.js | 6 + ...nUniformBufferOffsetAlignment.as_worker.js | 6 + .../validation/compute_pipeline.as_worker.js | 6 + .../validation/createBindGroup.as_worker.js | 6 + .../createBindGroupLayout.as_worker.js | 6 + .../createPipelineLayout.as_worker.js | 6 + .../api/validation/createSampler.as_worker.js | 6 + .../api/validation/createTexture.as_worker.js | 6 + .../api/validation/createView.as_worker.js | 6 + .../api/validation/debugMarker.as_worker.js | 6 + .../encoding/beginComputePass.as_worker.js | 6 + .../encoding/beginRenderPass.as_worker.js | 6 + .../encoding/cmds/clearBuffer.as_worker.js | 6 + .../encoding/cmds/compute_pass.as_worker.js | 6 + .../cmds/copyBufferToBuffer.as_worker.js | 6 + .../cmds/copyTextureToTexture.as_worker.js | 6 + .../encoding/cmds/debug.as_worker.js | 6 + .../encoding/cmds/index_access.as_worker.js | 6 + .../encoding/cmds/render/draw.as_worker.js | 6 + .../cmds/render/dynamic_state.as_worker.js | 6 + .../cmds/render/indirect_draw.as_worker.js | 6 + .../cmds/render/setIndexBuffer.as_worker.js | 6 + .../cmds/render/setPipeline.as_worker.js | 6 + .../cmds/render/setVertexBuffer.as_worker.js | 6 + .../cmds/render/state_tracking.as_worker.js | 6 + .../encoding/cmds/render_pass.as_worker.js | 6 + .../encoding/cmds/setBindGroup.as_worker.js | 6 + .../createRenderBundleEncoder.as_worker.js | 6 + .../encoding/encoder_open_state.as_worker.js | 6 + .../encoding/encoder_state.as_worker.js | 6 + .../pipeline_bind_group_compat.as_worker.js | 6 + .../encoding/queries/begin_end.as_worker.js | 6 + .../encoding/queries/general.as_worker.js | 6 + .../queries/resolveQuerySet.as_worker.js | 6 + .../encoding/render_bundle.as_worker.js | 6 + .../api/validation/error_scope.as_worker.js | 6 + .../getBindGroupLayout.as_worker.js | 6 + ...u_external_texture_expiration.as_worker.js | 6 + .../image_copy/buffer_related.as_worker.js | 6 + .../buffer_texture_copies.as_worker.js | 6 + .../image_copy/layout_related.as_worker.js | 6 + .../image_copy/texture_related.as_worker.js | 6 + .../layout_shader_compat.as_worker.js | 6 + .../validation/query_set/create.as_worker.js | 6 + .../validation/query_set/destroy.as_worker.js | 6 + .../queue/buffer_mapped.as_worker.js | 6 + .../CopyExternalImageToTexture.as_worker.js | 6 + .../queue/destroyed/buffer.as_worker.js | 6 + .../queue/destroyed/query_set.as_worker.js | 6 + .../queue/destroyed/texture.as_worker.js | 6 + .../api/validation/queue/submit.as_worker.js | 6 + .../validation/queue/writeBuffer.as_worker.js | 6 + .../queue/writeTexture.as_worker.js | 6 + .../attachment_compatibility.as_worker.js | 6 + .../render_pass_descriptor.as_worker.js | 6 + .../render_pass/resolve.as_worker.js | 6 + .../depth_stencil_state.as_worker.js | 6 + .../fragment_state.as_worker.js | 6 + .../render_pipeline/inter_stage.as_worker.js | 6 + .../render_pipeline/misc.as_worker.js | 6 + .../multisample_state.as_worker.js | 6 + .../render_pipeline/overrides.as_worker.js | 6 + .../primitive_state.as_worker.js | 6 + .../resource_compatibility.as_worker.js | 6 + .../shader_module.as_worker.js | 6 + .../render_pipeline/vertex_state.as_worker.js | 6 + .../buffer/in_pass_encoder.as_worker.js | 6 + .../buffer/in_pass_misc.as_worker.js | 6 + .../texture/in_pass_encoder.as_worker.js | 6 + .../texture/in_render_common.as_worker.js | 6 + .../texture/in_render_misc.as_worker.js | 6 + .../shader_module/entry_point.as_worker.js | 6 + .../shader_module/overrides.as_worker.js | 6 + .../state/device_lost/destroy.as_worker.js | 6 + .../texture/bgra8unorm_storage.as_worker.js | 6 + .../validation/texture/destroy.as_worker.js | 6 + .../texture/float32_filterable.as_worker.js | 6 + .../rg11b10ufloat_renderable.as_worker.js | 6 + .../validation/createBindGroup.as_worker.js | 6 + .../createBindGroupLayout.as_worker.js | 6 + .../cmds/copyTextureToBuffer.as_worker.js | 6 + .../cmds/copyTextureToTexture.as_worker.js | 6 + .../pipeline_bind_group_compat.as_worker.js | 6 + .../depth_stencil_state.as_worker.js | 6 + .../fragment_state.as_worker.js | 6 + .../render_pipeline/vertex_state.as_worker.js | 6 + .../shader_module/shader_module.as_worker.js | 6 + .../texture/createTexture.as_worker.js | 6 + .../validation/texture/cubeArray.as_worker.js | 6 + .../webgpu/webworker/examples.as_worker.js | 6 + .../idl/constants/flags.as_worker.js | 6 + .../webworker/idl/constructable.as_worker.js | 6 + .../webworker/print_environment.as_worker.js | 6 + .../access/array/index.as_worker.js | 6 + .../access/matrix/index.as_worker.js | 6 + .../access/structure/index.as_worker.js | 6 + .../access/vector/components.as_worker.js | 6 + .../access/vector/index.as_worker.js | 6 + .../binary/af_addition.as_worker.js | 6 + .../binary/af_comparison.as_worker.js | 6 + .../binary/af_division.as_worker.js | 6 + .../binary/af_matrix_addition.as_worker.js | 6 + ..._matrix_matrix_multiplication.as_worker.js | 6 + ..._matrix_scalar_multiplication.as_worker.js | 6 + .../binary/af_matrix_subtraction.as_worker.js | 6 + ..._matrix_vector_multiplication.as_worker.js | 6 + .../binary/af_multiplication.as_worker.js | 6 + .../binary/af_remainder.as_worker.js | 6 + .../binary/af_subtraction.as_worker.js | 6 + .../binary/ai_arithmetic.as_worker.js | 6 + .../binary/ai_comparison.as_worker.js | 6 + .../expression/binary/bitwise.as_worker.js | 6 + .../binary/bitwise_shift.as_worker.js | 6 + .../binary/bool_logical.as_worker.js | 6 + .../binary/f16_addition.as_worker.js | 6 + .../binary/f16_comparison.as_worker.js | 6 + .../binary/f16_division.as_worker.js | 6 + .../binary/f16_matrix_addition.as_worker.js | 6 + ..._matrix_matrix_multiplication.as_worker.js | 6 + ..._matrix_scalar_multiplication.as_worker.js | 6 + .../f16_matrix_subtraction.as_worker.js | 6 + ..._matrix_vector_multiplication.as_worker.js | 6 + .../binary/f16_multiplication.as_worker.js | 6 + .../binary/f16_remainder.as_worker.js | 6 + .../binary/f16_subtraction.as_worker.js | 6 + .../binary/f32_addition.as_worker.js | 6 + .../binary/f32_comparison.as_worker.js | 6 + .../binary/f32_division.as_worker.js | 6 + .../binary/f32_matrix_addition.as_worker.js | 6 + ..._matrix_matrix_multiplication.as_worker.js | 6 + ..._matrix_scalar_multiplication.as_worker.js | 6 + .../f32_matrix_subtraction.as_worker.js | 6 + ..._matrix_vector_multiplication.as_worker.js | 6 + .../binary/f32_multiplication.as_worker.js | 6 + .../binary/f32_remainder.as_worker.js | 6 + .../binary/f32_subtraction.as_worker.js | 6 + .../binary/i32_arithmetic.as_worker.js | 6 + .../binary/i32_comparison.as_worker.js | 6 + .../binary/u32_arithmetic.as_worker.js | 6 + .../binary/u32_comparison.as_worker.js | 6 + .../expression/call/builtin/abs.as_worker.js | 6 + .../expression/call/builtin/acos.as_worker.js | 6 + .../call/builtin/acosh.as_worker.js | 6 + .../expression/call/builtin/all.as_worker.js | 6 + .../expression/call/builtin/any.as_worker.js | 6 + .../call/builtin/arrayLength.as_worker.js | 6 + .../expression/call/builtin/asin.as_worker.js | 6 + .../call/builtin/asinh.as_worker.js | 6 + .../expression/call/builtin/atan.as_worker.js | 6 + .../call/builtin/atan2.as_worker.js | 6 + .../call/builtin/atanh.as_worker.js | 6 + .../builtin/atomics/atomicAdd.as_worker.js | 6 + .../builtin/atomics/atomicAnd.as_worker.js | 6 + .../atomicCompareExchangeWeak.as_worker.js | 6 + .../atomics/atomicExchange.as_worker.js | 6 + .../builtin/atomics/atomicLoad.as_worker.js | 6 + .../builtin/atomics/atomicMax.as_worker.js | 6 + .../builtin/atomics/atomicMin.as_worker.js | 6 + .../builtin/atomics/atomicOr.as_worker.js | 6 + .../builtin/atomics/atomicStore.as_worker.js | 6 + .../builtin/atomics/atomicSub.as_worker.js | 6 + .../builtin/atomics/atomicXor.as_worker.js | 6 + .../call/builtin/bitcast.as_worker.js | 6 + .../expression/call/builtin/ceil.as_worker.js | 6 + .../call/builtin/clamp.as_worker.js | 6 + .../expression/call/builtin/cos.as_worker.js | 6 + .../expression/call/builtin/cosh.as_worker.js | 6 + .../builtin/countLeadingZeros.as_worker.js | 6 + .../call/builtin/countOneBits.as_worker.js | 6 + .../builtin/countTrailingZeros.as_worker.js | 6 + .../call/builtin/cross.as_worker.js | 6 + .../call/builtin/degrees.as_worker.js | 6 + .../call/builtin/determinant.as_worker.js | 6 + .../call/builtin/distance.as_worker.js | 6 + .../expression/call/builtin/dot.as_worker.js | 6 + .../call/builtin/dot4I8Packed.as_worker.js | 6 + .../call/builtin/dot4U8Packed.as_worker.js | 6 + .../expression/call/builtin/dpdx.as_worker.js | 6 + .../call/builtin/dpdxCoarse.as_worker.js | 6 + .../call/builtin/dpdxFine.as_worker.js | 6 + .../expression/call/builtin/dpdy.as_worker.js | 6 + .../call/builtin/dpdyCoarse.as_worker.js | 6 + .../call/builtin/dpdyFine.as_worker.js | 6 + .../expression/call/builtin/exp.as_worker.js | 6 + .../expression/call/builtin/exp2.as_worker.js | 6 + .../call/builtin/extractBits.as_worker.js | 6 + .../call/builtin/faceForward.as_worker.js | 6 + .../call/builtin/firstLeadingBit.as_worker.js | 6 + .../builtin/firstTrailingBit.as_worker.js | 6 + .../call/builtin/floor.as_worker.js | 6 + .../expression/call/builtin/fma.as_worker.js | 6 + .../call/builtin/fract.as_worker.js | 6 + .../call/builtin/frexp.as_worker.js | 6 + .../call/builtin/fwidth.as_worker.js | 6 + .../call/builtin/fwidthCoarse.as_worker.js | 6 + .../call/builtin/fwidthFine.as_worker.js | 6 + .../call/builtin/insertBits.as_worker.js | 6 + .../call/builtin/inversesqrt.as_worker.js | 6 + .../call/builtin/ldexp.as_worker.js | 6 + .../call/builtin/length.as_worker.js | 6 + .../expression/call/builtin/log.as_worker.js | 6 + .../expression/call/builtin/log2.as_worker.js | 6 + .../expression/call/builtin/max.as_worker.js | 6 + .../expression/call/builtin/min.as_worker.js | 6 + .../expression/call/builtin/mix.as_worker.js | 6 + .../expression/call/builtin/modf.as_worker.js | 6 + .../call/builtin/normalize.as_worker.js | 6 + .../call/builtin/pack2x16float.as_worker.js | 6 + .../call/builtin/pack2x16snorm.as_worker.js | 6 + .../call/builtin/pack2x16unorm.as_worker.js | 6 + .../call/builtin/pack4x8snorm.as_worker.js | 6 + .../call/builtin/pack4x8unorm.as_worker.js | 6 + .../call/builtin/pack4xI8.as_worker.js | 6 + .../call/builtin/pack4xI8Clamp.as_worker.js | 6 + .../call/builtin/pack4xU8.as_worker.js | 6 + .../call/builtin/pack4xU8Clamp.as_worker.js | 6 + .../expression/call/builtin/pow.as_worker.js | 6 + .../call/builtin/quantizeToF16.as_worker.js | 6 + .../call/builtin/radians.as_worker.js | 6 + .../call/builtin/reflect.as_worker.js | 6 + .../call/builtin/refract.as_worker.js | 6 + .../call/builtin/reverseBits.as_worker.js | 6 + .../call/builtin/round.as_worker.js | 6 + .../call/builtin/saturate.as_worker.js | 6 + .../call/builtin/select.as_worker.js | 6 + .../expression/call/builtin/sign.as_worker.js | 6 + .../expression/call/builtin/sin.as_worker.js | 6 + .../expression/call/builtin/sinh.as_worker.js | 6 + .../call/builtin/smoothstep.as_worker.js | 6 + .../expression/call/builtin/sqrt.as_worker.js | 6 + .../expression/call/builtin/step.as_worker.js | 6 + .../call/builtin/storageBarrier.as_worker.js | 6 + .../expression/call/builtin/tan.as_worker.js | 6 + .../expression/call/builtin/tanh.as_worker.js | 6 + .../builtin/textureDimensions.as_worker.js | 6 + .../call/builtin/textureGather.as_worker.js | 6 + .../builtin/textureGatherCompare.as_worker.js | 6 + .../call/builtin/textureLoad.as_worker.js | 6 + .../builtin/textureNumLayers.as_worker.js | 6 + .../builtin/textureNumLevels.as_worker.js | 6 + .../builtin/textureNumSamples.as_worker.js | 6 + .../call/builtin/textureSample.as_worker.js | 6 + .../builtin/textureSampleBias.as_worker.js | 6 + .../builtin/textureSampleCompare.as_worker.js | 6 + .../textureSampleCompareLevel.as_worker.js | 6 + .../builtin/textureSampleGrad.as_worker.js | 6 + .../builtin/textureSampleLevel.as_worker.js | 6 + .../call/builtin/textureStore.as_worker.js | 6 + .../call/builtin/transpose.as_worker.js | 6 + .../call/builtin/trunc.as_worker.js | 6 + .../call/builtin/unpack2x16float.as_worker.js | 6 + .../call/builtin/unpack2x16snorm.as_worker.js | 6 + .../call/builtin/unpack2x16unorm.as_worker.js | 6 + .../call/builtin/unpack4x8snorm.as_worker.js | 6 + .../call/builtin/unpack4x8unorm.as_worker.js | 6 + .../call/builtin/unpack4xI8.as_worker.js | 6 + .../call/builtin/unpack4xU8.as_worker.js | 6 + .../builtin/workgroupBarrier.as_worker.js | 6 + .../builtin/workgroupUniformLoad.as_worker.js | 6 + .../call/user/ptr_params.as_worker.js | 6 + .../constructor/non_zero.as_worker.js | 6 + .../constructor/zero_value.as_worker.js | 6 + .../expression/precedence.as_worker.js | 6 + .../address_of_and_indirection.as_worker.js | 6 + .../unary/af_arithmetic.as_worker.js | 6 + .../unary/af_assignment.as_worker.js | 6 + .../unary/ai_arithmetic.as_worker.js | 6 + .../unary/ai_assignment.as_worker.js | 6 + .../unary/ai_complement.as_worker.js | 6 + .../unary/bool_conversion.as_worker.js | 6 + .../unary/bool_logical.as_worker.js | 6 + .../unary/f16_arithmetic.as_worker.js | 6 + .../unary/f16_conversion.as_worker.js | 6 + .../unary/f32_arithmetic.as_worker.js | 6 + .../unary/f32_conversion.as_worker.js | 6 + .../unary/i32_arithmetic.as_worker.js | 6 + .../unary/i32_complement.as_worker.js | 6 + .../unary/i32_conversion.as_worker.js | 6 + .../unary/u32_complement.as_worker.js | 6 + .../unary/u32_conversion.as_worker.js | 6 + .../shader/execution/float_parse.as_worker.js | 6 + .../execution/flow_control/call.as_worker.js | 6 + .../flow_control/complex.as_worker.js | 6 + .../flow_control/eval_order.as_worker.js | 6 + .../execution/flow_control/for.as_worker.js | 6 + .../execution/flow_control/if.as_worker.js | 6 + .../execution/flow_control/loop.as_worker.js | 6 + .../execution/flow_control/phony.as_worker.js | 6 + .../flow_control/return.as_worker.js | 6 + .../flow_control/switch.as_worker.js | 6 + .../execution/flow_control/while.as_worker.js | 6 + .../shader/execution/limits.as_worker.js | 6 + .../execution/memory_layout.as_worker.js | 6 + .../memory_model/adjacent.as_worker.js | 6 + .../memory_model/atomicity.as_worker.js | 6 + .../memory_model/barrier.as_worker.js | 6 + .../memory_model/coherence.as_worker.js | 6 + ...re_intra_invocation_coherence.as_worker.js | 6 + .../execution/memory_model/weak.as_worker.js | 6 + .../shader/execution/padding.as_worker.js | 6 + .../execution/robust_access.as_worker.js | 6 + .../robust_access_vertex.as_worker.js | 6 + .../shader_io/compute_builtins.as_worker.js | 6 + .../shader_io/fragment_builtins.as_worker.js | 6 + .../shader_io/shared_structs.as_worker.js | 6 + .../execution/shader_io/user_io.as_worker.js | 6 + .../shader_io/workgroup_size.as_worker.js | 6 + .../shader/execution/shadow.as_worker.js | 6 + .../shader/execution/stage.as_worker.js | 6 + .../execution/statement/compound.as_worker.js | 6 + .../execution/statement/discard.as_worker.js | 6 + .../increment_decrement.as_worker.js | 6 + .../shader/execution/value_init.as_worker.js | 6 + .../shader/execution/zero_init.as_worker.js | 6 + .../const_assert/const_assert.as_worker.js | 6 + .../decl/compound_statement.as_worker.js | 6 + .../shader/validation/decl/const.as_worker.js | 6 + .../context_dependent_resolution.as_worker.js | 6 + .../shader/validation/decl/let.as_worker.js | 6 + .../validation/decl/override.as_worker.js | 6 + .../shader/validation/decl/var.as_worker.js | 6 + .../expression/access/array.as_worker.js | 6 + .../expression/access/matrix.as_worker.js | 6 + .../expression/access/structure.as_worker.js | 6 + .../expression/access/vector.as_worker.js | 6 + .../binary/add_sub_mul.as_worker.js | 6 + .../expression/binary/and_or_xor.as_worker.js | 6 + .../binary/bitwise_shift.as_worker.js | 6 + .../expression/binary/comparison.as_worker.js | 6 + .../expression/binary/div_rem.as_worker.js | 6 + .../expression/binary/parse.as_worker.js | 6 + .../expression/call/builtin/abs.as_worker.js | 6 + .../expression/call/builtin/acos.as_worker.js | 6 + .../call/builtin/acosh.as_worker.js | 6 + .../expression/call/builtin/all.as_worker.js | 6 + .../expression/call/builtin/any.as_worker.js | 6 + .../call/builtin/arrayLength.as_worker.js | 6 + .../expression/call/builtin/asin.as_worker.js | 6 + .../call/builtin/asinh.as_worker.js | 6 + .../expression/call/builtin/atan.as_worker.js | 6 + .../call/builtin/atan2.as_worker.js | 6 + .../call/builtin/atanh.as_worker.js | 6 + .../call/builtin/atomics.as_worker.js | 6 + .../call/builtin/barriers.as_worker.js | 6 + .../call/builtin/bitcast.as_worker.js | 6 + .../expression/call/builtin/ceil.as_worker.js | 6 + .../call/builtin/clamp.as_worker.js | 6 + .../expression/call/builtin/cos.as_worker.js | 6 + .../expression/call/builtin/cosh.as_worker.js | 6 + .../builtin/countLeadingZeros.as_worker.js | 6 + .../call/builtin/countOneBits.as_worker.js | 6 + .../builtin/countTrailingZeros.as_worker.js | 6 + .../call/builtin/cross.as_worker.js | 6 + .../call/builtin/degrees.as_worker.js | 6 + .../call/builtin/derivatives.as_worker.js | 6 + .../call/builtin/determinant.as_worker.js | 6 + .../call/builtin/distance.as_worker.js | 6 + .../expression/call/builtin/dot.as_worker.js | 6 + .../call/builtin/dot4I8Packed.as_worker.js | 6 + .../call/builtin/dot4U8Packed.as_worker.js | 6 + .../expression/call/builtin/exp.as_worker.js | 6 + .../expression/call/builtin/exp2.as_worker.js | 6 + .../call/builtin/extractBits.as_worker.js | 6 + .../call/builtin/faceForward.as_worker.js | 6 + .../call/builtin/firstLeadingBit.as_worker.js | 6 + .../builtin/firstTrailingBit.as_worker.js | 6 + .../call/builtin/floor.as_worker.js | 6 + .../expression/call/builtin/fma.as_worker.js | 6 + .../call/builtin/fract.as_worker.js | 6 + .../call/builtin/frexp.as_worker.js | 6 + .../call/builtin/insertBits.as_worker.js | 6 + .../call/builtin/inverseSqrt.as_worker.js | 6 + .../call/builtin/ldexp.as_worker.js | 6 + .../call/builtin/length.as_worker.js | 6 + .../expression/call/builtin/log.as_worker.js | 6 + .../expression/call/builtin/log2.as_worker.js | 6 + .../expression/call/builtin/max.as_worker.js | 6 + .../expression/call/builtin/min.as_worker.js | 6 + .../expression/call/builtin/mix.as_worker.js | 6 + .../expression/call/builtin/modf.as_worker.js | 6 + .../call/builtin/normalize.as_worker.js | 6 + .../call/builtin/pack2x16float.as_worker.js | 6 + .../call/builtin/pack2x16snorm.as_worker.js | 6 + .../call/builtin/pack2x16unorm.as_worker.js | 6 + .../call/builtin/pack4x8snorm.as_worker.js | 6 + .../call/builtin/pack4x8unorm.as_worker.js | 6 + .../call/builtin/pack4xI8.as_worker.js | 6 + .../call/builtin/pack4xI8Clamp.as_worker.js | 6 + .../call/builtin/pack4xU8.as_worker.js | 6 + .../call/builtin/pack4xU8Clamp.as_worker.js | 6 + .../expression/call/builtin/pow.as_worker.js | 6 + .../call/builtin/quantizeToF16.as_worker.js | 6 + .../call/builtin/radians.as_worker.js | 6 + .../call/builtin/reflect.as_worker.js | 6 + .../call/builtin/refract.as_worker.js | 6 + .../call/builtin/reverseBits.as_worker.js | 6 + .../call/builtin/round.as_worker.js | 6 + .../call/builtin/saturate.as_worker.js | 6 + .../call/builtin/select.as_worker.js | 6 + .../expression/call/builtin/sign.as_worker.js | 6 + .../expression/call/builtin/sin.as_worker.js | 6 + .../expression/call/builtin/sinh.as_worker.js | 6 + .../call/builtin/smoothstep.as_worker.js | 6 + .../expression/call/builtin/sqrt.as_worker.js | 6 + .../expression/call/builtin/step.as_worker.js | 6 + .../expression/call/builtin/tan.as_worker.js | 6 + .../expression/call/builtin/tanh.as_worker.js | 6 + .../builtin/textureDimensions.as_worker.js | 6 + .../call/builtin/textureGather.as_worker.js | 6 + .../builtin/textureGatherCompare.as_worker.js | 6 + .../call/builtin/textureLoad.as_worker.js | 6 + .../builtin/textureNumLayers.as_worker.js | 6 + .../builtin/textureNumLevels.as_worker.js | 6 + .../builtin/textureNumSamples.as_worker.js | 6 + .../call/builtin/textureSample.as_worker.js | 6 + .../textureSampleBaseClampToEdge.as_worker.js | 6 + .../builtin/textureSampleBias.as_worker.js | 6 + .../builtin/textureSampleCompare.as_worker.js | 6 + .../textureSampleCompareLevel.as_worker.js | 6 + .../builtin/textureSampleGrad.as_worker.js | 6 + .../builtin/textureSampleLevel.as_worker.js | 6 + .../call/builtin/textureStore.as_worker.js | 6 + .../call/builtin/transpose.as_worker.js | 6 + .../call/builtin/trunc.as_worker.js | 6 + .../call/builtin/unpack2x16float.as_worker.js | 6 + .../call/builtin/unpack2x16snorm.as_worker.js | 6 + .../call/builtin/unpack2x16unorm.as_worker.js | 6 + .../call/builtin/unpack4x8snorm.as_worker.js | 6 + .../call/builtin/unpack4x8unorm.as_worker.js | 6 + .../call/builtin/unpack4xI8.as_worker.js | 6 + .../call/builtin/unpack4xU8.as_worker.js | 6 + .../builtin/value_constructor.as_worker.js | 6 + .../builtin/workgroupUniformLoad.as_worker.js | 6 + .../expression/early_evaluation.as_worker.js | 6 + .../expression/matrix/add_sub.as_worker.js | 6 + .../expression/matrix/and_or_xor.as_worker.js | 6 + .../matrix/bitwise_shift.as_worker.js | 6 + .../expression/matrix/comparison.as_worker.js | 6 + .../expression/matrix/div_rem.as_worker.js | 6 + .../expression/matrix/mul.as_worker.js | 6 + .../overload_resolution.as_worker.js | 6 + .../expression/precedence.as_worker.js | 6 + .../address_of_and_indirection.as_worker.js | 6 + .../unary/arithmetic_negation.as_worker.js | 6 + .../unary/bitwise_complement.as_worker.js | 6 + .../unary/logical_negation.as_worker.js | 6 + .../dual_source_blending.as_worker.js | 6 + .../pointer_composite_access.as_worker.js | 6 + ...nd_readwrite_storage_textures.as_worker.js | 6 + .../functions/alias_analysis.as_worker.js | 6 + .../functions/restrictions.as_worker.js | 6 + .../validation/parse/attribute.as_worker.js | 6 + .../validation/parse/blankspace.as_worker.js | 6 + .../validation/parse/comments.as_worker.js | 6 + .../validation/parse/diagnostic.as_worker.js | 6 + .../validation/parse/enable.as_worker.js | 6 + .../validation/parse/identifiers.as_worker.js | 6 + .../validation/parse/literal.as_worker.js | 6 + .../validation/parse/must_use.as_worker.js | 6 + .../validation/parse/requires.as_worker.js | 6 + .../validation/parse/semicolon.as_worker.js | 6 + .../parse/shadow_builtins.as_worker.js | 6 + .../validation/parse/source.as_worker.js | 6 + .../validation/shader_io/align.as_worker.js | 6 + .../validation/shader_io/binding.as_worker.js | 6 + .../shader_io/builtins.as_worker.js | 6 + .../shader_io/entry_point.as_worker.js | 6 + .../validation/shader_io/group.as_worker.js | 6 + .../shader_io/group_and_binding.as_worker.js | 6 + .../validation/shader_io/id.as_worker.js | 6 + .../shader_io/interpolate.as_worker.js | 6 + .../shader_io/invariant.as_worker.js | 6 + .../shader_io/layout_constraints.as_worker.js | 6 + .../shader_io/locations.as_worker.js | 6 + .../shader_io/pipeline_stage.as_worker.js | 6 + .../validation/shader_io/size.as_worker.js | 6 + .../shader_io/workgroup_size.as_worker.js | 6 + .../validation/statement/break.as_worker.js | 6 + .../statement/break_if.as_worker.js | 6 + .../statement/compound.as_worker.js | 6 + .../statement/const_assert.as_worker.js | 6 + .../statement/continue.as_worker.js | 6 + .../statement/continuing.as_worker.js | 6 + .../validation/statement/discard.as_worker.js | 6 + .../validation/statement/for.as_worker.js | 6 + .../validation/statement/if.as_worker.js | 6 + .../increment_decrement.as_worker.js | 6 + .../validation/statement/loop.as_worker.js | 6 + .../validation/statement/phony.as_worker.js | 6 + .../validation/statement/return.as_worker.js | 6 + .../statement/statement_behavior.as_worker.js | 6 + .../validation/statement/switch.as_worker.js | 6 + .../validation/statement/while.as_worker.js | 6 + .../validation/types/alias.as_worker.js | 6 + .../validation/types/array.as_worker.js | 6 + .../validation/types/atomics.as_worker.js | 6 + .../validation/types/enumerant.as_worker.js | 6 + .../validation/types/matrix.as_worker.js | 6 + .../validation/types/pointer.as_worker.js | 6 + .../shader/validation/types/ref.as_worker.js | 6 + .../validation/types/struct.as_worker.js | 6 + .../validation/types/textures.as_worker.js | 6 + .../validation/types/vector.as_worker.js | 6 + .../uniformity/uniformity.as_worker.js | 6 + .../color_space_conversions.as_worker.js | 6 + .../util/texture/texel_data.as_worker.js | 6 + .../util/texture/texture_ok.as_worker.js | 6 + .../canvas/configure.as_worker.js | 6 + .../canvas/context_creation.as_worker.js | 6 + .../canvas/getCurrentTexture.as_worker.js | 6 + .../getPreferredCanvasFormat.as_worker.js | 6 + .../readbackFromWebGPUCanvas.as_worker.js | 6 + .../copyToTexture/ImageBitmap.as_worker.js | 6 + .../copyToTexture/ImageData.as_worker.js | 6 + .../copyToTexture/canvas.as_worker.js | 6 + .../copyToTexture/image.as_worker.js | 6 + .../copyToTexture/video.as_worker.js | 6 + .../external_texture/video.as_worker.js | 6 + .../web_platform/worker/worker.as_worker.js | 6 + 1385 files changed, 153348 insertions(+), 13164 deletions(-) create mode 100644 tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html.ini create mode 100644 tests/wpt/webgpu/tests/webgpu/common/runtime/helper/utils_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/common/runtime/helper/wrap_for_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/ai_arithmetic.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/derivatives.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fwidth.bin create mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/ai_arithmetic.bin delete mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_complement.bin delete mode 100644 tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_complement.bin rename tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/{requestAdapterInfo.spec.js => info.spec.js} (67%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/3d_texture_slices.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_only.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/resource_compatibility.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/utils.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/shader_module.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/shader_module/shader_module.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/error_test.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/inter_stage.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/print_environment.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/array/index.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/matrix/index.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/structure/index.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/components.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/index.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_data.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_comparison.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimension.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimensions.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/texture_utils.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/workgroupUniformLoad.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/non_zero.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/zero_value.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/precedence.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/{indirection.spec.js => address_of_and_indirection.spec.js} (86%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_complement.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.cache.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.cache.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/limits.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/texture_intra_invocation_coherence.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/user_io.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/discard.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/value_init.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/context_dependent_resolution.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/let.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var_access_mode.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/array.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/matrix.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/structure.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/add_sub_mul.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/and_or_xor.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/comparison.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/div_rem.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse/binary_ops.spec.js => expression/binary/parse.spec.js} (89%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/result_type.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/all.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/any.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countLeadingZeros.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countOneBits.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countTrailingZeros.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cross.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/derivatives.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/determinant.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/distance.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/extractBits.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/faceForward.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstLeadingBit.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstTrailingBit.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fma.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fract.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/frexp.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/insertBits.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ldexp.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/max.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/min.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/mix.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/normalize.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16float.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16snorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16unorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8snorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8unorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pow.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/quantizeToF16.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reflect.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/refract.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reverseBits.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/select.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/shader_builtin_utils.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/step.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tanh.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGather.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSample.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureStore.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/transpose.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/trunc.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16float.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16snorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16unorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8snorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8unorm.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/early_evaluation.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/add_sub.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/and_or_xor.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/bitwise_shift.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/comparison.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/div_rem.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/mul.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/overload_resolution.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/precedence.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/address_of_and_indirection.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/arithmetic_negation.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/bitwise_complement.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/logical_negation.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/dual_source_blending.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/readonly_and_readwrite_storage_textures.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/builtin.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/shadow_builtins.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/unary_ops.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/var_and_let.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => shader_io}/align.spec.js (99%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/layout_constraints.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => shader_io}/pipeline_stage.spec.js (100%) rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/break.spec.js (100%) rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/break_if.spec.js (70%) rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/compound.spec.js (100%) rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/const_assert.spec.js (100%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continue.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/continuing.spec.js (100%) rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{parse => statement}/discard.spec.js (100%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/for.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/if.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/increment_decrement.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/loop.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/phony.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/return.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/statement_behavior.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/switch.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/test_types.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/while.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/array.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/atomics.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/enumerant.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/matrix.spec.js rename tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/{decl/ptr_spelling.spec.js => types/pointer.spec.js} (54%) create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/ref.spec.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/textures.spec.js delete mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/util/buffer.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.html.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/ref/canvas_display_after_device_lost-ref.html create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/info.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestAdapter.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestDevice.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_ArrayBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_detach.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_oom.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/threading.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/basic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/clearBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyBufferToBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyTextureToTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/image_copy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/programmable/state_tracking.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/queries/occlusionQuery.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/dynamic_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/state_tracking.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute/basic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/entry_point_name.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/overrides.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/device/lost.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/labels.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/multiple_buffers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/single_buffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/readonly_depth_stencil.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/same_subresource.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/onSubmittedWorkDone.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/pipeline/default_layout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/queue/writeBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/reflection.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/clear_value.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/resolve.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeOp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeop2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/culling_tests.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/overrides.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/pipeline_output_targets.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/primitive_topology.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/sample_mask.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/vertex_only_render_pipeline.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/3d_texture_slices.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/basic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/color_target_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_bias.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_clip_clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/draw.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/indirect_draw.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/robust_access_index.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/stencil.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/buffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/texture_zero.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/anisotropy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/filter_mode.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/lod_clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/shader_module/compilation_info.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_only.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_write.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/format_reinterpretation.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/read.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/write.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/uncapturederror.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/correctness.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/index_format.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/create.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/destroy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/mapping.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/threading.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/query_types.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/texture_formats.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroups.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindingsPerBindGroup.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBufferSize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachments.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeInvocationsPerWorkgroup.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupStorageSize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicStorageBuffersPerPipelineLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicUniformBuffersPerPipelineLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderComponents.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderVariables.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSampledTexturesPerShaderStage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSamplersPerShaderStage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBufferBindingSize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBuffersPerShaderStage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageTexturesPerShaderStage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureArrayLayers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension1D.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension2D.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension3D.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBufferBindingSize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBuffersPerShaderStage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexAttributes.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBufferArrayStride.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBuffers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/compute_pipeline.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroup.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroupLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createPipelineLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createSampler.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createView.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/debugMarker.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginComputePass.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginRenderPass.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/clearBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/compute_pass.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyBufferToBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/debug.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/index_access.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/draw.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/dynamic_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/indirect_draw.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setIndexBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setPipeline.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setVertexBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/state_tracking.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render_pass.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setBindGroup.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/createRenderBundleEncoder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_open_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/begin_end.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/general.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/resolveQuerySet.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/render_bundle.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/error_scope.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/getBindGroupLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/gpu_external_texture_expiration.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_related.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_texture_copies.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/layout_related.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/texture_related.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/layout_shader_compat.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/create.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/destroy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/buffer_mapped.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/copyToTexture/CopyExternalImageToTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/buffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/query_set.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/texture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/submit.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/attachment_compatibility.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/render_pass_descriptor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/resolve.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/depth_stencil_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/fragment_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/inter_stage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/misc.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/multisample_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/overrides.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/primitive_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/resource_compatibility.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/shader_module.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/vertex_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_encoder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_misc.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_pass_encoder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_common.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_misc.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/entry_point.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/overrides.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/state/device_lost/destroy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/bgra8unorm_storage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/destroy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/float32_filterable.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/rg11b10ufloat_renderable.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroup.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroupLayout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToBuffer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/depth_stencil_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/fragment_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/vertex_state.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/shader_module/shader_module.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/createTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/cubeArray.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/examples.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constants/flags.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constructable.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/print_environment.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/array/index.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/matrix/index.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/structure/index.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/components.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/index.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_division.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_matrix_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_scalar_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_vector_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_remainder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise_shift.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bool_logical.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_division.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_matrix_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_scalar_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_vector_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_remainder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_division.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_addition.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_matrix_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_scalar_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_vector_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_multiplication.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_remainder.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_subtraction.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/abs.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acos.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acosh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/all.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/any.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/arrayLength.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asin.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asinh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atanh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAdd.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAnd.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicExchange.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicLoad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMax.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMin.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicOr.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicStore.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicSub.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicXor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/bitcast.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ceil.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cos.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cosh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countLeadingZeros.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countOneBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countTrailingZeros.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cross.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/degrees.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/determinant.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/distance.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4I8Packed.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4U8Packed.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdx.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxCoarse.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxFine.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdy.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyCoarse.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyFine.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/extractBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/faceForward.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstLeadingBit.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstTrailingBit.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/floor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fma.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fract.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/frexp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidth.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthCoarse.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthFine.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/insertBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/inversesqrt.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ldexp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/length.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/max.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/min.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/mix.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/modf.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/normalize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16float.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8Clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8Clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pow.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/quantizeToF16.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/radians.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reflect.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/refract.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reverseBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/round.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/saturate.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/select.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sign.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sin.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sinh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/smoothstep.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sqrt.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/step.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/storageBarrier.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tan.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tanh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureDimensions.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGather.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGatherCompare.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureLoad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLayers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLevels.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumSamples.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSample.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleBias.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompare.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompareLevel.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleGrad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleLevel.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureStore.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/transpose.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/trunc.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16float.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xI8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xU8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupBarrier.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupUniformLoad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/user/ptr_params.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/non_zero.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/zero_value.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/precedence.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/address_of_and_indirection.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_assignment.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_assignment.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_complement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_conversion.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_logical.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_conversion.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_conversion.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_arithmetic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_complement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_conversion.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_complement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_conversion.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/float_parse.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/call.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/complex.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/eval_order.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/for.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/if.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/loop.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/phony.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/return.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/switch.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/while.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/limits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_layout.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/adjacent.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/atomicity.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/barrier.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/coherence.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/texture_intra_invocation_coherence.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/weak.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/padding.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access_vertex.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/compute_builtins.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/fragment_builtins.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/shared_structs.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/user_io.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/workgroup_size.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shadow.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/stage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/compound.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/discard.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/increment_decrement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/value_init.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/zero_init.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/const_assert/const_assert.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/compound_statement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/const.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/context_dependent_resolution.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/let.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/override.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/var.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/array.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/matrix.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/structure.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/vector.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/add_sub_mul.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/and_or_xor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/bitwise_shift.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/div_rem.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/parse.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/abs.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acos.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acosh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/all.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/any.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/arrayLength.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asin.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asinh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atanh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atomics.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/barriers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/bitcast.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ceil.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cos.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cosh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countLeadingZeros.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countOneBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countTrailingZeros.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cross.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/degrees.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/derivatives.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/determinant.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/distance.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4I8Packed.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4U8Packed.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/extractBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/faceForward.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstLeadingBit.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstTrailingBit.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/floor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fma.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fract.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/frexp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/insertBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/inverseSqrt.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ldexp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/length.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log2.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/max.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/min.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/mix.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/modf.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/normalize.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16float.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8Clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8Clamp.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pow.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/quantizeToF16.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/radians.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reflect.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/refract.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reverseBits.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/round.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/saturate.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/select.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sign.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sin.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sinh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/smoothstep.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sqrt.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/step.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tan.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tanh.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureDimensions.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGather.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGatherCompare.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureLoad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLayers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLevels.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumSamples.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSample.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBias.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompare.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompareLevel.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleGrad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleLevel.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureStore.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/transpose.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/trunc.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16float.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8snorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8unorm.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xI8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xU8.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/value_constructor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/workgroupUniformLoad.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/early_evaluation.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/add_sub.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/and_or_xor.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/bitwise_shift.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/comparison.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/div_rem.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/mul.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/overload_resolution.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/precedence.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/address_of_and_indirection.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/arithmetic_negation.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/bitwise_complement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/logical_negation.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/dual_source_blending.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/pointer_composite_access.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/readonly_and_readwrite_storage_textures.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/alias_analysis.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/restrictions.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/attribute.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/blankspace.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/comments.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/diagnostic.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/enable.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/identifiers.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/literal.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/must_use.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/requires.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/semicolon.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/shadow_builtins.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/source.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/align.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/binding.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/builtins.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/entry_point.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group_and_binding.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/id.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/interpolate.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/invariant.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/layout_constraints.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/locations.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/pipeline_stage.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/size.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/workgroup_size.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break_if.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/compound.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/const_assert.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continue.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continuing.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/discard.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/for.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/if.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/increment_decrement.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/loop.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/phony.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/return.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/statement_behavior.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/switch.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/while.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/alias.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/array.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/atomics.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/enumerant.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/matrix.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/pointer.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/ref.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/struct.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/textures.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/vector.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/uniformity/uniformity.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/color_space_conversions.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texel_data.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texture_ok.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/configure.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/context_creation.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getCurrentTexture.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getPreferredCanvasFormat.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/readbackFromWebGPUCanvas.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageBitmap.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageData.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/canvas.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/image.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/video.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/external_texture/video.as_worker.js create mode 100644 tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/worker/worker.as_worker.js diff --git a/tests/wpt/webgpu/meta/MANIFEST.json b/tests/wpt/webgpu/meta/MANIFEST.json index 08a40c2d71c..3029f85b561 100644 --- a/tests/wpt/webgpu/meta/MANIFEST.json +++ b/tests/wpt/webgpu/meta/MANIFEST.json @@ -461,6 +461,19 @@ } ] ], + "canvas_display_after_device_lost.https.html": [ + "03ff43580a0e88e675ac9d154b463b78d89297b5", + [ + null, + [ + [ + "/_webgpu/webgpu/webgpu/web_platform/reftests/ref/canvas_display_after_device_lost-ref.html", + "==" + ] + ], + {} + ] + ], "canvas_image_rendering.https.html": [ "6a64b3da5dd10e09792f069dd62f6695dd0a7727", [ @@ -515,7 +528,7 @@ [] ], "checkout_commit.txt": [ - "79dad5b98aa6080ca086bf384c6e85f75cf40185", + "ba9ce014f077d7700ba4fb1c54f9061aab4e062c", [] ], "webgpu": { @@ -526,11 +539,11 @@ [] ], "fixture.js": [ - "d64245f5f89c40aafafe257faea5046da63302e5", + "1cd50c01ccd0f1a42d534ee1a8f10ff813be60c7", [] ], "metadata.js": [ - "7742a9c1ae5c9a9a108a72a5dd00662d146ce296", + "9df7235bb153fa43201db34026f57fbe29f1c341", [] ], "params_builder.js": [ @@ -542,7 +555,7 @@ [] ], "test_config.js": [ - "81984dbec5e5065873478d2391e81a8d57843d34", + "5d8a59217f75c38474ae15a0a7da67b296c1ce7d", [] ], "test_group.js": [ @@ -557,19 +570,19 @@ ], "logging": { "log_message.js": [ - "234b7c2cc909107a992a09b6d1154db75c44e732", + "53d2cd4b9c6d77e1224c6d734a350c8c65ea611c", [] ], "logger.js": [ - "224af20ddc58f3d3fd22d8c8ba97bac1bcab6e5c", + "4ec505cb69720c98786d85cd497bba9abe2705bf", [] ], "result.js": [ - "a7eb281daf366b8585981daf587a35ef1627bb10", + "cd4d0e86f1c7223a30a4ab152b4be26e7cf50fa8", [] ], "test_case_recorder.js": [ - "7b9a5302cec839033c011737d1e7466feece71e7", + "5b2a4e8b8ef259763c331bf7e4f8421d1eb43a70", [] ] }, @@ -579,7 +592,7 @@ ], "query": { "compare.js": [ - "8af64919a2ed63c10d58863d72b55c78f54527d7", + "f2bb1b62f3241b3a6393b18a8114c2045a04dce8", [] ], "encode_selectively.js": [ @@ -595,7 +608,7 @@ [] ], "query.js": [ - "e1db8750610e83134c853cbffec945ac1434eb4a", + "8fd443652af428d06a6fecf0150cc4f2656c520a", [] ], "separators.js": [ @@ -616,11 +629,11 @@ [] ], "test_group.js": [ - "3db409ffe765feb5c869d9947900ff000788edb0", + "2772194667219e9168f7ecde7223afe26945d155", [] ], "test_suite_listing.js": [ - "81a15cf7123193973f4f3f3237a855ce4c5b071b", + "7ea1c066f53c19d5a4a11f363432cd5cc3445e1a", [] ], "tree.js": [ @@ -632,31 +645,39 @@ [] ], "version.js": [ - "34933cc3cb2ee174bfb0b98bbc82a08f2b5ad60e", + "1583378be3382623678c24860638334537ea0a56", [] ], "websocket_logger.js": [ - "7a8f92b1a84b27990004a6a127a4f2d3b0d3eeff", + "1790e5632d8d086e2019a709962b1358aec95a06", [] ] }, "runtime": { "helper": { "options.js": [ - "139c3bc29f22ae53a946af1885861c65f9f43670", + "01b7d958891ab210b1b27e4ec77479db08c4157e", [] ], "test_worker-worker.js": [ - "a0f13c54afeb57dc14ce69fb8335ed21389fd3bd", + "c5df860d0bb0ff52ba48d85a596f0a02d7269ffb", [] ], "test_worker.js": [ - "1d653941802d3a45ab05094b654d8e369920d57c", + "13314163f45a52a0957b8c307b8a51ba31dbaf77", + [] + ], + "utils_worker.js": [ + "5a34070e1486d668ce6806048a329eb7cae47e1b", + [] + ], + "wrap_for_worker.js": [ + "c3a94612af3b9f6f097c0247aafc8c5b79a6234d", [] ] }, "wpt.js": [ - "97c6a3886ed139e709e7b336606eaab4098c1fe9", + "d1a025d1f82bb9a3ad78004502c2cc54c3c6fb37", [] ] }, @@ -678,7 +699,7 @@ [] ], "navigator_gpu.js": [ - "d5db9f936ef57af9bab40bff317afd230482d253", + "a6cb742a18fb0ebcbc6288ee0b181ce57fb741aa", [] ], "parse_imports.js": [ @@ -698,7 +719,7 @@ [] ], "util.js": [ - "b10762390fc5f883c2c8dcaf91da075869dcf2e5", + "56e09bff45edf8390f72bf239c394d13081717e8", [] ], "wpt_reftest_wait.js": [ @@ -711,11 +732,11 @@ "petamoriken": { "float16": { "float16.d.js": [ - "138c3378a5285254f3267e606e97e4d95be8935c", + "5a3e7f2f00a377819656db6e73d2b17fd8cadc49", [] ], "float16.js": [ - "42543cdea172850819c0e50c7ea44d0c03238af9", + "11db53a4fd73b14921db173da132423704941c7b", [] ] } @@ -723,80 +744,96 @@ }, "resources": { "README.md": [ - "990b2b98e0a454f8681dd223ef2422b72dbd1ea4", + "a1ed0604170c08c9a8b579f477c7e07304df0edc", [] ], "cache": { "hashes.json": [ - "d908a0c69caa7fcbebab7e8a5b05e53e6df7b14b", + "e0459422560f3fa4eeff29ad0c46926b21c62e5b", [] ], "webgpu": { "shader": { "execution": { "abs.bin": [ - "16111ac66a32c2290a9d7f22be4b0e7d3ef23aab", + "4cba9b72dff4e34c6a8b77120479331d2a28ab39", [] ], "acos.bin": [ - "3765fcd2bef86bea9a6acd30f366dd0317d055b7", + "2ecaaa389a4e2ceca0d22803faed5a7bcb4c6ecf", [] ], "acosh.bin": [ - "ee127796edb4763828cf6bc4a4d9ab4e1c34428f", + "d48659f3c3253de69bc0425496474d9cbd8dd18b", [] ], "asin.bin": [ - "439de48fb3f165594370eefc6b01e1c676a1ada2", + "b199953eaf4b047cd64d437e40c0de18a1d935bb", [] ], "asinh.bin": [ - "eda7179e75974c25204038952373bbf36152b4cc", + "b370c53b01790680ef0699cdb15d91ffd91e6147", [] ], "atan.bin": [ - "d15ee8b6b7f20b5e312b205668c7d67fb7f32b12", + "6ab0ba106a9efbaf739a2351bbf72f8fc08b5ceb", [] ], "atan2.bin": [ - "2966b4ea155cc9f5621ee0c26802df131374bbe3", + "0109ddbc375f6eb6e38da3d82ba7981991d7b1a2", [] ], "atanh.bin": [ - "d919b4bcb782602eb2184803c4a1c3b30408dbff", + "e6a190b35df52250397c14343e8ef4a651cb1b93", [] ], "binary": { "af_addition.bin": [ - "ebd757c1b6b194e93c9beb5b0057cbc5bf43a888", + "03e1f4a57bfb4c689b1f647c816914fd946b4b34", [] ], "af_division.bin": [ - "af690dcfb53f1cbadecd6f7bf29a4fe071cb6c6c", + "656356d32e6adca1d685f8b729549bf6f5c4976e", [] ], "af_logical.bin": [ - "e386de36b7e828c02101d4889ff1f5fd443d9fef", + "e3594458f2569d32c2506acc9381deec17cda8d4", [] ], "af_matrix_addition.bin": [ - "d387abcd7f208df8c11ad5470307a737ffe8b81d", + "abd3cdde0211dfcaa507c9f6ce28e18bcc1a6d99", + [] + ], + "af_matrix_matrix_multiplication.bin": [ + "58d0d40cb97dff8d220bfb44ba92db53232b1e0e", + [] + ], + "af_matrix_scalar_multiplication.bin": [ + "61401e54700314318da070d1e00dcb0c29a23fed", [] ], "af_matrix_subtraction.bin": [ - "4a1449182109965ae9b9e4ed2a19bb5bb24d5001", + "fa000a20eba74fdd8b009ee7d226c6308952d9f9", + [] + ], + "af_matrix_vector_multiplication.bin": [ + "545a5112cf0ceb4f2d69aab31adae8eca47dc1c1", [] ], "af_multiplication.bin": [ - "552d8b4892c87a6b7889ebc50773bdadc64acd97", + "be7c44d84e8c487ef51040183cabbf226da0205d", [] ], "af_remainder.bin": [ - "b9cd253ac7ca04b0faa7ece4de628b308398f46e", + "c45792abf49e4ecfd8fc07a978a2c77fc6e5d4cd", [] ], "af_subtraction.bin": [ - "6f0be2978587de4c6c5659248a4e180b8a5bdbf6", + "a28375db8b219b88c01bdc208f37750379231c79", + [] + ], + "ai_arithmetic.bin": [ + "658eb46d3949a3187f3ad615d3b089ea106f5ffb", [] ], "f16_addition.bin": [ @@ -804,11 +841,11 @@ [] ], "f16_division.bin": [ - "c05b627fa121b60fa8315e191c90c0d4e9bf27f6", + "22e60bef813cdae2e30d06c197e513f08b89c216", [] ], "f16_logical.bin": [ - "558a25ded4500f2fd42630c3a88535e157e0f250", + "932af58208a8c27d85fb6b2cc3ec4edc01847312", [] ], "f16_matrix_addition.bin": [ @@ -852,7 +889,7 @@ [] ], "f32_logical.bin": [ - "5a6fbe92d5d21e8db004110e3791afea6e086372", + "a819eab08cb43443ee1e8b33042e91966b82adc0", [] ], "f32_matrix_addition.bin": [ @@ -888,11 +925,11 @@ [] ], "i32_arithmetic.bin": [ - "55880fdeedede1bc61dd2875ccc48fb71cb8a376", + "bacd4c0c54ea10baea64d1fd172c5dc030c1c0e1", [] ], "i32_comparison.bin": [ - "4bc8882dea9233a3473218f17e95cabb734ff5c9", + "d5a745e85cb7bd7f650b775a08a17f8846a9910d", [] ], "u32_arithmetic.bin": [ @@ -905,111 +942,119 @@ ] }, "bitcast.bin": [ - "d3954903ac89afcfbe5049a356005ed02cf10aae", + "ead299d5e78fe9ee3c9f1954e1afa2f76714258b", [] ], "ceil.bin": [ - "5ec60b6e150d5694fda5f5933f6accd39d76bf2d", + "9b93ed416f64cab3ab59dd75114fb225c8abef95", [] ], "clamp.bin": [ - "1ceb3f19a10d30cb69ffd5cf37415f5a8e4ab84f", + "492be017aab39c196448e7d4b681af0b35eda5fc", [] ], "cos.bin": [ - "a7951b4470252bbed5e7af6c7b548e0a0ce9903c", + "4e34eff3f1b1f234063494cdff519e27e320b852", [] ], "cosh.bin": [ - "693b2d3230e74e38b599933a7606f15e8245e0f5", + "5b30d2786c5ec095c30bfc2370bf51ba0da3a9e7", [] ], "cross.bin": [ - "64041c731193542451c281ca31fcdc2764cca2c7", + "c8ee9d3e1aa6aad5709c190135be0cd237ca8bc6", [] ], "degrees.bin": [ - "715e6b656f748a0fce3c5b242b30ef9da996ed4d", + "662558d78aca547f5fcbb4e948bdf1006ff3d49a", + [] + ], + "derivatives.bin": [ + "d6d078877597b6473e8782c26038e6f056a0aae2", [] ], "determinant.bin": [ - "cef09cd67bd1e75a9778c97c4687d60e5b2c7c2a", + "0475a6e6a6cb48c5f454ef4f0899c3fe3456a88b", [] ], "distance.bin": [ - "68e892671e1fbd926d853b5bc6bcebc3643601ab", + "23a4756a69eb4e861455f53f0fec5a12eb3c6fd9", [] ], "dot.bin": [ - "9c243ea4f00401534583569b6d5dfed4b589473c", + "13622a686b38f564a1055885f45fb00fdf86bfe0", [] ], "exp.bin": [ - "0c4ed5bfea0a6a59f5bbcf72edbe9c39b4bd55f1", + "29361a2b27340806f4b35422d3d20231dfbf0c28", [] ], "exp2.bin": [ - "7ffbb062f1b2ef67ee6f77844daee1f688a58354", + "367b5a8e903e15039a8fe28a5742566ba8a3ed6a", [] ], "faceForward.bin": [ - "13436dde01b1008e59c6d6b8d8e8a87db54d7ac4", + "8f065bb97cb49e82c3eba440b471cd51fd4a8f05", [] ], "floor.bin": [ - "a4b363825bea4e03beae563fbd046e228948c10c", + "b5341907f8ef6b83c9287d647356708752703d39", [] ], "fma.bin": [ - "db54353a526216716895786790abc1bf9452594d", + "eb4cb9ebbe531bb93e14f0b15df6c0bf8d606cac", [] ], "fract.bin": [ - "566b95144f3c00cdc4e04e9b01e365fe6f7c5c24", + "7f09e8f60b2345471731a82825a290785015d9bd", [] ], "frexp.bin": [ - "2e20d4ce033d25c1a12f314eb12b8d1ae7067723", + "6811dfa295076b1561a3d730c434b9b229849de9", + [] + ], + "fwidth.bin": [ + "cfe00bfaa9759abeb79c4ec7ff12db2caf58718a", [] ], "inverseSqrt.bin": [ - "731c62903cc20ed648cfe9e95f9cbe24f964211b", + "5039345ad0d219c54ede3323eb7db09e2d5fc23f", [] ], "ldexp.bin": [ - "d441928d1cb7855ec90f293257b4b17ab3f0014b", + "bab78ed2af9d842fabebc75f61b887aa132f78a9", [] ], "length.bin": [ - "9ecedd7d997fdce8df99b8f5d3e07b5bf8306629", + "3644d9b683ac70b84740dd3b72c6b2a20abd9e92", [] ], "log.bin": [ - "5c860bfaa65cae352ae09a2afb7df1415c4e4c24", + "ba591faad8a032e8e352cccd54c5495d44769e01", [] ], "log2.bin": [ - "7f6d35346b33628496b0e7ca5269695b3817f5ca", + "00641ce119cfa61735b37bac238921ad7c602bb8", [] ], "max.bin": [ - "63704eb2330096274b364835f34aeed92dc3addf", + "3861a94acac30d443910b1f44e11a761a09872d4", [] ], "min.bin": [ - "18b26a3bf8c80d01fe454c61a180fe871a602319", + "21c29e62ed4b4cddad8eb1a79c9320c62c39a861", [] ], "mix.bin": [ - "e6d92fc898d54e70e4a846bb304353fd13537786", + "c42b2aa067e24f3e351d99d7791944bcdb7169e5", [] ], "modf.bin": [ - "e5387db46257f1783a78794cbcea77bfe410ad29", + "363cc161fd7225ca902c248c9ff2cca162606247", [] ], "normalize.bin": [ - "434bbe2dd167c1dbb06074abd9e357de729a156c", + "01b8eab7003c432332ddeeceba7bf1e750910c3c", [] ], "pack2x16float.bin": [ @@ -1017,7 +1062,7 @@ [] ], "pow.bin": [ - "1f23a1f3818a2a86c256a3b39a4e1d0067af9a45", + "4f5faf3293fafcc60f8104806edeb0faf6d62859", [] ], "quantizeToF16.bin": [ @@ -1025,15 +1070,15 @@ [] ], "radians.bin": [ - "63c7cc3ccd5be708747bec1cf1e9e48cec76aaca", + "f5285d108778da7ea5a7ab0930659875cdfb308e", [] ], "reflect.bin": [ - "6608646fd01ecaeaaa9c78c9decdaeb8e338b64b", + "30cd7ee925d69aa7e7a60189d452bf4d3b6263a2", [] ], "refract.bin": [ - "037496f0930f5118de4677b4debba413e0e726e6", + "c428285817fb4ec34561265566318dae28508539", [] ], "round.bin": [ @@ -1041,39 +1086,39 @@ [] ], "saturate.bin": [ - "39df7169b750d6727701e15ac9270f9b6eb5e69e", + "2e1eb821a9e788a62d14b3ed3375ab734d6c8a9d", [] ], "sign.bin": [ - "2f3b2aa258b22dcee4155780650f6bddbba0aaee", + "033f2e8158f6cc1b223f099e3a54e832acb558a7", [] ], "sin.bin": [ - "d583876c518cba48505c271089ec7e34514bf2ac", + "a2ca632008ff4e42fe5a18e61a63389816c966ed", [] ], "sinh.bin": [ - "072c53393f46bfc3084d599a14a7dc4b110f4fda", + "1176cd472bf244bd4513facef35f43866c130207", [] ], "smoothstep.bin": [ - "43aac2b1c46d1acd72edaae1e7196ed0a759f50e", + "73b65d17c2edda3eefadb663276652f29b3e9ce7", [] ], "sqrt.bin": [ - "f466d2379f65802305e56ea5cf61a3f88a790c7a", + "6dd8088c0898cd7c31fdfeff86f8aa32319fe403", [] ], "step.bin": [ - "03f251cb65cfa6c5fddd7e567bba39bc9ae4ba7f", + "f6c6c7b5f3f00716adbd8b4dcc7a563046e50839", [] ], "tan.bin": [ - "aafb900347d0e40d3536cb35adcd40672a197dcb", + "572bee4df2a502c650055ee3caa963710be529ed", [] ], "tanh.bin": [ - "709427217c2629669fea621350b8c86d8d16917b", + "a13028b165f054dfdb3a460eedef70704d0d58e7", [] ], "transpose.bin": [ @@ -1093,6 +1138,10 @@ "a92279b5ce4e4bc03edbedb040150623f97c2867", [] ], + "ai_arithmetic.bin": [ + "2fa273ff1940fc17223d47a0483278d320e556d6", + [] + ], "ai_assignment.bin": [ "7956b3652a07102f92b597b13a96b9ac8fdcc83f", [] @@ -1106,7 +1155,7 @@ [] ], "f16_conversion.bin": [ - "5b386b070434a14f96c724bbf5d0bc939e85cfde", + "14299da76670985737516491ff0392b6235babd2", [] ], "f32_arithmetic.bin": [ @@ -1114,27 +1163,19 @@ [] ], "f32_conversion.bin": [ - "bdcc0c72988e6a5d01923ddcc39da26aa8172951", + "66b2bc73f889cc03ac45cd5a116e8aaf05b5c192", [] ], "i32_arithmetic.bin": [ "4753b020c9651ed7e5339214487cf446a4574242", [] ], - "i32_complement.bin": [ - "f7b8bd680c372bc7d016e884c78abc7757cb0f65", - [] - ], "i32_conversion.bin": [ - "74c5d000e3f631e5b708c46662a4e8fef511a010", - [] - ], - "u32_complement.bin": [ - "526456273e48f6126087dce1c930f33386230e1e", + "04841df6078543261ae2aaf237c38570b10ae6fb", [] ], "u32_conversion.bin": [ - "609caf94fe68795c4a18802aa7e15e7bbd23c89e", + "277ffc4d76b7d6c1d8692f92fb3e9ecd3eb93894", [] ] }, @@ -1235,22 +1276,22 @@ "api": { "operation": { "adapter": { - "requestAdapter.spec.js": [ - "ca97535007f913d5e5661501ff90d7919de3a03c", + "info.spec.js": [ + "be4421fc50f67cdc3b5f3857bb66583a3e71292e", [] ], - "requestAdapterInfo.spec.js": [ - "170f5c538550e52a3d9c399c615b13468790ddca", + "requestAdapter.spec.js": [ + "b5962136c53b99f3a4ca8f0eab57b7958d0d1b72", [] ], "requestDevice.spec.js": [ - "3d69c132c5581e7c69ae112396e0e13412c62ccc", + "c7d69f28c8b4b2335fc707d8c63bc9cf271715be", [] ] }, "buffers": { "map.spec.js": [ - "2d4408e6c070fbc88f3b66bebd5684d046e883ee", + "7fe5c002f6e32359b1fb6d75c821aea01699280c", [] ], "map_ArrayBuffer.spec.js": [ @@ -1258,11 +1299,11 @@ [] ], "map_detach.spec.js": [ - "4d8df2634970e06ee696500a63c4486f12445c21", + "a7d024557c586a02c133eaad5f1e8796c44118eb", [] ], "map_oom.spec.js": [ - "73aa5b73f161eb70204de906230d6302a36914c5", + "0ec7d466704a8c1491d82d07c9fdab82e81c0a32", [] ], "mapping_test.js": [ @@ -1276,7 +1317,7 @@ }, "command_buffer": { "basic.spec.js": [ - "56b6785a65f2baa8d75be30c3f82ede5759447a8", + "1677f3db2d4b61de39a7fa40b06f5cc72f3e6b64", [] ], "clearBuffer.spec.js": [ @@ -1284,15 +1325,15 @@ [] ], "copyBufferToBuffer.spec.js": [ - "376596a7b7223b83bc91cf10a4e740e9293def55", + "76f37bc6e3fb7c48992fc313099c820c9180d5b2", [] ], "copyTextureToTexture.spec.js": [ - "4609ed70c53980cf500f5e74e2528f81fee568a1", + "b004592da9fb639b5b8efcd48362c53cc28eb581", [] ], "image_copy.spec.js": [ - "4263953443f330b63a9b4a5d939bac327a21215a", + "b8b7f520d6b47e5be79d40284069dea5133a8dd7", [] ], "programmable": { @@ -1307,7 +1348,7 @@ }, "queries": { "occlusionQuery.spec.js": [ - "fc25802db43b1ddeea100f6fbbd7193aeb6acb27", + "550a0734cbb0422fd4a4b9f3d8669265ac77ef56", [] ] }, @@ -1317,14 +1358,14 @@ [] ], "state_tracking.spec.js": [ - "9b3363f3aeacf741b039e7c1ce66b24daceec1fd", + "8b3595f223e4697f9a89e8996b057b60f83f4373", [] ] } }, "compute": { "basic.spec.js": [ - "2875f8a0ac3afea6a952b4f82316c2539173b9e6", + "a6531609a6c6b54b3de6234b6db6300df3686245", [] ] }, @@ -1334,24 +1375,24 @@ [] ], "overrides.spec.js": [ - "35d8c437fd2dd6b1d56c1f48b2b0a57cf1aca145", + "2586486c1c2b4bb9ef8705c6c3237b9e34ce0803", [] ] }, "device": { "lost.spec.js": [ - "e86b009d2358b1194d04b5ad0c74a7c35d02fbbc", + "27231d3216f83176089ad264f213454fdbf7fa1d", [] ] }, "labels.spec.js": [ - "7da653f5ac2fb64b68bcb455d60aa9dd34fa7baf", + "5d0f0df9d2bd04a8f0ac1ad9c0533fb04c2ad8c3", [] ], "memory_sync": { "buffer": { "buffer_sync_test.js": [ - "7687ba27cd99c62f90adc2053cc3e771d621031d", + "3b217fa7bd4048c4815a27a991ddc277b7db6e50", [] ], "multiple_buffers.spec.js": [ @@ -1364,16 +1405,16 @@ ] }, "operation_context_helper.js": [ - "f3ddfa12bf986aa3ae4bc69e2a4adbd02fc077c8", + "96e1f2ef46eacceedb32cbaf5842dad2d0efad4b", [] ], "texture": { "readonly_depth_stencil.spec.js": [ - "a52c12f8e99a0398be80ca6a5d18386c884ac1ac", + "b92cb156cb1b3a2fb736cf568ee6a3ea9b75ba66", [] ], "same_subresource.spec.js": [ - "ca575db19bf4f55d74af7007fb775ab242fc1827", + "60526aa029bcb8ba617a6e8c0e9e1d5a27e7af5e", [] ], "texture_sync_test.js": [ @@ -1383,7 +1424,7 @@ } }, "onSubmittedWorkDone.spec.js": [ - "e6d6fae9b5607ec508fde42c21a94b2b55c74340", + "577b90c104d277a31ac5ad71deb958f486ec04dd", [] ], "pipeline": { @@ -1399,46 +1440,46 @@ ] }, "reflection.spec.js": [ - "3fd7746ebeda1d5a9f535169a52381a032520fbd", + "3e4d04ef244cd3018a7c81b6b5525567d3ea5189", [] ], "render_pass": { "clear_value.spec.js": [ - "5c127533ba80cc38ef829241a17a79e36779a405", + "13b16de62e57aa3c556f545714db03f432b490b5", [] ], "resolve.spec.js": [ - "abcbe24bd892a39b4728d53362d5c589e42881ca", + "c9b1f20dfb2b4d0c7d5581d19a3a87a6c9fdf606", [] ], "storeOp.spec.js": [ - "16ce84669937a024bda8d99343bbdd48a3175d17", + "40e1e6a235ed5c4396eaa798603e0fb8fc24763a", [] ], "storeop2.spec.js": [ - "07894fcfc05e81d2d1de47c098dfc9e35660fa20", + "4ab2bba168e9ff64ad8d1e7de44438c3d0440586", [] ] }, "render_pipeline": { "culling_tests.spec.js": [ - "12e919b64d8068a394f049c4f10d2c6e19ceb659", + "1cf10b3edb0e19ec480e321240d47bae6f08b50a", [] ], "overrides.spec.js": [ - "be7a059954eea83d5bffc288eb6d7c1414a587ee", + "9598b6f5c7af9d379f40bcfbfd8ab15992d532e5", [] ], "pipeline_output_targets.spec.js": [ - "5fdd9a2b669ad3bb4dd8864a58f28bab9747ab8f", + "143c89814eda3c50ec9c6d394e89d5715b74fea4", [] ], "primitive_topology.spec.js": [ - "bcdcf5bf0050b1db8708230192e969f4c0ef8476", + "4d856ded882ee061089deddeb512033436165009", [] ], "sample_mask.spec.js": [ - "54f89d1c40b32fbc865dc2fab8eff273efaa74a1", + "fed04b277ee1cff0170f0401e91d3014e1714343", [] ], "vertex_only_render_pipeline.spec.js": [ @@ -1447,32 +1488,36 @@ ] }, "rendering": { + "3d_texture_slices.spec.js": [ + "6f2fac8d9efbdfb1f3029bc8aa936ce1a4258577", + [] + ], "basic.spec.js": [ - "c549a195a78d059c6932cd74267436f8356d50c8", + "004761ac4f40e932684bce67163fc6c1451078db", [] ], "color_target_state.spec.js": [ - "4e0a49f507f1c9747cd7a52b115d6b073b66627f", + "97630bc904d9d37863ea0277fd9e738abbf2988f", [] ], "depth.spec.js": [ - "19008f085059c00aa4b39fd1bb22caa3496a53eb", + "85b3d8310c63e45619bdb656dcefdbb023d371a2", [] ], "depth_bias.spec.js": [ - "59e5f83befab50b16aa2a58ec806c705a0449b82", + "2870516dd38f77371a2aebd2266f95d07adc430c", [] ], "depth_clip_clamp.spec.js": [ - "28d639990d1cd5714fa4156491e73028f1b5b2a5", + "1b5784f4123b48e0b6786d4cb3e7970063389840", [] ], "draw.spec.js": [ - "541b87648510f64ad9e9f1bf9089e26c5c8812b3", + "5a6f780827cba28bc003a4eb45a693b939b2bd94", [] ], "indirect_draw.spec.js": [ - "4bc9cf572759da70a830ccb90d02b47f456b6703", + "665228b30dbabfce2360f79ee7862c46163b7aca", [] ], "robust_access_index.spec.js": [ @@ -1480,45 +1525,45 @@ [] ], "stencil.spec.js": [ - "9868fa37c1025940cd67ca860d54af072ebd3204", + "44bc3a246600bafd288b422e1badb903d73a921b", [] ] }, "resource_init": { "buffer.spec.js": [ - "fa7cbdbbbab4b8d4bef94d43ac3066749f1fd4e0", + "b6ebb69fd651b4c6da4595a989dd59370775dc11", [] ], "check_texture": { "by_copy.js": [ - "08e878b458473695c39aefe82c1cd58b2f68067d", + "7616505410a462b882477855fb2c8afbc6f7fe5f", [] ], "by_ds_test.js": [ - "a88c38e60ee6cdcae67f1b7a836ef0f9655899d8", + "de13b2782495966f284dba4fa1dd601e63bcde7a", [] ], "by_sampling.js": [ - "d55628a5bbe01c5a3c744e6460a0ef637d81ae55", + "12bb98fd826c3f8b42d8664276e920074ad865e6", [] ], "texture_zero_init_test.js": [ - "2a6ee76438f9e5de022e34fac05376143026f884", + "a9119df7ea287e0a1ed4c3766695a03fb9077c2d", [] ] }, "texture_zero.spec.js": [ - "574a997516ae98be4fdc6c3cdaa4c5c359108b75", + "4b5116c81d6d1ef8e24e054430ddb044759c98ae", [] ] }, "sampling": { "anisotropy.spec.js": [ - "8408f619f4b1eb0a625857d57faf6065bc5d9197", + "65a1e4c7a6d2cad07ef022f679a87712324c3f53", [] ], "filter_mode.spec.js": [ - "860eb03f8d1e3622dec60d49b40f672e942eff87", + "fbfd981beb48799160d35e3ab7492ffffc042b10", [] ], "lod_clamp.spec.js": [ @@ -1528,19 +1573,23 @@ }, "shader_module": { "compilation_info.spec.js": [ - "9f9a1fcba045b9c5db1111530df81ee8dc8a6f85", + "ee64ed60651ec25f7f2dacd9dead8cfd68a9f85a", [] ] }, "storage_texture": { + "read_only.spec.js": [ + "4212c665bfe83ce5214dc34448727e66cedad6ae", + [] + ], "read_write.spec.js": [ - "15f734afe9e946e3d02ca04731e87ee930fbfe98", + "09f80f255c46f0297f7de7d4e006f4e026a52059", [] ] }, "texture_view": { "format_reinterpretation.spec.js": [ - "f942724585ca80ea38919a8c01ddff17eb16a92d", + "4544b91dc5deb0d4a29d038e025a4625335aa0b4", [] ], "read.spec.js": [ @@ -1548,21 +1597,21 @@ [] ], "write.spec.js": [ - "185407105c00c2543b607a4acf4e1783186c9f51", + "6a7d07def4dd670259475fe50f6c9b63384e8d80", [] ] }, "uncapturederror.spec.js": [ - "3c7615f961156ca0eac1ed27213f241ec939319a", + "361d9793161183cb5e185309b28d36be2e8616a0", [] ], "vertex_state": { "correctness.spec.js": [ - "0973299a73e6206af228f081adc089fa251f073d", + "0ede885b8488c363cc042c370f5afcc1fc7e9a97", [] ], "index_format.spec.js": [ - "60ffb5bc3695ecaf1ab83996c7d5233788823ddb", + "f64f2ec63cdbc3220ab4947e7ffe7395c79ab2b2", [] ] } @@ -1570,15 +1619,15 @@ "validation": { "buffer": { "create.spec.js": [ - "d28cee735aa4ebce86bfdba8daffe90267f8eb7e", + "743bfced8dbf5251dd2750801789dbc70195ef36", [] ], "destroy.spec.js": [ - "59b6c9500db4d28cd517fd9b47f302f31d394c07", + "41728df009d79e3262eefaebe3cc6221037ae6f4", [] ], "mapping.spec.js": [ - "3d27f0256768f88c1e6435b61983144ffa453694", + "49b4d27ad0d89b2e1e78af498c267d4abbe7d194", [] ], "threading.spec.js": [ @@ -1589,21 +1638,25 @@ "capability_checks": { "features": { "query_types.spec.js": [ - "44097d184c31bc2ae613546e99935d5ec1a4dbf3", + "64cffceb1eaa8822cfc93c04651593cc598a3ee5", [] ], "texture_formats.spec.js": [ - "4e88bfc4fff0fc91c2b5aacb5aebc7ac7b9f3cf3", + "b7beccf59c67d23532f8a36a2caef8620ff3a310", [] ] }, "limits": { "limit_utils.js": [ - "6a23a9450fd54fe514010de16f04b8ae2d4b03eb", + "3fbe58f5d6d35bb44163b4988ca7eef5a762d997", [] ], "maxBindGroups.spec.js": [ - "fad769f242a672615bae74d0f835191922657e97", + "f239b560fa9ea66375ff76441e85d7665cf7858a", + [] + ], + "maxBindGroupsPlusVertexBuffers.spec.js": [ + "d417400974aa3e27510b7b9c6dd0ae8871b250d6", [] ], "maxBindingsPerBindGroup.spec.js": [ @@ -1611,15 +1664,15 @@ [] ], "maxBufferSize.spec.js": [ - "ab2d5215d5d8cc2959877ef3708254a8a36dffd0", + "8d611e348059cc00dcd1b0310d27dff6eed054d5", [] ], "maxColorAttachmentBytesPerSample.spec.js": [ - "508b436deee981b18b30ef704c2110645663db2f", + "8c90ce0ac9fff1bb59155c4a990db01b7ca024cf", [] ], "maxColorAttachments.spec.js": [ - "80fa8fdd7cf3dd4652a9f61cde196bbc9a8fbb37", + "d32ae9e836f519dac82921dee218311b9dafe9eb", [] ], "maxComputeInvocationsPerWorkgroup.spec.js": [ @@ -1643,7 +1696,7 @@ [] ], "maxComputeWorkgroupsPerDimension.spec.js": [ - "6c43c8da1cb46724f5e4c0441a136e943a905921", + "3b2e6686852da62964af08d06b366d4094eaecb3", [] ], "maxDynamicStorageBuffersPerPipelineLayout.spec.js": [ @@ -1655,7 +1708,7 @@ [] ], "maxInterStageShaderComponents.spec.js": [ - "8da125b1dfa37f6d01c56049b8fd131c494f04a0", + "7b994ab8a8442398dd5b6498530a14239d253034", [] ], "maxInterStageShaderVariables.spec.js": [ @@ -1671,7 +1724,7 @@ [] ], "maxStorageBufferBindingSize.spec.js": [ - "93052a8d725352de59e0b702d102004db9249710", + "a86bcfbe639781d3607fffd9b6ff99c17574cf36", [] ], "maxStorageBuffersPerShaderStage.spec.js": [ @@ -1683,23 +1736,23 @@ [] ], "maxTextureArrayLayers.spec.js": [ - "7a9cc1e23085fa16527a7d6732e455d7a3f895a2", + "a3aae92933935a19d1ad797c1390af58191c4ff3", [] ], "maxTextureDimension1D.spec.js": [ - "3d4608dde35ff03c580598d0c3d4ea312c9dfe2a", + "ba69cbbc852892f653b7ded7adcaa6bb44fdcca8", [] ], "maxTextureDimension2D.spec.js": [ - "5f3b3a4def2f0b9a84df5dc214ee6aa353b093a9", + "27ed1efc1a0b746c9edeaeb6571029d1b884a7d8", [] ], "maxTextureDimension3D.spec.js": [ - "74108cc85edcb7899c8053a7f3e4608d126a03ec", + "bf44a37221d5d9b0f3563e3a3c58e92033bc6e66", [] ], "maxUniformBufferBindingSize.spec.js": [ - "40b22ed60bb0a139e49cabc38489c19554f10e90", + "aa39c0a5291cdaba458f63a67cba381a69c443bc", [] ], "maxUniformBuffersPerShaderStage.spec.js": [ @@ -1715,25 +1768,25 @@ [] ], "maxVertexBuffers.spec.js": [ - "860c40687e8ed39cf615aefd0f37c6707f74181d", + "1f9ffc439656e0864238dae29a006a64a7043f15", [] ], "minStorageBufferOffsetAlignment.spec.js": [ - "5735818916e0c0562156914dbf9852c99d13c3bc", + "7281f6dcbcf81b5ee21db8fcb704677aaa757cc3", [] ], "minUniformBufferOffsetAlignment.spec.js": [ - "93d2b3eacf7fe5946ed3cef19061b12d77752241", + "88181bdfbea873ea7f05e80d7568e6472a4a599f", [] ] } }, "compute_pipeline.spec.js": [ - "3d2c5a7641bd9e32f5e7c14b411df197fc6a6ded", + "a9ad3c4476162f21b99e465413205e389c36bda5", [] ], "createBindGroup.spec.js": [ - "283fe97fd247ba81b76b63e3027264b5f96bc76a", + "33ac087f50e8f0e1747b37b235ea93c36b48957e", [] ], "createBindGroupLayout.spec.js": [ @@ -1749,41 +1802,41 @@ [] ], "createTexture.spec.js": [ - "9bfc8c17786ac819bc67471f7af50cb9cfef9c24", + "ac9785edb42a5ce2e2d8b8494ce9d546ffa818b8", [] ], "createView.spec.js": [ - "0a2c8916dd9abe18086af8310102a756e8ea34a1", + "9ba5d20d5f409d347a956cb7312c51e1a4233682", [] ], "debugMarker.spec.js": [ - "c042630d6bf3f86af0b8a5e803edb26071c0974c", + "23cab3ed06f1163c9f350a8c0527963ecc202e20", [] ], "encoding": { "beginComputePass.spec.js": [ - "6ba98492918027bd7177bea9c9fcaf466ad657fa", + "bc3123b01f54013194b3587f8386adc457353c0c", [] ], "beginRenderPass.spec.js": [ - "8003268d991d952f583e4a2dfafba9a64bac8647", + "a4b4dbc56d5f28ce183ada35d6ed9aee2e79c001", [] ], "cmds": { "clearBuffer.spec.js": [ - "839a82741bfda117b3a4e754e4cbb5bcd597ad07", + "09c32b11ec78588caf333ad2f1647f02f2c8f11a", [] ], "compute_pass.spec.js": [ - "d810e8757a87d648457fb61881d914617a614031", + "4616892ea507175ce8261b1c2145b939b512bebf", [] ], "copyBufferToBuffer.spec.js": [ - "a7aa2b5b7914e877ffd5b06dadc897c917e689b6", + "699fa6163c38eec30a0b6f33eccfc32bbf23f822", [] ], "copyTextureToTexture.spec.js": [ - "00bf4e83d8177b162cc46da9e63463c7e7bc5a03", + "844d81d28d0e2a8fac8ecfae1ede35a816e8ee59", [] ], "debug.spec.js": [ @@ -1791,20 +1844,20 @@ [] ], "index_access.spec.js": [ - "744c7e20de8064196a30618ae17326855ed0f6bd", + "efa6da6a24932fa1f7607fec0a79ecfb9b00dd20", [] ], "render": { "draw.spec.js": [ - "823a327118f52f83246a75fb342fd541e1c4a005", + "3de590f69382f32abf71f47e3dc0b20e9a1b27b8", [] ], "dynamic_state.spec.js": [ - "048f33029aa5e04abfc7f3de04b38d8e6267b411", + "ec000e480d7ea51081aef8c1288a2aa1f4c890da", [] ], "indirect_draw.spec.js": [ - "476f2ba73ac00fd9e8453092388e59df963e4bea", + "4aa743bfbbc2391887d4232e706f3911586f6428", [] ], "render.js": [ @@ -1812,7 +1865,7 @@ [] ], "setIndexBuffer.spec.js": [ - "03eea8fce80b9851d24a1760f9f33417d7a00e05", + "2aa0313d44d25f3f8bf3727093a0e177d201c99f", [] ], "setPipeline.spec.js": [ @@ -1820,11 +1873,11 @@ [] ], "setVertexBuffer.spec.js": [ - "b5cc30706b76a758e52fb0346b03c8a3e601e03a", + "ee895eab70a069c6a7cbb20564b9dfcb08d56580", [] ], "state_tracking.spec.js": [ - "8d1e0184e7b6d16ca8356217794431538aca99a6", + "585fbed539b0000ea6e488e574d64f1587c73af5", [] ] }, @@ -1833,7 +1886,7 @@ [] ], "setBindGroup.spec.js": [ - "bbf30240d12e77b55c6e0107e05fcd2bcd31bc1a", + "99c009d9162c3099977f14fa0aea09c331ce8b61", [] ] }, @@ -1842,16 +1895,16 @@ [] ], "encoder_open_state.spec.js": [ - "b635fe1594d279002292de89d60566d6f1dff4a1", + "23e8bb03456641aa365cabba1557d225b8b8f4dd", [] ], "encoder_state.spec.js": [ - "eec8feb8f3bb2668ce9d28648b0cef424c8f1aed", + "778320403a3377b56bd6aea4265abddd8df4f82b", [] ], "programmable": { "pipeline_bind_group_compat.spec.js": [ - "b468feda5084048f222ae68d4ec7e1b435cf3fb4", + "18eec164ad89a49e177ec61f426bef30f88336df", [] ] }, @@ -1861,15 +1914,15 @@ [] ], "common.js": [ - "bd14a5102439a66b4c5a2029ab40aa770514ebf3", + "8e42dae1507f2b8a5141a39f974bfe096a8ccffc", [] ], "general.spec.js": [ - "984da884301097267d5c7d4dd220de4b9bffaee1", + "31625ee2a1d84443cfd17d2640c2d19ed379c7bd", [] ], "resolveQuerySet.spec.js": [ - "d0b19e4e04f83f786d4a19dba16501611de41f8d", + "a2a1fbe85e27a4457c73e505eefaa965c3fc2251", [] ] }, @@ -1879,7 +1932,7 @@ ] }, "error_scope.spec.js": [ - "cfca6157fc4689ace00daa2d1376fd2d27516db0", + "790a171d2c1af005cf37ea55838650f95abffbfe", [] ], "getBindGroupLayout.spec.js": [ @@ -1887,28 +1940,28 @@ [] ], "gpu_external_texture_expiration.spec.js": [ - "0b271d6afd6b3f1c32364edbfe0c18ad60217cc7", + "09a949ad857fa0649a7247b3afb44cf454141391", [] ], "image_copy": { "buffer_related.spec.js": [ - "d22e39eecba519adc98b649e91e0dffe3cc3d2c8", + "602a59a4333e3fdd54e96ddb663c9bdb0e49eec9", [] ], "buffer_texture_copies.spec.js": [ - "9ea44a36d45b43e0b893e223756cb700573c3ca9", + "ea2ace9f9407dad181ba58ad8e8281b45982f82d", [] ], "image_copy.js": [ - "3cffa6b3ce0e05d276d3edf2b30ea2d1f44ae290", + "639b1a8de93e1c3cc206aca846d5a1c36e9f6716", [] ], "layout_related.spec.js": [ - "8246aebf289124e0b39f67405720b31bdc73168c", + "86fdd728468c569bde6472d04eaf997c05c798ea", [] ], "texture_related.spec.js": [ - "7b535935c3cc72542c352578827c6a52fa84b8ea", + "a42cccac4dd61577dc5717b2118f41e8041f6c37", [] ] }, @@ -1918,85 +1971,85 @@ ], "query_set": { "create.spec.js": [ - "283b92abecd636783c78a9dd574332529d08ff98", + "ce6b4c87913627c8aa25850d5092997d66b7ae55", [] ], "destroy.spec.js": [ - "58e8b03d47a61d4d0a2bc406176a752c92612eba", + "a05d00a11253b36c17615d9d02529785a3310608", [] ] }, "queue": { "buffer_mapped.spec.js": [ - "1647ebd351a0f7f8b38d37a15af065fef00a76a8", + "13ff2526e4c1f27acf2d236e2728cc33132f2e36", [] ], "copyToTexture": { "CopyExternalImageToTexture.spec.js": [ - "a66b9a77472b84cd61e44d6980cde1ad5c778a72", + "d42c8529cec0b952f91ca11a3b39073731c13d3c", [] ] }, "destroyed": { "buffer.spec.js": [ - "aa740c9200a8e998f5c97b2a5636092545bfeb3f", + "214f77fe2ef2c831f0052cf0219ce26ee82bd7b2", [] ], "query_set.spec.js": [ - "ac8f810f1608f038a2678df7f9e95d34f70185d3", + "cfe51ac82302ca07c3f1c2fc7d9b0c1038c8b2d9", [] ], "texture.spec.js": [ - "2f640238067720070924e561f3fda45437d28b68", + "d2af1ee5ca9c8dce84d50f576f3091c3a6b64b07", [] ] }, "submit.spec.js": [ - "fc31992d58090855f08ef1cf8ef1dfa63492ec79", + "19e0f6fdf3d01e47ce7a3a1b7aa50b571f94c391", [] ], "writeBuffer.spec.js": [ - "f7cff5bb79c5171e2a97130822a69f043e23874c", + "823c6dc68fd9e22899b50a9b77c7b348230b7661", [] ], "writeTexture.spec.js": [ - "31727c7945e3c2e2be30a55d4a41b2eaaa52e657", + "c3b6ed739fe99cf61b53f097dfd03c093184980c", [] ] }, "render_pass": { "attachment_compatibility.spec.js": [ - "6579343b49c4be434ebaf1a1b3461aa0f4b0e2e9", + "baac9bdb5868937244d8fbef34a1c023fd705b9e", [] ], "render_pass_descriptor.spec.js": [ - "94633c2f70791ad3eff565b1092f5c92895fd159", + "05cd5bd402ce84642dd9924b5226a3103f499c92", [] ], "resolve.spec.js": [ - "b9d60091f8fd60b4ef76f9303c6bdb204eebf1b0", + "183d8bd6594a05680f86f16e6eb7dc8d8743ba80", [] ] }, "render_pipeline": { "common.js": [ - "2b4283b32c60545eda0019f5f785edfc72e0e592", + "6785346a2f34a315e51d009e4408c22b3e2b9e74", [] ], "depth_stencil_state.spec.js": [ - "d47041b4fc1a3eb07e118ae155715274df56232b", + "8be7ee6e8841b6c5359c9d0802e3ff66cf742a2e", [] ], "fragment_state.spec.js": [ - "6e7a46e943cdb894f9c1360b6e4e973cb8afd37e", + "1b0f0dd08a0956c22c1293b24e49ab60f0603566", [] ], "inter_stage.spec.js": [ - "f6280ccf76bcab2ef1f9b00406ddcc589043e449", + "cd26b00af05ee42f05b7e1eb5d23eb6bc9c5ca46", [] ], "misc.spec.js": [ - "79dddb51e0330a56d26075da6e7e44ea5d3d0cae", + "38bc1f3453475c6248a0dbfa3332c9666b1324d4", [] ], "multisample_state.spec.js": [ @@ -2011,8 +2064,12 @@ "249159a478726cde708ee11ea782a4a631e8ee9b", [] ], + "resource_compatibility.spec.js": [ + "d2e6a38930d8c3fe4f468f5450c2f3ba6a02f244", + [] + ], "shader_module.spec.js": [ - "72b44e6811ebccf883ed86a90f53e04a0b76c69d", + "fc8c8e782d8410726e1c92b42ac7080d5d4f048d", [] ], "vertex_state.spec.js": [ @@ -2023,7 +2080,7 @@ "resource_usages": { "buffer": { "in_pass_encoder.spec.js": [ - "d4a6fac4dad8286d1e2f8e9fdac113a7b05dffd8", + "c68af3e3a322cde50b8d9448cd0c94418dcd47cb", [] ], "in_pass_misc.spec.js": [ @@ -2033,15 +2090,15 @@ }, "texture": { "in_pass_encoder.spec.js": [ - "7977c3fb9ddd9b302720e32b103953c1edad96f8", + "d607ef1eeb32adc50f2f5c6afb82c47118680317", [] ], "in_render_common.spec.js": [ - "5ba4ecfcf7c6ccc466216a3e45f063b4278e1a26", + "0821bb7954f5a6eb37a0b331ba9d05a2f9c4c55d", [] ], "in_render_misc.spec.js": [ - "0b7733c9d68d8eace07291ca75a8ebedd682b072", + "e052daeb2a882081484985c1e7db010e701bd00b", [] ] } @@ -2059,117 +2116,127 @@ "state": { "device_lost": { "destroy.spec.js": [ - "e8a43b50f71012528dea8d16ee9311d8c5a0bc3a", + "9e3a68faf2fbe81b81525d4af3670eb9ee70131f", [] ] } }, "texture": { "bgra8unorm_storage.spec.js": [ - "57e1c5a23e56913bbdf8d76e23ae150ad91f2fab", + "b34e15b402bf83c080db96c67139ba6193b2e7e7", [] ], "destroy.spec.js": [ - "7f17d0368387bb8882da30e78c4e8ccdf8c6ccd4", + "645d76c5db7a1a68c4361d56b198efc74940e3f8", [] ], "float32_filterable.spec.js": [ - "05575673f9298b8698e7d55017f51898bf86d743", + "e744790d05fb84e1e26463036e8d726390a28735", [] ], "rg11b10ufloat_renderable.spec.js": [ - "29e796d61852713cb2fcb03aa30ac3a31a804327", + "267ef8d024cab0801c67717b773331594a90b2a1", [] ] }, + "utils.js": [ + "de27f6773a2395a3baf1fc6cb013ccfc2304d8ca", + [] + ], "validation_test.js": [ - "f602556d0a7631ee27d17ee29ab029671d76983e", + "7c45d95d0e41b83c69ab97e70ad8b83951e7419f", [] ] } }, "capability_info.js": [ - "eb330bb567a24653b06347f540b7cb388221b622", + "b3fad3b6f37c784e44781869af6c8f3cc5a5f519", [] ], "compat": { "api": { "validation": { "createBindGroup.spec.js": [ - "63cc27708830bb38252f74c3f0e6e3b808127090", + "93428792198990f2685537cb10dcc099bb31758e", [] ], "createBindGroupLayout.spec.js": [ - "b6d9057cd0288f1c029f908ec5b82cba6c145a4a", + "93871e42a2b0b724ecf36c1f36deb8d47cd39d35", [] ], "encoding": { "cmds": { "copyTextureToBuffer.spec.js": [ - "30db0b1a40ff7b141282b89ea8cd8f73f1b4798d", + "3bb4e513d8cb67bca0d1780f4f9ab292ddc05434", [] ], "copyTextureToTexture.spec.js": [ - "07c16b940f899447be8b9bb737e4caeae61f5738", + "68ed041d58b826076e9915d1ea18627d8bb1af3a", [] ] }, "programmable": { "pipeline_bind_group_compat.spec.js": [ - "8a3d64fe5494431f8e4fff99e62d75a7535dddf3", + "394bff640abe9b9102cf7a176471b8700b87bc16", [] ] } }, "render_pipeline": { "depth_stencil_state.spec.js": [ - "d2d997aaa4317fec3071c296f88c83638862a842", + "0f344c06f6dc73cf3d4bde6b7df0aea50888e757", [] ], "fragment_state.spec.js": [ - "b3c41daafa0563885a2f00b5727a92c79fa727a3", - [] - ], - "shader_module.spec.js": [ - "a35d0199c89339d8f970557bef08fb7e1aa9efd0", + "1d020f82ba86e84569dc5a4edf58a29b894c42d7", [] ], "vertex_state.spec.js": [ - "d5ba060e8366d7402fc099ecb38dc7a5ce90143b", + "47b962f608c4aff52bbff212270ebd5f118ae6f4", + [] + ] + }, + "shader_module": { + "shader_module.spec.js": [ + "0de80fc9dc3db51c44b54390809a5fc513c924f3", [] ] }, "texture": { "createTexture.spec.js": [ - "65bc50e07223165c2c7995d703a40d224bee4df0", + "b5006cedd0ab80a2c4813104e15df1d85b3c3299", [] ], "cubeArray.spec.js": [ - "ed3c96ec346938e3433a3e0ebed9a8c7509a5cea", + "e703c8c67aa0ed368562fbb506dc0e81aa2e5bde", [] ] } } }, "compatibility_test.js": [ - "217dbc0ac10d534dac6c286c1966314d1248d13d", + "f25366e61a7727e280a4a69c9700ed28ebb0d5d1", [] ] }, "constants.js": [ - "1a01173428aac450bfca95c6bc1e9c25ab961a55", + "5ed0f78310a43669a05a6ccb3b7b1b949f115ddc", + [] + ], + "error_test.js": [ + "d8b363304c161d9abb62aeb6799dde1c7b4685c3", [] ], "examples.spec.js": [ - "ca72493de6758a0c84a79ad7d62bf3220c90dc3f", + "680915ee5c155aba039155e63f9dc9858ccee1d9", [] ], "format_info.js": [ - "ca65bbe6b75d1a14c33ba6a399a904960bf1d4cf", + "248078fc6c843a3bc0f71674c8555f2f7d2bbe78", [] ], "gpu_test.js": [ - "fbed9c6a56e752170d3669e415444a6724da9951", + "2fecbd4ccefec5bdc83bfd4d3d00b8e30b578f69", [] ], "idl": { @@ -2192,24 +2259,62 @@ [] ] }, + "inter_stage.js": [ + "e6eacfc12884d4e5d18e0721ac7b9d0ceb174599", + [] + ], "listing.js": [ - "1d4edb1bb87fe85c6ccd02c3dd20dc8dd3313b68", + "998993c688ebe0a7f13607b666d03c5abcb8d933", [] ], "multisample_info.js": [ "5473d4ca742cf209889266ab99bb8601775c88a1", [] ], + "print_environment.spec.js": [ + "d9bd533326118c4fc8b7af8abede8db1481ba32e", + [] + ], "shader": { "execution": { "expression": { + "access": { + "array": { + "index.spec.js": [ + "cdd3eec20343d765813cc58107d8238b3221e162", + [] + ] + }, + "matrix": { + "index.spec.js": [ + "0f44f06305f5cb72505419753fa971f0ce49228c", + [] + ] + }, + "structure": { + "index.spec.js": [ + "cba9f759d712e9e3a12eb20e88f1d09e43fa9f79", + [] + ] + }, + "vector": { + "components.spec.js": [ + "9a62033a252436d70ee57644babf02f13366a519", + [] + ], + "index.spec.js": [ + "d969f543b614d2f316c56e9a966b0b98c002a15a", + [] + ] + } + }, "binary": { "af_addition.cache.js": [ - "402fd1add81d9680b7ba9991e7439a28ce77d590", + "89160507ac4fbde60234e37cea990d6a6db91fd8", [] ], "af_addition.spec.js": [ - "44259f01729ea006af14b001fa605f52b1bb83e4", + "75fc6688c2092319fd96b6d1529762cc2d1471f0", [] ], "af_comparison.cache.js": [ @@ -2217,71 +2322,111 @@ [] ], "af_comparison.spec.js": [ - "e5205ccf1d6c5a2367c690b67bd96cfdd4af3604", + "3b1033a26e222287c7e5cea37fac05f3549a9e11", + [] + ], + "af_data.js": [ + "190583f2755577a21297d3c39e9e671c3401fc82", [] ], "af_division.cache.js": [ - "867a448b26ab68850095ae004a98de26494cce5c", + "0eca9ce46c806f17acaaea0b57bb90b2fb4831f2", [] ], "af_division.spec.js": [ - "eea1086518081bff47fec9daf33f37f62d5fe72d", + "495706ef5d6ca05c2a982d773b5d4bceb73e808c", [] ], "af_matrix_addition.cache.js": [ - "3af576a50891e15d817ebc002745f375a7d3dc27", + "eeb5d14433bcd9390ae450848316a9bbf54704ea", [] ], "af_matrix_addition.spec.js": [ - "6007298df0b8c7c37000a9d0f4a39573a9a948f9", + "132fe4244e6dd013aa3cb7b1f3ccab9111c04c61", + [] + ], + "af_matrix_matrix_multiplication.cache.js": [ + "a313cea99258db928533dbcb4f6d939ebd06e1f0", + [] + ], + "af_matrix_matrix_multiplication.spec.js": [ + "27889a2a4f351c589ceadaeddf0250ed510d263b", + [] + ], + "af_matrix_scalar_multiplication.cache.js": [ + "1e39459d7a3426123135f964d9481b1fde3bd064", + [] + ], + "af_matrix_scalar_multiplication.spec.js": [ + "78b2b4bcf8d25de3990547e306c587686cdcffd3", [] ], "af_matrix_subtraction.cache.js": [ - "ffbe51b3f3cb059df90e85d4c5d15670bcc67f13", + "865afbabd857ce0039fe698b065ddbab2aa68721", [] ], "af_matrix_subtraction.spec.js": [ - "8ea6bcbdfb3c2530af25894bfdbb4de8f7ad94f7", + "5a0f0ff8ffedebe54c828e642cf1a3d92505c771", + [] + ], + "af_matrix_vector_multiplication.cache.js": [ + "9f2124652cba5bcd1126afab438db97632ec066b", + [] + ], + "af_matrix_vector_multiplication.spec.js": [ + "9ae17ce0cc002735d1a8685e56c74576a5e57b19", [] ], "af_multiplication.cache.js": [ - "210aab7752b5bd7c76afcaa487ac8d1bf0d13985", + "f95670fffc40d0ad1e4aa81ac496ef8949ed4e3f", [] ], "af_multiplication.spec.js": [ - "c9e6926635af582b639c63b7c02d56e13e3fef82", + "9a5f7bdb0d2dc5bba2546dbd9ed0f1e84c732fe4", [] ], "af_remainder.cache.js": [ - "d75ddd8c72f46e040e97103954f88b7844348e87", + "e0e34535532358bf75881c099ef9d178a6d96619", [] ], "af_remainder.spec.js": [ - "4abf5d88d50b4d2c57d0d39044511a04d7267cef", + "7cbeda971cf21af475829b0b639cb862221390fc", [] ], "af_subtraction.cache.js": [ - "ea2adc302f7a3d16ef53970026061fbc93ce5b91", + "74839462cec0754d08bef0ace61b51af7dab508f", [] ], "af_subtraction.spec.js": [ - "f1d510c4e6065a93aeccfef4d4b6a1d5de71da54", + "a3cdd89f2162c25b0d9bccee939caa36bc18fb51", + [] + ], + "ai_arithmetic.cache.js": [ + "af9ec7ac629405ffda6346f5f556ca2d248c2434", + [] + ], + "ai_arithmetic.spec.js": [ + "ae85bd2d6f37f9f203d975c0542e85657e45aa77", + [] + ], + "ai_comparison.spec.js": [ + "902e1c00009e2d93efcd14a3fcf9a29287c9301d", [] ], "binary.js": [ - "f3f84db87c9898e5f20af34b54688f8f3ad1ab6d", + "1f0329e40bbd7022deb55e506703fcd501e374f5", [] ], "bitwise.spec.js": [ - "c442f5cfa45cf62633bac341ab1710182079dc0c", + "06ff03bb126d05f15a748d90ff2066a901cba0a7", [] ], "bitwise_shift.spec.js": [ - "ab766ba672a128eda4b521e9928239ec0049875c", + "8d9bc53669bf96f4887d3d857627bbc27d3b5a91", [] ], "bool_logical.spec.js": [ - "52cbe17222e22066a23617d7081924163ca53633", + "69a24f22a0f072d7b5ebca2a1f36c0ec5820ee62", [] ], "f16_addition.cache.js": [ @@ -2289,7 +2434,7 @@ [] ], "f16_addition.spec.js": [ - "5f06e3725786d6c04a2629659584451862770915", + "982aa1e43aca5d12dc6eea188a36b3c721496926", [] ], "f16_comparison.cache.js": [ @@ -2297,7 +2442,7 @@ [] ], "f16_comparison.spec.js": [ - "b0ca63693167b39a01dc93d10bf49e4ee6c87f41", + "defab2c209ddcd7ee304db4f5553bee67d2d5e45", [] ], "f16_division.cache.js": [ @@ -2305,7 +2450,7 @@ [] ], "f16_division.spec.js": [ - "8284b4550f26cf31fa107008fd3fb319108c874c", + "324d27c43a39f72acea2b57f7857d50110b60ac7", [] ], "f16_matrix_addition.cache.js": [ @@ -2313,7 +2458,7 @@ [] ], "f16_matrix_addition.spec.js": [ - "cf9cedd8d5eaf76b49a4860e50a2ffc4ad8efcea", + "a5478d9a492dbcc8d76cc5d1956acbe05eff965a", [] ], "f16_matrix_matrix_multiplication.cache.js": [ @@ -2321,7 +2466,7 @@ [] ], "f16_matrix_matrix_multiplication.spec.js": [ - "a310e0eab6856ce0b5cbec05c8bac8ec1fee4ed4", + "9df1697583200789dd4d2a775a77be3545b79446", [] ], "f16_matrix_scalar_multiplication.cache.js": [ @@ -2329,7 +2474,7 @@ [] ], "f16_matrix_scalar_multiplication.spec.js": [ - "2587945a76143cf104144c23c561f014435aa2da", + "040745320e925fb79f40aaa9d90189dd3a07726e", [] ], "f16_matrix_subtraction.cache.js": [ @@ -2337,7 +2482,7 @@ [] ], "f16_matrix_subtraction.spec.js": [ - "9a458db528b2969c4ec57306b1585f5df5cd6215", + "f47021eee6406127cbd995727546b5c00e4d195a", [] ], "f16_matrix_vector_multiplication.cache.js": [ @@ -2345,7 +2490,7 @@ [] ], "f16_matrix_vector_multiplication.spec.js": [ - "f7be6036f3a5e184d00db764571b6453dc358e5e", + "d0262e0484126ba29370e1c83d1d1dbff07d1519", [] ], "f16_multiplication.cache.js": [ @@ -2353,7 +2498,7 @@ [] ], "f16_multiplication.spec.js": [ - "acb36d472e81d615a244aacc20bab910b3222382", + "c9d264f9492fa847f5ba5a5e2cde7de4a1c0e4e0", [] ], "f16_remainder.cache.js": [ @@ -2361,7 +2506,7 @@ [] ], "f16_remainder.spec.js": [ - "8d9437d103369abee478b2e6c5a9fbbb86aeec6e", + "52aa9945028f2bfc071d8606cb1f0648b9042382", [] ], "f16_subtraction.cache.js": [ @@ -2369,7 +2514,7 @@ [] ], "f16_subtraction.spec.js": [ - "90fe379dc2974f9bb6f355a19efdb94b410e1644", + "f5910cd986312182f0897178cb51661552e18a63", [] ], "f32_addition.cache.js": [ @@ -2377,7 +2522,7 @@ [] ], "f32_addition.spec.js": [ - "d1372b80273c7bf25df1f5c8cc602b1f9fcdf57e", + "6c9adbb126c064d8937de9847479a460008476a5", [] ], "f32_comparison.cache.js": [ @@ -2385,7 +2530,7 @@ [] ], "f32_comparison.spec.js": [ - "95990ebc16784431ce13fe8e525be9e974f8fde7", + "2c362db2ed7fe328c08ca654a7afc104d8c96003", [] ], "f32_division.cache.js": [ @@ -2393,7 +2538,7 @@ [] ], "f32_division.spec.js": [ - "a9180e950c77ded3240a65a5bcce22148be839ca", + "fc752b9e3a3e2a3782499b6df5f2dcdb0e41f6dd", [] ], "f32_matrix_addition.cache.js": [ @@ -2401,7 +2546,7 @@ [] ], "f32_matrix_addition.spec.js": [ - "14cba2293ef1137a4cc58777f9bdc888ce30eb99", + "7da49853cc0330e34f804376e140a240c67df95f", [] ], "f32_matrix_matrix_multiplication.cache.js": [ @@ -2409,7 +2554,7 @@ [] ], "f32_matrix_matrix_multiplication.spec.js": [ - "ada32250a7647c231a052ee35293702ada5d5c6b", + "bee27aea4ce1b7629367ee14e7aeec1b39e02cc4", [] ], "f32_matrix_scalar_multiplication.cache.js": [ @@ -2417,7 +2562,7 @@ [] ], "f32_matrix_scalar_multiplication.spec.js": [ - "d7c0c2b04f742f2ea4d0a2a892776bb919cec034", + "918cbc49d6189cb961298762e641084e6d45d3c1", [] ], "f32_matrix_subtraction.cache.js": [ @@ -2425,7 +2570,7 @@ [] ], "f32_matrix_subtraction.spec.js": [ - "beb7d0dac26f259d85ec20460a4d3a23918817ef", + "9c6930a63c15f2fc3662a8704b9ee72c2dee173e", [] ], "f32_matrix_vector_multiplication.cache.js": [ @@ -2433,7 +2578,7 @@ [] ], "f32_matrix_vector_multiplication.spec.js": [ - "ed1f21028d73d3d4a3d093f7625a416192fff9b8", + "dc2d9a260449d71604cc13887e6638e64e24faaa", [] ], "f32_multiplication.cache.js": [ @@ -2441,7 +2586,7 @@ [] ], "f32_multiplication.spec.js": [ - "0420096d7a061baccbc575bfa73d2abf7bc6f632", + "c7a737a87631008ad9b899308ba15576a303c181", [] ], "f32_remainder.cache.js": [ @@ -2449,7 +2594,7 @@ [] ], "f32_remainder.spec.js": [ - "6e7d4cffc55b0b35dc5da9611f3b183ee95746b2", + "aab16e65e9d14803c6ecfab05bbd310a0d9b9731", [] ], "f32_subtraction.cache.js": [ @@ -2457,7 +2602,7 @@ [] ], "f32_subtraction.spec.js": [ - "dd4dab1c8f0f78fc2f274e82e0857196ddb29f9c", + "92325e65503790b644d61700b5f587180cae369a", [] ], "i32_arithmetic.cache.js": [ @@ -2465,7 +2610,7 @@ [] ], "i32_arithmetic.spec.js": [ - "c2abea5b26a2af8d3cf9cf7ed355014b8aeedc63", + "8f84d041b05cf62f54f013cc20709def5420c344", [] ], "i32_comparison.cache.js": [ @@ -2473,7 +2618,7 @@ [] ], "i32_comparison.spec.js": [ - "4c9d7d664292273cc7e338b8289ec1e0b15f4083", + "e0f78079bab17eb7faf5de2ecfb4dd37ef84f355", [] ], "u32_arithmetic.cache.js": [ @@ -2481,7 +2626,7 @@ [] ], "u32_arithmetic.spec.js": [ - "ef1c480e5c4b753b0e2fc47de1f327eb587b9a01", + "0a86c46ffdaa68314c8db842a193a1ab1d2fb51a", [] ], "u32_comparison.cache.js": [ @@ -2489,86 +2634,86 @@ [] ], "u32_comparison.spec.js": [ - "917371129e88ba3b44f721256765f972912500f7", + "a9424f205c8f25622b4d822e5ebd1940527a4d0a", [] ] }, "call": { "builtin": { "abs.cache.js": [ - "8e2e0ea58f54153a543e9064e55faf83bbbd1841", + "18404671f52238c2a9a62b9c240b8c5d76c63e04", [] ], "abs.spec.js": [ - "6069839777f88702f3afd29374edd3193ddb67d3", + "e5f9196d5ddb65079fedca8002cd8a1b34dac26a", [] ], "acos.cache.js": [ - "d71dcffc6ddb81e6ef35af7348ece59288556299", + "2252cdfadaf3995540c6bb633856bc15b1fb7849", [] ], "acos.spec.js": [ - "a36a7a88f7865d9ea7253f993ac618aacddbabc6", + "587d894db4e3c90337009a390dd8ced20df9576f", [] ], "acosh.cache.js": [ - "acd8029a17ed793e18d3bbfdec7490b3548fd335", + "7ec1882deae02110b7a817f9d1cf738cee7c837d", [] ], "acosh.spec.js": [ - "5b6074692631e451829f4d8e9aafcc370b3110e4", + "621805031fd2e8f8e114991d1a9bc5de4aa90515", [] ], "all.spec.js": [ - "09bbb7c02e04f6c8d8efb3289b2ea6c94eef5718", + "8189413ce4254ca64f65d186c31f6316f95c217a", [] ], "any.spec.js": [ - "119efbb2be971afd7b4870d0cd4a4113e146f185", + "621e56be22a8fc147ed4468faa9c6c8bf1b419b9", [] ], "arrayLength.spec.js": [ - "460332e6916a9ace6a4d5e08a381cc85b4b44032", + "b4ffb72c2f5d69c908e972ef313e69b66bfdada8", [] ], "asin.cache.js": [ - "c7991c9bc851870e45441a0fcdef358304a9c13e", + "99f0e6b798c86c8fe898cae23651b5e16636b1f0", [] ], "asin.spec.js": [ - "0519361a7149578f0bebecc9e471017092fd4240", + "0f8d808079a661190ce5a1ee47f5503e36837dd4", [] ], "asinh.cache.js": [ - "b45ca00e39a7de6ec1a9c98f151c8dcbd07a8c57", + "2c3d6f33eb8006f060660f65776d77b43ef73572", [] ], "asinh.spec.js": [ - "6e2bd6f9b5af5bc824c205f4cc8b25e7113de63e", + "4cee7ca2d83d1ebfaa25ce82313b33aec33f2b65", [] ], "atan.cache.js": [ - "97ce4e70cc19060c8f017fa4c2182491b2235754", + "aff1d32cbacca0f12bacbdc6ca0f1b04f7dc7daa", [] ], "atan.spec.js": [ - "2ede98c62374e430f5539be47f1ec903229e42b0", + "fe58aca571ef72fb65e5d0a1e0b2d5224b9bd938", [] ], "atan2.cache.js": [ - "5363a81fd7f603e8373de845e4d418596bf90359", + "b4625d38eb4ac6a805b899699a19be54789b1b06", [] ], "atan2.spec.js": [ - "da3cd9fe2872ef702cc9b2ef98b604f2fa2aa358", + "88a223e52e541ed4971deb652c155aa8c7c9ed30", [] ], "atanh.cache.js": [ - "d34cd70b75bb0a80b3aab27cd650e0fff7f4e939", + "b10574328e2da480a90bfee4d41afb1dbf8c4513", [] ], "atanh.spec.js": [ - "b3a150bd70df1e8bbc6a41dec54df49638a8e2d4", + "b378b0a494e526e6b1eabe39c4f548e2cabb7767", [] ], "atomics": { @@ -2581,15 +2726,15 @@ [] ], "atomicCompareExchangeWeak.spec.js": [ - "1c33de38cacf9d85580f64c49da72f882ed1e17e", + "4d52fff7c4eae45ffe83854ad39e65fbf635d99b", [] ], "atomicExchange.spec.js": [ - "92717005f7a9d4fcaf91f7c52b4fd5a79028f223", + "23a9b78ba90e4405366ebfde8b0ea57a4539baf9", [] ], "atomicLoad.spec.js": [ - "dca1a6b9d92aa323b5ca8c189d0044a5400ddead", + "96efa3ac5c9720f652aa4bc92e53cd734f7127f2", [] ], "atomicMax.spec.js": [ @@ -2605,11 +2750,11 @@ [] ], "atomicStore.spec.js": [ - "1b9b7f70bd977227a3f94aa178de49c7ad8d70b3", + "7e154e649656147d36efc86015c86c922d5f003e", [] ], "atomicSub.spec.js": [ - "47b1ff8ec5ad2c7b091a6aca906b1988de76383a", + "696a15b2ef62018e233ad243c56cda4bb50ba284", [] ], "atomicXor.spec.js": [ @@ -2617,172 +2762,180 @@ [] ], "harness.js": [ - "c377728f10cc0ed71ef7bca7dc2553d179c980f8", + "abba91dc64be7245a6106fe968315b1b0d145ea8", [] ] }, "bitcast.cache.js": [ - "d0e4463d5641bf66cd082fa83f2e89a80cefd9b2", + "6ecbee7dd633c6f3923f35bd6588c99bd907ac96", [] ], "bitcast.spec.js": [ - "9ee1abdd3637b67983d5dae0f8bf55b16fc6c181", + "a2e9ab49e7d068a45d83cf625a68997ba27ae4cb", [] ], "builtin.js": [ - "cd3e52298c0efd3a7b2e978b1ef2a3061b87609f", + "1cc248421b10d2bb4a18061080a806a1e18c79bf", [] ], "ceil.cache.js": [ - "9faa6b897267227b0d441684b2b34fcc89ebabf3", + "5c101715f1c5d0266dfbb09c8027e2b0519a629d", [] ], "ceil.spec.js": [ - "f634fcdcbec87b909a4d3f8d9bc73bfdd3122cb9", + "fab2be8c0140f84b8f673c5e59f824b3548213fc", [] ], "clamp.cache.js": [ - "189518963dfbd6cca5f7fbcba7d5fc2b706c0d6a", + "eee76e0de0fadf92ff00bc7ba6ea4022099be997", [] ], "clamp.spec.js": [ - "51ff607c6db684f8a67c037509a76a8d154460f4", + "1cf7035691c539915f87f0f91e287a8555f587a3", [] ], "cos.cache.js": [ - "3e24070aad31c9e1c2a5b4bb285f7d7f49c72c2a", + "453110b9f78f469489b593e6b6f3b803f034dbd4", [] ], "cos.spec.js": [ - "4e2edf6e2f8aa1fb446852f9d7ad6f0c687b1f80", + "ae31f076105ee441bdfe6a09a94911d5cf373d83", [] ], "cosh.cache.js": [ - "fca56714d1db5c21ce5eeebc75f30af5629464ec", + "264a58ca7f03ad4d17a2961ce30398a11c416e06", [] ], "cosh.spec.js": [ - "756f23dcbdcf15113b07cc0c17c6b56ed54be561", + "f51fef5dacc766ad13b2327e7c4689b2391acf21", [] ], "countLeadingZeros.spec.js": [ - "8622bef96e5e0ec2554d9437c0352f7e2da88ef8", + "c394cc60a4bc5bc62b8d8d49ffb0f3039eb7a032", [] ], "countOneBits.spec.js": [ - "500b02ba61518c542a861c9b7a4b5f4824be6d4d", + "7de73dc8113e69a5936dcd6c36250e60a5b4e091", [] ], "countTrailingZeros.spec.js": [ - "ca3f78ee0518e1da3c27bdb23dbbfcfcfdc12d22", + "f7b3b3a9dd0a8a413ecc227e2b8ec10393228633", [] ], "cross.cache.js": [ - "12cee9a67fa5751485b526e9d61a1de1168f79a1", + "e5a68365ae389d77b7e2af7d7c53ce1485731417", [] ], "cross.spec.js": [ - "f192ac8947092739d26e428a1980c8b4624ce246", + "c5a54fbe3e9f3501ae860965fb5188e68ddfbb7a", [] ], "degrees.cache.js": [ - "c9d3faca94a599410a5feaa208dbbf1d91f7c749", + "e4e012f2026ff1b7d5b1567e2a1b267fbb8bc32c", [] ], "degrees.spec.js": [ - "4e3d42b6d6b61eeb5d0265dea84e69365412ef66", + "a79889a43b3311b9e29a07834e76395a2ee194fe", + [] + ], + "derivatives.cache.js": [ + "98a271f54aea857413068519ff457e9fd58cbd1e", + [] + ], + "derivatives.js": [ + "02ae6d22d1fa62b579e0371bc512209aed295f88", [] ], "determinant.cache.js": [ - "729d86ad795f60aa7c708d996f55e8c2c923eb38", + "86e1bae80df83e1affb39265f2ba7b8a9b72e1f8", [] ], "determinant.spec.js": [ - "1791ed754ee0afd515496f296325bada8d5b4ab8", + "92d092c70b91ad96eb0a545fe19f10b6f7a2126b", [] ], "distance.cache.js": [ - "faeab44a9b092441b8ebe00a041eec037bc938c4", + "3e0199304d65a93f1bd235c607a346225c5ace47", [] ], "distance.spec.js": [ - "72f6b686c241411616f87466282e5d819c0f5768", + "7a45853faa4e7e3aab031db444a06194549f8213", [] ], "dot.cache.js": [ - "56d12bef598babdc7e0e5eaeacdc382d90568626", + "4bdf75bc3160bed527a6aa1fc12e845d33b3c9a4", [] ], "dot.spec.js": [ - "c23848f11f48228c9a634eb1f89539a14c7b99dd", + "76cbb50393827d8619a09538a1183f3f1ba61ec1", [] ], "dot4I8Packed.spec.js": [ - "1207b043136cf6edb3fc70dd9f087674c6331bd5", + "9a2e9eae8d539bad6805eb551e36b50cafc7e7dc", [] ], "dot4U8Packed.spec.js": [ - "027b297fb680ce6e8da09559373ef2fec451e680", + "7fd3c08a5f8531efdf938d99cef811f9210c9e51", [] ], "dpdx.spec.js": [ - "9d595f7d23667b9836967319ff5cf5fc354aeab5", + "9ea801316debdcd28bdd355fdcb8c88eeb02aea8", [] ], "dpdxCoarse.spec.js": [ - "db31f42df169b0677ab6398ec8d77fe23de19e98", + "9b1b78f3812041e607cba176a5eab300cc777c0c", [] ], "dpdxFine.spec.js": [ - "5eaf79243913827b24f05c629044e6142f0c8e15", + "25a04360340033c43aa3bb376877fadc37e57224", [] ], "dpdy.spec.js": [ - "edba9b14c14c2de7e861e695664d8115ee483c1e", + "0f79064b922074daf0a9620727ac5cac3b72c7a4", [] ], "dpdyCoarse.spec.js": [ - "f002a587b6b781105f0d4215b48a63ba348c025a", + "c547896de90153ad9506fcfa5b35d2ee32108a02", [] ], "dpdyFine.spec.js": [ - "405914acf19d14c1c79b38071dbb846a17dbc222", + "85a829ca009b3580cef62062498ac47853d9c588", [] ], "exp.cache.js": [ - "6fff05ae76848814783e165a486e8caa32734ab5", + "00a4cd7d2d0162c24de44a532374b90f3dca6e29", [] ], "exp.spec.js": [ - "e06613beb26d8064eb186b65a72c54174a52763b", + "69883e92c0acd718a6a6b933a10a4cf981592d79", [] ], "exp2.cache.js": [ - "df2b9edd41a72e3df9cdc65b6d8eaf840a1d74d5", + "c001595cc01dc6b73cf7e85fc88a9bd27796dcb8", [] ], "exp2.spec.js": [ - "04f381730c6688fa0e65f3cc12601e98463b8e54", + "573512cb52d98b71d72ffa7ceb4e6510a2f8a24b", [] ], "extractBits.spec.js": [ - "3faccc58a7bfad67faf76eca41aef9b00f72d880", + "ea3197696d625f5dc3c35d56d204ea48e4daf6bb", [] ], "faceForward.cache.js": [ - "cd3b559955b2eca01489559ca69e8e68a600b488", + "f2b96e3a5f9c5f84a51afe6fe96c01386a8e9ed8", [] ], "faceForward.spec.js": [ - "ab96642124d3f63c6907271843dacc2fb67f2144", + "542bff23f372bb59bc801c83650c9373a132fe30", [] ], "firstLeadingBit.spec.js": [ - "fd6b6359f124834b231dbad3c5b3fe51d1a288dc", + "139e653961e408059ac6008f1e319fdf4e37a096", [] ], "firstTrailingBit.spec.js": [ - "73071c38085350769d1b97f831ed2599ef70e9b6", + "51fa9fa4747d07c3faa1e7b4b397ec156b7975ae", [] ], "floor.cache.js": [ @@ -2790,111 +2943,119 @@ [] ], "floor.spec.js": [ - "dbb2704de205ac55243887c8860d71e7122b5d78", + "6274dd75d15aea1244b0987244917e545acdccad", [] ], "fma.cache.js": [ - "c4da19cfa84425e28de3b33013f1e9ea4fe021eb", + "d8a7da7aabf97dbb5a7cc02ac64d617c50ff85cd", [] ], "fma.spec.js": [ - "b9f114ee4049aa15e8d44c51763e4df9e78016dd", + "ed0203f89f6f1b1da5ba70398add815084a1304f", [] ], "fract.cache.js": [ - "fbb928745309488431790734fbc85f202e836f8e", + "d27581590f3f537e6dd120d95ef002202aff4997", [] ], "fract.spec.js": [ - "c5a649bd17a3d533ad2d279e4cef2a05696e59a0", + "b556fcf18fefb7301915ace98cc02c2fa1bfc73a", [] ], "frexp.cache.js": [ - "2de29328383b71ea9742f3fff65531cfaa9a5664", + "11d49dd04046a154da034d76f382c474f5d657e4", [] ], "frexp.spec.js": [ - "10fa6e72d2f23d1618488b6469c31f851d42546f", + "b7877a45833fa501006a2447a7651166a64132a0", + [] + ], + "fwidth.cache.js": [ + "2df7eaa47f985994a2141682835d2244ea3dab84", + [] + ], + "fwidth.js": [ + "dd3587874d08f52aafaf1b7fa7023a59fc28d877", [] ], "fwidth.spec.js": [ - "2ec40557bbb9fb7dbde4a27f89ab3e7fc56732b7", + "b885f3f61d3f551268b4d7a4d883a7ee0096f007", [] ], "fwidthCoarse.spec.js": [ - "21c4cce923963f6befe62b951cf81848fc14169f", + "eddd60eee8f19ccd372b954551e853ab092ba46a", [] ], "fwidthFine.spec.js": [ - "637967371e9aed1bcb67ee01ea9bc42e1fa97031", + "fd768ce7894dfaf43e5f5bde9ab062260c6a89af", [] ], "insertBits.spec.js": [ - "1af24a518991b860e76c8b5c181636bd96fabe64", + "5a0a8182d6975eb4d3b8103cf8ac90089ced2401", [] ], "inversesqrt.cache.js": [ - "8d8a9254972b5bd380dfb72f7c92eb60d3adcd8e", + "883dc14c08f047817f29f341d2d6680d9fec7fba", [] ], "inversesqrt.spec.js": [ - "d72b14e2e6e3ca92b0366e3436b31fb4a2d9e5a2", + "d22daed907cf3088a2211328b62f24acc55864f0", [] ], "ldexp.cache.js": [ - "1c04b45ec25324f6a990d015179a0ce90d9e60da", + "bacdae0349dd51916a87888480170c094c7168b4", [] ], "ldexp.spec.js": [ - "0935b09eecbee35ba61986e7b1140de93497c722", + "99bb09d17637d8115b3b3d3c7b959a514ec93a95", [] ], "length.cache.js": [ - "f1bbfeb095199bcd6190f89d3b7bde131b333a37", + "18c15dec5dd8f2d257eb692f68a8428171ced388", [] ], "length.spec.js": [ - "ee4138312bc12df01be1e9f7ff888f9da7979ace", + "9aa959e086d9558c5f3c4ece28e0735f42f9327b", [] ], "log.cache.js": [ - "c71324eb1c33f5e05a1be3275f2939f4900f0810", + "b984c1f30a4f3d794287d21cb2345747044ba663", [] ], "log.spec.js": [ - "b49df93f568397eeaca830af2f1580be4dbd9a8b", + "e828fabdbe8cc1b88ead584e3ed894245785b7cc", [] ], "log2.cache.js": [ - "f12e8308173cf97dd8c688f87c0891e7ffc246f5", + "1ed1f82474f928bbfd75fbb17810ce5dbdc6d4d4", [] ], "log2.spec.js": [ - "8fd0dfec1cf7129a4393d7e86831839afd1d06df", + "df280e596543e553723e6370cdd59487c7846242", [] ], "max.cache.js": [ - "afb67586a3893079fee250d594ff39bc6edf59cd", + "8644a569acc06550b619f8620af1ac85fb717bf0", [] ], "max.spec.js": [ - "d5674b63b135e27340b4130895d0e803c7d7d087", + "a605553a4a7ecb3c63d13b5859b51837fbcacb98", [] ], "min.cache.js": [ - "f77b544f3f633c6ad8bd4f9f5a6c2a92226fcef7", + "482502e39010b27db38f94f15e6ce4f2160385ef", [] ], "min.spec.js": [ - "bf9116fa5ff4a6338c994e11b8e00761937c6a78", + "05bd9dd0e4efcb0d424fe42aebeb5a3002f640ea", [] ], "mix.cache.js": [ - "88579af0ad522e9af62b1534fe6cce2073587a7a", + "ac1d4cf57320bd1b4f9f1705673f7ec834963ac1", [] ], "mix.spec.js": [ - "7a6d93eaa6c3a55880f0f45829bc7007e924ef16", + "a118c24978bd975cf9ff01c7f8b676b89f772d34", [] ], "modf.cache.js": [ @@ -2902,15 +3063,15 @@ [] ], "modf.spec.js": [ - "2c88c8bb9cb39b574c9de0b9ab8a91d84bf81737", + "39a3c7f10dca4b5089cca7d4337024208cbb1950", [] ], "normalize.cache.js": [ - "decd583a70f46886028c29a30e81c571b91a2c56", + "a1b8b07b9f7a184f5344ecf779f626963b6e2823", [] ], "normalize.spec.js": [ - "ce13fea99b8f19adc8303ae7844f98ade325b1b3", + "8bc4ea7ca8035f9f077908a2fd35224dfebec240", [] ], "pack2x16float.cache.js": [ @@ -2918,47 +3079,47 @@ [] ], "pack2x16float.spec.js": [ - "317966986b834fef78e803f4d1d3593eb85ba2a1", + "e859b1898a245299a5e783e18ec8e3844513136e", [] ], "pack2x16snorm.spec.js": [ - "eb73eb4cb3890c271100697bcdacc06afd4928eb", + "e9f4b655829162134bc0213b96118fb57b125dcd", [] ], "pack2x16unorm.spec.js": [ - "2648353ada8323d9495eae739e4bb2c3cf5dc8f4", + "f98d606b8d3c619a91296002edcb28dcda2bac49", [] ], "pack4x8snorm.spec.js": [ - "6668427241c64364d0761e053caf926391e838c7", + "42db991e5380fde20bea66f7f5f509db36eb1951", [] ], "pack4x8unorm.spec.js": [ - "8c23e47719bce3dde57c53a15a6a4a2486c7c85a", + "d0299f973c5540bad1c907df71d38abef155ea17", [] ], "pack4xI8.spec.js": [ - "92f3fb45b34317f603fa6ac55651490e3bdb2484", + "4ced1a04b42d7c2e783294a9f617bda2f0d5ba5c", [] ], "pack4xI8Clamp.spec.js": [ - "cdf33a6d102ca25d6c9542eef1aaa9dd12ea2293", + "e7ee33839ef6516bda69900453332d6c4c5a1063", [] ], "pack4xU8.spec.js": [ - "3a36be4ba9b10caf20701a01a7ba64dd6ee08fbd", + "e5ace048f7994f4498a44fd6407e89b152c9d115", [] ], "pack4xU8Clamp.spec.js": [ - "d16fba390ed92aeb269d9f4428004c265251cc8b", + "5a68795299f011a2381c1a3492e219144eedcba1", [] ], "pow.cache.js": [ - "b166e35b6301864e2ad9e8db004363bb4bd141a6", + "944c406bd837bff81952e53281e5c1e001a1d46d", [] ], "pow.spec.js": [ - "3b677b9cb1395a2a6d54d712a16520e31f694423", + "562c75de99c175c5586236156e6ff869da6817cc", [] ], "quantizeToF16.cache.js": [ @@ -2966,35 +3127,35 @@ [] ], "quantizeToF16.spec.js": [ - "40f5b2f132e39a608788e17637b75305d5a51f79", + "b872d0923f4af24b344d5ae6f27db51cbd945619", [] ], "radians.cache.js": [ - "582338e976a8a67c8e93f02d98b1e3b9f3e91a09", + "d3770a173c70998ebbf5d0b5f3979817cd16adc1", [] ], "radians.spec.js": [ - "480cd55d5c3e5c61f2654b711ce98841a2152ce4", + "46e8dbb09b40c9bf2c73cc187bbd5718f6c28653", [] ], "reflect.cache.js": [ - "dbde213306350a317346b8f8e67ecef15575144a", + "359e731bf25184bc77ffce800fc920772c9eead7", [] ], "reflect.spec.js": [ - "a6a59f071047f3f1a37ecd3125c306545eb35992", + "4d1b805e1f37a35fef27e952604090c4ba3261df", [] ], "refract.cache.js": [ - "6b2c4b182e998fc5d6d4e256f29aea06381b8152", + "4f2ce5e2b45a1a3b32ff0929985b171089febd95", [] ], "refract.spec.js": [ - "90e39fa252238202abfae590e2d0ce3b385c75e2", + "a2ffec4a1a00f7a4b9dc4a540c49fd81be9a5215", [] ], "reverseBits.spec.js": [ - "fc99867f1087a11b87d85d5805ffba7e74309400", + "9716dfd108b65a43419b0f31add08f19b1e3a563", [] ], "round.cache.js": [ @@ -3002,7 +3163,7 @@ [] ], "round.spec.js": [ - "570f60ed9e80348e0ebe1bacfcfcaf5f3b51bbf3", + "b60399773e4d0322b73684bfa930515f3fb15564", [] ], "saturate.cache.js": [ @@ -3010,59 +3171,59 @@ [] ], "saturate.spec.js": [ - "2b63e3305465a36c95b4915ba7ee573e0dd0d55b", + "e18f41ae65932cde72c400da503c5cb0a36c26c3", [] ], "select.spec.js": [ - "4c681e49cdf5e20762b242b591c47291a56c8dc5", + "c08f4d5f1b42fa05dc7d10dc66890145d20cd00b", [] ], "sign.cache.js": [ - "a090c5c83dcc508483d89ff706d0aa8a6dad0760", + "839f97d59a035c0274da92e412a9b3739b3632fd", [] ], "sign.spec.js": [ - "aeddf2b558136efb71687c3ea58ceb1f1ac9ccd0", + "7f9218e7ef8faa91655bfdce982b91846b9050ed", [] ], "sin.cache.js": [ - "67825c91c6f546f4f6a7c8ce2292cbcffd872c5f", + "69457c8b27027218400364e9778cb1bb29fe01f8", [] ], "sin.spec.js": [ - "76224e1cace4eabc48accaa4b506a67e5558362e", + "85a7a665f71aeb2138dc342a7485aac0e9584654", [] ], "sinh.cache.js": [ - "4dadd1e1e3cd9780c99b2851811048faa1c83d89", + "0a9b03fb0a85ce2fa49feeabaaf67d8ca1fe7390", [] ], "sinh.spec.js": [ - "ffe701e6161745a3eb8e97258864908afa1eb95f", + "c19a84ebc2404941328e999d12b5d1859f59dfb9", [] ], "smoothstep.cache.js": [ - "5af2eea9f017ea25eb3b6c5a2e1be03c3f868151", + "9a379eed1d9f4175e6a05b4ca2037c5648ea46fb", [] ], "smoothstep.spec.js": [ - "52bda2bf77e5d9b6bf2ed8504d32ecf80ea41b00", + "353f70a00c35aec34ed876d584340457c99e2713", [] ], "sqrt.cache.js": [ - "514a734274b8c749fb7d7ee5bffac387f48bd018", + "af8f0ba376ebe999bf8e7cbe076a664cfbbbdee3", [] ], "sqrt.spec.js": [ - "e01df292609b11c7dc6148c9f8a926792b250295", + "b2bc38b8ce5bbc745a195b3810e675f0f5c79cef", [] ], "step.cache.js": [ - "96ac3a4f28795673a57a6a9ccdaf9b891426e99b", + "91f05db9d460c543a2649d3e01feaffbd4aaecbb", [] ], "step.spec.js": [ - "15ab23462f9431811837b5564e7832f4ada8ea6a", + "86c7b64ba7cced250aa46ca3b5d9d95cd62da9cd", [] ], "storageBarrier.spec.js": [ @@ -3070,23 +3231,23 @@ [] ], "tan.cache.js": [ - "205cb6d6cfecfaf57353b4264e2185d190127242", + "d88c4a29075857c463621a8b3cdaedf4cbd6c6b9", [] ], "tan.spec.js": [ - "335e0e229e47258dbd4d0ecccca4f31fa7a30107", + "af936622e261d9ab0d2d4741cd562f974c6ea94d", [] ], "tanh.cache.js": [ - "d38767af979e960b2977b6d1bcf3f33f4282b810", + "a1ec6c9e7f6620ff2094e4eae3a1ad24887a9696", [] ], "tanh.spec.js": [ - "8e0d6bbe3ea47478b0e6105927619fa883656259", + "9c7b348f103d2d73981cef840c0625151feffddd", [] ], - "textureDimension.spec.js": [ - "8ed1e289ee46e7361be9ba9a81ae7860bad46d57", + "textureDimensions.spec.js": [ + "5d1c9e5df03d0f3611eef2c982098ee5245aa921", [] ], "textureGather.spec.js": [ @@ -3098,31 +3259,31 @@ [] ], "textureLoad.spec.js": [ - "269f841850b441fda26f726964ca0a34408b89fb", + "7dc13aa0377d94d3cf3e1bd2da09c4f035b52873", [] ], "textureNumLayers.spec.js": [ - "30eeed0e8824db107c4ef4e84041b2f5e8df8b7a", + "835095a2274d7fe4a94f5f2a77348304d1769093", [] ], "textureNumLevels.spec.js": [ - "69af41b79eccce5afe17ffeb434cb5f92929d4a1", + "9292252108b95756ede081ad2ceeecd4a6ea9013", [] ], "textureNumSamples.spec.js": [ - "c192bffe04b1d7e25c19f2008e0d879d01a66338", + "95faec1946affc278ade7bec6e8a70ac4ce5156c", [] ], "textureSample.spec.js": [ - "7e4bbd77441656eaf3dc64338086d57281ea72a7", + "bc18d9ad32a957adf1c01c86bdc018dd090ad49f", [] ], "textureSampleBias.spec.js": [ - "7594f3ad5ab5b44e89c23486453142f03e00a60a", + "a11274e067f3706c7e7dd08f4e22e76cc1d3bad8", [] ], "textureSampleCompare.spec.js": [ - "9f90e69f6330f379b9ba09be97891c2fee2d3fb2", + "cb34aa652ccda52f0b73ca5aa2dcec705c94cd71", [] ], "textureSampleCompareLevel.spec.js": [ @@ -3138,7 +3299,11 @@ [] ], "textureStore.spec.js": [ - "24ee130577fb95c9524616b48a521dc49c89febb", + "49e777d4550d12b5b66616873d0b4e7c5977570f", + [] + ], + "texture_utils.js": [ + "4de55d82e5e73dbc54e47772cc4b36c9f81d2852", [] ], "transpose.cache.js": [ @@ -3146,7 +3311,7 @@ [] ], "transpose.spec.js": [ - "5a919d82ec4ed7b0e6a4a23879dd9d3ab7f2a8dd", + "8e1c70e37f1a8b71715d09a75dca8f1fe61a713f", [] ], "trunc.cache.js": [ @@ -3154,7 +3319,7 @@ [] ], "trunc.spec.js": [ - "ddd7549a70f453c1b37aca062606d880126f0be4", + "b2af7b2e03c1e5bb965b376fc00edbe3b073785a", [] ], "unpack2x16float.cache.js": [ @@ -3162,7 +3327,7 @@ [] ], "unpack2x16float.spec.js": [ - "47fdf10edd795a9c57c6565e2e6dd007d96a6d48", + "39e1ca28e5cb84b7241da40e899857f06fbf1ead", [] ], "unpack2x16snorm.cache.js": [ @@ -3170,7 +3335,7 @@ [] ], "unpack2x16snorm.spec.js": [ - "7c832f3d6bd7af83f33712fe7bbdd4bcf15ce722", + "f2b36e2ceb375ccf65c3b018346d211ccc54a76d", [] ], "unpack2x16unorm.cache.js": [ @@ -3178,7 +3343,7 @@ [] ], "unpack2x16unorm.spec.js": [ - "0f50805c78382c5707c4bb1531d15a98392dd056", + "37547b1b3cb0405fd041ee476a8c446876294538", [] ], "unpack4x8snorm.cache.js": [ @@ -3186,7 +3351,7 @@ [] ], "unpack4x8snorm.spec.js": [ - "f46549c33d7b19b354cc21f07846995b65e36bca", + "59043efbfa3faccc830f333f69ecf71116eaa8de", [] ], "unpack4x8unorm.cache.js": [ @@ -3194,60 +3359,82 @@ [] ], "unpack4x8unorm.spec.js": [ - "faffee422901f6267fcf650a8376235fb1c9918b", + "755c490c0c13f43d51d224eb9b4add1a9e0fc28f", [] ], "unpack4xI8.spec.js": [ - "2688d78efea05f6bd8bb9e0d0c6f8738cccbda68", + "30bd91d235e333ee20ba5e783281395b36396d3b", [] ], "unpack4xU8.spec.js": [ - "8d86de836091e5ad9cb1b303b9c879d3ee4a9f89", + "9711650ec0ca4c7b3d15cd806a5176803c5a1cec", [] ], "utils.js": [ - "448d369d7f18c6e50621aff0bf3c696d96550c11", + "a603a10a6f7301299478db804680abf21a4da8b9", [] ], "workgroupBarrier.spec.js": [ "96848767ffe2ef99fa58915b5264e4055692f980", [] + ], + "workgroupUniformLoad.spec.js": [ + "0a08baba0d9125eb81b9684a16c87cfa668e5e80", + [] ] }, "user": { "ptr_params.spec.js": [ - "1c3976ed4c63d5f2e5c86a5bc20347a94538dca9", + "fdc31662a613ccb3367c7300f3f416a9519b09a4", [] ] } }, "case.js": [ - "e361bf370db07639c20a2e42668c8e42af5a4d8a", + "d2d3a019de614cccd3b4809a9b4da78bea61ed3f", [] ], "case_cache.js": [ - "261c55d762a5945b6bbf488f58988b4095406e5e", + "41857ad8fa6a811ed318063d9abeed39ed793f3f", [] ], + "constructor": { + "non_zero.spec.js": [ + "e79f9a3a2b5ae4e1cfb110dd0c8a3505c85a2d63", + [] + ], + "zero_value.spec.js": [ + "c8df64d2e58c679bd73b9919f56c3d9235f2385b", + [] + ] + }, "expectation.js": [ - "f5c2726bbac6f8dc2c310d11c8aba8dc722b944a", + "d859117054d9f09d5ba92bb42980578f8399c995", [] ], "expression.js": [ - "e3d47b582c62606c124f36cb3a429d48f77fd03d", + "2c1a2c9473e7ac67122794e74ba1634707893e24", [] ], "interval_filter.js": [ "d70e087a74c7bf305c25554ba1cc3a0df66c3abf", [] ], + "precedence.spec.js": [ + "6bdea30e43658ea03c2c1af28c1e430f750aa165", + [] + ], "unary": { + "address_of_and_indirection.spec.js": [ + "f68dc1882274592b3d38c8fb21a02a199cb7ac62", + [] + ], "af_arithmetic.cache.js": [ "97917cb2a32bd45f553e7b4a8fd8ecc08d2dde56", [] ], "af_arithmetic.spec.js": [ - "868057236bfdcdf50075d597a82f829337b9f15c", + "55457e59d1862e5c39ea3b03cbc612901686e536", [] ], "af_assignment.cache.js": [ @@ -3255,7 +3442,15 @@ [] ], "af_assignment.spec.js": [ - "fdd793e1825f4f9b4dd053f67c4d0b4830428fb6", + "2288245f366763a8659beef61c21036762ada576", + [] + ], + "ai_arithmetic.cache.js": [ + "3ed097dc50668cd882969f102467ccca57e39e3b", + [] + ], + "ai_arithmetic.spec.js": [ + "6060edd7d50a8e517d5a0513228ecdaddd877c29", [] ], "ai_assignment.cache.js": [ @@ -3263,7 +3458,11 @@ [] ], "ai_assignment.spec.js": [ - "8d367bdb819df8382a9414a76907c8e97e35cfde", + "be05705c543c61af1c33bd3a50df8d6d107bdff2", + [] + ], + "ai_complement.spec.js": [ + "c8d42096089f9ab8a67f1495d6f5d7a704986bd9", [] ], "bool_conversion.cache.js": [ @@ -3271,11 +3470,11 @@ [] ], "bool_conversion.spec.js": [ - "22ff61aa00d98c769f4c221530f253c5f5ba56c4", + "8da4619fe777ab0bce60fa9a08e80c44ee8fac5b", [] ], "bool_logical.spec.js": [ - "ac8da84846d98fd31b597c3f747e9a57805fed55", + "e09cb35d3f3245892c586091a96045b5ee9da682", [] ], "f16_arithmetic.cache.js": [ @@ -3283,15 +3482,15 @@ [] ], "f16_arithmetic.spec.js": [ - "fd85be26dd99e0c9e9434c583f0aa2fe5d11ada1", + "1dbeffd6964f065484110f90da0cb8341fde9f85", [] ], "f16_conversion.cache.js": [ - "e7ffcd20180afad4c47e5aae71660ddd5d727847", + "19af40984a9ba29c798d07f5bce0a22404315c56", [] ], "f16_conversion.spec.js": [ - "562b68b339609c63e3b39ad328311f9567ba30b8", + "53e11c44ec60d16a7347b499dcb557c0e2ee814c", [] ], "f32_arithmetic.cache.js": [ @@ -3299,15 +3498,15 @@ [] ], "f32_arithmetic.spec.js": [ - "bb6861b1d66d8e699a7986e396d19ec3644906f5", + "785f8f9aa1c3a031f442149f99cdf72b0450c1b9", [] ], "f32_conversion.cache.js": [ - "eb8fbe2c790b6f0a779a7d76f1d87a097d40740e", + "a401e000844a322768797fa2a99707169f7a505a", [] ], "f32_conversion.spec.js": [ - "6cb4c32294973d98e9488233486f5101363d814e", + "13e2fe8f62f75cf4f27619d1498ca7c0568eb1a6", [] ], "i32_arithmetic.cache.js": [ @@ -3315,47 +3514,35 @@ [] ], "i32_arithmetic.spec.js": [ - "56a50f0814d870315aa5c0656f7b646cca5df846", - [] - ], - "i32_complement.cache.js": [ - "00c8dd8019488fba0348e2c2f7631807655c9d9a", + "c30b3d5aa3334c0e63da572500efd750ea127bab", [] ], "i32_complement.spec.js": [ - "f3f4c71e8bb54b0996a05889fdeb391efd3759cd", + "0648c9ee3cc0cf5cf0d775f685eb272eabaceaa7", [] ], "i32_conversion.cache.js": [ - "39abb6a1cc067f75b0beeba59eb71cb03eec6ae5", + "ab5cac3b28424510ab439d5fa7e845f529bdecaf", [] ], "i32_conversion.spec.js": [ - "797df86bba7f17169511600e2aa875e07820b483", - [] - ], - "indirection.spec.js": [ - "428839f71a06a67b9a2871e925ecb83fc8c17224", - [] - ], - "u32_complement.cache.js": [ - "816093a7db5a9dc6216023fc89c20a8f3af895dd", + "57768e7abc16b397c063bb5847f62e20c751b11a", [] ], "u32_complement.spec.js": [ - "214e856c8809b38e1ed110c5b6ab374ea1425c70", + "a15742738c6984834a14c7ea479a6b774675998d", [] ], "u32_conversion.cache.js": [ - "33317a6e918a00e90ed01c64faee1f142331da02", + "d43133a5f61aba8d319181ba79e9c99ecacc78c9", [] ], "u32_conversion.spec.js": [ - "7a9894d7dadd293750a8cf05efd74aff2b5b30b7", + "528e01f4cc6456a87d42d88469fa919fabc8fc80", [] ], "unary.js": [ - "914d9fed4c64cedafa27dec668b0d9e826161f4e", + "1b46f37795162bd15b0f63c6bd3cc190aef55eba", [] ] } @@ -3366,7 +3553,7 @@ ], "flow_control": { "call.spec.js": [ - "43897ca432b0269ad22fc974e090ce50b13447ca", + "00d2451ecab9da61882984e39b74d40feaaa4595", [] ], "complex.spec.js": [ @@ -3378,11 +3565,11 @@ [] ], "for.spec.js": [ - "182f1e999ae009b58476feb3e06f4d92130e116e", + "4f7714cf428b39a7b5ef4c93b133b6fd1af7fb24", [] ], "harness.js": [ - "bb2869833f4ff9f7a9547721b6f6e8937716f79c", + "d15afe2942c8ebf4e0ef4f91b0a79509dfd98769", [] ], "if.spec.js": [ @@ -3390,7 +3577,7 @@ [] ], "loop.spec.js": [ - "adb5e0916df63ca5a6307850c0c4d3a57585ddd1", + "829c5b499768a9d42bf7eac18c1791a4f5f57492", [] ], "phony.spec.js": [ @@ -3402,21 +3589,25 @@ [] ], "switch.spec.js": [ - "09664a067eac6229367338e3fb805bade6e4c1ba", + "597ef20c78863c5123467ad87cee0af78b5315b3", [] ], "while.spec.js": [ - "f4bbc942ef591b50be54fb3e71b8f97d88a76ce1", + "b77e09bf486a23c12d5cbea8fe278b8005e4ad3e", [] ] }, + "limits.spec.js": [ + "7e96b8b91429a23b2e9dea1214718009a6b7ce95", + [] + ], "memory_layout.spec.js": [ - "53a797b7c87f908e9f17aa3f7e052f6d0ef60699", + "8807156fb85064a79acb36aae61f707212fa1a03", [] ], "memory_model": { "adjacent.spec.js": [ - "c049664e862781f740446cd7f448e4e130f0de69", + "f223eba5abdcabce8d7904b652b044f5c02a003a", [] ], "atomicity.spec.js": [ @@ -3424,7 +3615,7 @@ [] ], "barrier.spec.js": [ - "47ad99244b8201a0c0e6216593716895a0ae60b0", + "9ccd04c61d0890511a3234bbb14e60d434cae4ca", [] ], "coherence.spec.js": [ @@ -3432,7 +3623,11 @@ [] ], "memory_model_setup.js": [ - "c5af090176299d6a693e9d81378b4708eab53800", + "5c0ae85356ce43cac5a06ddd1550ec52bcc4efcf", + [] + ], + "texture_intra_invocation_coherence.spec.js": [ + "ba13b74422d912e92d7e13696d77c77dfa864403", [] ], "weak.spec.js": [ @@ -3445,28 +3640,32 @@ [] ], "robust_access.spec.js": [ - "8e6cd5c80b37c6aed7122daa718e373bd5cbfb3d", + "12f83e420846db6763b8aad6132202eea97af39e", [] ], "robust_access_vertex.spec.js": [ - "f964d330c3873f5eaee7896fed20c6cd18df79a7", + "4d26a2b40a3997d12c7d00dc407e04764aa48e21", [] ], "shader_io": { "compute_builtins.spec.js": [ - "90de84fb44cd9d0c8fd3c6e7f1c161d395132777", + "98baa860c02534522488d6d88cf73ec9def66a33", [] ], "fragment_builtins.spec.js": [ - "557ebb04f652b91ab15326848ddf9e05ecdae3a1", + "79f61c083bee57e09d95e6ef5bb7d59fab4db0fd", [] ], "shared_structs.spec.js": [ - "4582f615cedb620bf700e17553a7a87aa77c603d", + "98d92fb8fa4941c19ffbbf0d64f1b743b90d1902", + [] + ], + "user_io.spec.js": [ + "0998100ef9c6779f61aaf42c178aef16ac6b2e98", [] ], "workgroup_size.spec.js": [ - "a683d352725ee0e48ea4a92681bc4d9716dfcdf2", + "88338fe373e0d239232b0594c4f110d8d18fc85d", [] ] }, @@ -3475,26 +3674,34 @@ [] ], "stage.spec.js": [ - "df09954c3f7d17c26d13c149cfd5e359a248bc41", + "fd8783769c52267432d157248258172bda24a8a4", [] ], "statement": { "compound.spec.js": [ - "0c7f0edcaee8f94fa37a824e1f7817eeeb9fc9ad", + "fe4de3ef727d31fa789c68237993c63e32737a23", + [] + ], + "discard.spec.js": [ + "644f73ee876d6705bc28ee1d830e2ec2df3e6211", [] ], "increment_decrement.spec.js": [ - "9ed58742835253696bfec1d53c10bf5fb6b24040", + "b3db47e210915250f7022d1e868c6661f7aa33e0", [] ] }, + "value_init.spec.js": [ + "b34cecef8fd62f02a33dd7de1cbeb061480f8705", + [] + ], "zero_init.spec.js": [ - "c7b21d5699e4f929c132b28027e334708b89a593", + "f29bf720d4ae7a2dcb026e21ac8a4eb7671917d5", [] ] }, "types.js": [ - "5810b8e9f1cc226443e67c54e5a02c6b286cb9fd", + "7855490eea9498f93b6345d1046fdc71a101bc0c", [] ], "validation": { @@ -3510,15 +3717,19 @@ [] ], "const.spec.js": [ - "2ab34e65bf59ca66ac7a50fc7bfb944a655abba9", + "700a680f34fc3f7f015b885383c5c92dc35366a0", + [] + ], + "context_dependent_resolution.spec.js": [ + "af2a3f172bc48c73b157835d919165027c5c0c36", + [] + ], + "let.spec.js": [ + "cfed50a2c90637ee10661b7412a13dd46676a9a4", [] ], "override.spec.js": [ - "561527a622540cb7ead1a83c5d8a27419af73e3a", - [] - ], - "ptr_spelling.spec.js": [ - "14e578b24409f2b4c63af4bd7425805d01199d04", + "abd02be5a9cb875b36618c91b5f8221a7b3d9fa2", [] ], "util.js": [ @@ -3526,67 +3737,107 @@ [] ], "var.spec.js": [ - "ff4f705d87892a002fbbc48242cb82886d498226", - [] - ], - "var_access_mode.spec.js": [ - "466c9e32cd5a68985755ce9d1f7153eacf2852d3", + "82bd326d0575cd7346704d0d83aa2e34aa280d49", [] ] }, "expression": { "access": { + "array.spec.js": [ + "401c919a2ac5b933d61cf87dda0848ae510e7879", + [] + ], + "matrix.spec.js": [ + "96d0078a27280cbac1ff9964196387d4c21b2057", + [] + ], + "structure.spec.js": [ + "d9b0380496b0898ffd42765e610a15d6503cc2f9", + [] + ], "vector.spec.js": [ - "b881b8ccf5812d306774b76fb56df5a4e5805a7c", + "7b90ce94049b751a0f970cb5dfcc2487d04416f2", [] ] }, "binary": { + "add_sub_mul.spec.js": [ + "cf1b68a855532dabbafa8ccd81260f0d5ee188cd", + [] + ], + "and_or_xor.spec.js": [ + "d53569ac161172980f00695232fefdf9b6cd14af", + [] + ], "bitwise_shift.spec.js": [ - "ff3e1ae525819bf06848aec3120a3a73e457dbf3", + "2894eafb016a1709f4c45f3091ddee41d624358a", + [] + ], + "comparison.spec.js": [ + "75ab1b6daa7ccd39c3e6978aab0b3d74582481b8", + [] + ], + "div_rem.spec.js": [ + "d09d60130551ab063134ca543cd670da1846f855", + [] + ], + "parse.spec.js": [ + "cf3ccef3399dc9c08f20c319cce0d48e7c868a31", + [] + ], + "result_type.js": [ + "d7a6d546a34b1afb9f7865eaa63321b6176d77fe", [] ] }, "call": { "builtin": { "abs.spec.js": [ - "255c8ab2e24079c07fd9ef64b1185b512c2463d3", + "407449d057b56c1689fdbed2f3a61e7c8cc7b67e", [] ], "acos.spec.js": [ - "d7caeca828b8e87a79340149190f2a47faf1dd35", + "0c96399268e898b04a0a52d4b5393bd4c1e8d65c", [] ], "acosh.spec.js": [ - "037d058fb6e7d0c923e5865e247ba062058d11a0", + "888c0ad4f743f63f4f1b8006ff50c13e3c5623b7", + [] + ], + "all.spec.js": [ + "83d2cfaf82912fd5a412f456b23f032f1e3f649b", + [] + ], + "any.spec.js": [ + "7298c941307c697619db4279aeeff9e3c2cd9c08", [] ], "arrayLength.spec.js": [ - "9a18b77e36f5e84c779f08aa1c89f17e7195878b", + "65c557156b54a8856b01ae9c2f3cb9700db78be6", [] ], "asin.spec.js": [ - "ec5c51fe15ba186991f8d6aa45ee768daa6936de", + "e12dbf6b2b8f40451571b3e270cec47153b1d34d", [] ], "asinh.spec.js": [ - "ccc73de0fce8230900a718edda703f1e8b2e964e", + "d958d09ba6da55a05be261d32b49d158daaebfcd", [] ], "atan.spec.js": [ - "2cd971e678dba1c682f39fa8d5a470e457651cdd", + "4c4c9ab70bf2bf14f3e7fab0acedd2386b2b3495", [] ], "atan2.spec.js": [ - "e0fded50b14b41d36ac7386719b636818797c073", + "2a5a558c87784b38284a55457f846e75331d4f63", [] ], "atanh.spec.js": [ - "e252551219b4fd53ded597dd8bf05c58ab270bbf", + "4218dcbc5508091f5f9fa1324cd480106972498b", [] ], "atomics.spec.js": [ - "3d51650c95d942ff48d47fe628d0f0c4311cd072", + "8e413b6ee5cf1f976ee191a5ace83d56d365d011", [] ], "barriers.spec.js": [ @@ -3594,135 +3845,439 @@ [] ], "bitcast.spec.js": [ - "71ef456929d85518ffc269d07bbd03d2cf76157c", + "613798288dd14093db816a4b087d8a6957d47068", [] ], "ceil.spec.js": [ - "714846eba8caa19efc6d8dbb5a138087712cc5f5", + "ed3fbc984a82303a3721765e3b2ed83764e1fc8e", [] ], "clamp.spec.js": [ - "ae83f29898c7174723ee478787b1b00acfd24983", + "e55db09017c5a60caa56f14ce677559d49849dcd", [] ], "const_override_validation.js": [ - "0b61930d7242060033326bbe5ae4a4b3a724fd62", + "c9a6e64cb983bc67928da7de1771ca78af7aac12", [] ], "cos.spec.js": [ - "4f3a485b5f493c984a99e727fee5c10937a377be", + "5d5cde71c7bab9528e804fe8851edfa6cbd21754", [] ], "cosh.spec.js": [ - "27f975252c7f9ed7ddc79dd9c1148c4041a5f051", + "a496f0184ef39c5c49bf5a290f4f32b8b89b73e6", + [] + ], + "countLeadingZeros.spec.js": [ + "549ff06a7d40412460c3287308ee17fa989024f1", + [] + ], + "countOneBits.spec.js": [ + "24ff7f79a5cf2cad5d534bd7664b44ce14b2b349", + [] + ], + "countTrailingZeros.spec.js": [ + "82af773fd34eac6848806242086f7c310b8fae60", + [] + ], + "cross.spec.js": [ + "50f50e44fbdc0269f76456358969186a7bbe0f41", [] ], "degrees.spec.js": [ - "10aac98de2c2e760794500eac08220a8ec33a8b0", + "2262cf9ab856824adeb94de78ba8e76856270b52", + [] + ], + "derivatives.spec.js": [ + "9a8113caf89a01515ab48e9bc0aeb6e7f1d31c6e", + [] + ], + "determinant.spec.js": [ + "8bade808a2659e33b2a0ce5edfd97b2a63447b1c", + [] + ], + "distance.spec.js": [ + "355a8f821634dc4cb7262b67f4fb5fe4f9c95360", + [] + ], + "dot.spec.js": [ + "56164710ca969bcd2db5de81d93a6eff2ad23614", [] ], "dot4I8Packed.spec.js": [ - "327e8cc13a6b5d37e6fdcc78911974f092a065eb", + "f72eb87f97dc2fe4e3d344a5f9ba35358e272eb5", [] ], "dot4U8Packed.spec.js": [ - "2f2a6c3cab025ed6de2100db7c7e74f09775d18c", + "315e69bfb9d7d18c726ff02688bbfa24aba17241", [] ], "exp.spec.js": [ - "74a88161140907659bbb6736e1a9e9300f179ea2", + "e677442d4a4e4d40292f6161c47fe5b2c156d22f", [] ], "exp2.spec.js": [ - "c38d5f90ef9f1e9210ddbddd36cc4ff9eefa793e", + "5455216d7527b2ebee8ed2e03fce31599a6ee577", + [] + ], + "extractBits.spec.js": [ + "fba6dc6bf7dbad39c8f549950ffe437bdd509381", + [] + ], + "faceForward.spec.js": [ + "77946e3e9e8f7b3612cae19c3126085ad7b7e58d", + [] + ], + "firstLeadingBit.spec.js": [ + "ab9224386805b33530de4b7a218c5050a392bbf3", + [] + ], + "firstTrailingBit.spec.js": [ + "9b0bc5f58fd901da9545cdea7b7d4be5b75a396c", [] ], "floor.spec.js": [ - "2c72c68649b858787641237f8b614c3ad1e4e779", + "6aa6f753104252614c2f707ba1d12df5eb81fde9", + [] + ], + "fma.spec.js": [ + "e18380f0cccb4b3d1c64ac76ba49d8676da1abdb", + [] + ], + "fract.spec.js": [ + "2eb0f5a7a380a3299e30023179654e9812047797", + [] + ], + "frexp.spec.js": [ + "e4a87551bbe1ef34e30cf0e240aafdd24fd81f7a", + [] + ], + "insertBits.spec.js": [ + "ecb124f558773848629ab4145c6d887d4cfbe279", [] ], "inverseSqrt.spec.js": [ - "bb6c089450f861a39c611f91245a6efacb790da1", + "128a9d390c4dd4bfb25193f9e259b3613d5d2f8d", + [] + ], + "ldexp.spec.js": [ + "cb22771798909a30fff50502fc18bc0d565f189c", [] ], "length.spec.js": [ - "12a28233e55051a431d4b215086c82d3aeefa5de", + "02cf2bd90c598db09c77d71472f1ab87104565c1", [] ], "log.spec.js": [ - "fb911b418832dd13116bfcb710649f2a38660d9c", + "5b735772350af756e0f017d4c23c9dd44ffd31aa", [] ], "log2.spec.js": [ - "4e538fbb77695ef8f7d784baef5089ed07274688", + "60403807a6ca26895447bdaea06ccd79230719c2", + [] + ], + "max.spec.js": [ + "6a550cfbc406a8f628258e67d31bcbb722befe67", + [] + ], + "min.spec.js": [ + "377480a0294ba4a22f90427c05c3dd7441dacdb1", + [] + ], + "mix.spec.js": [ + "4e480d9550e839e1e69b0ab6e77eabd54c494c5b", [] ], "modf.spec.js": [ - "d3937bc4f3473d46e432b0bb38c74099703def3d", + "fc5d4baff0086eb42674df37352efaaef63aa0e0", + [] + ], + "normalize.spec.js": [ + "b696401dbacc61d375f87dcef0cae58126e9b64e", + [] + ], + "pack2x16float.spec.js": [ + "7c75f2cbb4bd602257343670c69e20a66c10e869", + [] + ], + "pack2x16snorm.spec.js": [ + "1059208d458698fd6930c6b306db4e8a7d051a61", + [] + ], + "pack2x16unorm.spec.js": [ + "eb29dd5b4150b40f359658c580370f4f006c994e", + [] + ], + "pack4x8snorm.spec.js": [ + "09c9008d616e385f2491de3eea19d9d45749ba18", + [] + ], + "pack4x8unorm.spec.js": [ + "a0ff836f4454b53a64050542d0ca05f4fdc48872", [] ], "pack4xI8.spec.js": [ - "7247b5fa2bdf29061608895b6e1e101eb40ddc9e", + "4d9caa575c9e510987e2f335d87773422e6f08fe", [] ], "pack4xI8Clamp.spec.js": [ - "b84dacbf6b08042823c024e375ec08ad691ec5e1", + "dcd3af2633e47a70dc381f63bcc4fd24fe42ca37", [] ], "pack4xU8.spec.js": [ - "c9cf334f514cf53371474b2e4fbaffc71a54817b", + "ef5483c2aed7109cc4c7c068e09edb05c01a52ad", [] ], "pack4xU8Clamp.spec.js": [ - "b197d48b2a1169e8e9d00bce6c1c382663c95ab2", + "46505239aab93d5ec4e5e268ef681f6ec9b663a8", + [] + ], + "pow.spec.js": [ + "66e13ff2dfb24e8c7a065e8f5e209c6508160ec5", + [] + ], + "quantizeToF16.spec.js": [ + "cbea6ffa409ebe7ae66602a4f64ef48b51faa58c", [] ], "radians.spec.js": [ - "51e1c451a317eed6149b39fde8c99d7331eeccb5", + "6d8a5511dec27c93babac0068c08d52e9d6463dd", + [] + ], + "reflect.spec.js": [ + "f90cfc116a5d1f56cd6e7d1d12686027bd5cfb38", + [] + ], + "refract.spec.js": [ + "334a197b1cbf72ee16d23350e452a249e3406052", + [] + ], + "reverseBits.spec.js": [ + "f1560d6d06a158159fae4295f3bf8219634e7b27", [] ], "round.spec.js": [ - "a90c17e10c9bd5a8edcabb63587f27377b930cf3", + "2e9d63cb17a7ce7b75f07f1ae30b817c6034ba64", [] ], "saturate.spec.js": [ - "acf8bb059fe480278ef484e0ece3ff76760fcb8e", + "b5a10b986cfdc63d52fbc169bb3f846565415ac7", + [] + ], + "select.spec.js": [ + "7d3d56c2d50eac33d910c2bb615eaf8523be54c8", + [] + ], + "shader_builtin_utils.js": [ + "899f56b1b3805a4e9d4844a25f26c918bc4a698e", [] ], "sign.spec.js": [ - "7a08bac5f9328b71a00640ae53c97d34ad46e2fc", + "1e458aa9d031e11015721e175b5cdd74c5f24244", [] ], "sin.spec.js": [ - "716311f20ce850261e7c74b0355298e943cd2dbf", + "fd629bf7ed9ce5cc4a2bc862d228ceec2f070f45", [] ], "sinh.spec.js": [ - "c65413296080348d7e0c053189ad11fa0877cea6", + "e35fb84e7220e7ec70f4c2119dd6856adc77b7bf", + [] + ], + "smoothstep.spec.js": [ + "dbddd881077abf7bf7eca31eca68810d20572dc6", [] ], "sqrt.spec.js": [ - "4a2f254fef583023f8611d238eb3c0366f5125a8", + "acb432a539d3176ad627361ce5bd315fa43d78db", + [] + ], + "step.spec.js": [ + "6266a3628bcd6a8c95d9e7e1015fc3cf591b8c02", [] ], "tan.spec.js": [ - "91cee003edc32d9a82cbba8e0db0c1e3055cdca6", + "a7504ccb18d8bba03ff726753b3679b88b7fb262", + [] + ], + "tanh.spec.js": [ + "653f92663e665a443fa81f546192769e3b67fe71", + [] + ], + "textureDimensions.spec.js": [ + "420f52f1d1065496ff1fc86978bd114dffe00758", + [] + ], + "textureGather.spec.js": [ + "8673f0194e861ac6d75b6907d518dad28400c822", + [] + ], + "textureGatherCompare.spec.js": [ + "45cf1b9f90abf5e79da145f59d1b215f9319ec2e", + [] + ], + "textureLoad.spec.js": [ + "6853e91ec8817f64ed2618f88cd2fec6220cc557", + [] + ], + "textureNumLayers.spec.js": [ + "5db9a681f5acab7d3737e90f7f02a173f071faf4", + [] + ], + "textureNumLevels.spec.js": [ + "7215da7f63c8852f1cc3f6ff4bea177dfd4c1ffe", + [] + ], + "textureNumSamples.spec.js": [ + "1e4d4e678ffbff38f274c25f257160464163f7f1", + [] + ], + "textureSample.spec.js": [ + "9da3eabf87fdd836a0b1af1d084a9075e5d1489c", + [] + ], + "textureSampleBaseClampToEdge.spec.js": [ + "ed4081044e46e80c27cd9b3ddbeedc7b34ada685", + [] + ], + "textureSampleBias.spec.js": [ + "1f87bd8f564430c7e28e83a9ca4fe1b3d71aa59b", + [] + ], + "textureSampleCompare.spec.js": [ + "cb73edb24b661ed08a9fdb26da54a63bf809bb91", + [] + ], + "textureSampleCompareLevel.spec.js": [ + "74b1b77a330b85b561329e111468084876fade35", + [] + ], + "textureSampleGrad.spec.js": [ + "e6dd32378f1230d8d56f26a61114c0eacc6a40d2", + [] + ], + "textureSampleLevel.spec.js": [ + "fd46b94569b06dd15e4505fb80e9802ef071f0da", + [] + ], + "textureStore.spec.js": [ + "06d16ba81813e358bad2694f781d93626fd35fc4", + [] + ], + "transpose.spec.js": [ + "6897c6977dcee1913e1b7c523736a50859b3c55b", + [] + ], + "trunc.spec.js": [ + "a4ce758a7e1992d5c1f7a8aaa56589074ed3f12f", + [] + ], + "unpack2x16float.spec.js": [ + "3c09eece0505ef86ee9dd8bec132683d4c01f750", + [] + ], + "unpack2x16snorm.spec.js": [ + "ecbe4b2d1ea76a3b0c930f7844686a9e493a4ede", + [] + ], + "unpack2x16unorm.spec.js": [ + "e9dfacb65b3534390fedbe1949c398da7d3b76ae", + [] + ], + "unpack4x8snorm.spec.js": [ + "a2b02f95ef9d3b8c3d0a19ab2eec043c4efad55a", + [] + ], + "unpack4x8unorm.spec.js": [ + "b3f9cbdd6ba416a636a5c87b5ed8a4e1d60752cc", [] ], "unpack4xI8.spec.js": [ - "35e51529a136c6935dfbe0d8ceb5e24ff20a5824", + "bacab89a45b6a8ab08b53ae108e5edf6c1f7cde9", [] ], "unpack4xU8.spec.js": [ - "86c101fede7a9431e04148152add29b583a7e21c", + "aeef2e9a323166530699fba77b26b9c00f297411", + [] + ], + "value_constructor.spec.js": [ + "814fd57e07165eb4bc98c98dcd4d6c38559ce533", + [] + ], + "workgroupUniformLoad.spec.js": [ + "90c84eaa7845246fc08a7a41a5e5e6387294dcd4", [] ] } + }, + "early_evaluation.spec.js": [ + "d74e7f17cfbebec46a10e227875ee13201254d28", + [] + ], + "matrix": { + "add_sub.spec.js": [ + "4760c3b947885cbcd09ef64d9dfd1d417393ffb3", + [] + ], + "and_or_xor.spec.js": [ + "35a4a8f5547f9825abf5074aa84536451d588765", + [] + ], + "bitwise_shift.spec.js": [ + "efde94bf77db09e72d9d037d05dbb7cd4861dbb3", + [] + ], + "comparison.spec.js": [ + "77dbd65d44a03b27533eb8f189d800264a007ac2", + [] + ], + "div_rem.spec.js": [ + "7e85a89ed4e172559e38a24c37e32f99602196ee", + [] + ], + "mul.spec.js": [ + "d8ef4f2e752630ac3f1d60a8ca7a6f56f3c62a43", + [] + ] + }, + "overload_resolution.spec.js": [ + "9520d2b2512519ec821b9a9195ae8322df239eed", + [] + ], + "precedence.spec.js": [ + "f0dca1291e4d1ec23978fcf1222ca61e4af5733e", + [] + ], + "unary": { + "address_of_and_indirection.spec.js": [ + "b783220b308c2666935739343ac524bee241ee28", + [] + ], + "arithmetic_negation.spec.js": [ + "7d323f7bae8f51e326441c5cf9c633537efa01c8", + [] + ], + "bitwise_complement.spec.js": [ + "5dcc9a42f2a2e3b515cf0682e7799147c0a24424", + [] + ], + "logical_negation.spec.js": [ + "51820d4c79b44f3dbf7c5b1192de6de3b567e1cd", + [] + ] } }, "extension": { + "dual_source_blending.spec.js": [ + "c5ce9153d4b43af8c0a71a57ed3acaa67bafd427", + [] + ], "pointer_composite_access.spec.js": [ - "60cc7e35c203143539ca71c7f6d91f40d2cb37c8", + "50b0696a3aeede84a37b8ee9d9af1e82aa661894", + [] + ], + "readonly_and_readwrite_storage_textures.spec.js": [ + "7d983e9750716e2277748b436f9f6c1e870caedc", [] ] }, @@ -3732,65 +4287,25 @@ [] ], "restrictions.spec.js": [ - "eb6a788ab7448e93d768392555db108cbfdfd8e2", + "070b4203c636bdff4abb6d8c4c41b9a7dc94ef13", [] ] }, "parse": { - "align.spec.js": [ - "e0fae5a6930612a93c43feaac4b0d5291961c06c", - [] - ], "attribute.spec.js": [ "3d8a1ba9c9f52398a1ed82a68cdc3a36f20a326f", [] ], - "binary_ops.spec.js": [ - "d605a76293802570dc5b935eca93044564717ad9", - [] - ], "blankspace.spec.js": [ "e5e07597aedc259175a6a0642e189bbef32d28e4", [] ], - "break.spec.js": [ - "2a694f3cdcc41fc4f934e0314a823bf23ba4739e", - [] - ], - "break_if.spec.js": [ - "a525d1514b3ac842144c3da4279cfe0747bff0ac", - [] - ], - "builtin.spec.js": [ - "4d6dc7652b9c256048f8479247ee1bcfdbc6e291", - [] - ], "comments.spec.js": [ "9d23bbe2025e7b5e4d6df6d12d571451d37f9430", [] ], - "compound.spec.js": [ - "12fc0724d868e1943087b86afba4114a41bf6d78", - [] - ], - "const.spec.js": [ - "fcc431a82a7a7a6f042b664c0a6beccd97fc7efa", - [] - ], - "const_assert.spec.js": [ - "ba19057ecc34ff729a32b4109a5dbbaacd3b6642", - [] - ], - "continuing.spec.js": [ - "7f6825dcd3c31ba6bd792bb8f677a04e97537f9a", - [] - ], "diagnostic.spec.js": [ - "7b56bde7ac9bdef53c4cd20be510d8cecaaa83dd", - [] - ], - "discard.spec.js": [ - "d7e76f6bc6d99797d92f67335f856342fb84ae3f", + "addf21336e06b84088aa356b86a7c28e2ff84c10", [] ], "enable.spec.js": [ @@ -3806,41 +4321,37 @@ [] ], "must_use.spec.js": [ - "5c96cba5b968e21a0744b580df3319b68608bd76", - [] - ], - "pipeline_stage.spec.js": [ - "018a6022d7b1362f6143c00d1ea9541785474245", + "2f4e31efebe3cccda71184650529977ebff994ea", [] ], "requires.spec.js": [ - "a4fb9b6675b2e91647e2286eff1c44b6c69b105c", + "050feef2af97b874c20e7aa8f1becfba5e81012a", [] ], "semicolon.spec.js": [ "d2feb676b18cb49886a63e319048a5d9ffc9ea46", [] ], + "shadow_builtins.spec.js": [ + "a80ba712a33be5b60ccaa3739c3dfb21c41b041f", + [] + ], "source.spec.js": [ "11f28d904a60357a1e0faa615e252d14bd4bbc98", [] - ], - "unary_ops.spec.js": [ - "952cb9a8ed2bd048b3bd8353f6a716bb1df1e2b5", - [] - ], - "var_and_let.spec.js": [ - "75bf64e7eb13d9455a09e0f609782f80f9e8756e", - [] ] }, "shader_io": { + "align.spec.js": [ + "f405b14ef773170842a6bfccb613e64090703614", + [] + ], "binding.spec.js": [ "6e287bb6cdebb870af2097fbfde0a3b8b7fb6440", [] ], "builtins.spec.js": [ - "9aa013aa6104806a80d05005e67137166d0cbd71", + "57d56e175d4c2a84b68f84d8ade27dd27d2eea15", [] ], "entry_point.spec.js": [ @@ -3852,7 +4363,7 @@ [] ], "group_and_binding.spec.js": [ - "b63f33b4cff958673c73245deb97ed04e504c6e1", + "a280112acbcb2b4090aa112f39408b3750b2e3fc", [] ], "id.spec.js": [ @@ -3860,41 +4371,147 @@ [] ], "interpolate.spec.js": [ - "ec9adc012967accef61309d17d550c0d718d03b3", + "1799aea931e98b4a96e54a9c809b5967e9cf0cdb", [] ], "invariant.spec.js": [ "567fabdaf63d624bb4b2548d8067b636124ba364", [] ], + "layout_constraints.spec.js": [ + "1f595f7d23f3895ad8434071a7a682a22f067a41", + [] + ], "locations.spec.js": [ - "7dd5492283c3c2ab7ea221a35a04e154c71fb346", + "3acf43c6848c766f46d038e92c4e485c329972d2", + [] + ], + "pipeline_stage.spec.js": [ + "018a6022d7b1362f6143c00d1ea9541785474245", [] ], "size.spec.js": [ - "22eecfc399d3d564e121e9a9cc9e6f488d8fd92a", + "b9ad40058c81ed0832afaaf3307eaab106a98eaf", [] ], "util.js": [ - "934016eaeabdc7c0be44e2696b536dd903d8086d", + "38659014c88796d369eab9a762df1c10c5a96731", [] ], "workgroup_size.spec.js": [ - "4c8396bff085cc69519f4a4873b492a6f61ebb26", + "8f3a09e1039fe6f4d604e3a79c8f425fea1c1279", [] ] }, "shader_validation_test.js": [ - "efbfe6e00906988c53f88ccd2000671763e05822", + "82192482e21bd39b059841e65f5b191dea7bbc20", [] ], + "statement": { + "break.spec.js": [ + "2a694f3cdcc41fc4f934e0314a823bf23ba4739e", + [] + ], + "break_if.spec.js": [ + "a69f7a505bb9f2845376cb0122e27f9979d4140d", + [] + ], + "compound.spec.js": [ + "12fc0724d868e1943087b86afba4114a41bf6d78", + [] + ], + "const_assert.spec.js": [ + "ba19057ecc34ff729a32b4109a5dbbaacd3b6642", + [] + ], + "continue.spec.js": [ + "ed8a3b4cab6a52f9137031d5b2b3363c1991cfef", + [] + ], + "continuing.spec.js": [ + "7f6825dcd3c31ba6bd792bb8f677a04e97537f9a", + [] + ], + "discard.spec.js": [ + "d7e76f6bc6d99797d92f67335f856342fb84ae3f", + [] + ], + "for.spec.js": [ + "1cbd5e1dff03db5dd28cd9512899eb5279b7d8ef", + [] + ], + "if.spec.js": [ + "4b611ab3c9ead045a3456ac404d0385719d66971", + [] + ], + "increment_decrement.spec.js": [ + "245fb041c8a1c1c1db68030eef6fc87fdeb6c571", + [] + ], + "loop.spec.js": [ + "77ed4b0920fadea8d997987738fa59d4b99c6f0c", + [] + ], + "phony.spec.js": [ + "da106d26fbc718fb4c4379f82f08e30e302b9ede", + [] + ], + "return.spec.js": [ + "8c46a8a8eefc2d363b548b9cdf3a3723ac56b94a", + [] + ], + "statement_behavior.spec.js": [ + "95407a7d6821326a49aa77887c2c906e1bddda96", + [] + ], + "switch.spec.js": [ + "dcce0de1fbaeb9f70b7e05f7b2510dce4fe561a4", + [] + ], + "test_types.js": [ + "1b3fd8567a9664f14865ac393cae568b78da3c16", + [] + ], + "while.spec.js": [ + "04316f05c3136ace2a7c6403077a0648408e0bf0", + [] + ] + }, "types": { "alias.spec.js": [ - "012652df4ba9d3c155c210e7057449a77ef6566d", + "7a4b9626aea752eb859cc425b187a0bbd96e5bc8", + [] + ], + "array.spec.js": [ + "e8b704f4c65d91e92ac983275a3479db9d61a575", + [] + ], + "atomics.spec.js": [ + "59ed9f36151192dcbca982dfa269a97829c5add0", + [] + ], + "enumerant.spec.js": [ + "55757f327d0993074526a72edc1cc5f12a0e801e", + [] + ], + "matrix.spec.js": [ + "750767d66ad61483435e235de9161ea446d1ecb2", + [] + ], + "pointer.spec.js": [ + "9a205edd9ec267bbab79d4c08477e4d9251069f4", + [] + ], + "ref.spec.js": [ + "651a3fc1bb99022c38818ea0948f88c960424f6c", [] ], "struct.spec.js": [ - "80a60642321d8c9da3f621dabc09c6dcc3948517", + "b5f4ef5b19f08b5d1fff7d9b062bfca02ba3befe", + [] + ], + "textures.spec.js": [ + "085d450c297d4c55d89fa9997e374a656e41cfb6", [] ], "vector.spec.js": [ @@ -3904,7 +4521,7 @@ }, "uniformity": { "uniformity.spec.js": [ - "a808b17675bc7000446fafcdcd5146fb18448e3c", + "2c7464aecc1c070c394fe1f53ea96beabb062099", [] ] } @@ -3919,12 +4536,8 @@ "5e5ff177ffccd8b77bbfddd87e7a1d8c718ca675", [] ], - "buffer.js": [ - "0ce8bd858d8df11c51c7b14cbbf88ed5eb751fd5", - [] - ], "check_contents.js": [ - "ab0f794952025c4108db2b775942b07e80fd668b", + "f9dfc95549bb4401da8036453036328f10a48393", [] ], "color_space_conversion.js": [ @@ -3936,19 +4549,19 @@ [] ], "compare.js": [ - "e884e9a01f6f593b772c1bc3eee2587b7ea95c61", + "2b2cd9a751b60404b553f9e59452d8bad402248b", [] ], "constants.js": [ - "85cf24117c0c4d151c044cfe846b70ad011d99bf", + "332958cb24ff2f855026609030dc159473bc13dd", [] ], "conversion.js": [ - "81ebee69c8f6c54490e078192ee64e9e75ae124f", + "e6506d2c7d42879d67ff51069f2d768e6690ce61", [] ], "copy_to_texture.js": [ - "beaad649fee49cb5e9d5d49281ff5b6e7481bd18", + "5065bd11250186773c2e96789d05a7a6c098c1aa", [] ], "create_elements.js": [ @@ -3956,19 +4569,19 @@ [] ], "device_pool.js": [ - "84345c9e5a31987806bf186b995f294963c23c2c", + "a5a73d7c46cb54e53e8c0d5ff1af23ec9c6ca8b7", [] ], "floating_point.js": [ - "74743b0fe7ab934b3d3cd811381e74711510eaf0", + "5c53b46a8007d5cf47fe32e0f1248690be6782ec", [] ], "math.js": [ - "91cc091c21a9d33e873027af54079e7996927a97", + "e44458cfbd9f4e767bd01d6cd8983b52c0d7f4eb", [] ], "memory.js": [ - "e48ab32fc989b31751faca094c3bd65baedde87b", + "e178e54daff4fa13b576d262d58f8fc1882d18af", [] ], "pretty_diff_tables.js": [ @@ -3976,7 +4589,7 @@ [] ], "prng.js": [ - "9e456d734ea557fa7f64673b33d19f94ee2325de", + "cd2ce728810d1dfbd36f6c617a1d2a3016e18bf6", [] ], "reinterpret.js": [ @@ -3984,12 +4597,12 @@ [] ], "shader.js": [ - "cb372faaa7fe2bb2b324db55f4c9175b7592146f", + "c4fd89c3af6df929ec08efbf9e31052ecae6494b", [] ], "texture": { "base.js": [ - "99636b9ad906422dc6326a784f1227d28a9dafa4", + "282f6a95a472a7f5fe1f063a67227d8a9cb3543b", [] ], "color_space_conversions.spec.js": [ @@ -4001,7 +4614,7 @@ [] ], "layout.js": [ - "36603a1df47f44a3b78cb255678787ae15a92bfd", + "c4c83f6b25d7877da3204f4d2a9989cd9ebd9835", [] ], "subresource.js": [ @@ -4009,28 +4622,28 @@ [] ], "texel_data.js": [ - "602d642724f11e3c5a8b7f765aee3349c7075ca8", + "4188f047ec89da64a8eb1183b145c5116945e505", [] ], "texel_data.spec.js": [ - "ae985b0e844b4c067ec64910213927658ccb44c2", + "ae2c050444abe53d7d33036877f558895668cfb8", [] ], "texel_view.js": [ - "45953234f229b6fd5f7227f93fbcff83bb90971b", + "e61baf99e4468cdf4e680f6c35a4bcc17d55560e", [] ], "texture_ok.js": [ - "992cf9e96da786ca83925be2c0b53d23f5d4e30e", + "c4db13ebc5a6b0958277ef18491cd35cc36783bc", [] ], "texture_ok.spec.js": [ - "76198cb3b6bd37dc7fc1bd1a5ecd0f736071496f", + "48f4f64549d0a86ac62ccaca3a124ab97730dafa", [] ] }, "texture.js": [ - "c2c980c975efab53791376cc721d6612fe2f17fa", + "bd7dd92f94ec0c09391646e68b9acad9bacefd30", [] ], "unions.js": [ @@ -4041,7 +4654,7 @@ "web_platform": { "canvas": { "configure.spec.js": [ - "b87d9cef01eb0f386a4be4afdca845dfa642277d", + "58ebfb4af580458a55a59104f66e71a9fc43c48b", [] ], "context_creation.spec.js": [ @@ -4049,7 +4662,7 @@ [] ], "getCurrentTexture.spec.js": [ - "bd13bf4c29f40b00d02c3381ba36b2baf7350e56", + "729a7cdfaf7d43d4c1cdcb5a9a110b91b3572aef", [] ], "getPreferredCanvasFormat.spec.js": [ @@ -4057,25 +4670,25 @@ [] ], "readbackFromWebGPUCanvas.spec.js": [ - "9c9cabb9af71b461110338aa15fa08f23109430c", + "87d73d074556f8449c865dd9df2246de2a952c2c", [] ] }, "copyToTexture": { "ImageBitmap.spec.js": [ - "e5340e1872bd8aa37c15ca1f270899a3f3bbbff1", + "0ec99fdc591cb6dfd559269772eae499d2380b2d", [] ], "ImageData.spec.js": [ - "b285afa6cc286dbbc4954cff0345a0a1126b7638", + "32000fbb011847668fcc42c27a268aa78d4117e5", [] ], "canvas.spec.js": [ - "16133fb8f903bfb86547c2d8a87f419794eedc39", + "5903908611cb17e0558ec4380c15c72ac3a5e5bf", [] ], "image.spec.js": [ - "173bc9bbb700034162eb49255399033c3a9f5efc", + "1e8fed51d6f5f0614da75b212c8d9b64792264cb", [] ], "util.js": [ @@ -4083,13 +4696,13 @@ [] ], "video.spec.js": [ - "91d747e681735466b77659061ae7f8ac3bc1a8c2", + "9360e125fc2609b7aa98b3ee11007fc3869b4a93", [] ] }, "external_texture": { "video.spec.js": [ - "a5edc22085df1e97e0f63da8362c152def654e71", + "908287b3b04cb84511b7375d89ab9bd0a3fa0915", [] ] }, @@ -4110,6 +4723,10 @@ "81a424690656cd9c0dd7142b93bbd32bb1f16097", [] ], + "canvas_display_after_device_lost.html.js": [ + "3d62e515d0acf57928e81aec0fbfa301a0330232", + [] + ], "canvas_image_rendering.html.js": [ "c1c2fcf975ee4a2f560aaef5e334c1091967b0b8", [] @@ -4151,6 +4768,10 @@ "635625ecc784f1df061e9d97e21ee65db0ebfd5b", [] ], + "canvas_display_after_device_lost-ref.html": [ + "fbbbafb6fd0505f2ee04a02e720d34202ccbe029", + [] + ], "canvas_image_rendering-ref.html": [ "56e3453c56146e68b7833dcfbbb821f039f61848", [] @@ -4170,23 +4791,2707 @@ ] }, "util.js": [ - "cf78d2f778d3f1ad9e7a506c702fba4d0288786d", + "dc66e3c70dc48156024bd71320e4c1c94f59d98a", [] ], "worker": { "worker.js": [ - "8eff1ae8cdbcd510d593134d276f87cd0546578c", + "01524c66e5fe8282f6e95eeba168021e29689297", [] ], "worker.spec.js": [ - "56d07640e4402ac574482973faad6c06ccb3b3dd", + "43d796f828e1326383edb69b91d3b3166d635ad3", [] ], "worker_launcher.js": [ - "11c4a4e7e381f95c3826c409ad10e1d4359748c0", + "2024a96f8ebd0b42e614e454d19ec92242e73651", [] ] } + }, + "webworker": { + "api": { + "operation": { + "adapter": { + "info.as_worker.js": [ + "202dd2fcfdd21bc9c3a9d53440e49dd760bc62d8", + [] + ], + "requestAdapter.as_worker.js": [ + "006b7d926bbb8037475a226d281f51eef0dc075a", + [] + ], + "requestDevice.as_worker.js": [ + "8e5aa7a3290df62f3411f5abc0679e2a5ce0b52f", + [] + ] + }, + "buffers": { + "map.as_worker.js": [ + "ea5d50dcaa157a9a66230f1e9e4d44bcd9670d05", + [] + ], + "map_ArrayBuffer.as_worker.js": [ + "5f9c16e71a77c62b46af045bdee153d85ffb3c12", + [] + ], + "map_detach.as_worker.js": [ + "60ca0d6b7c74c70c3f7aee740897ca3f02a4fd18", + [] + ], + "map_oom.as_worker.js": [ + "c5adf88767355fb2460d826b6542e2ba18185e19", + [] + ], + "threading.as_worker.js": [ + "d65a38a7be305ddb271cfa6241edc4f2b35aa52c", + [] + ] + }, + "command_buffer": { + "basic.as_worker.js": [ + "56ebb361a1375749658fe86ebbfd61d582c4a457", + [] + ], + "clearBuffer.as_worker.js": [ + "ce7ed9a93defc59cff218ec81e558b073c9a76ac", + [] + ], + "copyBufferToBuffer.as_worker.js": [ + "4968696863dc5cc7e175146c7e2baf43e23575f7", + [] + ], + "copyTextureToTexture.as_worker.js": [ + "fac5b03ea746f6faec53f121d61ae2b998ef9b92", + [] + ], + "image_copy.as_worker.js": [ + "2e39a8358bbea82e50c4678369902f45807fe45d", + [] + ], + "programmable": { + "state_tracking.as_worker.js": [ + "8e17f588ad450477d05ae786a35d468769c5384a", + [] + ] + }, + "queries": { + "occlusionQuery.as_worker.js": [ + "de05375bbf7ad5f754faba09ffbd7edec42e0581", + [] + ] + }, + "render": { + "dynamic_state.as_worker.js": [ + "a5e0b76f3e96bec231ebcea9df7f8dc77352279d", + [] + ], + "state_tracking.as_worker.js": [ + "df05ffe4d31952b2224778c8d1df77a4fe34be67", + [] + ] + } + }, + "compute": { + "basic.as_worker.js": [ + "4129b0f122d6b11bbc4ce962e7e61ae4796f2189", + [] + ] + }, + "compute_pipeline": { + "entry_point_name.as_worker.js": [ + "e0359948b63a243dc84f722a2ed41bf975645bed", + [] + ], + "overrides.as_worker.js": [ + "8fedbc8f51fd67c3a1ef22a4a6243544336c45a1", + [] + ] + }, + "device": { + "lost.as_worker.js": [ + "afb13ff4f6a08bb2ca4832e6cfee8910713423fa", + [] + ] + }, + "labels.as_worker.js": [ + "e0dc7bae365e73248457c6c7f43f5666f54c0e3f", + [] + ], + "memory_sync": { + "buffer": { + "multiple_buffers.as_worker.js": [ + "c5aaa8eeb6426c880048ab2be9c26bfe219239ab", + [] + ], + "single_buffer.as_worker.js": [ + "a5db55c892cb1fdbe18fb3c499de6f7e197fc743", + [] + ] + }, + "texture": { + "readonly_depth_stencil.as_worker.js": [ + "4a91e7062caa99d760e9e4c6ce648ea4352420f4", + [] + ], + "same_subresource.as_worker.js": [ + "f716f5fbd2d32ee725730d68462d1e5b9656ef90", + [] + ] + } + }, + "onSubmittedWorkDone.as_worker.js": [ + "64fe2f204a22b68f98b3f0e65427c9e75d9b3f54", + [] + ], + "pipeline": { + "default_layout.as_worker.js": [ + "bb32229817ae1108c4d20c8f684c68bb2df89faf", + [] + ] + }, + "queue": { + "writeBuffer.as_worker.js": [ + "e471b6a15cf6ec5accb027d805a6fe2f07c2591b", + [] + ] + }, + "reflection.as_worker.js": [ + "bcc052b651a3a4d5978c5c69c9eb3d102aa0fd8a", + [] + ], + "render_pass": { + "clear_value.as_worker.js": [ + "aeb572ddc50a5c0b8dd465f7fd28116c8ce89e38", + [] + ], + "resolve.as_worker.js": [ + "ee1d6ac5b8d2a05faec36e9422bc42d2df59c96a", + [] + ], + "storeOp.as_worker.js": [ + "9fe4944f8e023e6e876ff9ce11a227dac8efae41", + [] + ], + "storeop2.as_worker.js": [ + "7b91a303028d4defeb482a0f81a3525c5d507ec0", + [] + ] + }, + "render_pipeline": { + "culling_tests.as_worker.js": [ + "b3e56a8171ce348dcb43030ae89e2b370a8572d1", + [] + ], + "overrides.as_worker.js": [ + "4d35070f204a9e12ec6e0a2208fe8c4c71861b22", + [] + ], + "pipeline_output_targets.as_worker.js": [ + "4752f3e5383089ff33630975412c178759d223c5", + [] + ], + "primitive_topology.as_worker.js": [ + "9e3664a3fe8796076de13184a33f2cc6def399bb", + [] + ], + "sample_mask.as_worker.js": [ + "148f38687ff82103694fef39308be0446469dabc", + [] + ], + "vertex_only_render_pipeline.as_worker.js": [ + "03c7feee04327ed8bb1390cd7e08efb3b81e5594", + [] + ] + }, + "rendering": { + "3d_texture_slices.as_worker.js": [ + "aa13489087b478849f149ee3dcc41f28cf0a03c2", + [] + ], + "basic.as_worker.js": [ + "5a68ad5d0f5db6d06fcd5382cd20d5a24e1b48eb", + [] + ], + "color_target_state.as_worker.js": [ + "e22643306d23db767815b8e77d52aed9cb79b11b", + [] + ], + "depth.as_worker.js": [ + "3887717ca0e8ab6eb11bdf269797062b9aabb42d", + [] + ], + "depth_bias.as_worker.js": [ + "164c83d8e9fdb5f25cf111eb6c849ffcdd47e867", + [] + ], + "depth_clip_clamp.as_worker.js": [ + "dbb129adad43beb00c6485ae020e5dd03a0877f7", + [] + ], + "draw.as_worker.js": [ + "4b7dcaa34a8b8fbac1dac5ae197c55a13e09ed96", + [] + ], + "indirect_draw.as_worker.js": [ + "1241861451fd7b51d2b1a007b3bef88169d54bcf", + [] + ], + "robust_access_index.as_worker.js": [ + "88dcfa7bfb6b89628c56bca9532ee9c4d219a043", + [] + ], + "stencil.as_worker.js": [ + "386683f8805d30b336e70c5231c6344c865a7acc", + [] + ] + }, + "resource_init": { + "buffer.as_worker.js": [ + "a17cd337c437bf132fc764698ebfedc87edeb99e", + [] + ], + "texture_zero.as_worker.js": [ + "e425408557f11d35387e9e8e02bb5a43f17a9660", + [] + ] + }, + "sampling": { + "anisotropy.as_worker.js": [ + "634e853bb92aa000f679b0fbd4ff48c258d57dc5", + [] + ], + "filter_mode.as_worker.js": [ + "992f61f32ab8744ec16a09075ba1e8492b6c4cfe", + [] + ], + "lod_clamp.as_worker.js": [ + "690ccdc922b98e0397c23152541167b0905af708", + [] + ] + }, + "shader_module": { + "compilation_info.as_worker.js": [ + "56650a37aeb23115bf591334fa4d56ebff63dedc", + [] + ] + }, + "storage_texture": { + "read_only.as_worker.js": [ + "1e1b3141cdcb8c23532c49aea713e8d26460e588", + [] + ], + "read_write.as_worker.js": [ + "68a7804b943b0ff0983d7ffb8cb91c83be6220ef", + [] + ] + }, + "texture_view": { + "format_reinterpretation.as_worker.js": [ + "149586acaed2424a56fae36e64bea75fbad9bad1", + [] + ], + "read.as_worker.js": [ + "9cae75cc80c2cd62cdff4f04c6b8dc2642b70c04", + [] + ], + "write.as_worker.js": [ + "d5a8fef0b543b5cb46bf958058a69b95b6d3de65", + [] + ] + }, + "uncapturederror.as_worker.js": [ + "7f58278d953780fe578a0d852e8a641e330f08dd", + [] + ], + "vertex_state": { + "correctness.as_worker.js": [ + "409931bddc2c9f4445e299aafeacfeaca3501309", + [] + ], + "index_format.as_worker.js": [ + "131b3eec8ac92d11e83c3e10d4be211e0ac28e72", + [] + ] + } + }, + "validation": { + "buffer": { + "create.as_worker.js": [ + "9956d030dbe5481abbf9417cd72ea09df6c55970", + [] + ], + "destroy.as_worker.js": [ + "0bc23d441aa1488691579845a20e5ae3bc71a062", + [] + ], + "mapping.as_worker.js": [ + "ced5a04bc2406645e223eb6fb1c758cec758c82a", + [] + ], + "threading.as_worker.js": [ + "87a0dcb5460d14840b79a66cc6e480b6c4b6804c", + [] + ] + }, + "capability_checks": { + "features": { + "query_types.as_worker.js": [ + "1b47f1ebe58d7b4f57a3706114cbefcfe64a754b", + [] + ], + "texture_formats.as_worker.js": [ + "46be9cf8e6887847fe1be4b4e3cf0bed5df887e3", + [] + ] + }, + "limits": { + "maxBindGroups.as_worker.js": [ + "a7ad4947d6fd306ebfe87d061fac3695056bcd9a", + [] + ], + "maxBindGroupsPlusVertexBuffers.as_worker.js": [ + "77da34e1b981029b022a8cfa06eef41170271da5", + [] + ], + "maxBindingsPerBindGroup.as_worker.js": [ + "34ce60042c9228c829b6579c080713bc3fc5870a", + [] + ], + "maxBufferSize.as_worker.js": [ + "e16e1a828baee0c4aba450a71b9310fe3ae0bcb4", + [] + ], + "maxColorAttachmentBytesPerSample.as_worker.js": [ + "53202de2525368590d48f69c9307d7c5beb987f2", + [] + ], + "maxColorAttachments.as_worker.js": [ + "93f409b9aa1407a2719ed817401fd9bd2b054547", + [] + ], + "maxComputeInvocationsPerWorkgroup.as_worker.js": [ + "ca774003d6128e96f39f66b8225391bafa7981ef", + [] + ], + "maxComputeWorkgroupSizeX.as_worker.js": [ + "cf2dfd7d83c16b0898fb24c92b32f19ba947aa57", + [] + ], + "maxComputeWorkgroupSizeY.as_worker.js": [ + "fac5b8adb7fa075d7c519ae49d0f9329751306b2", + [] + ], + "maxComputeWorkgroupSizeZ.as_worker.js": [ + "fc6ecee71add122aee7a7939316e2a71333e288a", + [] + ], + "maxComputeWorkgroupStorageSize.as_worker.js": [ + "c621df8750cf957d7c472a26d8ed4af1559e40f3", + [] + ], + "maxComputeWorkgroupsPerDimension.as_worker.js": [ + "0adb573ac3d6e921b9fc08378ea8b56a5c64a699", + [] + ], + "maxDynamicStorageBuffersPerPipelineLayout.as_worker.js": [ + "348f858ab9b92996dec1301733307317903fea64", + [] + ], + "maxDynamicUniformBuffersPerPipelineLayout.as_worker.js": [ + "2f8f6eac6b0ffe40ba1477debc771dd25d9edff4", + [] + ], + "maxInterStageShaderComponents.as_worker.js": [ + "5141c00a5c48901b601860dd8f2fba3f4d23a582", + [] + ], + "maxInterStageShaderVariables.as_worker.js": [ + "9eed84a023670dc1fdbd35f9febcea67682b7f03", + [] + ], + "maxSampledTexturesPerShaderStage.as_worker.js": [ + "4c786280458aa0a1eef98c00ba85e6ac59835149", + [] + ], + "maxSamplersPerShaderStage.as_worker.js": [ + "171c51ba3ee2e4ce28d415c8551077cdd16e509a", + [] + ], + "maxStorageBufferBindingSize.as_worker.js": [ + "fc013f5a33a0c8ff5029a67449e6068f88e68231", + [] + ], + "maxStorageBuffersPerShaderStage.as_worker.js": [ + "0534c599313b1b8be5e8b53c5df462bc4b87687b", + [] + ], + "maxStorageTexturesPerShaderStage.as_worker.js": [ + "7528bfcb768b0564f375493624675bb6558c2990", + [] + ], + "maxTextureArrayLayers.as_worker.js": [ + "d9d4a2695b7ae3320c7ba61f022d675edef714dc", + [] + ], + "maxTextureDimension1D.as_worker.js": [ + "b01d232fb117cc67b4b0d630184abec67ea3cc85", + [] + ], + "maxTextureDimension2D.as_worker.js": [ + "9e0be3b1412a7ec2ece259f2416da7c3c1b2957a", + [] + ], + "maxTextureDimension3D.as_worker.js": [ + "8b7ab4335e1ea89142bde25ab03594261a2437a5", + [] + ], + "maxUniformBufferBindingSize.as_worker.js": [ + "4b8569d2833a90a26f06eb8462533a5dd50db9b6", + [] + ], + "maxUniformBuffersPerShaderStage.as_worker.js": [ + "a39add9d222e9329d61128bd8eb83a2c8d890652", + [] + ], + "maxVertexAttributes.as_worker.js": [ + "e5fb866a61699ab83a5b37c1577c06dbca8f293b", + [] + ], + "maxVertexBufferArrayStride.as_worker.js": [ + "f8d938fcd89adc86984ded49b909b3036a2efe6e", + [] + ], + "maxVertexBuffers.as_worker.js": [ + "dead0eea960357ab3f4f819ff2ea6045a51acc8d", + [] + ], + "minStorageBufferOffsetAlignment.as_worker.js": [ + "11228efe7828d831b2e2ed8a5032dd12414f9c37", + [] + ], + "minUniformBufferOffsetAlignment.as_worker.js": [ + "b484c0f1dadb370ec32b53c354729e63f957d9b0", + [] + ] + } + }, + "compute_pipeline.as_worker.js": [ + "9ab87dd3891b665926ef3154e29b0e698be7c1d4", + [] + ], + "createBindGroup.as_worker.js": [ + "c28e40bba91bcd30e9ce2ec1bb66006088a74a19", + [] + ], + "createBindGroupLayout.as_worker.js": [ + "d0db0125d7cfe82ccf23e2fbad5a8afc822ec0ba", + [] + ], + "createPipelineLayout.as_worker.js": [ + "7931f8f0a2165030a38c60ac0c7957bc42d10e66", + [] + ], + "createSampler.as_worker.js": [ + "980383283b2c4fdc7cbc274d377c2bcd4a68a998", + [] + ], + "createTexture.as_worker.js": [ + "bc8d5ca90f836edf39f29f8cb2b10aed976e0ecf", + [] + ], + "createView.as_worker.js": [ + "7a6d9fc330231898b4b8f0580bc7f55ef4eb6947", + [] + ], + "debugMarker.as_worker.js": [ + "0fadeb557a0aa8b6e0e77caffd489bd28e35ad12", + [] + ], + "encoding": { + "beginComputePass.as_worker.js": [ + "2e321f4129605ceb394971e8b54548f9ee030741", + [] + ], + "beginRenderPass.as_worker.js": [ + "ed5e0d97b7fc99b7ab6db96e10954cfdd12ba37e", + [] + ], + "cmds": { + "clearBuffer.as_worker.js": [ + "dcbd091e774f1a4dc2d49a9f2fb9b810aa6355d8", + [] + ], + "compute_pass.as_worker.js": [ + "02ef60bff863adecb858b5c463ab4c8f712ec727", + [] + ], + "copyBufferToBuffer.as_worker.js": [ + "6627e8046580e0d28c44e119d4bf2023fd2cca4f", + [] + ], + "copyTextureToTexture.as_worker.js": [ + "d0806be0f71d41b60c0c622a26cca108f4db0507", + [] + ], + "debug.as_worker.js": [ + "e46686daa0b3cfbdd24d12ebd1d8768c3de257ea", + [] + ], + "index_access.as_worker.js": [ + "e0afa5f787eece9a1cbe378bf03eb4076556cf81", + [] + ], + "render": { + "draw.as_worker.js": [ + "830d3af791d940a9e2173bf3575194abfea57581", + [] + ], + "dynamic_state.as_worker.js": [ + "69993c2b18678a24b0236baab0d08132125a8c95", + [] + ], + "indirect_draw.as_worker.js": [ + "0fc8c4297ea4e8d3ccbabcc27ceafc300846c30b", + [] + ], + "setIndexBuffer.as_worker.js": [ + "e89a3d9e0b9f2ad5bd46c63b1d15d1b261709957", + [] + ], + "setPipeline.as_worker.js": [ + "7733659e3e4fd5529cd566e109c276f7d48e9fbf", + [] + ], + "setVertexBuffer.as_worker.js": [ + "506c30d2f26960c60db85c7242f8b926f232402f", + [] + ], + "state_tracking.as_worker.js": [ + "0670d300958a4bd4728edc636b866eeb962566a6", + [] + ] + }, + "render_pass.as_worker.js": [ + "1e72576a2b09995a0d61e6d78fd19e6ccf9b2427", + [] + ], + "setBindGroup.as_worker.js": [ + "25ac67208dbfe5a5c99a4e51de06e9fa98866ba5", + [] + ] + }, + "createRenderBundleEncoder.as_worker.js": [ + "67f3071613c5e20813127aac90c0a0781ab63bfe", + [] + ], + "encoder_open_state.as_worker.js": [ + "15124bde336d2a147b6a3e895566a9b5baf56fac", + [] + ], + "encoder_state.as_worker.js": [ + "f3a8102fd4b1c8d343cab35725c70e8f7d3b9ff7", + [] + ], + "programmable": { + "pipeline_bind_group_compat.as_worker.js": [ + "3d5af06ba05a5c82561c2541a6bf420fcb21f4ae", + [] + ] + }, + "queries": { + "begin_end.as_worker.js": [ + "b723940977a86e07d04556f161c179ef050bd8fa", + [] + ], + "general.as_worker.js": [ + "1a4a48d56ff2193ce8b33d850843d59c6bada7c4", + [] + ], + "resolveQuerySet.as_worker.js": [ + "ef133a2e6508bed7376ffd0a5148c2d6d982fba6", + [] + ] + }, + "render_bundle.as_worker.js": [ + "b711a626b7ebfb9a19a3c75754fb16a767662583", + [] + ] + }, + "error_scope.as_worker.js": [ + "4134bbb2d2e32e35de7dabb1db5ab82f8d05a4e9", + [] + ], + "getBindGroupLayout.as_worker.js": [ + "008f952ac37813f47929ccaddc341a145ad598ef", + [] + ], + "gpu_external_texture_expiration.as_worker.js": [ + "cc27a53cb32c8689b5d914c0d3260b071a2daa39", + [] + ], + "image_copy": { + "buffer_related.as_worker.js": [ + "2dd3ff15aa2a6ba18b1b58ddc83047898a49c9e1", + [] + ], + "buffer_texture_copies.as_worker.js": [ + "4198982692cba0c79a9bead20fa4c86e8bdbf2f8", + [] + ], + "layout_related.as_worker.js": [ + "82475148104580d7eebbec0d6e45eb8d862c19dd", + [] + ], + "texture_related.as_worker.js": [ + "750edbb59efa98fc8339f2beb27290d024fc42d9", + [] + ] + }, + "layout_shader_compat.as_worker.js": [ + "c62cff190f04ec67467cad1c606acd073d36eb3c", + [] + ], + "query_set": { + "create.as_worker.js": [ + "6b25b2e59a95962aa2d8c5c4fb8ab7e45456ecc6", + [] + ], + "destroy.as_worker.js": [ + "18c5be2780016b7355e4d4c68c90e820ff168643", + [] + ] + }, + "queue": { + "buffer_mapped.as_worker.js": [ + "2ef88aaba4203420cc36f9e2e2cf3f79538e4d6a", + [] + ], + "copyToTexture": { + "CopyExternalImageToTexture.as_worker.js": [ + "dbeb64983743263d681d5595540bf7538255579c", + [] + ] + }, + "destroyed": { + "buffer.as_worker.js": [ + "b6ace0141b9c78911c8215b2cee952e10021072d", + [] + ], + "query_set.as_worker.js": [ + "7d0ad59976f8fac6512dda35e615b1538d9f78e0", + [] + ], + "texture.as_worker.js": [ + "3a55f8ac8b2b0c030b4c4dae8c2f1f5fc79cd373", + [] + ] + }, + "submit.as_worker.js": [ + "dadadd8cca8940d1d1f29327f36299a2467faa7e", + [] + ], + "writeBuffer.as_worker.js": [ + "3b08d8f6f8319cf5f608fb5339eb47db52cb6b7b", + [] + ], + "writeTexture.as_worker.js": [ + "3c4aa50c90a96f079b1e766280fc30d3265a480b", + [] + ] + }, + "render_pass": { + "attachment_compatibility.as_worker.js": [ + "1e401477f955de9a902c8b16e77caf3e67576fa4", + [] + ], + "render_pass_descriptor.as_worker.js": [ + "5b0ff9dac3febfd103639b1395763ea0d770864d", + [] + ], + "resolve.as_worker.js": [ + "03c82fe256da1ab415c91dfa5a5e358b67f5f0d9", + [] + ] + }, + "render_pipeline": { + "depth_stencil_state.as_worker.js": [ + "6ac988850f9d320292b60c7f8466fb8453d1c145", + [] + ], + "fragment_state.as_worker.js": [ + "c72d44ea90b8ead2505c8bcff0c8ddb246e2f754", + [] + ], + "inter_stage.as_worker.js": [ + "1a15d1262cde284837e453dff113fa7b1218be18", + [] + ], + "misc.as_worker.js": [ + "8e4b205225e461727cd0d6d6b271ea09d9f40c45", + [] + ], + "multisample_state.as_worker.js": [ + "58e9dafa3549e00dfd0519620fcd237a46e15fcc", + [] + ], + "overrides.as_worker.js": [ + "0390971fa32b301103023a3ed2558e72990b90aa", + [] + ], + "primitive_state.as_worker.js": [ + "0989905dd12d98abe7d5c8519234e34146ee7c94", + [] + ], + "resource_compatibility.as_worker.js": [ + "34a92baee9de684211d7d8287efa2d96bff334e2", + [] + ], + "shader_module.as_worker.js": [ + "2a183cac86e9e44b1f421d205749f8600a0b88e7", + [] + ], + "vertex_state.as_worker.js": [ + "a9107e3782869a3f642b5b26074e5a9ea75f7781", + [] + ] + }, + "resource_usages": { + "buffer": { + "in_pass_encoder.as_worker.js": [ + "210d2a2db1626ae32744952bf4927fd7f6c033fe", + [] + ], + "in_pass_misc.as_worker.js": [ + "4f6eaca9c4944b728574f61fa62f52d61fd4c617", + [] + ] + }, + "texture": { + "in_pass_encoder.as_worker.js": [ + "77dabff1d4372a50c9468f11d8993945a7d5dbb8", + [] + ], + "in_render_common.as_worker.js": [ + "12158a6fd1afa3f28138cd7908ff2818b68d19c8", + [] + ], + "in_render_misc.as_worker.js": [ + "113a040aedd27d4858a2360180c54db23f9f8958", + [] + ] + } + }, + "shader_module": { + "entry_point.as_worker.js": [ + "6f395fba801c08c4fbcb628a524f465bd387201b", + [] + ], + "overrides.as_worker.js": [ + "e3144b7fc43d909a6e0638c3313aa9ee5f108fa1", + [] + ] + }, + "state": { + "device_lost": { + "destroy.as_worker.js": [ + "7aca2300190adffaf41c592a09285324715ce078", + [] + ] + } + }, + "texture": { + "bgra8unorm_storage.as_worker.js": [ + "e77ed783ae1407dc8209f9a41a9e4f0cc9a29659", + [] + ], + "destroy.as_worker.js": [ + "92b96ec9add12f9ed4716b6c0ef3bc876fac3b41", + [] + ], + "float32_filterable.as_worker.js": [ + "09ea5238bb724b4dd7e8c743741f3c6b19ed26ae", + [] + ], + "rg11b10ufloat_renderable.as_worker.js": [ + "795241e1d85ebf5056501f9267fe1c144a6a9f9a", + [] + ] + } + } + }, + "compat": { + "api": { + "validation": { + "createBindGroup.as_worker.js": [ + "2d81691f8f6cc87e0a2c4c8d1308319fd282fcab", + [] + ], + "createBindGroupLayout.as_worker.js": [ + "3305962eb8801e964b7d4697d36ffc6a62841e24", + [] + ], + "encoding": { + "cmds": { + "copyTextureToBuffer.as_worker.js": [ + "ad24236d47e6c77ecdbf5c55265debc94f6d41f4", + [] + ], + "copyTextureToTexture.as_worker.js": [ + "f8e1928824dc76b45a8e83019b597f92949651fe", + [] + ] + }, + "programmable": { + "pipeline_bind_group_compat.as_worker.js": [ + "af10ab581cacbf0e6264c7974efb02e841f088e3", + [] + ] + } + }, + "render_pipeline": { + "depth_stencil_state.as_worker.js": [ + "d24b5fa74514f8192bd6066859d93b6d8aa0be8c", + [] + ], + "fragment_state.as_worker.js": [ + "98196d03d1ddb8353e64c4ff4fae4aa8cc82a560", + [] + ], + "vertex_state.as_worker.js": [ + "20e8dd4ce76b832c370886876c11713e37b295ae", + [] + ] + }, + "shader_module": { + "shader_module.as_worker.js": [ + "dca678fc5c26b91498d8d00048f3b5241d67e011", + [] + ] + }, + "texture": { + "createTexture.as_worker.js": [ + "d0fb1f6d7062c371942727b34d272b4481c502d5", + [] + ], + "cubeArray.as_worker.js": [ + "53286a24886d18d50c09ea389b4c75f7f941e7a3", + [] + ] + } + } + } + }, + "examples.as_worker.js": [ + "ecd9374c221a3f2a2ffdfbf36fb9b6cfa821e5c0", + [] + ], + "idl": { + "constants": { + "flags.as_worker.js": [ + "f54be7798f8394ceaee43ca682fbb48bd28f35f8", + [] + ] + }, + "constructable.as_worker.js": [ + "fe624207cb847e62f7fed32a79c9a25beac4320e", + [] + ] + }, + "print_environment.as_worker.js": [ + "71ab073cc1bb4fc620dd51538329dbcebb396d1c", + [] + ], + "shader": { + "execution": { + "expression": { + "access": { + "array": { + "index.as_worker.js": [ + "9cc97b7c4e80929448ae770ec189dd630a79f5a0", + [] + ] + }, + "matrix": { + "index.as_worker.js": [ + "9538240899f947776802511c4fbaf9fce6cd78ee", + [] + ] + }, + "structure": { + "index.as_worker.js": [ + "9aa32ce479651d9b4916349ba962e88275281418", + [] + ] + }, + "vector": { + "components.as_worker.js": [ + "076c7fed905449844ba9568eee83074f2af4ebc0", + [] + ], + "index.as_worker.js": [ + "3781e618ff00355d5342b8825afef9d805362e3a", + [] + ] + } + }, + "binary": { + "af_addition.as_worker.js": [ + "3f25d7f105c79b1c750702e0686c663deb397d14", + [] + ], + "af_comparison.as_worker.js": [ + "7cf5dd3314409e2d5a95ccd2b08b558673fed0cc", + [] + ], + "af_division.as_worker.js": [ + "17a9993f954dbf067c155680046d27d2d5aa6215", + [] + ], + "af_matrix_addition.as_worker.js": [ + "2bc11305ae5456ad19307e7d1f99796d82c581f8", + [] + ], + "af_matrix_matrix_multiplication.as_worker.js": [ + "c22a0382f9e7f1cd9363fbfb2904542504ea0298", + [] + ], + "af_matrix_scalar_multiplication.as_worker.js": [ + "b5b23f073c596eb1725c2d1bf2c50ea5b95055d9", + [] + ], + "af_matrix_subtraction.as_worker.js": [ + "926d93f629753853fc635d82dca6eb6503da16ef", + [] + ], + "af_matrix_vector_multiplication.as_worker.js": [ + "8e2de76fda7fa052d699ad2c8e96e813173a1e4c", + [] + ], + "af_multiplication.as_worker.js": [ + "2a313bcbe754789953d8d92e32eb5bb24e5a72b5", + [] + ], + "af_remainder.as_worker.js": [ + "79ff0a10a74aa0f0b5c7ea93941a82759a96e1f7", + [] + ], + "af_subtraction.as_worker.js": [ + "59de223470ddde8be5054e3252790c28f36e495a", + [] + ], + "ai_arithmetic.as_worker.js": [ + "35c5bad2bb8d3c35633d7487b30ae71600e5cd7b", + [] + ], + "ai_comparison.as_worker.js": [ + "bf119f5a82e3dcc9648cc7927da90a124ef8ed2b", + [] + ], + "bitwise.as_worker.js": [ + "1b78a11416382a87737c4a5229a15d3e46cff3b6", + [] + ], + "bitwise_shift.as_worker.js": [ + "50df7799cc636a22abd1f2352b67c46d2dc70206", + [] + ], + "bool_logical.as_worker.js": [ + "c97a65500a5a0595e4a1e74a61db414b44f4028a", + [] + ], + "f16_addition.as_worker.js": [ + "b4d1ba4e9af51533bf75de99e2ffe64f63f1885a", + [] + ], + "f16_comparison.as_worker.js": [ + "343e81cd66f769bf70d835ac570dd97038b2fb4d", + [] + ], + "f16_division.as_worker.js": [ + "df89b1d70f458f262bcdafaa6ee260f39f347acd", + [] + ], + "f16_matrix_addition.as_worker.js": [ + "3d37d6b02817bdd3c4170afe4da4c29424119867", + [] + ], + "f16_matrix_matrix_multiplication.as_worker.js": [ + "f66a6197dc1e435e9776cf996f8ee290e17550a5", + [] + ], + "f16_matrix_scalar_multiplication.as_worker.js": [ + "560e1f8d73e55d6e2c44ceb81f422a9f3b2333be", + [] + ], + "f16_matrix_subtraction.as_worker.js": [ + "f8b9a5c9fbdecc192f9b59be92abafa5d2a59f6c", + [] + ], + "f16_matrix_vector_multiplication.as_worker.js": [ + "d15ae4e874ac431b17f75a5e615afb49c9ce94f8", + [] + ], + "f16_multiplication.as_worker.js": [ + "07a20c242ccd9c03f29b46507f7b4dee246b2668", + [] + ], + "f16_remainder.as_worker.js": [ + "2062f2f6c2dfd0ebebdc7967bec4ec9b1d2e5741", + [] + ], + "f16_subtraction.as_worker.js": [ + "0812e2596adde577ad7f76432355423a00368a00", + [] + ], + "f32_addition.as_worker.js": [ + "6a4e8567812d3dd5eb9bd618a7f4a0aba6ffd86d", + [] + ], + "f32_comparison.as_worker.js": [ + "24be70b2b148cd600d14f2c61604934772fccc50", + [] + ], + "f32_division.as_worker.js": [ + "c4c529c8f4c1e1e731ee1dcbcc98ca2297e42003", + [] + ], + "f32_matrix_addition.as_worker.js": [ + "f1782f5375d84a11ff9d972413bbfda5996b2670", + [] + ], + "f32_matrix_matrix_multiplication.as_worker.js": [ + "039780dcae0f3d0fef825de74a44267de036f768", + [] + ], + "f32_matrix_scalar_multiplication.as_worker.js": [ + "4438ac0342b961fadf6b1ba97ec19d2c6696de01", + [] + ], + "f32_matrix_subtraction.as_worker.js": [ + "02f57adfac11bceab65e8fdfcab6f43e269d371d", + [] + ], + "f32_matrix_vector_multiplication.as_worker.js": [ + "ddb363aaa400a11159050e1a931fa126f20f649e", + [] + ], + "f32_multiplication.as_worker.js": [ + "7fec7f76d561183ef9fba4511ce6a676b6076817", + [] + ], + "f32_remainder.as_worker.js": [ + "05b5a3c79f99839e4ecd3cdb7f515c16c5c7a3f4", + [] + ], + "f32_subtraction.as_worker.js": [ + "c227a5eab521adb9c35fed66f4e857cb71ec1b24", + [] + ], + "i32_arithmetic.as_worker.js": [ + "9cb5320d769df808cb45b6bef9f6aac822e3fac9", + [] + ], + "i32_comparison.as_worker.js": [ + "54b62bca2500b3f0d2e001b460a749bc815a1c79", + [] + ], + "u32_arithmetic.as_worker.js": [ + "a630ff22b3f19e1249c44841b04e174db95779b4", + [] + ], + "u32_comparison.as_worker.js": [ + "f554e8aa269bf255f8e67ef9dade16a96d62e8dd", + [] + ] + }, + "call": { + "builtin": { + "abs.as_worker.js": [ + "1a0c5737c40318b172407f674aca64a1679cd489", + [] + ], + "acos.as_worker.js": [ + "918deeca0aca0735e8379ca1f8c1b46b7d848afd", + [] + ], + "acosh.as_worker.js": [ + "eebceffa12d6be03e1be25baf73100b321e0b72c", + [] + ], + "all.as_worker.js": [ + "9232689fb1b164e4319a1892b703622af3bc32da", + [] + ], + "any.as_worker.js": [ + "ee03b527c32f3b893774e327895dcfcebb4b3dba", + [] + ], + "arrayLength.as_worker.js": [ + "d13d0e9412907cf8f84e94cb5eb54d49c57b1460", + [] + ], + "asin.as_worker.js": [ + "84b154faaefb5e3dffc260582b2bc3d0f023810e", + [] + ], + "asinh.as_worker.js": [ + "94eef38c0d30b600825e41546913aef6884871bc", + [] + ], + "atan.as_worker.js": [ + "0e583ed82f9c28c9a170e66f65d78c0b058ecf65", + [] + ], + "atan2.as_worker.js": [ + "04e39bb68ed1e4ea939e5d2b4a24d01af19856c4", + [] + ], + "atanh.as_worker.js": [ + "6c807c08bb473d53ef7c9c6761a2b8f28a5e50d6", + [] + ], + "atomics": { + "atomicAdd.as_worker.js": [ + "76f5f7443f39996824dc60b4d4d371812050b932", + [] + ], + "atomicAnd.as_worker.js": [ + "a86260b41425d0b4e80dfff4b58b20ff14b47a30", + [] + ], + "atomicCompareExchangeWeak.as_worker.js": [ + "ba86a542445e8ae3fa35fea7449e3709ec847202", + [] + ], + "atomicExchange.as_worker.js": [ + "53f4028fa4fd2d0a32a8a7e5d352aa8023ee2c7c", + [] + ], + "atomicLoad.as_worker.js": [ + "aac4f05de064892b6882a69c57cb6e1c1871d19d", + [] + ], + "atomicMax.as_worker.js": [ + "d000bc90add30dcc1214ee802068109fe2d1918d", + [] + ], + "atomicMin.as_worker.js": [ + "12db37164b1b026c183c0b50e7e209780f80aa87", + [] + ], + "atomicOr.as_worker.js": [ + "0416b23e84a798995fe707d1eb4a5548c3d97efc", + [] + ], + "atomicStore.as_worker.js": [ + "591ea6c1352df9432844b272b085c4a271985f63", + [] + ], + "atomicSub.as_worker.js": [ + "8767389e87c97f93c155b9270c98ced8ea27c8aa", + [] + ], + "atomicXor.as_worker.js": [ + "c239fc2797a155c254ef0b4e4ad8257dd7fa26db", + [] + ] + }, + "bitcast.as_worker.js": [ + "481abb1d26741b06bb71d8c071d5b6c3ff95cedc", + [] + ], + "ceil.as_worker.js": [ + "c24b27665db8ecfb2e6a54e72a123ba8898b6513", + [] + ], + "clamp.as_worker.js": [ + "19ab86e3ff7f1b134537e31cc01ca3302884a2dc", + [] + ], + "cos.as_worker.js": [ + "b10ddecef77b3fc387b35c046b3b889830c38d5e", + [] + ], + "cosh.as_worker.js": [ + "f5613135c46d53f62c6f4efcc48521f063afb71a", + [] + ], + "countLeadingZeros.as_worker.js": [ + "9b3e765eb2af63409442fdba79719b4bbc6e3846", + [] + ], + "countOneBits.as_worker.js": [ + "755c44f883979d790bc27a3dd9c85a03339ba262", + [] + ], + "countTrailingZeros.as_worker.js": [ + "023d8979a699aa1f9dd8992ea7ad056b0f0af678", + [] + ], + "cross.as_worker.js": [ + "e741a038c2a90128bbd09dd894003a3e090f4f2a", + [] + ], + "degrees.as_worker.js": [ + "11a9befc7cb4e2e884cfb0d75c067c0ef27a9c4f", + [] + ], + "determinant.as_worker.js": [ + "d7b2083a0cd9141398024cb1fb207001f8949d44", + [] + ], + "distance.as_worker.js": [ + "d08c9b959fce888d9b36800bc83622a732bb648d", + [] + ], + "dot.as_worker.js": [ + "ba9b9861c46f691dfbff872d056392f40a5fe7df", + [] + ], + "dot4I8Packed.as_worker.js": [ + "47e81aee2ce12ca7ab85c05f12dea0485870dc4f", + [] + ], + "dot4U8Packed.as_worker.js": [ + "1997d588839c4e35cd2023876d8d7e6cb9eaef23", + [] + ], + "dpdx.as_worker.js": [ + "1f23c8f7439ff6742b5bc53a8a5f2efd7579dfd0", + [] + ], + "dpdxCoarse.as_worker.js": [ + "332238aa98602601e0d37f4cd8561e10bfae0b66", + [] + ], + "dpdxFine.as_worker.js": [ + "45d0dd15f6ac2aaff79e61d6b09e03103b9097d8", + [] + ], + "dpdy.as_worker.js": [ + "d7fa774c700fae8f1f2950f21721a7b4d4447c9c", + [] + ], + "dpdyCoarse.as_worker.js": [ + "f818422cf43c6a67c8e50f4023fb016ec99664b5", + [] + ], + "dpdyFine.as_worker.js": [ + "b96b3c2d7b47aeb5c1031d79fe7d264aafff9d17", + [] + ], + "exp.as_worker.js": [ + "b3f99653b1209f501384d6f21df062480845a1d6", + [] + ], + "exp2.as_worker.js": [ + "943f79d3fad17a90c6383030c1dd154977c2e1e3", + [] + ], + "extractBits.as_worker.js": [ + "1e720dea491a43c4ac304846f9de72aae428a53c", + [] + ], + "faceForward.as_worker.js": [ + "771f30a6abe36c31d22a20a4f9da3ea6e34aabe1", + [] + ], + "firstLeadingBit.as_worker.js": [ + "560b19314cb2da7452cf7b77ed05c78cf55690df", + [] + ], + "firstTrailingBit.as_worker.js": [ + "6a4da57be151257c613d12a0437ab52e551de378", + [] + ], + "floor.as_worker.js": [ + "577ee0ff0fe797a03347b2cfb8209c8a3fc3e3ce", + [] + ], + "fma.as_worker.js": [ + "278df598650806aab9968c6df5fe600dcb8e7508", + [] + ], + "fract.as_worker.js": [ + "f96aff459eab1099506ae28958542f1cb6302106", + [] + ], + "frexp.as_worker.js": [ + "08efc30280647f9c65a987aa1f065671bb78b5f3", + [] + ], + "fwidth.as_worker.js": [ + "ebb0a1e6124cc3264d065935961afa87d3badc59", + [] + ], + "fwidthCoarse.as_worker.js": [ + "17e286ccf2054a52ba55ca586ad0f54a9db09852", + [] + ], + "fwidthFine.as_worker.js": [ + "a8ec6865ac2f6cca48b8f9076e7a2ae90e7d781d", + [] + ], + "insertBits.as_worker.js": [ + "244c0aef8d8f1159480a5e0d71b0df9751e5eb84", + [] + ], + "inversesqrt.as_worker.js": [ + "3808e163f6c996af06014468c36a02d86a7ca2be", + [] + ], + "ldexp.as_worker.js": [ + "538d662fe1645730f47e75c61d527b017a415077", + [] + ], + "length.as_worker.js": [ + "e9a7510c002d0ccead1c45fc34e4cd00757f6e1e", + [] + ], + "log.as_worker.js": [ + "a4726143d2745df01b6c57cb1ecfaf07d733862b", + [] + ], + "log2.as_worker.js": [ + "17f7b3123355540f001545b2a7c1d6722ee3cd31", + [] + ], + "max.as_worker.js": [ + "071ee77eb11a889d514994cf8e4fad6411ab63d5", + [] + ], + "min.as_worker.js": [ + "1f713e0877997b1de56507e74a51638a33e75055", + [] + ], + "mix.as_worker.js": [ + "8d31ff9367bd329ea2ac5092ff4c0998fd890c3a", + [] + ], + "modf.as_worker.js": [ + "b6f1af2f666b0ba6e1af1c861f89ede746092cb0", + [] + ], + "normalize.as_worker.js": [ + "41eba8d1ea447ca49eec985ab6c39ab1c76bbe22", + [] + ], + "pack2x16float.as_worker.js": [ + "0b607cc615578d8a94a67d5e24455dbd6925af86", + [] + ], + "pack2x16snorm.as_worker.js": [ + "f4b1a9fc964d79bbdba7214f8870ddfcd241e881", + [] + ], + "pack2x16unorm.as_worker.js": [ + "867aacc60844758fc49c53ae3cc778c0357536e9", + [] + ], + "pack4x8snorm.as_worker.js": [ + "80520d1f0b71eb24e1ca05457acdd862b1a2c50b", + [] + ], + "pack4x8unorm.as_worker.js": [ + "d78be03afbb324f3d2c20295252af21caae7b29a", + [] + ], + "pack4xI8.as_worker.js": [ + "9e15ccc5c7a18e61d78056e12222da84419a64a7", + [] + ], + "pack4xI8Clamp.as_worker.js": [ + "2f3e6fe2dac5c181ca58852fb68b05c2cfab476f", + [] + ], + "pack4xU8.as_worker.js": [ + "fd46e2f76bb5b527dfcfc6123a1be0f7d88b1958", + [] + ], + "pack4xU8Clamp.as_worker.js": [ + "6f3ddc8d63123a3ea5144276305ef2f280ed8b0f", + [] + ], + "pow.as_worker.js": [ + "6bd477c788d8dc0e4c7e1db98d3186c57d90adea", + [] + ], + "quantizeToF16.as_worker.js": [ + "d99fc9bbaba6b2f82285d607161070ffc1e65412", + [] + ], + "radians.as_worker.js": [ + "19f07b4d98be204e0da4b223f13dba1a8ae7c684", + [] + ], + "reflect.as_worker.js": [ + "cd834840ad07cab7c6a00267c55452570703e05d", + [] + ], + "refract.as_worker.js": [ + "a8a1de177df0a9bbbdf76a0baf6b8d0c71a354f5", + [] + ], + "reverseBits.as_worker.js": [ + "11f63b1017cfe723cbecfffbbb664247112de3d1", + [] + ], + "round.as_worker.js": [ + "3d159b67182d88bd351ac64f825c54345bc5e40a", + [] + ], + "saturate.as_worker.js": [ + "81d2f8f62fa75f095aa873acf9a0e3dd8d76246a", + [] + ], + "select.as_worker.js": [ + "35a204c1c1344966350d8d52ced4ebb498bd6591", + [] + ], + "sign.as_worker.js": [ + "7125ebd4ea48a286ad6e9da84dc6932dedf49c6e", + [] + ], + "sin.as_worker.js": [ + "9cd044bf3bfe4337a2bfb19ea44cd31ba2eb7fcf", + [] + ], + "sinh.as_worker.js": [ + "d248983ec1f56496036c2838cf136d45a5f2a5dc", + [] + ], + "smoothstep.as_worker.js": [ + "e7c6422316413c8fd9166e6fb1658f12c7470e4c", + [] + ], + "sqrt.as_worker.js": [ + "c5718ef57135931e9413d3bee7f67b96c2ede2c3", + [] + ], + "step.as_worker.js": [ + "78b2e7056d510ce2e4a4b1e75c17373c9834b679", + [] + ], + "storageBarrier.as_worker.js": [ + "bc402636419fdfb7b671867ff8259cd7199d91b1", + [] + ], + "tan.as_worker.js": [ + "4ed7807bda8e1fb08cb54f2818f7e3e72e7d63f3", + [] + ], + "tanh.as_worker.js": [ + "f24791180a49b30e59be87d82844a366a99c2410", + [] + ], + "textureDimensions.as_worker.js": [ + "eda70ffb331131a58b4039eb899c39f98166dd82", + [] + ], + "textureGather.as_worker.js": [ + "c632b85bb848d046298be4a9ec85567d1197d8e5", + [] + ], + "textureGatherCompare.as_worker.js": [ + "cf00fc8ae668cefd7d24094d132e1e4d0cf42383", + [] + ], + "textureLoad.as_worker.js": [ + "3f7aeaf39b49065b3b817606dbc399c85377ffb6", + [] + ], + "textureNumLayers.as_worker.js": [ + "5cad50f39dd8002f879fbff68c5637fb5b87591d", + [] + ], + "textureNumLevels.as_worker.js": [ + "d1d13ca8f147f0257e4b0db4fa25bb062940e729", + [] + ], + "textureNumSamples.as_worker.js": [ + "3636b6fc5cee6399d19b809b607bf9d17ac48fdb", + [] + ], + "textureSample.as_worker.js": [ + "8d6cffd9725bc40fc588d6c4c9d6baee1133ce83", + [] + ], + "textureSampleBias.as_worker.js": [ + "6f15b0455f0fabd2e7793051bec282abb49a4a20", + [] + ], + "textureSampleCompare.as_worker.js": [ + "7b2442f62e1d1dc48dae912ea89469874817eddd", + [] + ], + "textureSampleCompareLevel.as_worker.js": [ + "ce8edf2a39d9d08f1887fe20c8c147b3d90e34e8", + [] + ], + "textureSampleGrad.as_worker.js": [ + "4b93570bb637579551f412b7718330cf97fb338f", + [] + ], + "textureSampleLevel.as_worker.js": [ + "36c0342b3c55a64608c9062018161870c46f69f1", + [] + ], + "textureStore.as_worker.js": [ + "7c3ef351efa172a9b17c696ceba585f32c463db0", + [] + ], + "transpose.as_worker.js": [ + "ad5e60d152c8e4045569561d62d1126b6afc59c0", + [] + ], + "trunc.as_worker.js": [ + "0b312f07a8229539b5318dc65e81b7fd95035e2f", + [] + ], + "unpack2x16float.as_worker.js": [ + "b2fd425c06765e5ed83f22e6601d74c8328d726d", + [] + ], + "unpack2x16snorm.as_worker.js": [ + "6eb4703282792a10dd5b0b5f4f0a2d2fe663a7cf", + [] + ], + "unpack2x16unorm.as_worker.js": [ + "6b8b918cf09cc394fdc4e72b4aa78aad6207b067", + [] + ], + "unpack4x8snorm.as_worker.js": [ + "281dd18ee9de8ccb927790cc9c2feed4af254fe2", + [] + ], + "unpack4x8unorm.as_worker.js": [ + "d67901b286434c5b65c17721e26267441aa8f794", + [] + ], + "unpack4xI8.as_worker.js": [ + "c5b84ae2c549ac2957a88e2615c5feef565a3a45", + [] + ], + "unpack4xU8.as_worker.js": [ + "59d7cf25b3d45cf5ec938a843155c30e01619dc6", + [] + ], + "workgroupBarrier.as_worker.js": [ + "5a2ff0b830239f638163728d68abdb89a8df70eb", + [] + ], + "workgroupUniformLoad.as_worker.js": [ + "9b341af87dfdb4af2a8f2e76b01e6a4e014fbbb9", + [] + ] + }, + "user": { + "ptr_params.as_worker.js": [ + "850fec5f5f74eab6e563836c9125d5254136fd09", + [] + ] + } + }, + "constructor": { + "non_zero.as_worker.js": [ + "ae66debc946fce8e0afee11f23561cbe489cdae6", + [] + ], + "zero_value.as_worker.js": [ + "9ddbaa9daeeff2d0d1abbdb8955896677d6800dd", + [] + ] + }, + "precedence.as_worker.js": [ + "a83f045413a3a44fdddb8361904397fe2588b332", + [] + ], + "unary": { + "address_of_and_indirection.as_worker.js": [ + "e8939856929e0bec190a1e5f32f18d73bd1023a3", + [] + ], + "af_arithmetic.as_worker.js": [ + "d0c1b8f3d50ff4a7b44cb880940d04c9d24a7cf1", + [] + ], + "af_assignment.as_worker.js": [ + "cc871a1984f6f57e4c2f2197d6ee3104bf77a94a", + [] + ], + "ai_arithmetic.as_worker.js": [ + "ba35df71861d0ff39ca67b4cf412753817c67f71", + [] + ], + "ai_assignment.as_worker.js": [ + "9431211f171b4f89a604d3c41970e36e0086d528", + [] + ], + "ai_complement.as_worker.js": [ + "db525f760b112a9b073e4329ae77bbe4f8715b7b", + [] + ], + "bool_conversion.as_worker.js": [ + "303fc054efe71c6a35ef8e4af64ee0430546e4f6", + [] + ], + "bool_logical.as_worker.js": [ + "77674f07c771397887456f4b4fdc5c681d919db3", + [] + ], + "f16_arithmetic.as_worker.js": [ + "1bcd1bdd23fc01bf1b963abdb9478d102f45efbc", + [] + ], + "f16_conversion.as_worker.js": [ + "a6b5ac343aa30941f30e550ec0adb7eb98e7f03c", + [] + ], + "f32_arithmetic.as_worker.js": [ + "8ec016fb008b9e8439828038731eb7fe192093be", + [] + ], + "f32_conversion.as_worker.js": [ + "d175bd5dca55cb234a563a4b15c355b8ae97740f", + [] + ], + "i32_arithmetic.as_worker.js": [ + "f435320547a28fe0c6f1a5b06e364e67af0246de", + [] + ], + "i32_complement.as_worker.js": [ + "00ea9f8c2581def34c24ec748abd1bf48536bf68", + [] + ], + "i32_conversion.as_worker.js": [ + "28302ac1fc9bdcfb5d1801e0e36b2429aa18e16e", + [] + ], + "u32_complement.as_worker.js": [ + "c2a5ca068860d8867354de1bedec49042285f36e", + [] + ], + "u32_conversion.as_worker.js": [ + "ac55bd61e2dd293029a3da96993e3b2d698e4117", + [] + ] + } + }, + "float_parse.as_worker.js": [ + "070bb888f61892bf3bb9466a4474bb1c36510902", + [] + ], + "flow_control": { + "call.as_worker.js": [ + "03930d032c84bd11c07cc3e650911c6c4c57bef7", + [] + ], + "complex.as_worker.js": [ + "1cd99e11c065c81e4fa107f1834977e70d254416", + [] + ], + "eval_order.as_worker.js": [ + "78b9b84fd390a2906335f10d88a9f0087638466e", + [] + ], + "for.as_worker.js": [ + "379c29f9ce65d96ecb51359078c673060c5123df", + [] + ], + "if.as_worker.js": [ + "9b086d3ed7275840f7b65736b65ba485f498af92", + [] + ], + "loop.as_worker.js": [ + "bab864b5c38a419079a6c05c6b8ade87959c644b", + [] + ], + "phony.as_worker.js": [ + "5badcd1df833b04dbb4149a58a151154c85f4d48", + [] + ], + "return.as_worker.js": [ + "8e545f3fae0be83018ef5ce15ddd12bf6bbd3137", + [] + ], + "switch.as_worker.js": [ + "845493427b904c22d40f991c3c19a2f2ad771aa1", + [] + ], + "while.as_worker.js": [ + "3eae34839091687b93f12ca750a6180f228220e7", + [] + ] + }, + "limits.as_worker.js": [ + "046704071e14545d7c6685692f3eb79b69d6ad35", + [] + ], + "memory_layout.as_worker.js": [ + "a89aac4149b07b03f12a566170989a59254d8b58", + [] + ], + "memory_model": { + "adjacent.as_worker.js": [ + "3c7ead1467f522b2c67e8c8318f4bd34ed7e07d1", + [] + ], + "atomicity.as_worker.js": [ + "d26549c1e3bd4656c3047602d1e147694820492b", + [] + ], + "barrier.as_worker.js": [ + "e97bc4eb86710767ce322b9886f78e168d72d60e", + [] + ], + "coherence.as_worker.js": [ + "289c01b354614767bbd66643b9c729a8cc6072c0", + [] + ], + "texture_intra_invocation_coherence.as_worker.js": [ + "00a5fabc3a3bc601e34c73f2a2707db766c1d81b", + [] + ], + "weak.as_worker.js": [ + "fc4486c6e33d34580f0c2e3317f83535e4728617", + [] + ] + }, + "padding.as_worker.js": [ + "23e642f6c1422c8128d667e78b136d2c41961828", + [] + ], + "robust_access.as_worker.js": [ + "965170500765e95029e6ffa2c331177366ff5390", + [] + ], + "robust_access_vertex.as_worker.js": [ + "909c40a7974633ae41e0a285566b224120654231", + [] + ], + "shader_io": { + "compute_builtins.as_worker.js": [ + "10509037693ed5050d7872f02e3601a87802c396", + [] + ], + "fragment_builtins.as_worker.js": [ + "b8332b455a21604b1f076410434912dec9cd5699", + [] + ], + "shared_structs.as_worker.js": [ + "399b32a33b17205f7fd21e436b90fe3bb8588887", + [] + ], + "user_io.as_worker.js": [ + "2b4570a48c0d1759ea7886ad25a53373de475a6e", + [] + ], + "workgroup_size.as_worker.js": [ + "31827b5e391be042cda3aa18d4ec4faf569ae811", + [] + ] + }, + "shadow.as_worker.js": [ + "b0c166c51cda6b437187210197cf18569a33f17c", + [] + ], + "stage.as_worker.js": [ + "c30bb087de6748358722794fae09e4c6ebeb7f8d", + [] + ], + "statement": { + "compound.as_worker.js": [ + "e25b55ffdfb281d4630a48a85cbcfd6567a670e5", + [] + ], + "discard.as_worker.js": [ + "16353062fd751c71c299d1e8134f0335c1375528", + [] + ], + "increment_decrement.as_worker.js": [ + "6d82f16828769ae9669ee3189da92ac9b399126d", + [] + ] + }, + "value_init.as_worker.js": [ + "a98b9a0b8b5249e5c7c3fe533dd5501d69829a57", + [] + ], + "zero_init.as_worker.js": [ + "5e79410031e5bca99a5f15e45940d4360c359e46", + [] + ] + }, + "validation": { + "const_assert": { + "const_assert.as_worker.js": [ + "58990b9148f562f7fa5db3b2d15ba4bda6e1c3ee", + [] + ] + }, + "decl": { + "compound_statement.as_worker.js": [ + "815908c745c15f52a320159fd865d39a587b0639", + [] + ], + "const.as_worker.js": [ + "37baed5e7ffca304894d2c282c4489b07a1446f3", + [] + ], + "context_dependent_resolution.as_worker.js": [ + "c2ebfd9e90f5f7593b67b965952f13856ae1e701", + [] + ], + "let.as_worker.js": [ + "75234ef572e3df6cb71a3e72dd1877cd19baeb46", + [] + ], + "override.as_worker.js": [ + "bfe7adb3c1cec05df2fe11c5a4a2bd3ac9675a6b", + [] + ], + "var.as_worker.js": [ + "832a4601cfaeb7c42bf2266a2642e6654428b652", + [] + ] + }, + "expression": { + "access": { + "array.as_worker.js": [ + "3d2c85bce5c5fa11876bf028b73b14356a1be478", + [] + ], + "matrix.as_worker.js": [ + "68ef5095f726c04a4ac3111d979b5cebd21c69c1", + [] + ], + "structure.as_worker.js": [ + "dfac1f75d71dd09ee9d46820d60bcddd2c923da5", + [] + ], + "vector.as_worker.js": [ + "dc667d4538291f7f9e9c275b3fbd33928930e401", + [] + ] + }, + "binary": { + "add_sub_mul.as_worker.js": [ + "34ae46a86f30399a4def7bdb48bfd96fe4e92ad3", + [] + ], + "and_or_xor.as_worker.js": [ + "d5423e6225951451761bb50caab9b3ab779c6e53", + [] + ], + "bitwise_shift.as_worker.js": [ + "b1b74edf0272ccc07c17f899aba134feaa11546f", + [] + ], + "comparison.as_worker.js": [ + "b44f38ccee2a9266f2cd1ebc55b32bb3e9dbda8f", + [] + ], + "div_rem.as_worker.js": [ + "4d1e0c841d91fef114f899b4724376008fd7437e", + [] + ], + "parse.as_worker.js": [ + "58165f7a8c946972f7acb5046e447a797197409b", + [] + ] + }, + "call": { + "builtin": { + "abs.as_worker.js": [ + "efa3463179799aabcbb5e9d481e284d2bcdeaabe", + [] + ], + "acos.as_worker.js": [ + "0575195da9e5d176cef4e7f00209e2924822cea1", + [] + ], + "acosh.as_worker.js": [ + "ede7c1e3d1c5960a7bb965d3d9afcf85a4eb0ef0", + [] + ], + "all.as_worker.js": [ + "e7440848776ca71a1c3633f5766216afb9d299ea", + [] + ], + "any.as_worker.js": [ + "f79ee3ccb266a90316e48f43e1a4bab0754a47b9", + [] + ], + "arrayLength.as_worker.js": [ + "efea85fabfeea36472c06b2ca89a0720e0e81e86", + [] + ], + "asin.as_worker.js": [ + "d8037c639e608a8a7fd39b11fd35d53500713a89", + [] + ], + "asinh.as_worker.js": [ + "255cbdce4cf42a7014f542d9df4bd68eb72e8b67", + [] + ], + "atan.as_worker.js": [ + "7dd62768780869007494ed021a202f2fb10d3403", + [] + ], + "atan2.as_worker.js": [ + "db2d9a6ac3509f1841d8acd50300cc9ac962b54d", + [] + ], + "atanh.as_worker.js": [ + "2d610e868a0985867a9006ce00aaf1f789e9bcca", + [] + ], + "atomics.as_worker.js": [ + "94fa14244ec9aee69f6cc9ad3477dc51f82b4c6a", + [] + ], + "barriers.as_worker.js": [ + "6055fde4658e4d77319ed7cc46a2c68d98b9a4a3", + [] + ], + "bitcast.as_worker.js": [ + "00b3673e4bcf96e89c15934d70e8c6e779faa87e", + [] + ], + "ceil.as_worker.js": [ + "ab5ec7adf7875c3bd3547294ea8bd04358b2d6c8", + [] + ], + "clamp.as_worker.js": [ + "3d09f8f68d3d40c872495b3918b3fe9dfcc3c5df", + [] + ], + "cos.as_worker.js": [ + "cf9af678f328aa741e0d259f689ff173d4881ec6", + [] + ], + "cosh.as_worker.js": [ + "e29d253a6fbdf7430a0ad92b5784c3dc2b2482ca", + [] + ], + "countLeadingZeros.as_worker.js": [ + "1555d2b2115433d963cfd7f11a4cab9de3f45e19", + [] + ], + "countOneBits.as_worker.js": [ + "7116dae8ba0fada2fa016394c9405d2183a850fc", + [] + ], + "countTrailingZeros.as_worker.js": [ + "fab97cbfd796f5ee1f2f2e667eae09c871deb645", + [] + ], + "cross.as_worker.js": [ + "7a69266441b9661ec0eaa32419f6d332050435be", + [] + ], + "degrees.as_worker.js": [ + "b5653c8ca1094cdb1b5d89491d4ab15b7bb3c490", + [] + ], + "derivatives.as_worker.js": [ + "3c127105b9c3b9a0f3bba7bdd047af7907d2ff12", + [] + ], + "determinant.as_worker.js": [ + "191c4352e40bae7b11ac27d4aac1eaff16117e6a", + [] + ], + "distance.as_worker.js": [ + "0d7c43c2a1b3a025fb6817935eb1da13c3805df0", + [] + ], + "dot.as_worker.js": [ + "6af52a5dc18dd03fb42faf1b8e2044fe2d90680e", + [] + ], + "dot4I8Packed.as_worker.js": [ + "f30e513574f3ff2c330b2ef72b1960fcc2ae7c2e", + [] + ], + "dot4U8Packed.as_worker.js": [ + "decdbc1387f42f68c9f36a833d199ae6c2fab6dc", + [] + ], + "exp.as_worker.js": [ + "247338299d4f908aeb81f14ccf1688506472074a", + [] + ], + "exp2.as_worker.js": [ + "1f6aaf585bd3b1440e258fc5cd083f91dfe8e0ca", + [] + ], + "extractBits.as_worker.js": [ + "a869a585ef92ab4f4953db054d8925b8935c384f", + [] + ], + "faceForward.as_worker.js": [ + "d61b7555ccff3c7c82dbc989b3273b04d6684b5b", + [] + ], + "firstLeadingBit.as_worker.js": [ + "a7c401830ac7ca41e6ac9168c574e80045b775f6", + [] + ], + "firstTrailingBit.as_worker.js": [ + "d1079ddf88ff9f70c2e47cb4f0a1c70c1648930b", + [] + ], + "floor.as_worker.js": [ + "636e721f143bcfd08ba2da8ebe62080be70622e7", + [] + ], + "fma.as_worker.js": [ + "4b7a5057f0a4f65780a4fd95deb472e69ec80bc3", + [] + ], + "fract.as_worker.js": [ + "0bcd6610eb2abe501cc66cd5014defcf31b61f06", + [] + ], + "frexp.as_worker.js": [ + "89c4f4d5efa79f5238dcea02a984f4d032b02f96", + [] + ], + "insertBits.as_worker.js": [ + "fa96c1d1216e8912ca68cb149fd21a653e468770", + [] + ], + "inverseSqrt.as_worker.js": [ + "6decc3216cc3c301a0d674a6373ddc7bbfd6b235", + [] + ], + "ldexp.as_worker.js": [ + "28f9e2ee8135dfa5de58a3288fed487c2a6033f7", + [] + ], + "length.as_worker.js": [ + "609f0bd26a2ca6952912addad85936da4ea0fb49", + [] + ], + "log.as_worker.js": [ + "339e911dcd74e85b158be256e4bb0971ca332e3a", + [] + ], + "log2.as_worker.js": [ + "bd2490ee01f21b42d904d4322c7d8d776ecfca2b", + [] + ], + "max.as_worker.js": [ + "0660d196f2086740b9cb153f475018125c6ba687", + [] + ], + "min.as_worker.js": [ + "4d0d4896cfa8916ca573eb26ce3152398762eb96", + [] + ], + "mix.as_worker.js": [ + "a721ad744e9b720e574a66c93e54c16e94264ac7", + [] + ], + "modf.as_worker.js": [ + "55f2b00583be505155b0f1c86c5e346d6c3aab49", + [] + ], + "normalize.as_worker.js": [ + "cb8077d1d6e02f45668120ae1d03008556636acc", + [] + ], + "pack2x16float.as_worker.js": [ + "99a7589f01c7a2ef922d38bfb05f4462ffdbe9f7", + [] + ], + "pack2x16snorm.as_worker.js": [ + "21d8d4b881d9e19ac58c239721e1ff89f7682e36", + [] + ], + "pack2x16unorm.as_worker.js": [ + "1df8200fd3944ae823dd2da13d4aacb89ae9b4ce", + [] + ], + "pack4x8snorm.as_worker.js": [ + "2bc4b2737c87b0bde805e197c02a492cb46c7835", + [] + ], + "pack4x8unorm.as_worker.js": [ + "32b359c074f75f3988c5adc72ec315271724d576", + [] + ], + "pack4xI8.as_worker.js": [ + "1f7ea4059fa3b072a99d0ada8fda8a8256a2e15f", + [] + ], + "pack4xI8Clamp.as_worker.js": [ + "504ef65f54b0d345b69ae879b3a32db246170d03", + [] + ], + "pack4xU8.as_worker.js": [ + "50378494c3b401e3b26d2e3a564634ce6edac797", + [] + ], + "pack4xU8Clamp.as_worker.js": [ + "a4392cae9d5424d1dd476fbf5ed1543d3ba79458", + [] + ], + "pow.as_worker.js": [ + "89a9e26cc4de9c9703e1eb7fe718b4152c0d0a19", + [] + ], + "quantizeToF16.as_worker.js": [ + "0fe919929f92e2515ce6406092da57f8068fa569", + [] + ], + "radians.as_worker.js": [ + "6c4a0ffcd42822afc92d1265435b0d597ac6e8c1", + [] + ], + "reflect.as_worker.js": [ + "9c5978d38d24f9cdf09f8219ce73eb02bdbcad3c", + [] + ], + "refract.as_worker.js": [ + "0e6f5e4b6bf09fad5dc68af7500cf6ca47eb3d04", + [] + ], + "reverseBits.as_worker.js": [ + "e28c74fb71925b077629af488c0ef9b52890a66f", + [] + ], + "round.as_worker.js": [ + "d2f3ad201dbbeee40d1c776934ccfeba27ea64f7", + [] + ], + "saturate.as_worker.js": [ + "f2c2f6c78fa4aa3087dbb5ab949084190eff5ed2", + [] + ], + "select.as_worker.js": [ + "b5127349289d0da865eb6d87eace14eda135f3f1", + [] + ], + "sign.as_worker.js": [ + "24b9c617ad128c88858d9f082ab96f2aaaea5e87", + [] + ], + "sin.as_worker.js": [ + "daa78363cdc3623efad6a5a2816e751b5228c127", + [] + ], + "sinh.as_worker.js": [ + "f09269f69064997e64a5fdf7df1abf4c773fe19a", + [] + ], + "smoothstep.as_worker.js": [ + "9c990e153cedb07de49a73aa52c43ef79b6e5ee1", + [] + ], + "sqrt.as_worker.js": [ + "8edaa59086db2dd377756dcbaf9c81f1e0c115fa", + [] + ], + "step.as_worker.js": [ + "bd3b7ba060f21d7bb1ea792d55c6f588d935a155", + [] + ], + "tan.as_worker.js": [ + "39f53bb17332d325c173756ba0046c78e25d2dc6", + [] + ], + "tanh.as_worker.js": [ + "9e9a1a438e076f1a8c013589b6433ca2d270bf83", + [] + ], + "textureDimensions.as_worker.js": [ + "46dff7167430e68d43cb5a0648bcc8c253708d54", + [] + ], + "textureGather.as_worker.js": [ + "5cdd6b2f90b1c498f6b527c1752df01bc337e3d7", + [] + ], + "textureGatherCompare.as_worker.js": [ + "9d4cb5ddcd07ff3052f5fb257fe797de1ae81710", + [] + ], + "textureLoad.as_worker.js": [ + "2ece8f78bd9f01cb2d00a98fe9fe6a3fcbc4261c", + [] + ], + "textureNumLayers.as_worker.js": [ + "4b4f6389669e6979d5e53a1b85bf1a627450fbbc", + [] + ], + "textureNumLevels.as_worker.js": [ + "d91123438337a80533e697d5a0205506b7853c18", + [] + ], + "textureNumSamples.as_worker.js": [ + "973d116905da37cc4202af4582b66eab5f0b361e", + [] + ], + "textureSample.as_worker.js": [ + "9c8718f0e7177faac4ab5a39da34f097cc7865ed", + [] + ], + "textureSampleBaseClampToEdge.as_worker.js": [ + "a22b541dc1fcbeaac9133373e7b2060778b04c4c", + [] + ], + "textureSampleBias.as_worker.js": [ + "0e13ca82dd2f33f4ea660b32c894725a6d6481f9", + [] + ], + "textureSampleCompare.as_worker.js": [ + "0e7adb6429d66626f1e49c29a28e77bac2bce30f", + [] + ], + "textureSampleCompareLevel.as_worker.js": [ + "3bb98849e11a80519f5ef201a35a48df0a7fb713", + [] + ], + "textureSampleGrad.as_worker.js": [ + "560763704ff78408d88c62a736e15033d731ef0c", + [] + ], + "textureSampleLevel.as_worker.js": [ + "2ecbac54e1cb0b7b529bbc1d0706f1780d9b04e0", + [] + ], + "textureStore.as_worker.js": [ + "edf849094319648cb9235ba3a20099b9cb5d1f60", + [] + ], + "transpose.as_worker.js": [ + "4aab6a4fb94f2ea5685fd6d8fbd2dfafa45cb9f4", + [] + ], + "trunc.as_worker.js": [ + "c21736648e602422b7c8344d0e9a1b8ff51d6bcb", + [] + ], + "unpack2x16float.as_worker.js": [ + "f9be70e83ecf4b6500ee9b2dc8cbc500f427f095", + [] + ], + "unpack2x16snorm.as_worker.js": [ + "9b33b717840eafa5e7d776a6a4671b041c8b0ffe", + [] + ], + "unpack2x16unorm.as_worker.js": [ + "c3a856b8a44dd961ef6932cc7b099481a875f2b6", + [] + ], + "unpack4x8snorm.as_worker.js": [ + "d1a576a28c1b9a3af9ad76146d68a738dfd9cc60", + [] + ], + "unpack4x8unorm.as_worker.js": [ + "8d43d6ddd16d453119d50aa1a2eb03d9ed55507b", + [] + ], + "unpack4xI8.as_worker.js": [ + "422c6d5a52db0d3d1945ad38f4455af83b629e65", + [] + ], + "unpack4xU8.as_worker.js": [ + "e8b87e5b423ebf62c688a4bd4f7cc83f2e74aad8", + [] + ], + "value_constructor.as_worker.js": [ + "87c2226e1bbf86c8eb925de83dd730b950162680", + [] + ], + "workgroupUniformLoad.as_worker.js": [ + "8597dedce27a9e87d72f8d0e1a447ff7cbe98153", + [] + ] + } + }, + "early_evaluation.as_worker.js": [ + "798513bbdf15b9f00b0a80a62f24bacb9fbf0c5c", + [] + ], + "matrix": { + "add_sub.as_worker.js": [ + "88214bcf9fb454826046d9585c4e35241e790942", + [] + ], + "and_or_xor.as_worker.js": [ + "e6e181316f64e9fbcdf097869e574976c5748eb0", + [] + ], + "bitwise_shift.as_worker.js": [ + "d22a70124bca8f6d7c1beb5bca600b9a1b4ed32a", + [] + ], + "comparison.as_worker.js": [ + "1565750788da904fdd76e001590d30b121f06e61", + [] + ], + "div_rem.as_worker.js": [ + "6bb88c6d2256a77f27df3d432020e7d0aba0da12", + [] + ], + "mul.as_worker.js": [ + "6781b6df40beadbe6720f139f386010cc34f2546", + [] + ] + }, + "overload_resolution.as_worker.js": [ + "be8db508ebe2b3670b1bb84e98283fc6751a96cf", + [] + ], + "precedence.as_worker.js": [ + "3cd2a99b0cbd74ec0160058c94e9018d3967d925", + [] + ], + "unary": { + "address_of_and_indirection.as_worker.js": [ + "a9474b7386bc0960796cab04c8431f3c714ae5a8", + [] + ], + "arithmetic_negation.as_worker.js": [ + "a62640f655a578e03e7b9c10ea34b61e60d83a66", + [] + ], + "bitwise_complement.as_worker.js": [ + "0ae7343d892a518b3f26c6dcecd28d2c04639df6", + [] + ], + "logical_negation.as_worker.js": [ + "11e804492765c1e7984cf5b01fce60dbbe879bc1", + [] + ] + } + }, + "extension": { + "dual_source_blending.as_worker.js": [ + "dd30e93ce28b7b252fe829f3e340249f52c5ece8", + [] + ], + "pointer_composite_access.as_worker.js": [ + "d773ad793d6aa262526560052dc4b6e83bca09a3", + [] + ], + "readonly_and_readwrite_storage_textures.as_worker.js": [ + "8479487b10c9ae058bb4d41bc804cb266f7df4bc", + [] + ] + }, + "functions": { + "alias_analysis.as_worker.js": [ + "807f1217c27a53425ff2d3ed573a991d8241d68c", + [] + ], + "restrictions.as_worker.js": [ + "6f73a164117960df6d91884eb0846522b6b6f3ce", + [] + ] + }, + "parse": { + "attribute.as_worker.js": [ + "acf3a576013c763ddd1268edd54dfca25fa388da", + [] + ], + "blankspace.as_worker.js": [ + "33333b84fe8f70fd663f813dd19e60dd7689d1cc", + [] + ], + "comments.as_worker.js": [ + "5f035ebcfcb6d5c70c2fed0eb744dc2f2dc0632a", + [] + ], + "diagnostic.as_worker.js": [ + "a311d903a1313d1fa4eca05d88f6c3419f88b125", + [] + ], + "enable.as_worker.js": [ + "8722aa3ec651c49d7e3192654e25caa2f386d6a4", + [] + ], + "identifiers.as_worker.js": [ + "d3f98b121bf2cc55cea91988cd81d31cfb327f5d", + [] + ], + "literal.as_worker.js": [ + "ef24ba83fd2e39bd81dcdc5510adfaead561ee6c", + [] + ], + "must_use.as_worker.js": [ + "888541ed1d866317f8b5f93285d5136ad78d50b6", + [] + ], + "requires.as_worker.js": [ + "dba1589829491496919d68f04c6dcf22772189d9", + [] + ], + "semicolon.as_worker.js": [ + "036f7b6d41293e145b6e0cafbc85bfeb97ca7699", + [] + ], + "shadow_builtins.as_worker.js": [ + "843b1e9a99e92e28f845be1707032e715838913f", + [] + ], + "source.as_worker.js": [ + "cfc5a6870cbe95bd490f3b6e1b07a62ed2e16e01", + [] + ] + }, + "shader_io": { + "align.as_worker.js": [ + "47afbfc4d80c48b23b50adeaa887a6067d3450e6", + [] + ], + "binding.as_worker.js": [ + "93747e17b962373899f988bf6304df11633e348e", + [] + ], + "builtins.as_worker.js": [ + "c616848fa9a08b3b888ea2c2627a1ddb9ab2aff3", + [] + ], + "entry_point.as_worker.js": [ + "7df3a5679a0e3878a22be1e165efce142a05591b", + [] + ], + "group.as_worker.js": [ + "91cc5ee843a13aa5dbd551eb849d4df8407ac9aa", + [] + ], + "group_and_binding.as_worker.js": [ + "de145c124fc0d30d2f3c202b0cc18e53c3d08522", + [] + ], + "id.as_worker.js": [ + "94bfbb1d9e278b74786f073af7f034c739b27232", + [] + ], + "interpolate.as_worker.js": [ + "1ef4a8537a2684dbd67f0c777f94d804723f11d8", + [] + ], + "invariant.as_worker.js": [ + "c443c1c7666d5fb28b51999e011fecf76df6516f", + [] + ], + "layout_constraints.as_worker.js": [ + "bd6e43ab6629f19310de93917a6d70c365f04146", + [] + ], + "locations.as_worker.js": [ + "bcc4bf954f1216b7a04ecee509d9b2dd1e65ef46", + [] + ], + "pipeline_stage.as_worker.js": [ + "e531533ade5b52a3b01d9316811d40ebffb697ad", + [] + ], + "size.as_worker.js": [ + "639041ced4d9b70e43526fc5e4d4afbd81158a39", + [] + ], + "workgroup_size.as_worker.js": [ + "da1c4058d58fc5d9cb893d87079545daffa9ef84", + [] + ] + }, + "statement": { + "break.as_worker.js": [ + "b6b56cb1abf7265f1dc53363a19924e8ce2f8aff", + [] + ], + "break_if.as_worker.js": [ + "d187ba3e4d3db88c3cb91227f9a40f8128395d67", + [] + ], + "compound.as_worker.js": [ + "9866e1bd30f3c575e5f78ce178623cff0709d66d", + [] + ], + "const_assert.as_worker.js": [ + "73625d9e2a1b91ffe1067a7b9ca2c8f5f992dfde", + [] + ], + "continue.as_worker.js": [ + "79c87793019b392a573c9f83d085c27c313949dd", + [] + ], + "continuing.as_worker.js": [ + "a84e513e36da6fbc566935fb4f52b76a903c9a69", + [] + ], + "discard.as_worker.js": [ + "d1fe0cdf060d34b505bf8ae8dffdb701eabcc4bd", + [] + ], + "for.as_worker.js": [ + "990515f9885f2c3b6877ce1e9341b224e2c07ef0", + [] + ], + "if.as_worker.js": [ + "67a6de9f98b395cb96c8d63d8c29551042c91ab4", + [] + ], + "increment_decrement.as_worker.js": [ + "03aae35519d4de91df1de99954f47042457a3687", + [] + ], + "loop.as_worker.js": [ + "1e209cca7dd281cce9addef1032bfd05e8d82d25", + [] + ], + "phony.as_worker.js": [ + "908e55e01758de1dd2f63247014eac98e21af0bc", + [] + ], + "return.as_worker.js": [ + "002415f782bd90a239e14dd49e6353d71f6e37b3", + [] + ], + "statement_behavior.as_worker.js": [ + "38e2498c0e72b711c510581821fa2154ba6c1a4c", + [] + ], + "switch.as_worker.js": [ + "c7a975bc33c77a4610884ee1596aeadd3dab3262", + [] + ], + "while.as_worker.js": [ + "6d1fb31475aff2567c9ca0f9af6f6357d69d002d", + [] + ] + }, + "types": { + "alias.as_worker.js": [ + "318e1606c72a70da81923378c0b129ef466fe64b", + [] + ], + "array.as_worker.js": [ + "ba738910ee315a5ed8cda39fee0f06c69644df4e", + [] + ], + "atomics.as_worker.js": [ + "dbbf764275aaabe6e5870d41017dfc442e12dc86", + [] + ], + "enumerant.as_worker.js": [ + "fa4e2d9766eb5e16d9f34ce19e6fbfe784b12117", + [] + ], + "matrix.as_worker.js": [ + "a3879d8e5e11f3d4b5537823b95ecf34f17f60bc", + [] + ], + "pointer.as_worker.js": [ + "c618c8049ebc4dfd6d6d128aed8223d492ec6bcf", + [] + ], + "ref.as_worker.js": [ + "d02f230e1389226cc5312c4cbd0a918adccaa0e0", + [] + ], + "struct.as_worker.js": [ + "97155cb9b0751e9644c5ef48f564c25fae610fe8", + [] + ], + "textures.as_worker.js": [ + "a0198cd3f7c44e763841c3c7135256c19d07f3eb", + [] + ], + "vector.as_worker.js": [ + "6d1b6ab76c7c15cebee5b6987f36da15ec9f4304", + [] + ] + }, + "uniformity": { + "uniformity.as_worker.js": [ + "9a03cf6a339b71637a758046971af7fef3613118", + [] + ] + } + } + }, + "util": { + "texture": { + "color_space_conversions.as_worker.js": [ + "92b7e45c2fce42008673cb03d565349e83456810", + [] + ], + "texel_data.as_worker.js": [ + "401eed9d2d326fa1afabd12445ea71f23f8b7760", + [] + ], + "texture_ok.as_worker.js": [ + "a12097bc55d13252188a1938cd9c4f067ad3a8ac", + [] + ] + } + }, + "web_platform": { + "canvas": { + "configure.as_worker.js": [ + "63126497f66985280a2557b85b126def53515a76", + [] + ], + "context_creation.as_worker.js": [ + "5165c5dd60fbc909963399bba9ecd0598730037f", + [] + ], + "getCurrentTexture.as_worker.js": [ + "776783039f7c1647d1ae11f2b88b3a103c4f9755", + [] + ], + "getPreferredCanvasFormat.as_worker.js": [ + "c412fea22992d521df490ddfc533052c2ad3c29f", + [] + ], + "readbackFromWebGPUCanvas.as_worker.js": [ + "f9a9f362f7c9d9a26237c81277e1aedc071fefc2", + [] + ] + }, + "copyToTexture": { + "ImageBitmap.as_worker.js": [ + "7d5f20ff007f7970e76d57b6d23c7adfc3774ceb", + [] + ], + "ImageData.as_worker.js": [ + "8cc3f679e421868ba87924a4a997d91c6f3bd91b", + [] + ], + "canvas.as_worker.js": [ + "d5826979845a6b28583c3df566d293c14172c4f5", + [] + ], + "image.as_worker.js": [ + "1aa1ad8c4fed7b476a1a27b04ec762f93fd75143", + [] + ], + "video.as_worker.js": [ + "dc686d044f1c280cbd74d3066667afa66dda77ef", + [] + ] + }, + "external_texture": { + "video.as_worker.js": [ + "610a8871794d1e4c83a94d548e1290445a7d4bab", + [] + ] + }, + "worker": { + "worker.as_worker.js": [ + "09109c25279a848fc6432903d728bafa1b5c64c7", + [] + ] + } + } } } } @@ -4194,7 +7499,13 @@ "testharness": { "webgpu": { "cts.https.html": [ - "52aa6715a1cf5b391cae139a3574f1b1c69a41ae", + "e516a3b38767a0d82d614f5c9d1207d86f726c3b", + [ + "webgpu/cts.https.html?q=webgpu:api,operation,adapter,info:adapter_info:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,operation,adapter,requestAdapter:requestAdapter:*", { @@ -4208,13 +7519,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:api,operation,adapter,requestAdapterInfo:adapter_info:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:api,operation,adapter,requestAdapterInfo:adapter_info_with_hints:*", + "webgpu/cts.https.html?q=webgpu:api,operation,adapter,requestDevice:always_returns_device:*", { "timeout": "long" } @@ -4627,6 +7932,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,operation,compute_pipeline,overrides:computed:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,operation,compute_pipeline,overrides:multi_entry_points:*", { @@ -5035,6 +8346,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:multiple_color_attachments,same_mip_level:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:multiple_color_attachments,same_slice_with_diff_mip_levels:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:one_color_attachment,mip_levels:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,operation,rendering,basic:clear:*", { @@ -5389,6 +8718,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,operation,storage_texture,read_only:basic:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,operation,storage_texture,read_write:basic:*", { @@ -5443,12 +8778,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:api,operation,uncapturederror:constructor:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:api,operation,uncapturederror:iff_uncaptured:*", { @@ -5624,13 +8953,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjoinRanges_many:*", + "webgpu/cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges:*", + "webgpu/cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges_many:*", { "timeout": "long" } @@ -5893,6 +9222,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindGroupsPlusVertexBuffers:createRenderPipeline,at_over:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindGroupsPlusVertexBuffers:draw,at_over:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindingsPerBindGroup:createBindGroupLayout,at_over:*", { @@ -6367,6 +9708,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,compute_pipeline:resource_compatibility:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,compute_pipeline:shader_module,compute:*", { @@ -7417,6 +10764,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,compute_pass:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,render_pass:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:empty_bind_group_layouts_requires_empty_bind_groups,compute_pass:*", { @@ -8053,6 +11412,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,duplicate_buffers:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,invalid_submit_invalidates:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,submit_invalidates:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,queue,writeBuffer:buffer,device_mismatch:*", { @@ -8461,6 +11838,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,fragment_state:targets_format_is_color_format:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,fragment_state:targets_format_renderable:*", { @@ -8533,6 +11916,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,misc:external_texture:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,misc:no_attachment:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,misc:pipeline_layout,device_mismatch:*", { @@ -8635,6 +12030,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,resource_compatibility:resource_compatibility:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:api,validation,render_pipeline,shader_module:device_mismatch:*", { @@ -9163,18 +12564,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_shader_module_with_bgra8unorm_storage:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_shader_module_without_bgra8unorm_storage:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_texture:*", { @@ -9307,42 +12696,42 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:interpolate:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:sample_index:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:sample_mask:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:unsupportedStorageTextureFormats,computePipeline:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:unsupportedStorageTextureFormats,renderPipeline:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:compat,api,validation,render_pipeline,vertex_state:maxVertexAttributesVertexIndexInstanceIndex:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:interpolate:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:sample_index:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:sample_mask:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:textureLoad_with_depth_textures:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:unsupportedStorageTextureFormats:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:compat,api,validation,texture,createTexture:depthOrArrayLayers_incompatible_with_textureBindingViewDimension:*", { @@ -9541,6 +12930,144 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:print_environment:info:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:abstract_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:bool:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:concrete_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:matrix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:runtime_sized:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,array,index:vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:abstract_float_column:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:abstract_float_element:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:concrete_float_column:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:concrete_float_element:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_align:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_pointer:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:const_nested:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:let:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:param:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,vector,components:abstract_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,vector,components:concrete_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,vector,index:abstract_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,access,vector,index:concrete_scalar:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_addition:scalar:*", { @@ -9631,12 +13158,42 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_matrix_multiplication:matrix_matrix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_scalar_multiplication:matrix_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_scalar_multiplication:scalar_matrix:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_subtraction:matrix:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_vector_multiplication:matrix_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_vector_multiplication:vector_matrix:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,af_multiplication:scalar:*", { @@ -9709,6 +13266,132 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition_scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition_vector_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division_scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division_vector_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication_scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication_vector_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder_scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder_vector_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction_scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction_vector_scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:equals:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:greater_equals:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:greater_than:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:less_equals:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:less_than:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:not_equals:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise:bitwise_and:*", { @@ -9745,6 +13428,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_left_abstract:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_left_concrete:*", { @@ -9757,6 +13446,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_right_abstract:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_right_concrete:*", { @@ -11113,6 +14808,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atomics,atomicSub:sub_i32_min:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atomics,atomicSub:sub_storage:*", { @@ -11180,7 +14881,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_vec2f16:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_vec2h:*", { "timeout": "long" } @@ -11270,7 +14971,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:vec2ai_to_vec4f16:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:vec2ai_to_vec4h:*", { "timeout": "long" } @@ -11515,6 +15216,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec4:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:f16:*", { @@ -11576,13 +15295,37 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec2:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec4:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec4:*", { "timeout": "long" } @@ -11624,13 +15367,37 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec2:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec4:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec4:*", { "timeout": "long" } @@ -11720,7 +15487,19 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec4:*", { "timeout": "long" } @@ -11839,6 +15618,54 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_exp:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_fract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec2_exp:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec2_fract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec3_exp:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec3_fract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec4_exp:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec4_fract:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:f16_exp:*", { @@ -12001,6 +15828,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec4:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:f16:*", { @@ -12374,7 +16219,19 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec4:*", { "timeout": "long" } @@ -12512,7 +16369,19 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec4:*", { "timeout": "long" } @@ -12554,7 +16423,19 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec4:*", { "timeout": "long" } @@ -12824,25 +16705,25 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:depth:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:depth:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:external:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:external:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:sampled:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:sampled_and_multisampled:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:storage:*", + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:storage:*", { "timeout": "long" } @@ -12961,6 +16842,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureLoad:storage_texel_formats:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLayers:arrayed:*", { @@ -13003,12 +16890,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:control_flow:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:depth_2d_coords:*", { @@ -13039,6 +16920,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:sampled_2d_coords,derivatives:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:sampled_2d_coords:*", { @@ -13063,12 +16950,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:stage:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:arrayed_2d_coords:*", { @@ -13081,12 +16962,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:control_flow:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:sampled_2d_coords:*", { @@ -13099,12 +16974,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:stage:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:2d_coords:*", { @@ -13129,18 +16998,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:control_flow:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:stage:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompareLevel:2d_coords:*", { @@ -13243,6 +17100,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:bgra8unorm_swizzle:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:store_1d_coords:*", { @@ -13267,6 +17142,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:texel_formats:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,transpose:abstract_float:*", { @@ -13357,6 +17238,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,workgroupUniformLoad:types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:array_length:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:atomic_ptr_to_element:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:mixed_ptr_parameters:*", { @@ -13399,6 +17298,162 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_array_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_matrix_column_vectors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_matrix_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_mix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_splat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_array_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_matrix_column_vectors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_matrix_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_mix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_splat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:matrix_identity:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:scalar_identity:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:structure:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:vector_identity:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:array:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:matrix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:scalar:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:structure:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:vector_prefix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,precedence:precedence:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref_index:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref_member:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,af_arithmetic:negation:*", { @@ -13423,6 +17478,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,ai_arithmetic:negation:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,ai_assignment:abstract:*", { @@ -13441,6 +17502,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,ai_complement:complement:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,bool_conversion:bool:*", { @@ -13483,6 +17550,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_float:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_float_mat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_int:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:bool:*", { @@ -13531,6 +17616,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_float:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_float_mat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_int:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:bool:*", { @@ -13585,6 +17688,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:abstract_float:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:abstract_int:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:bool:*", { @@ -13615,30 +17730,18 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref_index:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref_member:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,u32_complement:u32_complement:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:abstract_float:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:abstract_int:*", { @@ -13681,6 +17784,30 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_logical_and:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_logical_or:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_pointers:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,call:call_basic:*", { @@ -13975,6 +18102,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,for:for_logical_and_condition:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,for:for_logical_or_condition:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,for:nested_for_break:*", { @@ -14017,6 +18156,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_break_if_logical_and_condition:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_break_if_logical_or_condition:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_continue:*", { @@ -14101,6 +18252,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,switch:switch_inside_loop_with_continue:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,switch:switch_multiple_case:*", { @@ -14131,6 +18288,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,while:while_logical_and_condition:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,while:while_logical_or_condition:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,flow_control,while:while_nested_break:*", { @@ -14143,6 +18312,90 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:const_array_elements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:function_array_byte_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:function_parameters:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:function_variable_combined_byte_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_braces:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_composite_array:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_composite_struct:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:private_array_byte_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:private_array_combined_byte_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:struct_members:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:switch_case_selectors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:switch_case_selectors_same_clause:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:workgroup_array_byte_size:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,limits:workgroup_array_byte_size_override:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,memory_layout:read_layout:*", { @@ -14215,6 +18468,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,texture_intra_invocation_coherence:texture_intra_invocation_coherence:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,weak:2_plus_2_write:*", { @@ -14347,6 +18606,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,sample_mask:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,shader_io,shared_structs:shared_between_stages:*", { @@ -14365,6 +18630,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,shader_io,user_io:passthrough:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,shader_io,workgroup_size:workgroup_size:*", { @@ -14431,6 +18702,48 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:all:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:continuing:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:derivatives:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:function_call:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:loop:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:three_quarters:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,discard:uniform_read_loop:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:frexp_exp_increment:*", { @@ -14485,6 +18798,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:single_eval_decrement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:single_eval_increment:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:vec2_element_decrement:*", { @@ -14521,6 +18846,42 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:array,nested:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:array:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:mat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:scalars:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:struct:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,execution,value_init:vec:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:*", { @@ -14581,6 +18942,30 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:assert:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:function_scope:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:immutable:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:initializer:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:no_direct_recursion:*", { @@ -14605,6 +18990,120 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,const:type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:attribute_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:builtin_value_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:diagnostic_rule_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:diagnostic_severity_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:enable_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_flat_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_sampling_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_type_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:language_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:swizzle_names:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,let:initializer:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,let:initializer_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,let:module_scope:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,let:type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,override:function_scope:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,override:id:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,override:initializer:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,decl,override:no_direct_recursion:*", { @@ -14618,43 +19117,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_explicit_type_matches_var:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,override:type:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_reads:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_writes:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_address_space_never_uses_access_mode:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_bad_store_type:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_handle_space_invalid:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_not_instantiable:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:address_space_access_mode:*", { "timeout": "long" } @@ -14689,6 +19158,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:explicit_access_mode:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:function_addrspace_at_module_scope:*", { @@ -14707,12 +19182,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:implicit_access_mode:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:initializer_kind:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:initializer_type:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:module_scope_initializers:*", { @@ -14726,31 +19213,175 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:explicit_access_mode:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:read_access:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:implicit_access_mode:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:shader_stage:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:read_access:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:var_access_mode_bad_other_template_contents:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:write_access:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:var_access_mode_bad_template_delim:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,vector:vector:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,decl,var:write_access:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,array:abstract_array_concrete_index:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,array:early_eval_errors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,array:index_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,array:result_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,matrix:abstract_matrix_concrete_index:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,matrix:early_eval_errors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,matrix:index_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,matrix:result_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,structure:identifier_mismatch:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type_runtime_array:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,structure:shadowed_member:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,vector:abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,access,vector:concrete:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:invalid_type_with_itself:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:scalar_vector_out_of_range:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,and_or_xor:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,and_or_xor:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:partial_eval_errors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_left_abstract:*", { "timeout": "long" } @@ -14762,7 +19393,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_left_vec_size_mismatch:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_right_abstract:*", { "timeout": "long" } @@ -14774,7 +19405,43 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_right_vec_size_mismatch:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,comparison:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,comparison:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:invalid_type_with_itself:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:scalar_vector_out_of_range:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,binary,parse:all:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,abs:parameters:*", { "timeout": "long" } @@ -14791,6 +19458,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acos:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acos:values:*", { @@ -14803,12 +19476,54 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acosh:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acosh:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:argument_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:argument_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:access_mode:*", { @@ -14821,6 +19536,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:type:*", { @@ -14833,6 +19554,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asin:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asin:values:*", { @@ -14845,6 +19572,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asinh:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asinh:values:*", { @@ -14852,13 +19585,25 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:integer_argument_x:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:invalid_argument_x:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:integer_argument_y:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:invalid_argument_y:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:parameters:*", { "timeout": "long" } @@ -14875,6 +19620,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan:values:*", { @@ -14887,12 +19638,42 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atanh:parameters:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atanh:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:atomic_parameterization:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:data_parameters:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:non_atomic:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:return_types:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:stage:*", { @@ -14947,6 +19728,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,bitcast:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,bitcast:valid_vec2h:*", { @@ -14959,30 +19746,84 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:arguments:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:low_high:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:low_high_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:mismatched:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:values:*", { @@ -14990,7 +19831,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:must_use:*", { "timeout": "long" } @@ -15001,12 +19848,114 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:values:*", { @@ -15014,7 +19963,61 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:invalid_argument_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:only_in_fragment:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:matrix_args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:args:*", { "timeout": "long" } @@ -15038,7 +20041,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:args:*", { "timeout": "long" } @@ -15062,7 +20065,31 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:must_use:*", { "timeout": "long" } @@ -15074,7 +20101,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:must_use:*", { "timeout": "long" } @@ -15085,12 +20118,114 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:count_offset:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:typed_arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:values:*", { @@ -15098,7 +20233,97 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:count_offset:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:mismatched:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:typed_arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:must_use:*", { "timeout": "long" } @@ -15109,12 +20334,48 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:partial_values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:scalar:*", { @@ -15139,36 +20400,126 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:arguments:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:values:*", { @@ -15176,7 +20527,127 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:invalid_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:value_range:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:args:*", { "timeout": "long" } @@ -15200,7 +20671,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:args:*", { "timeout": "long" } @@ -15224,7 +20695,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:args:*", { "timeout": "long" } @@ -15248,7 +20719,7 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:args:*", { "timeout": "long" } @@ -15271,36 +20742,180 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:invalid_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:float_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:arguments:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:values:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:arguments:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:values:*", { @@ -15308,7 +20923,37 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:unsigned_integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:argument_types_1_and_2:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:argument_types_3:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:must_use:*", { "timeout": "long" } @@ -15319,12 +20964,24 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:values:*", { @@ -15332,7 +20989,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:must_use:*", { "timeout": "long" } @@ -15343,12 +21006,54 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:argument_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:early_eval_errors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:partial_eval_errors:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:args:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:integer_argument:*", { "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:must_use:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:values:*", { @@ -15356,7 +21061,31 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:integer_argument:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:must_use:*", { "timeout": "long" } @@ -15368,7 +21097,763 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:level_argument,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:texture_type,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:component_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:component_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:depth_ref_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:array_index_argument,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:array_index_argument,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:level_argument,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:return_type,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:sample_index_argument,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,non_storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:only_in_fragment:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:bias_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:only_in_fragment:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:depth_ref_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:only_in_fragment:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:depth_ref_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddX_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddY_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:level_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument,non_const:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:return_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:texture_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:array_index_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:coords_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:texture_type,storage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:value_argument:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:return:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:args:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:arguments:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:arguments:*", { "timeout": "long" } @@ -15392,7 +21877,13 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:bad_args:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:arguments:*", { "timeout": "long" } @@ -15415,6 +21906,462 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:values:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:array_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:array_zero_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_column:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_copy:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_elementwise:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_zero_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:partial_eval:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_zero_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:struct_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:struct_zero_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_copy:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_elementwise:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_mixed:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_splat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_zero_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:must_use:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:no_atomics:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:only_in_compute:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,early_evaluation:composites:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_f32:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_f32:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:with_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,and_or_xor:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,bitwise_shift:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,comparison:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,div_rem:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:f16_and_f32_matrix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:f32_and_f16_matrix:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:mat_by_mat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:mat_by_vec:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_abstract_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f16_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f32:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f32_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_f32:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_abstract:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_abstract_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f16_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f32:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f32_internal:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:vec_by_mat:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,overload_resolution:implicit_conversions:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,overload_resolution:overload_resolution:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,precedence:binary_requires_parentheses:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,precedence:mixed_logical_requires_parentheses:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,precedence:other:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,precedence:other_lhs:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:basic:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:composite:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,arithmetic_negation:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,arithmetic_negation:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,bitwise_complement:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,bitwise_complement:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:invalid_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:scalar_vector:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_same_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_stage_input_output:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_syntax_validation:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_usage:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:use_blend_src_requires_extension_enabled:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,extension,pointer_composite_access:deref:*", { @@ -15427,6 +22374,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,readonly_and_readwrite_storage_textures:textureBarrier:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,extension,readonly_and_readwrite_storage_textures:var_decl:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,alias_analysis:aliasing_inside_function:*", { @@ -15517,6 +22476,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:body_required:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:call_arg_types_match_1_param:*", { @@ -15541,6 +22506,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_attributes:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_name_required:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_parameter_matching:*", { @@ -15559,6 +22536,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:must_use_requires_return:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:no_direct_recursion:*", { @@ -15571,6 +22554,42 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:non_module_scoped_function:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:overload:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_comma_placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_alias:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_function_name:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_global:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_names_must_differ:*", { @@ -15589,48 +22608,36 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_type_can_be_alias:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_type_required:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:parens_required:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,functions,restrictions:vertex_returns_position:*", { "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,align:multi_align:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,align:parsing:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,align:placement:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,align:required_alignment:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,attribute:expressions:*", { "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,binary_ops:all:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,blankspace:blankspace:*", { @@ -15649,36 +22656,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,break:placement:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,break_if:non_bool_param:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,break_if:placement:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,builtin:parse:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,builtin:placement:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,comments:comments:*", { @@ -15703,30 +22680,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,compound:parse:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,const:placement:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,const_assert:parse:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,continuing:placement:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:after_other_directives:*", { @@ -15740,13 +22693,19 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:conflicting_attribute_same_location:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:conflicting_directive:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:conflicting_directive:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:diagnostic_scoping:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,diagnostic:duplicate_attribute_same_location:*", { "timeout": "long" } @@ -15781,12 +22740,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,discard:placement:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,enable:enable:*", { @@ -15901,18 +22854,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,must_use:builtin_must_use:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,must_use:builtin_no_must_use:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,must_use:call:*", { @@ -15931,54 +22872,6 @@ "timeout": "long" } ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:compute_parsing:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_compute_function:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_fragment_function:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_vertex_function:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:fragment_parsing:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:multiple_entry_points:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:placement:*", - { - "timeout": "long" - } - ], - [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:vertex_parsing:*", - { - "timeout": "long" - } - ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,requires:requires:*", { @@ -16237,6 +23130,60 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:function_param:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_access_mode:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_atomic:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_atomic_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_barriers:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_f16:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_handle_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_texture:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,parse,source:empty:*", { @@ -16256,25 +23203,25 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,unary_ops:all:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,align:multi_align:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,var_and_let:initializer_type:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,align:parsing:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,var_and_let:var_access_mode_bad_other_template_contents:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,align:placement:*", { "timeout": "long" } ], [ - "webgpu/cts.https.html?q=webgpu:shader,validation,parse,var_and_let:var_access_mode_bad_template_delim:*", + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,align:required_alignment:*", { "timeout": "long" } @@ -16309,6 +23256,18 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,builtins:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,builtins:placement:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,builtins:reuse_builtin_name:*", { @@ -16489,6 +23448,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,layout_constraints:layout_constraints:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,locations:duplicates:*", { @@ -16507,6 +23472,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,locations:out_of_order:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,locations:stage_inout:*", { @@ -16525,6 +23496,54 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:compute_parsing:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_compute_function:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_fragment_function:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_vertex_function:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:fragment_parsing:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:multiple_entry_points:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:vertex_parsing:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,size:size:*", { @@ -16591,6 +23610,234 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,break:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,break_if:condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,break_if:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,compound:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,const_assert:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,continue:module_scope:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,continue:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,continuing:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,discard:placement:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,for:condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,for:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,if:condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,if:else_condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,if:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:component:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:var_init_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,loop:break_if_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,loop:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,phony:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,phony:rhs_constructible:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,phony:rhs_with_decl:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,return:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,return:return_missing_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,return:return_type_match:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,return:return_unexpected_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:invalid_functions:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:invalid_statements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:valid_functions:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:valid_statements:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,switch:case_types_match:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,switch:condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,switch:condition_type_match_case_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,switch:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,while:condition_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,statement,while:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,alias:any_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,alias:match_non_alias:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,types,alias:no_direct_recursion:*", { @@ -16651,6 +23898,168 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,array:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,array:valid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,atomics:address_space:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,atomics:invalid_operations:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,atomics:parse:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,atomics:trailing_comma:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,atomics:type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,enumerant:decl_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,enumerant:type_declaration:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,enumerant:value_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,matrix:invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,matrix:valid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:access_mode:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:address_space:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_explicit_type_matches_var:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_reads:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_writes:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:missing_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_address_space_never_uses_access_mode:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_bad_store_type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_handle_space_invalid:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_not_instantiable:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,pointer:type:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_alias:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_let:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_param:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_var:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,types,struct:no_direct_recursion:*", { @@ -16687,6 +24096,54 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,struct:structures:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:depth_texture_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:external_sampled_texture_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:sampled_texture_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:sampler_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:storage_texture_types:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:texel_formats,as_value:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:shader,validation,types,textures:texel_formats:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:shader,validation,types,vector:vector:*", { @@ -17017,6 +24474,12 @@ "timeout": "long" } ], + [ + "webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,image:from_fully_transparent_image:*", + { + "timeout": "long" + } + ], [ "webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,image:from_image:*", { @@ -17048,7 +24511,25 @@ } ], [ - "webgpu/cts.https.html?q=webgpu:web_platform,worker,worker:worker:*", + "webgpu/cts.https.html?q=webgpu:web_platform,external_texture,video:importExternalTexture,sample_non_YUV_video_frame:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:web_platform,worker,worker:dedicated_worker:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:web_platform,worker,worker:service_worker:*", + { + "timeout": "long" + } + ], + [ + "webgpu/cts.https.html?q=webgpu:web_platform,worker,worker:shared_worker:*", { "timeout": "long" } diff --git a/tests/wpt/webgpu/meta/webgpu/cts.https.html.ini b/tests/wpt/webgpu/meta/webgpu/cts.https.html.ini index 5d9ef99f68d..fcf45cefd0d 100644 --- a/tests/wpt/webgpu/meta/webgpu/cts.https.html.ini +++ b/tests/wpt/webgpu/meta/webgpu/cts.https.html.ini @@ -1,3 +1,9 @@ +[cts.https.html?q=webgpu:api,operation,adapter,info:adapter_info:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,operation,adapter,requestAdapter:requestAdapter:*] [:powerPreference="_undef_";forceFallbackAdapter="_undef_"] @@ -22,12 +28,10 @@ [:] -[cts.https.html?q=webgpu:api,operation,adapter,requestAdapterInfo:adapter_info:*] - [:] +[cts.https.html?q=webgpu:api,operation,adapter,requestDevice:always_returns_device:*] + [:compatibilityMode=false] - -[cts.https.html?q=webgpu:api,operation,adapter,requestAdapterInfo:adapter_info_with_hints:*] - [:] + [:compatibilityMode=true] [cts.https.html?q=webgpu:api,operation,adapter,requestDevice:default:*] @@ -505,6 +509,8 @@ [cts.https.html?q=webgpu:api,operation,buffers,map_detach:while_mapped:*] + expected: + if os == "linux" and not debug: CRASH [:] expected: if os == "linux" and not debug: FAIL @@ -2153,6 +2159,12 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:api,operation,compute_pipeline,overrides:computed:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,operation,compute_pipeline,overrides:multi_entry_points:*] [:isAsync=false] expected: @@ -2455,20 +2467,36 @@ if os == "linux" and not debug: [PASS, FAIL] [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2481,20 +2509,36 @@ [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2565,28 +2609,52 @@ [:boundary="queue-op";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2601,28 +2669,52 @@ [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2683,20 +2775,36 @@ [:boundary="command-buffer";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2709,20 +2817,36 @@ [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2787,28 +2911,52 @@ [:boundary="queue-op";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -2823,28 +2971,52 @@ [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3009,20 +3181,36 @@ if os == "linux" and not debug: [PASS, FAIL] [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3035,20 +3223,36 @@ [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3119,28 +3323,52 @@ [:boundary="queue-op";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3155,28 +3383,52 @@ [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3249,20 +3501,36 @@ [:boundary="command-buffer";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3279,20 +3547,36 @@ [:boundary="command-buffer";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3357,28 +3641,52 @@ [:boundary="queue-op";readOp="constant-uniform";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3393,28 +3701,52 @@ [:boundary="queue-op";readOp="input-indirect-dispatch";readContext="compute-pass-encoder";writeOp="write-buffer";writeContext="queue"] [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-indirect-index";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-bundle-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="t2b-copy";writeContext="command-encoder"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="input-vertex";readContext="render-pass-encoder";writeOp="write-buffer";writeContext="queue"] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";readOp="storage-read";readContext="compute-pass-encoder";writeOp="b2b-copy";writeContext="command-encoder"] @@ -3765,8 +4097,12 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";read={"op":"t2b-copy","in":"command-encoder"};write={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";read={"op":"t2b-copy","in":"command-encoder"};write={"op":"attachment-store","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";read={"op":"t2b-copy","in":"command-encoder"};write={"op":"b2t-copy","in":"command-encoder"}] @@ -3825,6 +4161,8 @@ if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"attachment-resolve","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"attachment-resolve","in":"command-encoder"};read={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -3835,6 +4173,8 @@ if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"attachment-store","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"attachment-store","in":"command-encoder"};read={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -3893,8 +4233,12 @@ if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"sample","in":"render-bundle-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"sample","in":"render-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] expected: @@ -3917,6 +4261,8 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"attachment-resolve","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"attachment-resolve","in":"command-encoder"};read={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -3927,6 +4273,8 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"attachment-store","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"attachment-store","in":"command-encoder"};read={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -3985,8 +4333,12 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"sample","in":"render-bundle-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"sample","in":"render-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";write={"op":"t2t-copy","in":"command-encoder"};read={"op":"t2b-copy","in":"command-encoder"}] expected: @@ -4017,28 +4369,44 @@ [cts.https.html?q=webgpu:api,operation,memory_sync,texture,same_subresource:ww:*] [:boundary="command-buffer";first={"op":"attachment-resolve","in":"command-encoder"};second={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-resolve","in":"command-encoder"};second={"op":"attachment-store","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-resolve","in":"command-encoder"};second={"op":"b2t-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-resolve","in":"command-encoder"};second={"op":"storage","in":"compute-pass-encoder"}] expected: if os == "linux" and not debug: [PASS, FAIL] [:boundary="command-buffer";first={"op":"attachment-resolve","in":"command-encoder"};second={"op":"t2t-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-store","in":"command-encoder"};second={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-store","in":"command-encoder"};second={"op":"attachment-store","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-store","in":"command-encoder"};second={"op":"b2t-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"attachment-store","in":"command-encoder"};second={"op":"storage","in":"compute-pass-encoder"}] expected: if os == "linux" and not debug: [PASS, FAIL] [:boundary="command-buffer";first={"op":"attachment-store","in":"command-encoder"};second={"op":"t2t-copy","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"b2t-copy","in":"command-encoder"};second={"op":"attachment-resolve","in":"command-encoder"}] expected: @@ -4105,6 +4473,8 @@ if os == "linux" and not debug: [PASS, FAIL] [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"attachment-store","in":"command-encoder"}] expected: @@ -4115,10 +4485,16 @@ if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"compute-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"render-bundle-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"render-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="command-buffer";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -4261,6 +4637,8 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"attachment-store","in":"command-encoder"}] expected: @@ -4271,10 +4649,16 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"compute-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"render-bundle-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"storage","in":"render-pass-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"t2t-copy","in":"command-encoder"};second={"op":"t2t-copy","in":"command-encoder"}] expected: @@ -4285,8 +4669,12 @@ if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"write-texture","in":"queue"};second={"op":"attachment-resolve","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"write-texture","in":"queue"};second={"op":"attachment-store","in":"command-encoder"}] + expected: + if os == "linux" and not debug: FAIL [:boundary="queue-op";first={"op":"write-texture","in":"queue"};second={"op":"b2t-copy","in":"command-encoder"}] @@ -5365,6 +5753,52 @@ [:] +[cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:multiple_color_attachments,same_mip_level:*] + [:sameTexture=false] + expected: + if os == "linux" and not debug: FAIL + + [:sameTexture=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:multiple_color_attachments,same_slice_with_diff_mip_levels:*] + [:depthSlice=0] + expected: + if os == "linux" and not debug: FAIL + + [:depthSlice=1] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,operation,rendering,3d_texture_slices:one_color_attachment,mip_levels:*] + [:mipLevel=0;depthSlice=0] + expected: + if os == "linux" and not debug: FAIL + + [:mipLevel=0;depthSlice=1] + expected: + if os == "linux" and not debug: FAIL + + [:mipLevel=1;depthSlice=0] + expected: + if os == "linux" and not debug: FAIL + + [:mipLevel=1;depthSlice=1] + expected: + if os == "linux" and not debug: FAIL + + [:mipLevel=2;depthSlice=0] + expected: + if os == "linux" and not debug: FAIL + + [:mipLevel=2;depthSlice=1] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,operation,rendering,basic:clear:*] [:] @@ -6103,8 +6537,12 @@ if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth="_undef_";writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth="_undef_";writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth="_undef_";writeDepth=true;multisampled=false] expected: @@ -6115,8 +6553,12 @@ if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth=false;writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth=false;writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus";unclippedDepth=false;writeDepth=true;multisampled=false] expected: @@ -6143,8 +6585,12 @@ if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth="_undef_";writeDepth=true;multisampled=false] expected: @@ -6155,8 +6601,12 @@ if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth=false;writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth=false;writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth24plus-stencil8";unclippedDepth=false;writeDepth=true;multisampled=false] expected: @@ -6183,8 +6633,12 @@ if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth="_undef_";writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth="_undef_";writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth="_undef_";writeDepth=true;multisampled=false] expected: @@ -6195,8 +6649,12 @@ if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth=false;writeDepth=false;multisampled=false] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth=false;writeDepth=false;multisampled=true] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";unclippedDepth=false;writeDepth=true;multisampled=false] expected: @@ -6375,132 +6833,260 @@ [cts.https.html?q=webgpu:api,operation,rendering,draw:vertex_attributes,basic:*] [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=1;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="float32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="uint32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=4;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="float32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="uint32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=16;vertex_buffer_count=8;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=1;vertex_buffer_count=1;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=1;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="float32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="uint32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=4;vertex_buffer_count=4;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=1;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="float32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="uint32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=4;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="float32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="float32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="float32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="float32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="uint32";step_mode="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="uint32";step_mode="instance"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="uint32";step_mode="mixed"] + expected: + if os == "linux" and not debug: FAIL [:vertex_attribute_count=8;vertex_buffer_count=8;vertex_format="uint32";step_mode="vertex"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,rendering,draw:vertex_attributes,formats:*] @@ -7495,6 +8081,8 @@ [:valid=false;name="unicode"] + [:valid=false;name="unicode-multi-byte-characters"] + [:valid=true;name="ascii"] [:valid=true;name="unicode"] @@ -7507,6 +8095,8 @@ [:valid=false;name="unicode"] + [:valid=false;name="unicode-multi-byte-characters"] + [cts.https.html?q=webgpu:api,operation,shader_module,compilation_info:offset_and_length:*] [:valid=false;name="ascii"] @@ -7515,11 +8105,1005 @@ [:valid=false;name="unicode"] + [:valid=false;name="unicode-multi-byte-characters"] + [:valid=true;name="ascii"] [:valid=true;name="unicode"] +[cts.https.html?q=webgpu:api,operation,storage_texture,read_only:basic:*] + [:format="bgra8unorm";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + + [:format="bgra8unorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + + [:format="bgra8unorm";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + + [:format="bgra8unorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + + [:format="bgra8unorm";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + + [:format="bgra8unorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + + [:format="bgra8unorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + + [:format="r32float";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="compute";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="compute";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="compute";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="fragment";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="fragment";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="fragment";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="vertex";dimension="1d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="vertex";dimension="2d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";shaderStage="vertex";dimension="3d";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,operation,storage_texture,read_write:basic:*] [:format="r32float";shaderStage="compute";textureDimension="1d";depthOrArrayLayers=1] expected: @@ -8000,13 +9584,13 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:api,operation,uncapturederror:constructor:*] - [:] - - [cts.https.html?q=webgpu:api,operation,uncapturederror:iff_uncaptured:*] [:] + [:errorType="out-of-memory"] + + [:errorType="validation"] + [cts.https.html?q=webgpu:api,operation,uncapturederror:only_original_device_is_event_target:*] [:] @@ -8114,8 +9698,12 @@ if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: @@ -8134,10 +9722,14 @@ if os == "linux" and not debug: FAIL [:format="unorm8x4"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:buffers_with_varying_step_mode:*] [:] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:discontiguous_location_and_attribs:*] @@ -8148,36 +9740,68 @@ [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:max_buffers_and_attribs:*] [:format="float16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="float32"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm8x2"] expected: @@ -8188,32 +9812,56 @@ if os == "linux" and not debug: FAIL [:format="uint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: if os == "linux" and not debug: FAIL [:format="unorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x4"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:non_zero_array_stride_and_attribute_offset:*] @@ -8314,8 +9962,12 @@ if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: @@ -8340,36 +9992,68 @@ [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:overlapping_attributes:*] [:format="float16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="float32"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm8x2"] expected: @@ -8380,32 +10064,56 @@ if os == "linux" and not debug: FAIL [:format="uint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: if os == "linux" and not debug: FAIL [:format="unorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x4"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:setVertexBuffer_offset_and_attribute_offset:*] @@ -8506,6 +10214,8 @@ if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] expected: @@ -8534,36 +10244,68 @@ [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_buffer_used_multiple_times_interleaved:*] [:format="float16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="float32"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm8x2"] expected: @@ -8574,66 +10316,122 @@ if os == "linux" and not debug: FAIL [:format="uint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: if os == "linux" and not debug: FAIL [:format="unorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x4"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_buffer_used_multiple_times_overlapped:*] [:format="float16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="float32"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="float32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="sint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="sint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="snorm8x2"] expected: @@ -8644,32 +10442,56 @@ if os == "linux" and not debug: FAIL [:format="uint16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x3"] + expected: + if os == "linux" and not debug: FAIL [:format="uint32x4"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="uint8x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm10-10-10-2"] expected: if os == "linux" and not debug: FAIL [:format="unorm16x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm16x4"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x2"] + expected: + if os == "linux" and not debug: FAIL [:format="unorm8x4"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:*] @@ -8733,12 +10555,16 @@ [cts.https.html?q=webgpu:api,validation,buffer,create:size:*] + expected: + if os == "linux" and not debug: CRASH [:mappedAtCreation=false] [:mappedAtCreation=true] [cts.https.html?q=webgpu:api,validation,buffer,create:usage:*] + expected: + if os == "linux" and not debug: CRASH [:usage1=0;usage2=0] [:usage1=0;usage2=1] @@ -9052,11 +10878,11 @@ [:] -[cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjoinRanges_many:*] +[cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges:*] [:] -[cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges:*] +[cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,disjointRanges_many:*] [:] @@ -9085,6 +10911,8 @@ [cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,state,invalid_mappedAtCreation:*] + expected: + if os == "linux" and not debug: CRASH [:] @@ -9107,8 +10935,6 @@ [cts.https.html?q=webgpu:api,validation,buffer,mapping:getMappedRange,state,mappingPending:*] - expected: - if os == "linux" and not debug: ERROR [:] expected: if os == "linux" and not debug: FAIL @@ -9162,7 +10988,7 @@ [cts.https.html?q=webgpu:api,validation,buffer,mapping:mapAsync,state,destroyed:*] expected: - if os == "linux" and not debug: [OK, ERROR] + if os == "linux" and not debug: [OK, CRASH] [:] expected: if os == "linux" and not debug: FAIL @@ -9181,8 +11007,6 @@ [cts.https.html?q=webgpu:api,validation,buffer,mapping:mapAsync,state,mappingPending:*] - expected: - if os == "linux" and not debug: ERROR [:] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -10986,6 +12810,170 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindGroupsPlusVertexBuffers:createRenderPipeline,at_over:*] + [:limitTest="atDefault";testValueName="atLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="atLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="overLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="overLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="atLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="atLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="overLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="overLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="atLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="atLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="atLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="atLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="overLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="overLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="atLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="atLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="overLimit";async=false] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="overLimit";async=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindGroupsPlusVertexBuffers:draw,at_over:*] + [:limitTest="atDefault";testValueName="atLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="atLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="overLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atDefault";testValueName="overLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="atLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="atLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="overLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="atMaximum";testValueName="overLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="atLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="atLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="atLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="atLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="overLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="overMaximum";testValueName="overLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="atLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="atLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="overLimit";encoderType="render"] + expected: + if os == "linux" and not debug: FAIL + + [:limitTest="underDefault";testValueName="overLimit";encoderType="renderBundle"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,capability_checks,limits,maxBindingsPerBindGroup:createBindGroupLayout,at_over:*] [:limitTest="atDefault";testValueName="atLimit"] @@ -11042,6 +13030,8 @@ if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";createPipelineType="createRenderPipeline";async=false] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";createPipelineType="createRenderPipeline";async=true] expected: @@ -11080,6 +13070,8 @@ if os == "linux" and not debug: FAIL [:limitTest="atMaximum";testValueName="overLimit";createPipelineType="createRenderPipeline";async=false] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atMaximum";testValueName="overLimit";createPipelineType="createRenderPipeline";async=true] expected: @@ -11118,6 +13110,8 @@ if os == "linux" and not debug: FAIL [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";createPipelineType="createRenderPipeline";async=false] + expected: + if os == "linux" and not debug: FAIL [:limitTest="betweenDefaultAndMaximum";testValueName="overLimit";createPipelineType="createRenderPipeline";async=true] expected: @@ -11251,11 +13245,11 @@ [:limitTest="overMaximum";testValueName="atLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: TIMEOUT [:limitTest="overMaximum";testValueName="overLimit"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: NOTRUN [:limitTest="underDefault";testValueName="atLimit"] expected: @@ -14647,11 +16641,11 @@ [:limitTest="overMaximum";testValueName="atLimit";async=false;pointList=false;frontFacing=false;sampleIndex=false;sampleMaskIn=false;sampleMaskOut=false] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, TIMEOUT] [:limitTest="overMaximum";testValueName="atLimit";async=false;pointList=false;frontFacing=false;sampleIndex=false;sampleMaskIn=false;sampleMaskOut=true] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: [TIMEOUT, NOTRUN] [:limitTest="overMaximum";testValueName="atLimit";async=false;pointList=false;frontFacing=false;sampleIndex=false;sampleMaskIn=true;sampleMaskOut=false] expected: @@ -15954,16 +17948,28 @@ if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="backward";bindGroupTest="differentGroups"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="backward";bindGroupTest="sameGroup"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="forward";bindGroupTest="differentGroups"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="forward";bindGroupTest="sameGroup"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="differentGroups"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertex";order="shiftByHalf";bindGroupTest="sameGroup"] + expected: + if os == "linux" and not debug: FAIL [:limitTest="atDefault";testValueName="overLimit";async=false;bindingCombination="vertexAndFragmentWithPossibleFragmentStageOverflow";order="backward";bindGroupTest="differentGroups"] expected: @@ -18143,11 +20149,11 @@ [:limitTest="overMaximum";testValueName="atLimit"] expected: - if os == "linux" and not debug: [PASS, FAIL] + if os == "linux" and not debug: TIMEOUT [:limitTest="overMaximum";testValueName="overLimit"] expected: - if os == "linux" and not debug: [PASS, TIMEOUT] + if os == "linux" and not debug: NOTRUN [:limitTest="underDefault";testValueName="atLimit"] expected: @@ -18175,11 +20181,11 @@ [:limitTest="overMaximum";testValueName="atLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, TIMEOUT] [:limitTest="overMaximum";testValueName="overLimit"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: [TIMEOUT, NOTRUN] [:limitTest="underDefault";testValueName="atLimit"] expected: @@ -18213,11 +20219,11 @@ [:limitTest="overMaximum";testValueName="atLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, TIMEOUT] [:limitTest="overMaximum";testValueName="overLimit"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: [TIMEOUT, NOTRUN] [:limitTest="underDefault";testValueName="atLimit"] expected: @@ -18250,11 +20256,11 @@ [:limitTest="overMaximum";testValueName="atLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: TIMEOUT [:limitTest="overMaximum";testValueName="overLimit"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: NOTRUN [:limitTest="underDefault";testValueName="atLimit"] expected: @@ -18422,11 +20428,11 @@ [:limitTest="overMaximum";testValueName="atLimit";encoderType="render"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: TIMEOUT [:limitTest="overMaximum";testValueName="atLimit";encoderType="renderBundle"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: NOTRUN [:limitTest="overMaximum";testValueName="overLimit";encoderType="render"] expected: @@ -18498,19 +20504,19 @@ [:limitTest="atDefault";testValueName="underLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [PASS, FAIL] [:limitTest="atMinimum";testValueName="atLimit"] [:limitTest="atMinimum";testValueName="underLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [PASS, FAIL] [:limitTest="betweenDefaultAndMinimum";testValueName="atLimit"] [:limitTest="betweenDefaultAndMinimum";testValueName="underLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [PASS, FAIL] [:limitTest="overDefault";testValueName="atLimit"] expected: @@ -18522,11 +20528,11 @@ [:limitTest="underMinimum";testValueName="atLimit"] expected: - if os == "linux" and not debug: [PASS, FAIL] + if os == "linux" and not debug: [PASS, FAIL, TIMEOUT] [:limitTest="underMinimum";testValueName="underLimit"] expected: - if os == "linux" and not debug: [PASS, TIMEOUT] + if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] [cts.https.html?q=webgpu:api,validation,capability_checks,limits,minStorageBufferOffsetAlignment:validate,greaterThanOrEqualTo32:*] @@ -18562,11 +20568,11 @@ [:limitTest="underMinimum";testValueName="atLimit"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: TIMEOUT [:limitTest="underMinimum";testValueName="underLimit"] expected: - if os == "linux" and not debug: TIMEOUT + if os == "linux" and not debug: NOTRUN [cts.https.html?q=webgpu:api,validation,capability_checks,limits,minUniformBufferOffsetAlignment:setBindGroup,at_over:*] @@ -19079,6 +21085,304 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:api,validation,compute_pipeline:resource_compatibility:*] + [:apiResource="comparison_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="non-filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="read-only-storage_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_1d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d-array_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_2d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="storage_texture_3d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_depth_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_depth_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_depth_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_depth_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_depth_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_sint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_uint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="texture_unfilterable-float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:apiResource="uniform_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,compute_pipeline:shader_module,compute:*] [:isAsync=false;shaderModuleStage="compute"] @@ -19203,16 +21507,28 @@ [:resourceType="errorSamp";entry={"texture":{"multisampled":true,"sampleType":"unfilterable-float"}}] [:resourceType="errorTex";entry={"buffer":{"type":"read-only-storage"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"buffer":{"type":"storage"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"buffer":{"type":"uniform"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"sampler":{"type":"comparison"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"sampler":{"type":"filtering"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"sampler":{"type":"non-filtering"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"storageTexture":{"access":"read-only","format":"r32float"}}] expected: @@ -19223,10 +21539,16 @@ if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"storageTexture":{"access":"write-only","format":"r32float"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"texture":{"multisampled":false,"sampleType":"unfilterable-float"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="errorTex";entry={"texture":{"multisampled":true,"sampleType":"unfilterable-float"}}] + expected: + if os == "linux" and not debug: FAIL [:resourceType="filtSamp";entry={"buffer":{"type":"read-only-storage"}}] @@ -21093,32 +23415,60 @@ [:dimension="1d";format="astc-8x8-unorm-srgb"] [:dimension="1d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bgra8unorm"] @@ -21129,10 +23479,16 @@ if os == "linux" and not debug: FAIL [:dimension="1d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="depth32float-stencil8"] expected: @@ -21497,32 +23853,60 @@ [:dimension="3d";format="astc-8x8-unorm-srgb"] [:dimension="3d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bgra8unorm"] @@ -21533,10 +23917,16 @@ if os == "linux" and not debug: FAIL [:dimension="3d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="depth32float-stencil8"] expected: @@ -21847,94 +24237,168 @@ [cts.https.html?q=webgpu:api,validation,createTexture:mipLevelCount,bound_check,bigger_than_integer_bit_width:*] [:] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createTexture:mipLevelCount,bound_check:*] [:format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createTexture:mipLevelCount,format:*] [:dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="astc-10x10-unorm"] @@ -21993,46 +24457,84 @@ [:dimension="2d";format="astc-8x8-unorm-srgb"] [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float-stencil8"] expected: @@ -22059,164 +24561,296 @@ [:dimension="2d";format="etc2-rgba8unorm-srgb"] [:dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="astc-10x10-unorm"] @@ -22275,46 +24909,84 @@ [:dimension="_undef_";format="astc-8x8-unorm-srgb"] [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float-stencil8"] expected: @@ -22341,80 +25013,144 @@ [:dimension="_undef_";format="etc2-rgba8unorm-srgb"] [:dimension="_undef_";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="stencil8"] expected: @@ -22423,84 +25159,152 @@ [cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:*] [:dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="astc-10x10-unorm"] @@ -22559,46 +25363,84 @@ [:dimension="2d";format="astc-8x8-unorm-srgb"] [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float-stencil8"] expected: @@ -22625,164 +25467,296 @@ [:dimension="2d";format="etc2-rgba8unorm-srgb"] [:dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="astc-10x10-unorm"] @@ -22841,46 +25815,84 @@ [:dimension="_undef_";format="astc-8x8-unorm-srgb"] [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float-stencil8"] expected: @@ -22907,80 +25919,144 @@ [:dimension="_undef_";format="etc2-rgba8unorm-srgb"] [:dimension="_undef_";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="stencil8"] expected: @@ -23045,46 +26121,84 @@ [:dimension="2d";format="astc-8x8-unorm-srgb"] [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float-stencil8"] expected: @@ -23111,80 +26225,144 @@ [:dimension="2d";format="etc2-rgba8unorm-srgb"] [:dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="stencil8"] expected: @@ -23247,46 +26425,84 @@ [:dimension="_undef_";format="astc-8x8-unorm-srgb"] [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float-stencil8"] expected: @@ -23313,80 +26529,144 @@ [:dimension="_undef_";format="etc2-rgba8unorm-srgb"] [:dimension="_undef_";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="stencil8"] expected: @@ -23395,96 +26675,172 @@ [cts.https.html?q=webgpu:api,validation,createTexture:sample_count,1d_2d_array_3d:*] [:dimension="1d";size=[4,1,1\];shouldError=true] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";size=[4,4,1\];shouldError=false] [:dimension="2d";size=[4,4,4\];shouldError=true] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";size=[4,4,6\];shouldError=true] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";size=[4,4,4\];shouldError=true] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createTexture:texture_size,1d_texture:*] [:format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createTexture:texture_size,2d_texture,compressed_format:*] @@ -23499,36 +26855,48 @@ [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth16unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -23571,54 +26939,72 @@ [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="depth32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -23661,180 +27047,240 @@ [:dimension="2d";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="r8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg11b10ufloat";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -23877,180 +27323,240 @@ [:dimension="2d";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rg8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24093,18 +27599,24 @@ [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb9e5ufloat";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24147,198 +27659,264 @@ [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="2d";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24381,36 +27959,48 @@ [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="bgra8unorm-srgb";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth16unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24453,54 +28043,72 @@ [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth24plus-stencil8";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="depth32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float-stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24543,180 +28151,240 @@ [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="r8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg11b10ufloat";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24759,180 +28427,240 @@ [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rg8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -24975,18 +28703,24 @@ [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgb10a2unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb9e5ufloat";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -25029,198 +28763,264 @@ [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba16uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32float";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba32uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8sint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8snorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8uint";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}\]] [:dimension="_undef_";format="rgba8unorm-srgb";sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}\]] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="stencil8";sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}\]] expected: @@ -25367,84 +29167,152 @@ [cts.https.html?q=webgpu:api,validation,createTexture:texture_size,3d_texture,uncompressed_format:*] [:format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createTexture:texture_size,default_value_and_smallest_size,compressed_format:*] @@ -25505,32 +29373,60 @@ [:dimension="2d";format="astc-8x8-unorm-srgb"] [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="eac-r11snorm"] @@ -25609,32 +29505,60 @@ [:dimension="_undef_";format="astc-8x8-unorm-srgb"] [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="eac-r11snorm"] @@ -26017,84 +29941,152 @@ [cts.https.html?q=webgpu:api,validation,createTexture:texture_usage:*] [:dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="astc-10x10-unorm"] @@ -26153,46 +30145,84 @@ [:dimension="2d";format="astc-8x8-unorm-srgb"] [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth32float-stencil8"] expected: @@ -26219,10 +30249,16 @@ [:dimension="2d";format="etc2-rgba8unorm-srgb"] [:dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r32float"] @@ -26231,22 +30267,36 @@ [:dimension="2d";format="r32uint"] [:dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg32float"] @@ -26255,18 +30305,28 @@ [:dimension="2d";format="rg32uint"] [:dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb9e5ufloat"] expected: @@ -26287,12 +30347,16 @@ [:dimension="2d";format="rgba8sint"] [:dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8uint"] [:dimension="2d";format="rgba8unorm"] [:dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="stencil8"] expected: @@ -26335,6 +30399,8 @@ if os == "linux" and not debug: FAIL [:dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="r8uint"] expected: @@ -26377,6 +30443,8 @@ if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rg8uint"] expected: @@ -26427,6 +30495,8 @@ if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8uint"] expected: @@ -26497,46 +30567,84 @@ [:dimension="_undef_";format="astc-8x8-unorm-srgb"] [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth16unorm"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth32float-stencil8"] expected: @@ -26563,10 +30671,16 @@ [:dimension="_undef_";format="etc2-rgba8unorm-srgb"] [:dimension="_undef_";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r32float"] @@ -26575,22 +30689,36 @@ [:dimension="_undef_";format="r32uint"] [:dimension="_undef_";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg32float"] @@ -26599,18 +30727,28 @@ [:dimension="_undef_";format="rg32uint"] [:dimension="_undef_";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb9e5ufloat"] expected: @@ -26631,12 +30769,16 @@ [:dimension="_undef_";format="rgba8sint"] [:dimension="_undef_";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8uint"] [:dimension="_undef_";format="rgba8unorm"] [:dimension="_undef_";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="stencil8"] expected: @@ -26697,6 +30839,8 @@ [:formatFeature="texture-compression-bc";viewFormatFeature="texture-compression-astc"] [:formatFeature="texture-compression-bc";viewFormatFeature="texture-compression-bc"] + expected: + if os == "linux" and not debug: FAIL [:formatFeature="texture-compression-bc";viewFormatFeature="texture-compression-etc2"] @@ -26713,28 +30857,52 @@ [cts.https.html?q=webgpu:api,validation,createTexture:zero_size_and_usage:*] [:dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,createView:array_layers:*] @@ -27674,6 +31842,8 @@ [cts.https.html?q=webgpu:api,validation,encoding,cmds,compute_pass:indirect_dispatch_buffer_state:*] + expected: + if os == "linux" and not debug: CRASH [:] expected: if os == "linux" and not debug: FAIL @@ -29348,6 +33518,8 @@ [cts.https.html?q=webgpu:api,validation,encoding,cmds,setBindGroup:state_and_binding_index:*] + expected: + if os == "linux" and not debug: [OK, CRASH] [:encoderType="compute%20pass";state="destroyed";resourceType="buffer"] expected: if os == "linux" and not debug: FAIL @@ -30237,6 +34409,210 @@ [:type="uniform"] +[cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,compute_pass:*] + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;computeCommand="dispatch"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;computeCommand="dispatchIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;computeCommand="dispatch"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;computeCommand="dispatchIndirect"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;computeCommand="dispatch"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;computeCommand="dispatchIndirect"] + + +[cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,render_pass:*] + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndirect"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndirect"] + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;renderCommand="draw"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;renderCommand="drawIndexed"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;renderCommand="drawIndexedIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=false;renderCommand="drawIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;renderCommand="draw"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;renderCommand="drawIndexed"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;renderCommand="drawIndexedIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto0";swap=true;empty=true;renderCommand="drawIndirect"] + expected: + if os == "linux" and not debug: FAIL + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=false;renderCommand="drawIndirect"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="auto1";swap=false;empty=true;renderCommand="drawIndirect"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndirect"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;renderCommand="draw"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndexed"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndexedIndirect"] + + [:pipelineType="auto0";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndirect"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;renderCommand="draw"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndexed"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndexedIndirect"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=false;renderCommand="drawIndirect"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;renderCommand="draw"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndexed"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndexedIndirect"] + + [:pipelineType="explicit";bindingType="auto0";swap=false;empty=true;renderCommand="drawIndirect"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;renderCommand="draw"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndexed"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndexedIndirect"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=false;renderCommand="drawIndirect"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;renderCommand="draw"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndexed"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndexedIndirect"] + + [:pipelineType="explicit";bindingType="explicit";swap=false;empty=true;renderCommand="drawIndirect"] + + [cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:empty_bind_group_layouts_requires_empty_bind_groups,compute_pass:*] [:bindGroupLayoutEntryCount=3;computeCommand="dispatch"] @@ -31401,6 +35777,8 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="eac-r11snorm";dimension="2d"] @@ -31903,44 +36281,84 @@ [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="depth16unorm";dimension="2d"] expected: @@ -31967,64 +36385,124 @@ [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="WriteTexture";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg11b10ufloat";dimension="1d"] expected: @@ -32039,64 +36517,124 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2uint";dimension="1d"] expected: @@ -32111,10 +36649,16 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb9e5ufloat";dimension="1d"] expected: @@ -32129,70 +36673,136 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="stencil8";dimension="2d"] expected: @@ -32210,6 +36820,8 @@ [cts.https.html?q=webgpu:api,validation,image_copy,buffer_texture_copies:depth_stencil_format,copy_buffer_offset:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] [:format="depth16unorm";aspect="depth-only";copyType="CopyB2T"] expected: if os == "linux" and not debug: FAIL @@ -32227,6 +36839,8 @@ [:format="depth24plus-stencil8";aspect="stencil-only";copyType="CopyT2B"] [:format="depth24plus-stencil8";aspect="stencil-only";copyType="WriteTexture"] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";aspect="depth-only";copyType="CopyT2B"] @@ -32236,15 +36850,15 @@ [:format="depth32float-stencil8";aspect="stencil-only";copyType="CopyB2T"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, TIMEOUT] [:format="depth32float-stencil8";aspect="stencil-only";copyType="CopyT2B"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, NOTRUN] [:format="depth32float-stencil8";aspect="stencil-only";copyType="WriteTexture"] expected: - if os == "linux" and not debug: FAIL + if os == "linux" and not debug: [FAIL, NOTRUN] [:format="stencil8";aspect="stencil-only";copyType="CopyB2T"] expected: @@ -32277,6 +36891,8 @@ [:format="depth24plus-stencil8";aspect="stencil-only";copyType="CopyT2B"] [:format="depth24plus-stencil8";aspect="stencil-only";copyType="WriteTexture"] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float";aspect="depth-only";copyType="CopyT2B"] @@ -32317,6 +36933,8 @@ [:format="depth24plus"] [:format="depth24plus-stencil8"] + expected: + if os == "linux" and not debug: FAIL [:format="depth32float"] @@ -32407,44 +37025,84 @@ [:method="CopyB2T";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyB2T";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="depth16unorm";dimension="2d"] expected: @@ -32471,64 +37129,124 @@ [:method="CopyB2T";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyB2T";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg11b10ufloat";dimension="1d"] expected: @@ -32543,64 +37261,124 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2uint";dimension="1d"] expected: @@ -32615,10 +37393,16 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb9e5ufloat";dimension="1d"] expected: @@ -32633,70 +37417,136 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="stencil8";dimension="2d"] expected: @@ -32759,44 +37609,84 @@ [:method="CopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyT2B";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth16unorm";dimension="2d"] expected: @@ -32827,64 +37717,124 @@ [:method="CopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyT2B";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg11b10ufloat";dimension="1d"] expected: @@ -32899,64 +37849,124 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2uint";dimension="1d"] expected: @@ -32971,10 +37981,16 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb9e5ufloat";dimension="1d"] expected: @@ -32989,70 +38005,136 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="stencil8";dimension="2d"] expected: @@ -33115,44 +38197,84 @@ [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="depth16unorm";dimension="2d"] expected: @@ -33179,64 +38301,124 @@ [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="WriteTexture";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg11b10ufloat";dimension="1d"] expected: @@ -33251,64 +38433,124 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2uint";dimension="1d"] expected: @@ -33323,10 +38565,16 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb9e5ufloat";dimension="1d"] expected: @@ -33341,70 +38589,136 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="stencil8";dimension="2d"] expected: @@ -33477,10 +38791,16 @@ [cts.https.html?q=webgpu:api,validation,image_copy,layout_related:copy_end_overflows_u64:*] [:method="CopyB2T"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,image_copy,layout_related:offset_alignment:*] @@ -33541,44 +38861,84 @@ [:method="CopyB2T";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyB2T";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="depth16unorm";dimension="2d"] expected: @@ -33605,64 +38965,124 @@ [:method="CopyB2T";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyB2T";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg11b10ufloat";dimension="1d"] expected: @@ -33677,64 +39097,124 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2uint";dimension="1d"] expected: @@ -33749,10 +39229,16 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb9e5ufloat";dimension="1d"] expected: @@ -33767,70 +39253,136 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="stencil8";dimension="2d"] expected: @@ -33893,50 +39445,92 @@ [:method="CopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyT2B";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth16unorm";dimension="2d"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="eac-r11snorm";dimension="2d"] @@ -33959,64 +39553,124 @@ [:method="CopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyT2B";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg11b10ufloat";dimension="1d"] expected: @@ -34031,64 +39685,124 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2uint";dimension="1d"] expected: @@ -34103,10 +39817,16 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb9e5ufloat";dimension="1d"] expected: @@ -34121,70 +39841,136 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="stencil8";dimension="2d"] expected: @@ -34247,44 +40033,84 @@ [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="depth16unorm";dimension="2d"] expected: @@ -34311,64 +40137,124 @@ [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="WriteTexture";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg11b10ufloat";dimension="1d"] expected: @@ -34383,64 +40269,124 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2uint";dimension="1d"] expected: @@ -34455,10 +40401,16 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb9e5ufloat";dimension="1d"] expected: @@ -34473,70 +40425,136 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="stencil8";dimension="2d"] expected: @@ -35691,6 +41709,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="2d"] expected: @@ -35701,6 +41721,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="2d"] expected: @@ -35735,6 +41757,8 @@ [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="WriteTexture";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="2d"] expected: @@ -35745,6 +41769,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="2d"] expected: @@ -35755,6 +41781,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="2d"] expected: @@ -35765,6 +41793,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="2d"] expected: @@ -35775,6 +41805,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="2d"] expected: @@ -35785,6 +41817,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="2d"] expected: @@ -35795,6 +41829,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="2d"] expected: @@ -35805,6 +41841,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="2d"] expected: @@ -35815,6 +41853,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="2d"] expected: @@ -35825,6 +41865,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="2d"] expected: @@ -35847,6 +41889,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="2d"] expected: @@ -35857,6 +41901,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="2d"] expected: @@ -35867,6 +41913,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="2d"] expected: @@ -35877,6 +41925,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="2d"] expected: @@ -35887,6 +41937,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="2d"] expected: @@ -35897,6 +41949,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="2d"] expected: @@ -35907,6 +41961,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="2d"] expected: @@ -35917,6 +41973,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="2d"] expected: @@ -35927,6 +41985,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="2d"] expected: @@ -35937,6 +41997,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="2d"] expected: @@ -35959,6 +42021,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="2d"] expected: @@ -35981,6 +42045,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="2d"] expected: @@ -35991,6 +42057,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="2d"] expected: @@ -36001,6 +42069,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="2d"] expected: @@ -36011,6 +42081,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="2d"] expected: @@ -36021,6 +42093,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="2d"] expected: @@ -36031,6 +42105,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="2d"] expected: @@ -36041,6 +42117,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="2d"] expected: @@ -36051,6 +42129,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="2d"] expected: @@ -36061,6 +42141,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="2d"] expected: @@ -36071,6 +42153,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="2d"] expected: @@ -36081,6 +42165,8 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="2d"] expected: @@ -36153,44 +42239,84 @@ [:method="CopyB2T";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyB2T";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="depth16unorm";dimension="2d"] expected: @@ -36217,64 +42343,124 @@ [:method="CopyB2T";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyB2T";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg11b10ufloat";dimension="1d"] expected: @@ -36289,64 +42475,124 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2uint";dimension="1d"] expected: @@ -36361,10 +42607,16 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgb9e5ufloat";dimension="1d"] expected: @@ -36379,70 +42631,136 @@ if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";format="stencil8";dimension="2d"] expected: @@ -36505,50 +42823,92 @@ [:method="CopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="CopyT2B";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth16unorm";dimension="2d"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";format="depth32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="eac-r11snorm";dimension="2d"] @@ -36571,64 +42931,124 @@ [:method="CopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="CopyT2B";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg11b10ufloat";dimension="1d"] expected: @@ -36643,64 +43063,124 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2uint";dimension="1d"] expected: @@ -36715,10 +43195,16 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgb9e5ufloat";dimension="1d"] expected: @@ -36733,70 +43219,136 @@ if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";format="stencil8";dimension="2d"] expected: @@ -36859,44 +43411,84 @@ [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc1-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc4-r-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="depth16unorm";dimension="2d"] expected: @@ -36923,64 +43515,124 @@ [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] [:method="WriteTexture";format="r16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="r8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg11b10ufloat";dimension="1d"] expected: @@ -36995,64 +43647,124 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rg8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2uint";dimension="1d"] expected: @@ -37067,10 +43779,16 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgb9e5ufloat";dimension="1d"] expected: @@ -37085,70 +43803,136 @@ if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba16uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32float";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba32uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8sint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8snorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8uint";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="1d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="2d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";format="stencil8";dimension="2d"] expected: @@ -37195,84 +43979,152 @@ [cts.https.html?q=webgpu:api,validation,image_copy,texture_related:format:*] [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="astc-10x10-unorm"] @@ -37331,36 +44183,68 @@ [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="depth16unorm"] expected: @@ -37387,164 +44271,296 @@ [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=1;dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="astc-10x10-unorm"] @@ -37603,36 +44619,68 @@ [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="depth16unorm"] expected: @@ -37659,164 +44707,296 @@ [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyB2T";depthOrArrayLayers=3;dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="astc-10x10-unorm"] @@ -37875,36 +45055,68 @@ [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="depth16unorm"] expected: @@ -37935,164 +45147,296 @@ [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=1;dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="astc-10x10-unorm"] @@ -38151,36 +45495,68 @@ [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="depth16unorm"] expected: @@ -38211,164 +45587,296 @@ [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="CopyT2B";depthOrArrayLayers=3;dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="1d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="astc-10x10-unorm"] @@ -38427,36 +45935,68 @@ [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="depth16unorm"] expected: @@ -38483,164 +46023,296 @@ [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=1;dimension="2d";format="stencil8"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=32;dimension="3d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="astc-10x10-unorm"] @@ -38699,36 +46371,68 @@ [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="astc-8x8-unorm-srgb"] [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc6h-rgb-ufloat"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="depth16unorm"] expected: @@ -38755,80 +46459,144 @@ [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="etc2-rgba8unorm-srgb"] [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg11b10ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgb10a2uint"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgb9e5ufloat"] expected: if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL [:method="WriteTexture";depthOrArrayLayers=3;dimension="2d";format="stencil8"] expected: @@ -42813,6 +50581,24 @@ [:] +[cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,duplicate_buffers:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,invalid_submit_invalidates:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,validation,queue,submit:command_buffer,submit_invalidates:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,queue,writeBuffer:buffer,device_mismatch:*] [:] @@ -42839,6 +50625,8 @@ [cts.https.html?q=webgpu:api,validation,queue,writeTexture:sample_count:*] [:sampleCount=1] + expected: + if os == "linux" and not debug: FAIL [:sampleCount=4] expected: @@ -42859,6 +50647,8 @@ [cts.https.html?q=webgpu:api,validation,queue,writeTexture:usages:*] [:] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,render_pass,attachment_compatibility:render_pass_and_bundle,color_count:*] @@ -43371,6 +51161,8 @@ [:resolveTargetHeight=4] [:resolveTargetInvalid=true] + expected: + if os == "linux" and not debug: FAIL [:resolveTargetSamples=4] @@ -48007,6 +55799,56 @@ [:isAsync=true;format="rgba8unorm-srgb"] +[cts.https.html?q=webgpu:api,validation,render_pipeline,fragment_state:targets_format_is_color_format:*] + [:format="depth16unorm";isAsync=false] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth16unorm";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus";isAsync=false] + + [:format="depth24plus";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";isAsync=false] + + [:format="depth24plus-stencil8";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float";isAsync=false] + + [:format="depth32float";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";isAsync=false] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";isAsync=false] + + [:format="rgba8unorm";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [:format="stencil8";isAsync=false] + expected: + if os == "linux" and not debug: FAIL + + [:format="stencil8";isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,render_pipeline,fragment_state:targets_format_renderable:*] [:isAsync=false;format="astc-10x10-unorm"] @@ -48482,6 +56324,10 @@ [cts.https.html?q=webgpu:api,validation,render_pipeline,inter_stage:interpolation_sampling:*] [:isAsync=false;output="%40interpolate(flat)";input="%40interpolate(flat)"] + [:isAsync=false;output="%40interpolate(flat,%20either)";input="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=false;output="%40interpolate(linear,%20center)";input="%40interpolate(linear)"] expected: if os == "linux" and not debug: FAIL @@ -48502,6 +56348,10 @@ [:isAsync=true;output="%40interpolate(flat)";input="%40interpolate(flat)"] + [:isAsync=true;output="%40interpolate(flat,%20either)";input="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=true;output="%40interpolate(linear,%20center)";input="%40interpolate(linear)"] expected: if os == "linux" and not debug: FAIL @@ -48542,8 +56392,16 @@ [:isAsync=false;output="%40interpolate(flat)";input="%40interpolate(perspective)"] + [:isAsync=false;output="%40interpolate(flat,%20either)";input="%40interpolate(perspective)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=false;output="%40interpolate(linear)";input="%40interpolate(flat)"] + [:isAsync=false;output="%40interpolate(linear)";input="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=false;output="%40interpolate(linear)";input="%40interpolate(perspective)"] [:isAsync=false;output="%40interpolate(linear,%20center)";input="%40interpolate(linear,%20center)"] @@ -48570,10 +56428,18 @@ expected: if os == "linux" and not debug: FAIL + [:isAsync=true;output="%40interpolate(flat,%20either)";input="%40interpolate(perspective)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=true;output="%40interpolate(linear)";input="%40interpolate(flat)"] expected: if os == "linux" and not debug: FAIL + [:isAsync=true;output="%40interpolate(linear)";input="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + [:isAsync=true;output="%40interpolate(linear)";input="%40interpolate(perspective)"] expected: if os == "linux" and not debug: FAIL @@ -48638,6 +56504,8 @@ [:isAsync=false;numScalarDelta=-3;useExtraBuiltinInputs=true] + [:isAsync=false;numScalarDelta=-4;useExtraBuiltinInputs=true] + [:isAsync=false;numScalarDelta=0;useExtraBuiltinInputs=false] [:isAsync=false;numScalarDelta=0;useExtraBuiltinInputs=true] @@ -48652,6 +56520,8 @@ [:isAsync=true;numScalarDelta=-3;useExtraBuiltinInputs=true] + [:isAsync=true;numScalarDelta=-4;useExtraBuiltinInputs=true] + [:isAsync=true;numScalarDelta=0;useExtraBuiltinInputs=false] [:isAsync=true;numScalarDelta=0;useExtraBuiltinInputs=true] @@ -48659,12 +56529,18 @@ if os == "linux" and not debug: FAIL [:isAsync=true;numScalarDelta=1;useExtraBuiltinInputs=false] - expected: - if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:api,validation,render_pipeline,inter_stage:max_components_count,output:*] [:isAsync=false;numScalarDelta=-1;topology="point-list"] + expected: + if os == "linux" and not debug: FAIL + + [:isAsync=false;numScalarDelta=-3;topology="point-list"] + expected: + if os == "linux" and not debug: FAIL + + [:isAsync=false;numScalarDelta=-4;topology="point-list"] [:isAsync=false;numScalarDelta=0;topology="point-list"] expected: @@ -48675,6 +56551,14 @@ [:isAsync=false;numScalarDelta=1;topology="triangle-list"] [:isAsync=true;numScalarDelta=-1;topology="point-list"] + expected: + if os == "linux" and not debug: FAIL + + [:isAsync=true;numScalarDelta=-3;topology="point-list"] + expected: + if os == "linux" and not debug: FAIL + + [:isAsync=true;numScalarDelta=-4;topology="point-list"] [:isAsync=true;numScalarDelta=0;topology="point-list"] expected: @@ -48715,30 +56599,48 @@ [cts.https.html?q=webgpu:api,validation,render_pipeline,inter_stage:type:*] [:isAsync=false;output="f32";input="f32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="f32";input="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="i32";input="f32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="i32";input="u32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="u32";input="f32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="u32";input="i32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="vec2%3Cf32%3E";input="f32"] expected: if os == "linux" and not debug: FAIL [:isAsync=false;output="vec2%3Cf32%3E";input="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="vec2%3Cf32%3E";input="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;output="vec3%3Cf32%3E";input="vec2%3Cf32%3E"] expected: if os == "linux" and not debug: FAIL [:isAsync=true;output="f32";input="f32"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=true;output="f32";input="vec2%3Cf32%3E"] expected: @@ -48765,6 +56667,8 @@ if os == "linux" and not debug: FAIL [:isAsync=true;output="vec2%3Cf32%3E";input="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:isAsync=true;output="vec2%3Cf32%3E";input="vec3%3Cf32%3E"] expected: @@ -48781,6 +56685,20 @@ [:isAsync=true] +[cts.https.html?q=webgpu:api,validation,render_pipeline,misc:external_texture:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:api,validation,render_pipeline,misc:no_attachment:*] + [:isAsync=false] + + [:isAsync=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,render_pipeline,misc:pipeline_layout,device_mismatch:*] [:] expected: @@ -49445,6 +57363,500 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:api,validation,render_pipeline,resource_compatibility:resource_compatibility:*] + [:stage="fragment";apiResource="comparison_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="non-filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="read-only-storage_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_1d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d-array_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_2d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32float_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32float_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32sint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32sint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32uint_read-write"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="storage_texture_3d_r32uint_write-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_depth_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_depth_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_depth_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_depth_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_depth_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_sint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_uint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="texture_unfilterable-float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";apiResource="uniform_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="comparison_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="non-filtering_sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="read-only-storage_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_1d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_1d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_1d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d-array_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d-array_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d-array_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_2d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_3d_r32float_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_3d_r32sint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="storage_texture_3d_r32uint_read-only"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_depth_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_depth_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_depth_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_depth_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_depth_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_sint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_uint_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_1d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_2d-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_2d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_2d_true"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_3d_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_cube-array_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="texture_unfilterable-float_cube_false"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";apiResource="uniform_buffer"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:api,validation,render_pipeline,shader_module:device_mismatch:*] [:] expected: @@ -49465,6 +57877,8 @@ [cts.https.html?q=webgpu:api,validation,render_pipeline,shader_module:invalid,vertex:*] [:isAsync=false;isVertexShaderValid=false] + expected: + if os == "linux" and not debug: FAIL [:isAsync=false;isVertexShaderValid=true] expected: @@ -56652,6 +65066,8 @@ [cts.https.html?q=webgpu:api,validation,state,device_lost,destroy:createBuffer:*] + expected: + if os == "linux" and not debug: CRASH [:usageType="INDEX";usageCopy="COPY_DST";awaitLost=false;mappedAtCreation=false] [:usageType="INDEX";usageCopy="COPY_DST";awaitLost=false;mappedAtCreation=true] @@ -62124,7 +70540,7 @@ [:format="rgb10a2uint";awaitLost=true] expected: - if os == "linux" and not debug: [FAIL, NOTRUN] + if os == "linux" and not debug: TIMEOUT [:format="rgb10a2unorm";awaitLost=false] expected: @@ -62245,22 +70661,6 @@ [:] -[cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_shader_module_with_bgra8unorm_storage:*] - [:shaderType="compute"] - - [:shaderType="fragment"] - - -[cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_shader_module_without_bgra8unorm_storage:*] - [:shaderType="compute"] - expected: - if os == "linux" and not debug: FAIL - - [:shaderType="fragment"] - expected: - if os == "linux" and not debug: FAIL - - [cts.https.html?q=webgpu:api,validation,texture,bgra8unorm_storage:create_texture:*] [:] @@ -62405,6 +70805,8 @@ [:dimension="1d";textureBindingViewDimension="1d";viewDimension="1d";depthOrArrayLayers=1] [:dimension="1d";textureBindingViewDimension="1d";viewDimension="_undef_";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="2d";viewDimension="2d";depthOrArrayLayers=1] @@ -62427,8 +70829,12 @@ [:dimension="2d";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=1] [:dimension="2d";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="2d-array";viewDimension="cube";depthOrArrayLayers=6] @@ -62447,8 +70853,12 @@ [:dimension="2d";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=1] [:dimension="2d";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="_undef_";viewDimension="cube";depthOrArrayLayers=6] @@ -62457,6 +70867,8 @@ [:dimension="2d";textureBindingViewDimension="cube";viewDimension="2d-array";depthOrArrayLayers=6] [:dimension="2d";textureBindingViewDimension="cube";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="2d";textureBindingViewDimension="cube";viewDimension="cube";depthOrArrayLayers=6] @@ -62467,10 +70879,16 @@ [:dimension="3d";textureBindingViewDimension="3d";viewDimension="3d";depthOrArrayLayers=6] [:dimension="3d";textureBindingViewDimension="3d";viewDimension="_undef_";depthOrArrayLayers=1] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";textureBindingViewDimension="3d";viewDimension="_undef_";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL [:dimension="3d";textureBindingViewDimension="3d";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="2d";viewDimension="2d";depthOrArrayLayers=1] @@ -62493,8 +70911,12 @@ [:dimension="_undef_";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=1] [:dimension="_undef_";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="2d-array";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="2d-array";viewDimension="cube";depthOrArrayLayers=6] @@ -62513,8 +70935,12 @@ [:dimension="_undef_";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=1] [:dimension="_undef_";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=2] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="_undef_";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="_undef_";viewDimension="cube";depthOrArrayLayers=6] @@ -62523,6 +70949,8 @@ [:dimension="_undef_";textureBindingViewDimension="cube";viewDimension="2d-array";depthOrArrayLayers=6] [:dimension="_undef_";textureBindingViewDimension="cube";viewDimension="_undef_";depthOrArrayLayers=6] + expected: + if os == "linux" and not debug: FAIL [:dimension="_undef_";textureBindingViewDimension="cube";viewDimension="cube";depthOrArrayLayers=6] @@ -62749,146 +71177,280 @@ [cts.https.html?q=webgpu:compat,api,validation,encoding,cmds,copyTextureToTexture:multisample:*] [:] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,encoding,programmable,pipeline_bind_group_compat:twoDifferentTextureViews,compute_pass,unused:*] [:textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,encoding,programmable,pipeline_bind_group_compat:twoDifferentTextureViews,compute_pass,used:*] [:bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="dispatchWorkgroups";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="dispatchWorkgroupsIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="dispatchWorkgroups";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="dispatchWorkgroupsIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="dispatchWorkgroups";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="dispatchWorkgroups";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="dispatchWorkgroupsIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="dispatchWorkgroupsIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="dispatchWorkgroups";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="dispatchWorkgroups";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="dispatchWorkgroupsIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="dispatchWorkgroupsIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,encoding,programmable,pipeline_bind_group_compat:twoDifferentTextureViews,render_pass,unused:*] [:encoderType="render%20bundle";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,encoding,programmable,pipeline_bind_group_compat:twoDifferentTextureViews,render_pass,used:*] [:encoderType="render%20bundle";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="draw";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexed";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="draw";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexed";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexedIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20bundle";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="binding%20incompatible%20bindGroups%20then%20fix";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="can%20bind%20same%20view%20in%20different%20bindGroups";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="draw";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexed";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndexedIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20different%20bindGroups";useCase="drawIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="draw";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="draw";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexed";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexed";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexedIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndexedIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndirect";textureType="regular"] + expected: + if os == "linux" and not debug: FAIL [:encoderType="render%20pass";bindCase="incompatible%20views%20in%20the%20same%20bindGroup";useCase="drawIndirect";textureType="storage"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,render_pipeline,depth_stencil_state:depthBiasClamp:*] @@ -62911,98 +71473,44 @@ [cts.https.html?q=webgpu:compat,api,validation,render_pipeline,fragment_state:colorState:*] [:caseName="alphaDstFactor"] + expected: + if os == "linux" and not debug: FAIL [:caseName="alphaOperation"] + expected: + if os == "linux" and not debug: FAIL [:caseName="alphaSrcFactor"] + expected: + if os == "linux" and not debug: FAIL [:caseName="colorDstFactor"] + expected: + if os == "linux" and not debug: FAIL [:caseName="colorOperation"] + expected: + if os == "linux" and not debug: FAIL [:caseName="colorSrcFactor"] + expected: + if os == "linux" and not debug: FAIL [:caseName="default"] + expected: + if os == "linux" and not debug: FAIL [:caseName="noBlendTarget0"] + expected: + if os == "linux" and not debug: FAIL [:caseName="noBlendTarget1"] + expected: + if os == "linux" and not debug: FAIL [:caseName="writeMask"] - - -[cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:interpolate:*] - [:interpolate="";entryPoint="fsWithInterpolationUsage1"] - - [:interpolate="";entryPoint="fsWithInterpolationUsage2"] - - [:interpolate="";entryPoint="fsWithInterpolationUsage3"] - - [:interpolate="";entryPoint="fsWithoutInterpolationUsage"] - - [:interpolate="%40interpolate(linear)";entryPoint="fsWithInterpolationUsage1"] - - [:interpolate="%40interpolate(linear)";entryPoint="fsWithInterpolationUsage2"] - - [:interpolate="%40interpolate(linear)";entryPoint="fsWithInterpolationUsage3"] - - [:interpolate="%40interpolate(linear)";entryPoint="fsWithoutInterpolationUsage"] - - [:interpolate="%40interpolate(linear,%20sample)";entryPoint="fsWithInterpolationUsage1"] - - [:interpolate="%40interpolate(linear,%20sample)";entryPoint="fsWithInterpolationUsage2"] - - [:interpolate="%40interpolate(linear,%20sample)";entryPoint="fsWithInterpolationUsage3"] - - [:interpolate="%40interpolate(linear,%20sample)";entryPoint="fsWithoutInterpolationUsage"] - - [:interpolate="%40interpolate(perspective,%20sample)";entryPoint="fsWithInterpolationUsage1"] - - [:interpolate="%40interpolate(perspective,%20sample)";entryPoint="fsWithInterpolationUsage2"] - - [:interpolate="%40interpolate(perspective,%20sample)";entryPoint="fsWithInterpolationUsage3"] - - [:interpolate="%40interpolate(perspective,%20sample)";entryPoint="fsWithoutInterpolationUsage"] - - -[cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:sample_index:*] - [:entryPoint="fsWithSampleIndexUsage"] - - [:entryPoint="fsWithoutSampleIndexUsage"] - - -[cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:sample_mask:*] - [:entryPoint="fsWithSampleMaskUsage"] - - [:entryPoint="fsWithoutSampleMaskUsage"] - - -[cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:unsupportedStorageTextureFormats,computePipeline:*] - [:format="rg32float";async=false] - - [:format="rg32float";async=true] - - [:format="rg32sint";async=false] - - [:format="rg32sint";async=true] - - [:format="rg32uint";async=false] - - [:format="rg32uint";async=true] - - -[cts.https.html?q=webgpu:compat,api,validation,render_pipeline,shader_module:unsupportedStorageTextureFormats,renderPipeline:*] - [:format="rg32float";async=false] - - [:format="rg32float";async=true] - - [:format="rg32sint";async=false] - - [:format="rg32sint";async=true] - - [:format="rg32uint";async=false] - - [:format="rg32uint";async=true] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:compat,api,validation,render_pipeline,vertex_state:maxVertexAttributesVertexIndexInstanceIndex:*] @@ -63055,6 +71563,50 @@ [:useVertexIndex=true;useInstanceIndex=true;numAttribsToReserve=2;isAsync=true] +[cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:interpolate:*] + [:success=false;interpolate="%40interpolate(flat)"] + + [:success=false;interpolate="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + + [:success=false;interpolate="%40interpolate(linear)"] + + [:success=false;interpolate="%40interpolate(linear,%20sample)"] + + [:success=false;interpolate="%40interpolate(perspective,%20sample)"] + + [:success=true;interpolate=""] + + [:success=true;interpolate="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:sample_index:*] + [:] + + +[cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:sample_mask:*] + [:] + + +[cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:textureLoad_with_depth_textures:*] + [:type="texture_depth_2d"] + + [:type="texture_depth_2d_array"] + + [:type="texture_depth_multisampled_2d"] + + +[cts.https.html?q=webgpu:compat,api,validation,shader_module,shader_module:unsupportedStorageTextureFormats:*] + [:format="rg32float"] + + [:format="rg32sint"] + + [:format="rg32uint"] + + [cts.https.html?q=webgpu:compat,api,validation,texture,createTexture:depthOrArrayLayers_incompatible_with_textureBindingViewDimension:*] [:textureBindingViewDimension="2d";depthOrArrayLayers=1] @@ -63359,6 +71911,1754 @@ [:] +[cts.https.html?q=webgpu:print_environment:info:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:abstract_scalar:*] + [:elementType="abstract-float";indexType="i32"] + + [:elementType="abstract-float";indexType="u32"] + + [:elementType="abstract-int";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:bool:*] + [:inputSource="const";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:concrete_scalar:*] + [:inputSource="const";elementType="f16";indexType="i32"] + + [:inputSource="const";elementType="f16";indexType="u32"] + + [:inputSource="const";elementType="f32";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="f16";indexType="i32"] + + [:inputSource="storage_r";elementType="f16";indexType="u32"] + + [:inputSource="storage_r";elementType="f32";indexType="i32"] + + [:inputSource="storage_r";elementType="f32";indexType="u32"] + + [:inputSource="storage_r";elementType="i32";indexType="i32"] + + [:inputSource="storage_r";elementType="i32";indexType="u32"] + + [:inputSource="storage_r";elementType="u32";indexType="i32"] + + [:inputSource="storage_r";elementType="u32";indexType="u32"] + + [:inputSource="storage_rw";elementType="f16";indexType="i32"] + + [:inputSource="storage_rw";elementType="f16";indexType="u32"] + + [:inputSource="storage_rw";elementType="f32";indexType="i32"] + + [:inputSource="storage_rw";elementType="f32";indexType="u32"] + + [:inputSource="storage_rw";elementType="i32";indexType="i32"] + + [:inputSource="storage_rw";elementType="i32";indexType="u32"] + + [:inputSource="storage_rw";elementType="u32";indexType="i32"] + + [:inputSource="storage_rw";elementType="u32";indexType="u32"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:matrix:*] + [:inputSource="const";elementType="f16"] + + [:inputSource="const";elementType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="f16"] + + [:inputSource="storage_r";elementType="f32"] + + [:inputSource="storage_rw";elementType="f16"] + + [:inputSource="storage_rw";elementType="f32"] + + [:inputSource="uniform";elementType="f16"] + + [:inputSource="uniform";elementType="f32"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:runtime_sized:*] + [:elementType="f16";indexType="i32"] + + [:elementType="f16";indexType="u32"] + + [:elementType="f32";indexType="i32"] + + [:elementType="f32";indexType="u32"] + + [:elementType="i32";indexType="i32"] + + [:elementType="i32";indexType="u32"] + + [:elementType="u32";indexType="i32"] + + [:elementType="u32";indexType="u32"] + + [:elementType="vec2h";indexType="i32"] + + [:elementType="vec2h";indexType="u32"] + + [:elementType="vec2u";indexType="i32"] + + [:elementType="vec2u";indexType="u32"] + + [:elementType="vec3f";indexType="i32"] + + [:elementType="vec3f";indexType="u32"] + + [:elementType="vec4i";indexType="i32"] + + [:elementType="vec4i";indexType="u32"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,array,index:vector:*] + [:inputSource="const";elementType="vec4f";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="vec4f";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="vec4h";indexType="i32"] + + [:inputSource="const";elementType="vec4h";indexType="u32"] + + [:inputSource="const";elementType="vec4i";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="vec4i";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="vec4u";indexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="vec4u";indexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="vec4f";indexType="i32"] + + [:inputSource="storage_r";elementType="vec4f";indexType="u32"] + + [:inputSource="storage_r";elementType="vec4h";indexType="i32"] + + [:inputSource="storage_r";elementType="vec4h";indexType="u32"] + + [:inputSource="storage_r";elementType="vec4i";indexType="i32"] + + [:inputSource="storage_r";elementType="vec4i";indexType="u32"] + + [:inputSource="storage_r";elementType="vec4u";indexType="i32"] + + [:inputSource="storage_r";elementType="vec4u";indexType="u32"] + + [:inputSource="storage_rw";elementType="vec4f";indexType="i32"] + + [:inputSource="storage_rw";elementType="vec4f";indexType="u32"] + + [:inputSource="storage_rw";elementType="vec4h";indexType="i32"] + + [:inputSource="storage_rw";elementType="vec4h";indexType="u32"] + + [:inputSource="storage_rw";elementType="vec4i";indexType="i32"] + + [:inputSource="storage_rw";elementType="vec4i";indexType="u32"] + + [:inputSource="storage_rw";elementType="vec4u";indexType="i32"] + + [:inputSource="storage_rw";elementType="vec4u";indexType="u32"] + + [:inputSource="uniform";elementType="vec4f";indexType="i32"] + + [:inputSource="uniform";elementType="vec4f";indexType="u32"] + + [:inputSource="uniform";elementType="vec4i";indexType="i32"] + + [:inputSource="uniform";elementType="vec4i";indexType="u32"] + + [:inputSource="uniform";elementType="vec4u";indexType="i32"] + + [:inputSource="uniform";elementType="vec4u";indexType="u32"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:abstract_float_column:*] + [:indexType="i32";columns=2;rows=2] + + [:indexType="i32";columns=2;rows=3] + + [:indexType="i32";columns=2;rows=4] + + [:indexType="i32";columns=3;rows=2] + + [:indexType="i32";columns=3;rows=3] + + [:indexType="i32";columns=3;rows=4] + + [:indexType="i32";columns=4;rows=2] + + [:indexType="i32";columns=4;rows=3] + + [:indexType="i32";columns=4;rows=4] + + [:indexType="u32";columns=2;rows=2] + + [:indexType="u32";columns=2;rows=3] + + [:indexType="u32";columns=2;rows=4] + + [:indexType="u32";columns=3;rows=2] + + [:indexType="u32";columns=3;rows=3] + + [:indexType="u32";columns=3;rows=4] + + [:indexType="u32";columns=4;rows=2] + + [:indexType="u32";columns=4;rows=3] + + [:indexType="u32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:abstract_float_element:*] + [:indexType="i32";columns=2;rows=2] + + [:indexType="i32";columns=2;rows=3] + + [:indexType="i32";columns=2;rows=4] + + [:indexType="i32";columns=3;rows=2] + + [:indexType="i32";columns=3;rows=3] + + [:indexType="i32";columns=3;rows=4] + + [:indexType="i32";columns=4;rows=2] + + [:indexType="i32";columns=4;rows=3] + + [:indexType="i32";columns=4;rows=4] + + [:indexType="u32";columns=2;rows=2] + + [:indexType="u32";columns=2;rows=3] + + [:indexType="u32";columns=2;rows=4] + + [:indexType="u32";columns=3;rows=2] + + [:indexType="u32";columns=3;rows=3] + + [:indexType="u32";columns=3;rows=4] + + [:indexType="u32";columns=4;rows=2] + + [:indexType="u32";columns=4;rows=3] + + [:indexType="u32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:concrete_float_column:*] + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,matrix,index:concrete_float_element:*] + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="const";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="const";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";columns=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";columns=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";columns=4;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=2;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=3;rows=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer:*] + [:member_types=["i32","f16","vec4i","mat3x2f"\];inputSource="storage"] + + [:member_types=["i32","f16","vec4i","mat3x2f"\];inputSource="uniform"] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];inputSource="storage"] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];inputSource="uniform"] + + [:member_types=["i32","u32"\];inputSource="storage"] + + [:member_types=["i32","u32"\];inputSource="uniform"] + + [:member_types=["u32"\];inputSource="storage"] + + [:member_types=["u32"\];inputSource="uniform"] + + [:member_types=["vec3f"\];inputSource="storage"] + + [:member_types=["vec3f"\];inputSource="uniform"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_align:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_pointer:*] + [:member_types=["i32","f16","vec4i","mat3x2f"\];inputSource="storage"] + + [:member_types=["i32","f16","vec4i","mat3x2f"\];inputSource="uniform"] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];inputSource="storage"] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];inputSource="uniform"] + + [:member_types=["i32","u32"\];inputSource="storage"] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["i32","u32"\];inputSource="uniform"] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];inputSource="storage"] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];inputSource="uniform"] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];inputSource="storage"] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];inputSource="uniform"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:buffer_size:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:const:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\]] + + [:member_types=["bool"\]] + + [:member_types=["i32","f16","vec4i","mat3x2f"\]] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\]] + + [:member_types=["i32","u32"\]] + + [:member_types=["u32"\]] + + [:member_types=["vec3f"\]] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:const_nested:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\]] + + [:member_types=["bool"\]] + + [:member_types=["i32","f16","vec4i","mat3x2f"\]] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\]] + + [:member_types=["i32","u32"\]] + + [:member_types=["u32"\]] + + [:member_types=["vec3f"\]] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:let:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\]] + + [:member_types=["bool"\]] + + [:member_types=["i32","f16","vec4i","mat3x2f"\]] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\]] + + [:member_types=["i32","u32"\]] + + [:member_types=["u32"\]] + + [:member_types=["vec3f"\]] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,structure,index:param:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\]] + + [:member_types=["bool"\]] + + [:member_types=["i32","f16","vec4i","mat3x2f"\]] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\]] + + [:member_types=["i32","u32"\]] + + [:member_types=["u32"\]] + + [:member_types=["vec3f"\]] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,vector,components:abstract_scalar:*] + [:elementType="abstract-float";width=2;components="rgba"] + + [:elementType="abstract-float";width=2;components="xyzw"] + + [:elementType="abstract-float";width=3;components="rgba"] + + [:elementType="abstract-float";width=3;components="xyzw"] + + [:elementType="abstract-float";width=4;components="rgba"] + + [:elementType="abstract-float";width=4;components="xyzw"] + + [:elementType="abstract-int";width=2;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";width=2;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";width=3;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";width=3;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";width=4;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";width=4;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,vector,components:concrete_scalar:*] + [:inputSource="const";elementType="bool";width=2;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";width=2;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";width=3;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";width=3;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";width=4;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";width=4;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f16";width=2;components="rgba"] + + [:inputSource="const";elementType="f16";width=2;components="xyzw"] + + [:inputSource="const";elementType="f16";width=3;components="rgba"] + + [:inputSource="const";elementType="f16";width=3;components="xyzw"] + + [:inputSource="const";elementType="f16";width=4;components="rgba"] + + [:inputSource="const";elementType="f16";width=4;components="xyzw"] + + [:inputSource="const";elementType="f32";width=2;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";width=2;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";width=3;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";width=3;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";width=4;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";width=4;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=2;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=2;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=3;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=3;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=4;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";width=4;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=2;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=2;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=3;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=3;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=4;components="rgba"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";width=4;components="xyzw"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="bool";width=2;components="rgba"] + + [:inputSource="storage_r";elementType="bool";width=2;components="xyzw"] + + [:inputSource="storage_r";elementType="bool";width=3;components="rgba"] + + [:inputSource="storage_r";elementType="bool";width=3;components="xyzw"] + + [:inputSource="storage_r";elementType="bool";width=4;components="rgba"] + + [:inputSource="storage_r";elementType="bool";width=4;components="xyzw"] + + [:inputSource="storage_r";elementType="f16";width=2;components="rgba"] + + [:inputSource="storage_r";elementType="f16";width=2;components="xyzw"] + + [:inputSource="storage_r";elementType="f16";width=3;components="rgba"] + + [:inputSource="storage_r";elementType="f16";width=3;components="xyzw"] + + [:inputSource="storage_r";elementType="f16";width=4;components="rgba"] + + [:inputSource="storage_r";elementType="f16";width=4;components="xyzw"] + + [:inputSource="storage_r";elementType="f32";width=2;components="rgba"] + + [:inputSource="storage_r";elementType="f32";width=2;components="xyzw"] + + [:inputSource="storage_r";elementType="f32";width=3;components="rgba"] + + [:inputSource="storage_r";elementType="f32";width=3;components="xyzw"] + + [:inputSource="storage_r";elementType="f32";width=4;components="rgba"] + + [:inputSource="storage_r";elementType="f32";width=4;components="xyzw"] + + [:inputSource="storage_r";elementType="i32";width=2;components="rgba"] + + [:inputSource="storage_r";elementType="i32";width=2;components="xyzw"] + + [:inputSource="storage_r";elementType="i32";width=3;components="rgba"] + + [:inputSource="storage_r";elementType="i32";width=3;components="xyzw"] + + [:inputSource="storage_r";elementType="i32";width=4;components="rgba"] + + [:inputSource="storage_r";elementType="i32";width=4;components="xyzw"] + + [:inputSource="storage_r";elementType="u32";width=2;components="rgba"] + + [:inputSource="storage_r";elementType="u32";width=2;components="xyzw"] + + [:inputSource="storage_r";elementType="u32";width=3;components="rgba"] + + [:inputSource="storage_r";elementType="u32";width=3;components="xyzw"] + + [:inputSource="storage_r";elementType="u32";width=4;components="rgba"] + + [:inputSource="storage_r";elementType="u32";width=4;components="xyzw"] + + [:inputSource="storage_rw";elementType="bool";width=2;components="rgba"] + + [:inputSource="storage_rw";elementType="bool";width=2;components="xyzw"] + + [:inputSource="storage_rw";elementType="bool";width=3;components="rgba"] + + [:inputSource="storage_rw";elementType="bool";width=3;components="xyzw"] + + [:inputSource="storage_rw";elementType="bool";width=4;components="rgba"] + + [:inputSource="storage_rw";elementType="bool";width=4;components="xyzw"] + + [:inputSource="storage_rw";elementType="f16";width=2;components="rgba"] + + [:inputSource="storage_rw";elementType="f16";width=2;components="xyzw"] + + [:inputSource="storage_rw";elementType="f16";width=3;components="rgba"] + + [:inputSource="storage_rw";elementType="f16";width=3;components="xyzw"] + + [:inputSource="storage_rw";elementType="f16";width=4;components="rgba"] + + [:inputSource="storage_rw";elementType="f16";width=4;components="xyzw"] + + [:inputSource="storage_rw";elementType="f32";width=2;components="rgba"] + + [:inputSource="storage_rw";elementType="f32";width=2;components="xyzw"] + + [:inputSource="storage_rw";elementType="f32";width=3;components="rgba"] + + [:inputSource="storage_rw";elementType="f32";width=3;components="xyzw"] + + [:inputSource="storage_rw";elementType="f32";width=4;components="rgba"] + + [:inputSource="storage_rw";elementType="f32";width=4;components="xyzw"] + + [:inputSource="storage_rw";elementType="i32";width=2;components="rgba"] + + [:inputSource="storage_rw";elementType="i32";width=2;components="xyzw"] + + [:inputSource="storage_rw";elementType="i32";width=3;components="rgba"] + + [:inputSource="storage_rw";elementType="i32";width=3;components="xyzw"] + + [:inputSource="storage_rw";elementType="i32";width=4;components="rgba"] + + [:inputSource="storage_rw";elementType="i32";width=4;components="xyzw"] + + [:inputSource="storage_rw";elementType="u32";width=2;components="rgba"] + + [:inputSource="storage_rw";elementType="u32";width=2;components="xyzw"] + + [:inputSource="storage_rw";elementType="u32";width=3;components="rgba"] + + [:inputSource="storage_rw";elementType="u32";width=3;components="xyzw"] + + [:inputSource="storage_rw";elementType="u32";width=4;components="rgba"] + + [:inputSource="storage_rw";elementType="u32";width=4;components="xyzw"] + + [:inputSource="uniform";elementType="bool";width=2;components="rgba"] + + [:inputSource="uniform";elementType="bool";width=2;components="xyzw"] + + [:inputSource="uniform";elementType="bool";width=3;components="rgba"] + + [:inputSource="uniform";elementType="bool";width=3;components="xyzw"] + + [:inputSource="uniform";elementType="bool";width=4;components="rgba"] + + [:inputSource="uniform";elementType="bool";width=4;components="xyzw"] + + [:inputSource="uniform";elementType="f16";width=2;components="rgba"] + + [:inputSource="uniform";elementType="f16";width=2;components="xyzw"] + + [:inputSource="uniform";elementType="f16";width=3;components="rgba"] + + [:inputSource="uniform";elementType="f16";width=3;components="xyzw"] + + [:inputSource="uniform";elementType="f16";width=4;components="rgba"] + + [:inputSource="uniform";elementType="f16";width=4;components="xyzw"] + + [:inputSource="uniform";elementType="f32";width=2;components="rgba"] + + [:inputSource="uniform";elementType="f32";width=2;components="xyzw"] + + [:inputSource="uniform";elementType="f32";width=3;components="rgba"] + + [:inputSource="uniform";elementType="f32";width=3;components="xyzw"] + + [:inputSource="uniform";elementType="f32";width=4;components="rgba"] + + [:inputSource="uniform";elementType="f32";width=4;components="xyzw"] + + [:inputSource="uniform";elementType="i32";width=2;components="rgba"] + + [:inputSource="uniform";elementType="i32";width=2;components="xyzw"] + + [:inputSource="uniform";elementType="i32";width=3;components="rgba"] + + [:inputSource="uniform";elementType="i32";width=3;components="xyzw"] + + [:inputSource="uniform";elementType="i32";width=4;components="rgba"] + + [:inputSource="uniform";elementType="i32";width=4;components="xyzw"] + + [:inputSource="uniform";elementType="u32";width=2;components="rgba"] + + [:inputSource="uniform";elementType="u32";width=2;components="xyzw"] + + [:inputSource="uniform";elementType="u32";width=3;components="rgba"] + + [:inputSource="uniform";elementType="u32";width=3;components="xyzw"] + + [:inputSource="uniform";elementType="u32";width=4;components="rgba"] + + [:inputSource="uniform";elementType="u32";width=4;components="xyzw"] + + +[cts.https.html?q=webgpu:shader,execution,expression,access,vector,index:abstract_scalar:*] + [:elementType="abstract-float";indexType="i32";width=2] + + [:elementType="abstract-float";indexType="i32";width=3] + + [:elementType="abstract-float";indexType="i32";width=4] + + [:elementType="abstract-float";indexType="u32";width=2] + + [:elementType="abstract-float";indexType="u32";width=3] + + [:elementType="abstract-float";indexType="u32";width=4] + + [:elementType="abstract-int";indexType="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:elementType="abstract-int";indexType="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,access,vector,index:concrete_scalar:*] + [:inputSource="const";elementType="bool";indexType="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";indexType="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";indexType="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";indexType="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";indexType="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="bool";indexType="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f16";indexType="i32";width=2] + + [:inputSource="const";elementType="f16";indexType="i32";width=3] + + [:inputSource="const";elementType="f16";indexType="i32";width=4] + + [:inputSource="const";elementType="f16";indexType="u32";width=2] + + [:inputSource="const";elementType="f16";indexType="u32";width=3] + + [:inputSource="const";elementType="f16";indexType="u32";width=4] + + [:inputSource="const";elementType="f32";indexType="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="f32";indexType="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="i32";indexType="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";elementType="u32";indexType="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";elementType="bool";indexType="i32";width=2] + + [:inputSource="storage_r";elementType="bool";indexType="i32";width=3] + + [:inputSource="storage_r";elementType="bool";indexType="i32";width=4] + + [:inputSource="storage_r";elementType="bool";indexType="u32";width=2] + + [:inputSource="storage_r";elementType="bool";indexType="u32";width=3] + + [:inputSource="storage_r";elementType="bool";indexType="u32";width=4] + + [:inputSource="storage_r";elementType="f16";indexType="i32";width=2] + + [:inputSource="storage_r";elementType="f16";indexType="i32";width=3] + + [:inputSource="storage_r";elementType="f16";indexType="i32";width=4] + + [:inputSource="storage_r";elementType="f16";indexType="u32";width=2] + + [:inputSource="storage_r";elementType="f16";indexType="u32";width=3] + + [:inputSource="storage_r";elementType="f16";indexType="u32";width=4] + + [:inputSource="storage_r";elementType="f32";indexType="i32";width=2] + + [:inputSource="storage_r";elementType="f32";indexType="i32";width=3] + + [:inputSource="storage_r";elementType="f32";indexType="i32";width=4] + + [:inputSource="storage_r";elementType="f32";indexType="u32";width=2] + + [:inputSource="storage_r";elementType="f32";indexType="u32";width=3] + + [:inputSource="storage_r";elementType="f32";indexType="u32";width=4] + + [:inputSource="storage_r";elementType="i32";indexType="i32";width=2] + + [:inputSource="storage_r";elementType="i32";indexType="i32";width=3] + + [:inputSource="storage_r";elementType="i32";indexType="i32";width=4] + + [:inputSource="storage_r";elementType="i32";indexType="u32";width=2] + + [:inputSource="storage_r";elementType="i32";indexType="u32";width=3] + + [:inputSource="storage_r";elementType="i32";indexType="u32";width=4] + + [:inputSource="storage_r";elementType="u32";indexType="i32";width=2] + + [:inputSource="storage_r";elementType="u32";indexType="i32";width=3] + + [:inputSource="storage_r";elementType="u32";indexType="i32";width=4] + + [:inputSource="storage_r";elementType="u32";indexType="u32";width=2] + + [:inputSource="storage_r";elementType="u32";indexType="u32";width=3] + + [:inputSource="storage_r";elementType="u32";indexType="u32";width=4] + + [:inputSource="storage_rw";elementType="bool";indexType="i32";width=2] + + [:inputSource="storage_rw";elementType="bool";indexType="i32";width=3] + + [:inputSource="storage_rw";elementType="bool";indexType="i32";width=4] + + [:inputSource="storage_rw";elementType="bool";indexType="u32";width=2] + + [:inputSource="storage_rw";elementType="bool";indexType="u32";width=3] + + [:inputSource="storage_rw";elementType="bool";indexType="u32";width=4] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";width=2] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";width=3] + + [:inputSource="storage_rw";elementType="f16";indexType="i32";width=4] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";width=2] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";width=3] + + [:inputSource="storage_rw";elementType="f16";indexType="u32";width=4] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";width=2] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";width=3] + + [:inputSource="storage_rw";elementType="f32";indexType="i32";width=4] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";width=2] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";width=3] + + [:inputSource="storage_rw";elementType="f32";indexType="u32";width=4] + + [:inputSource="storage_rw";elementType="i32";indexType="i32";width=2] + + [:inputSource="storage_rw";elementType="i32";indexType="i32";width=3] + + [:inputSource="storage_rw";elementType="i32";indexType="i32";width=4] + + [:inputSource="storage_rw";elementType="i32";indexType="u32";width=2] + + [:inputSource="storage_rw";elementType="i32";indexType="u32";width=3] + + [:inputSource="storage_rw";elementType="i32";indexType="u32";width=4] + + [:inputSource="storage_rw";elementType="u32";indexType="i32";width=2] + + [:inputSource="storage_rw";elementType="u32";indexType="i32";width=3] + + [:inputSource="storage_rw";elementType="u32";indexType="i32";width=4] + + [:inputSource="storage_rw";elementType="u32";indexType="u32";width=2] + + [:inputSource="storage_rw";elementType="u32";indexType="u32";width=3] + + [:inputSource="storage_rw";elementType="u32";indexType="u32";width=4] + + [:inputSource="uniform";elementType="bool";indexType="i32";width=2] + + [:inputSource="uniform";elementType="bool";indexType="i32";width=3] + + [:inputSource="uniform";elementType="bool";indexType="i32";width=4] + + [:inputSource="uniform";elementType="bool";indexType="u32";width=2] + + [:inputSource="uniform";elementType="bool";indexType="u32";width=3] + + [:inputSource="uniform";elementType="bool";indexType="u32";width=4] + + [:inputSource="uniform";elementType="f16";indexType="i32";width=2] + + [:inputSource="uniform";elementType="f16";indexType="i32";width=3] + + [:inputSource="uniform";elementType="f16";indexType="i32";width=4] + + [:inputSource="uniform";elementType="f16";indexType="u32";width=2] + + [:inputSource="uniform";elementType="f16";indexType="u32";width=3] + + [:inputSource="uniform";elementType="f16";indexType="u32";width=4] + + [:inputSource="uniform";elementType="f32";indexType="i32";width=2] + + [:inputSource="uniform";elementType="f32";indexType="i32";width=3] + + [:inputSource="uniform";elementType="f32";indexType="i32";width=4] + + [:inputSource="uniform";elementType="f32";indexType="u32";width=2] + + [:inputSource="uniform";elementType="f32";indexType="u32";width=3] + + [:inputSource="uniform";elementType="f32";indexType="u32";width=4] + + [:inputSource="uniform";elementType="i32";indexType="i32";width=2] + + [:inputSource="uniform";elementType="i32";indexType="i32";width=3] + + [:inputSource="uniform";elementType="i32";indexType="i32";width=4] + + [:inputSource="uniform";elementType="i32";indexType="u32";width=2] + + [:inputSource="uniform";elementType="i32";indexType="u32";width=3] + + [:inputSource="uniform";elementType="i32";indexType="u32";width=4] + + [:inputSource="uniform";elementType="u32";indexType="i32";width=2] + + [:inputSource="uniform";elementType="u32";indexType="i32";width=3] + + [:inputSource="uniform";elementType="u32";indexType="i32";width=4] + + [:inputSource="uniform";elementType="u32";indexType="u32";width=2] + + [:inputSource="uniform";elementType="u32";indexType="u32";width=3] + + [:inputSource="uniform";elementType="u32";indexType="u32";width=4] + + [cts.https.html?q=webgpu:shader,execution,expression,binary,af_addition:scalar:*] [:inputSource="const"] expected: @@ -63408,6 +73708,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_comparison:equals:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -63428,6 +73730,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_comparison:greater_than:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -63448,6 +73752,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_comparison:less_than:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -63516,6 +73822,194 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const";cols=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_matrix_multiplication:matrix_matrix:*] + [:inputSource="const";common_dim=2;x_rows=2;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=2;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=2;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=3;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=3;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=3;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=4;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=4;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=2;x_rows=4;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=2;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=2;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=2;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=3;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=3;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=3;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=4;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=4;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=3;x_rows=4;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=2;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=2;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=2;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=3;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=3;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=3;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=4;y_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=4;y_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";common_dim=4;x_rows=4;y_cols=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_scalar_multiplication:matrix_scalar:*] + [:inputSource="const";cols=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_scalar_multiplication:scalar_matrix:*] [:inputSource="const";cols=2;rows=2] expected: if os == "linux" and not debug: FAIL @@ -63591,7 +74085,85 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_vector_multiplication:matrix_vector:*] + [:inputSource="const";cols=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,af_matrix_vector_multiplication:vector_matrix:*] + [:inputSource="const";cols=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";cols=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,binary,af_multiplication:scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -63640,6 +74212,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_remainder:scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -63694,6 +74268,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,af_subtraction:scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] expected: if os == "linux" and not debug: FAIL @@ -63735,7 +74311,341 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition_scalar_vector:*] + [:inputSource="const";vectorize_rhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:addition_vector_scalar:*] + [:inputSource="const";vectorize_lhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division_scalar_vector:*] + [:inputSource="const";vectorize_rhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:division_vector_scalar:*] + [:inputSource="const";vectorize_lhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication_scalar_vector:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const";vectorize_rhs=2] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:inputSource="const";vectorize_rhs=3] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:inputSource="const";vectorize_rhs=4] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:multiplication_vector_scalar:*] + [:inputSource="const";vectorize_lhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder_scalar_vector:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const";vectorize_rhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:remainder_vector_scalar:*] + [:inputSource="const";vectorize_lhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction_scalar_vector:*] + [:inputSource="const";vectorize_rhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_rhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_arithmetic:subtraction_vector_scalar:*] + [:inputSource="const";vectorize_lhs=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize_lhs=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:equals:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:greater_equals:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:greater_than:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:less_equals:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:less_than:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,binary,ai_comparison:not_equals:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + [cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise:bitwise_and:*] + [:type="abstract-int";inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="storage_r";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_r";vectorize=2] + + [:type="abstract-int";inputSource="storage_r";vectorize=3] + + [:type="abstract-int";inputSource="storage_r";vectorize=4] + + [:type="abstract-int";inputSource="storage_rw";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_rw";vectorize=2] + + [:type="abstract-int";inputSource="storage_rw";vectorize=3] + + [:type="abstract-int";inputSource="storage_rw";vectorize=4] + + [:type="abstract-int";inputSource="uniform";vectorize="_undef_"] + + [:type="abstract-int";inputSource="uniform";vectorize=2] + + [:type="abstract-int";inputSource="uniform";vectorize=3] + + [:type="abstract-int";inputSource="uniform";vectorize=4] + [:type="i32";inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -63900,6 +74810,46 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise:bitwise_exclusive_or:*] + [:type="abstract-int";inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="storage_r";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_r";vectorize=2] + + [:type="abstract-int";inputSource="storage_r";vectorize=3] + + [:type="abstract-int";inputSource="storage_r";vectorize=4] + + [:type="abstract-int";inputSource="storage_rw";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_rw";vectorize=2] + + [:type="abstract-int";inputSource="storage_rw";vectorize=3] + + [:type="abstract-int";inputSource="storage_rw";vectorize=4] + + [:type="abstract-int";inputSource="uniform";vectorize="_undef_"] + + [:type="abstract-int";inputSource="uniform";vectorize=2] + + [:type="abstract-int";inputSource="uniform";vectorize=3] + + [:type="abstract-int";inputSource="uniform";vectorize=4] + [:type="i32";inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -64064,6 +75014,46 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise:bitwise_or:*] + [:type="abstract-int";inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int";inputSource="storage_r";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_r";vectorize=2] + + [:type="abstract-int";inputSource="storage_r";vectorize=3] + + [:type="abstract-int";inputSource="storage_r";vectorize=4] + + [:type="abstract-int";inputSource="storage_rw";vectorize="_undef_"] + + [:type="abstract-int";inputSource="storage_rw";vectorize=2] + + [:type="abstract-int";inputSource="storage_rw";vectorize=3] + + [:type="abstract-int";inputSource="storage_rw";vectorize=4] + + [:type="abstract-int";inputSource="uniform";vectorize="_undef_"] + + [:type="abstract-int";inputSource="uniform";vectorize=2] + + [:type="abstract-int";inputSource="uniform";vectorize=3] + + [:type="abstract-int";inputSource="uniform";vectorize=4] + [:type="i32";inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -64227,6 +75217,24 @@ [:type="u32";inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_left_abstract:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_left_concrete:*] disabled: true expected: @@ -64315,6 +75323,24 @@ [:type="u32";inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_right_abstract:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,binary,bitwise_shift:shift_right_concrete:*] [:type="i32";inputSource="const";vectorize="_undef_"] expected: @@ -65108,6 +76134,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f16_division:scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] [:inputSource="storage_r"] @@ -65992,6 +77020,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f16_matrix_subtraction:matrix_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";cols=2;rows=2] [:inputSource="const";cols=2;rows=3] @@ -66140,6 +77170,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f16_matrix_vector_multiplication:vector_matrix:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";cols=2;rows=2] [:inputSource="const";cols=2;rows=3] @@ -66510,6 +77542,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f16_remainder:vector_scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] [:inputSource="const";dim=3] @@ -66546,6 +77580,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f16_subtraction:scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -66696,6 +77732,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_addition:scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -66770,6 +77808,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_addition:vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize=2] expected: if os == "linux" and not debug: FAIL @@ -66802,6 +77842,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_addition:vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -66992,6 +78034,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_comparison:less_equals:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -67130,6 +78174,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_division:scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -67484,6 +78530,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_matrix_matrix_multiplication:matrix_matrix:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";common_dim=2;x_rows=2;y_cols=2] expected: if os == "linux" and not debug: FAIL @@ -68578,6 +79626,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_multiplication:scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] expected: if os == "linux" and not debug: FAIL @@ -68706,6 +79756,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_remainder:scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -68760,6 +79812,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_remainder:scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] expected: if os == "linux" and not debug: FAIL @@ -68888,6 +79942,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,f32_subtraction:scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -69432,6 +80488,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:division_vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -69532,6 +80590,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:multiplication:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -69648,6 +80708,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:multiplication_vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -69680,6 +80742,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:multiplication_vector_scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -69778,6 +80842,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:remainder_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -69844,6 +80910,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:remainder_scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_rhs=2] expected: if os == "linux" and not debug: FAIL @@ -70078,6 +81146,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_arithmetic:subtraction_scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_rhs=2] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -70258,6 +81328,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_comparison:greater_than:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -70300,6 +81372,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,i32_comparison:less_equals:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -70542,6 +81616,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:addition_vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -70574,6 +81650,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:addition_vector_scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -70606,6 +81684,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:division:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -70738,6 +81818,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:division_scalar_vector:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_rhs=2] expected: if os == "linux" and not debug: FAIL @@ -70788,6 +81870,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:division_vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -71036,6 +82120,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:multiplication_vector_scalar_compound:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -71466,6 +82552,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_arithmetic:subtraction_vector_scalar:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize_lhs=2] expected: if os == "linux" and not debug: FAIL @@ -71530,6 +82618,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_comparison:equals:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -71698,6 +82788,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_comparison:less_than:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -71740,6 +82832,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,binary,u32_comparison:not_equals:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -71801,12 +82895,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,abs:abstract_int:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -71834,6 +82936,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,abs:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -71995,12 +83099,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,acos:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -72105,12 +83217,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,acosh:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -72915,12 +84035,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,asin:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -73025,12 +84153,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,asinh:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -73058,6 +84194,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,asinh:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -73092,6 +84230,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,asinh:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -73134,13 +84274,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="storage_r";vectorize="_undef_"] @@ -73202,6 +84352,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -73245,12 +84397,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -73355,12 +84515,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atanh:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -76919,6 +88087,10 @@ [:workgroupSize=64;dispatchSize=8;mapId="remap";scalarType="u32"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atomics,atomicSub:sub_i32_min:*] + [:] + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atomics,atomicSub:sub_storage:*] [:workgroupSize=1;dispatchSize=16;scalarType="i32"] @@ -77377,56 +88549,32 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:af_to_f32:*] [:inputSource="const";vectorize="_undef_"] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] - expected: - if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:af_to_i32:*] [:inputSource="const";vectorize="_undef_"] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] - expected: - if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:af_to_u32:*] [:inputSource="const";vectorize="_undef_"] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] - expected: - if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] - expected: - if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:af_to_vec2f16:*] @@ -77436,42 +88584,102 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_f32:*] [:inputSource="const";vectorize="_undef_"] + [:inputSource="const";vectorize="_undef_";alias=false] + + [:inputSource="const";vectorize="_undef_";alias=true] + [:inputSource="const";vectorize=2] + [:inputSource="const";vectorize=2;alias=false] + + [:inputSource="const";vectorize=2;alias=true] + [:inputSource="const";vectorize=3] + [:inputSource="const";vectorize=3;alias=false] + + [:inputSource="const";vectorize=3;alias=true] + [:inputSource="const";vectorize=4] + [:inputSource="const";vectorize=4;alias=false] + + [:inputSource="const";vectorize=4;alias=true] + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_i32:*] [:inputSource="const";vectorize="_undef_"] + [:inputSource="const";vectorize="_undef_";alias=false] + + [:inputSource="const";vectorize="_undef_";alias=true] + [:inputSource="const";vectorize=2] + [:inputSource="const";vectorize=2;alias=false] + + [:inputSource="const";vectorize=2;alias=true] + [:inputSource="const";vectorize=3] + [:inputSource="const";vectorize=3;alias=false] + + [:inputSource="const";vectorize=3;alias=true] + [:inputSource="const";vectorize=4] + [:inputSource="const";vectorize=4;alias=false] + + [:inputSource="const";vectorize=4;alias=true] + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_u32:*] [:inputSource="const";vectorize="_undef_"] - [:inputSource="const";vectorize=2] + [:inputSource="const";vectorize="_undef_";alias=false] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=3] - - [:inputSource="const";vectorize=4] - - -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_vec2f16:*] - [:inputSource="const";vectorize="_undef_"] + [:inputSource="const";vectorize="_undef_";alias=true] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + [:inputSource="const";vectorize=2;alias=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2;alias=true] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";vectorize=3] + [:inputSource="const";vectorize=3;alias=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3;alias=true] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";vectorize=4] + [:inputSource="const";vectorize=4;alias=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4;alias=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_vec2h:*] + [:inputSource="const";alias=false] + + [:inputSource="const";alias=true] + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:f16_to_f16:*] [:inputSource="const";vectorize="_undef_";alias=false] @@ -78335,14 +89543,10 @@ [:inputSource="const"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:vec2ai_to_vec4f16:*] - [:inputSource="const";vectorize="_undef_"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:vec2ai_to_vec4h:*] + [:inputSource="const";alias=false] - [:inputSource="const";vectorize=2] - - [:inputSource="const";vectorize=3] - - [:inputSource="const";vectorize=4] + [:inputSource="const";alias=true] [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,bitcast:vec2f_to_vec4h:*] @@ -78509,12 +89713,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,ceil:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -78636,13 +89848,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,clamp:abstract_int:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -78670,6 +89892,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,clamp:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -78788,6 +90012,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,clamp:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -78831,12 +90057,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,cos:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -78941,12 +90175,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,cosh:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -79008,6 +90250,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,cosh:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -79308,6 +90552,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,cross:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] [:inputSource="storage_r"] @@ -79348,6 +90594,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,degrees:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -79424,6 +90672,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,determinant:abstract_float:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const";dim=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";dim=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";dim=4] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";dimension=2] [:inputSource="const";dimension=3] @@ -79450,6 +90712,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,determinant:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";dim=2] [:inputSource="const";dim=3] @@ -79508,6 +90772,10 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -79541,6 +90809,26 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec2:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:abstract_float_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:f16:*] [:inputSource="const"] @@ -79582,6 +90870,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:f32:*] + expected: + if os == "linux" and not debug: CRASH [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -79594,6 +90884,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,distance:f32_vec2:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -79665,24 +90957,48 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float:*] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec2:*] [:inputSource="const"] - - [:inputSource="storage_r"] - - [:inputSource="storage_rw"] - - [:inputSource="uniform"] + expected: + if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int:*] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec3:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="storage_r"] - [:inputSource="storage_rw"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_float_vec4:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="uniform"] + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec2:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec3:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:abstract_int_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:f16_vec2:*] @@ -79716,6 +91032,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:f32_vec2:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -79728,6 +91046,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:f32_vec3:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -79751,8 +91071,10 @@ [:inputSource="uniform"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32:*] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec2:*] [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r"] @@ -79761,8 +91083,60 @@ [:inputSource="uniform"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32:*] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec3:*] [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r"] + + [:inputSource="storage_rw"] + + [:inputSource="uniform"] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:i32_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r"] + + [:inputSource="storage_rw"] + + [:inputSource="uniform"] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec2:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:inputSource="storage_r"] + + [:inputSource="storage_rw"] + + [:inputSource="uniform"] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r"] + + [:inputSource="storage_rw"] + + [:inputSource="uniform"] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dot:u32_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r"] @@ -79804,6 +91178,38 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dpdxCoarse:f32:*] [:inputSource="const";vectorize="_undef_"] @@ -79838,8 +91244,42 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dpdxFine:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -79872,8 +91312,42 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dpdy:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -79906,6 +91380,38 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: [PASS, FAIL] + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: [PASS, FAIL] + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dpdyCoarse:f32:*] [:inputSource="const";vectorize="_undef_"] @@ -79940,8 +91446,42 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,dpdyFine:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -79974,15 +91514,55 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,exp2:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -80087,12 +91667,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,exp:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -80279,30 +91867,22 @@ [:inputSource="uniform";width=4] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float:*] - [:inputSource="const";vectorize=2] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec2:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=3] - [:inputSource="const";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="storage_r";vectorize=2] - [:inputSource="storage_r";vectorize=3] - - [:inputSource="storage_r";vectorize=4] - - [:inputSource="storage_rw";vectorize=2] - - [:inputSource="storage_rw";vectorize=3] - - [:inputSource="storage_rw";vectorize=4] - - [:inputSource="uniform";vectorize=2] - - [:inputSource="uniform";vectorize=3] - - [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:abstract_float_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,faceForward:f16_vec2:*] @@ -80592,6 +92172,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,floor:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -80728,13 +92310,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,fract:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="storage_r";vectorize="_undef_"] @@ -80762,6 +92354,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,fract:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -80796,6 +92390,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,fract:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -80837,6 +92433,54 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_exp:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_fract:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec2_exp:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec2_fract:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec3_exp:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec3_fract:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec4_exp:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:abstract_float_vec4_fract:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,frexp:f16_exp:*] [:inputSource="const"] @@ -81046,8 +92690,42 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,fwidthCoarse:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -81080,8 +92758,42 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,fwidthFine:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -81114,6 +92826,38 @@ [:inputSource="uniform";vectorize=4] + [:vectorize="_undef_";non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize="_undef_";non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=2;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=3;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=false] + expected: + if os == "linux" and not debug: FAIL + + [:vectorize=4;non_uniform_discard=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,insertBits:integer:*] [:inputSource="const";signed=false;width=1] @@ -81199,12 +92943,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,inversesqrt:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -81309,12 +93061,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,ldexp:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -81418,6 +93178,10 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -81451,6 +93215,26 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec2:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:abstract_float_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:f16:*] [:inputSource="const"] @@ -81516,6 +93300,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,length:f32_vec3:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -81541,12 +93327,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,log2:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -81574,6 +93368,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,log2:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -81608,6 +93404,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,log2:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -81650,13 +93448,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,log:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="storage_r";vectorize="_undef_"] @@ -81684,6 +93492,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,log:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -81779,12 +93589,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,max:abstract_int:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -81846,8 +93664,6 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,max:f32:*] - expected: - if os == "linux" and not debug: CRASH [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: [FAIL, TIMEOUT] @@ -81890,6 +93706,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,max:i32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -81993,12 +93811,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,min:abstract_int:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -82026,6 +93852,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,min:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -82061,7 +93889,7 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,min:f32:*] expected: - if os == "linux" and not debug: CRASH + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -82146,6 +93974,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,min:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -82188,6 +94018,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,mix:abstract_float_matching:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -82330,6 +94162,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,mix:f32_nonmatching_vec2:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82342,6 +94176,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,mix:f32_nonmatching_vec3:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82372,6 +94208,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:abstract_vec2_fract:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: [PASS, FAIL] @@ -82408,6 +94246,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:abstract_whole:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82424,6 +94264,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:f16_vec2_fract:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] [:inputSource="storage_r"] @@ -82444,6 +94286,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:f16_vec3_fract:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] [:inputSource="storage_r"] @@ -82494,6 +94338,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:f32_fract:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82518,6 +94364,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:f32_vec2_whole:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82566,6 +94414,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,modf:f32_vec4_whole:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -82589,38 +94439,22 @@ [:inputSource="uniform"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float:*] - [:inputSource="const";vectorize="_undef_"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec2:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=2] - [:inputSource="const";vectorize=3] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=4] - [:inputSource="storage_r";vectorize="_undef_"] - - [:inputSource="storage_r";vectorize=2] - - [:inputSource="storage_r";vectorize=3] - - [:inputSource="storage_r";vectorize=4] - - [:inputSource="storage_rw";vectorize="_undef_"] - - [:inputSource="storage_rw";vectorize=2] - - [:inputSource="storage_rw";vectorize=3] - - [:inputSource="storage_rw";vectorize=4] - - [:inputSource="uniform";vectorize="_undef_"] - - [:inputSource="uniform";vectorize=2] - - [:inputSource="uniform";vectorize=3] - - [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:abstract_float_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,normalize:f16_vec2:*] @@ -82811,12 +94645,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,pow:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -82844,6 +94686,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,pow:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -82988,6 +94832,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,radians:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -83081,30 +94927,24 @@ [:inputSource="uniform";vectorize=4] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float:*] - [:inputSource="const";vectorize=2] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec2:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=3] - [:inputSource="const";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec3:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="storage_r";vectorize=2] - [:inputSource="storage_r";vectorize=3] - - [:inputSource="storage_r";vectorize=4] - - [:inputSource="storage_rw";vectorize=2] - - [:inputSource="storage_rw";vectorize=3] - - [:inputSource="storage_rw";vectorize=4] - - [:inputSource="uniform";vectorize=2] - - [:inputSource="uniform";vectorize=3] - - [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:abstract_float_vec4:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,reflect:f16_vec2:*] @@ -83173,30 +95013,24 @@ [:inputSource="uniform"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float:*] - [:inputSource="const";vectorize=2] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec2:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="const";vectorize=3] - [:inputSource="const";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec3:*] + [:inputSource="const"] + expected: + if os == "linux" and not debug: FAIL - [:inputSource="storage_r";vectorize=2] - [:inputSource="storage_r";vectorize=3] - - [:inputSource="storage_r";vectorize=4] - - [:inputSource="storage_rw";vectorize=2] - - [:inputSource="storage_rw";vectorize=3] - - [:inputSource="storage_rw";vectorize=4] - - [:inputSource="uniform";vectorize=2] - - [:inputSource="uniform";vectorize=3] - - [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:abstract_float_vec4:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + expected: + if os == "linux" and not debug: [PASS, FAIL] [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:f16_vec2:*] @@ -83242,6 +95076,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:f32_vec3:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -83254,6 +95090,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,refract:f32_vec4:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -83350,6 +95188,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,round:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -83402,6 +95242,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,round:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -83554,6 +95396,22 @@ expected: if os == "linux" and not debug: FAIL + [:inputSource="const";component="ai";overload="scalar"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";component="ai";overload="vec2"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";component="ai";overload="vec3"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";component="ai";overload="vec4"] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";component="b";overload="scalar"] expected: if os == "linux" and not debug: FAIL @@ -83634,6 +95492,14 @@ [:inputSource="storage_r";component="af";overload="vec4"] + [:inputSource="storage_r";component="ai";overload="scalar"] + + [:inputSource="storage_r";component="ai";overload="vec2"] + + [:inputSource="storage_r";component="ai";overload="vec3"] + + [:inputSource="storage_r";component="ai";overload="vec4"] + [:inputSource="storage_r";component="b";overload="scalar"] [:inputSource="storage_r";component="b";overload="vec2"] @@ -83682,6 +95548,14 @@ [:inputSource="storage_rw";component="af";overload="vec4"] + [:inputSource="storage_rw";component="ai";overload="scalar"] + + [:inputSource="storage_rw";component="ai";overload="vec2"] + + [:inputSource="storage_rw";component="ai";overload="vec3"] + + [:inputSource="storage_rw";component="ai";overload="vec4"] + [:inputSource="storage_rw";component="b";overload="scalar"] [:inputSource="storage_rw";component="b";overload="vec2"] @@ -83730,6 +95604,14 @@ [:inputSource="uniform";component="af";overload="vec4"] + [:inputSource="uniform";component="ai";overload="scalar"] + + [:inputSource="uniform";component="ai";overload="vec2"] + + [:inputSource="uniform";component="ai";overload="vec3"] + + [:inputSource="uniform";component="ai";overload="vec4"] + [:inputSource="uniform";component="b";overload="scalar"] [:inputSource="uniform";component="b";overload="vec2"] @@ -83784,6 +95666,18 @@ expected: if os == "linux" and not debug: FAIL + [:inputSource="const";component="ai";overload="vec2"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";component="ai";overload="vec3"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";component="ai";overload="vec4"] + expected: + if os == "linux" and not debug: FAIL + [:inputSource="const";component="b";overload="vec2"] expected: if os == "linux" and not debug: FAIL @@ -83844,6 +95738,12 @@ [:inputSource="storage_r";component="af";overload="vec4"] + [:inputSource="storage_r";component="ai";overload="vec2"] + + [:inputSource="storage_r";component="ai";overload="vec3"] + + [:inputSource="storage_r";component="ai";overload="vec4"] + [:inputSource="storage_r";component="b";overload="vec2"] [:inputSource="storage_r";component="b";overload="vec3"] @@ -83880,6 +95780,12 @@ [:inputSource="storage_rw";component="af";overload="vec4"] + [:inputSource="storage_rw";component="ai";overload="vec2"] + + [:inputSource="storage_rw";component="ai";overload="vec3"] + + [:inputSource="storage_rw";component="ai";overload="vec4"] + [:inputSource="storage_rw";component="b";overload="vec2"] [:inputSource="storage_rw";component="b";overload="vec3"] @@ -83916,6 +95822,12 @@ [:inputSource="uniform";component="af";overload="vec4"] + [:inputSource="uniform";component="ai";overload="vec2"] + + [:inputSource="uniform";component="ai";overload="vec3"] + + [:inputSource="uniform";component="ai";overload="vec4"] + [:inputSource="uniform";component="b";overload="vec2"] [:inputSource="uniform";component="b";overload="vec3"] @@ -83967,12 +95879,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,sign:abstract_int:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84000,6 +95920,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,sign:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -84119,12 +96041,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,sin:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84229,12 +96159,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,sinh:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84339,12 +96277,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,smoothstep:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84448,13 +96394,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,sqrt:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84559,12 +96515,20 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,step:abstract_float:*] [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84626,8 +96590,6 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,step:f32:*] - expected: - if os == "linux" and not debug: CRASH [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -84682,13 +96644,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,tan:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: [PASS, FAIL] [:inputSource="storage_r";vectorize="_undef_"] @@ -84792,13 +96764,23 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,tanh:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL [:inputSource="storage_r";vectorize="_undef_"] @@ -84901,70 +96883,542 @@ [:inputSource="uniform";vectorize=4] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:depth:*] - [:texture_type="texture_depth_2d"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:depth:*] + [:format="depth16unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL - [:texture_type="texture_depth_2d_array"] + [:format="depth16unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL - [:texture_type="texture_depth_cube"] + [:format="depth24plus";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL - [:texture_type="texture_depth_cube_array"] + [:format="depth24plus";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL - [:texture_type="texture_depth_multisampled_2d"] + [:format="depth24plus-stencil8";aspect="depth-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";aspect="depth-only";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="depth-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="depth-only";samples=4] + expected: + if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:external:*] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:external:*] [:] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:sampled:*] - [:texture_type="texture_1d"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:sampled_and_multisampled:*] + [:format="astc-10x10-unorm";aspect="all";samples=1] - [:texture_type="texture_2d"] + [:format="astc-10x10-unorm-srgb";aspect="all";samples=1] - [:texture_type="texture_2d_array"] + [:format="astc-10x5-unorm";aspect="all";samples=1] - [:texture_type="texture_3d"] + [:format="astc-10x5-unorm-srgb";aspect="all";samples=1] - [:texture_type="texture_cube"] + [:format="astc-10x6-unorm";aspect="all";samples=1] - [:texture_type="texture_cube_array"] + [:format="astc-10x6-unorm-srgb";aspect="all";samples=1] - [:texture_type="texture_multisampled_2d"] + [:format="astc-10x8-unorm";aspect="all";samples=1] + + [:format="astc-10x8-unorm-srgb";aspect="all";samples=1] + + [:format="astc-12x10-unorm";aspect="all";samples=1] + + [:format="astc-12x10-unorm-srgb";aspect="all";samples=1] + + [:format="astc-12x12-unorm";aspect="all";samples=1] + + [:format="astc-12x12-unorm-srgb";aspect="all";samples=1] + + [:format="astc-4x4-unorm";aspect="all";samples=1] + + [:format="astc-4x4-unorm-srgb";aspect="all";samples=1] + + [:format="astc-5x4-unorm";aspect="all";samples=1] + + [:format="astc-5x4-unorm-srgb";aspect="all";samples=1] + + [:format="astc-5x5-unorm";aspect="all";samples=1] + + [:format="astc-5x5-unorm-srgb";aspect="all";samples=1] + + [:format="astc-6x5-unorm";aspect="all";samples=1] + + [:format="astc-6x5-unorm-srgb";aspect="all";samples=1] + + [:format="astc-6x6-unorm";aspect="all";samples=1] + + [:format="astc-6x6-unorm-srgb";aspect="all";samples=1] + + [:format="astc-8x5-unorm";aspect="all";samples=1] + + [:format="astc-8x5-unorm-srgb";aspect="all";samples=1] + + [:format="astc-8x6-unorm";aspect="all";samples=1] + + [:format="astc-8x6-unorm-srgb";aspect="all";samples=1] + + [:format="astc-8x8-unorm";aspect="all";samples=1] + + [:format="astc-8x8-unorm-srgb";aspect="all";samples=1] + + [:format="bc1-rgba-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc6h-rgb-float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc6h-rgb-ufloat";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth16unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth16unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";aspect="depth-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";aspect="depth-only";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";aspect="stencil-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth24plus-stencil8";aspect="stencil-only";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="depth-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="depth-only";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="stencil-only";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="depth32float-stencil8";aspect="stencil-only";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="eac-r11snorm";aspect="all";samples=1] + + [:format="eac-r11unorm";aspect="all";samples=1] + + [:format="eac-rg11snorm";aspect="all";samples=1] + + [:format="eac-rg11unorm";aspect="all";samples=1] + + [:format="etc2-rgb8a1unorm";aspect="all";samples=1] + + [:format="etc2-rgb8a1unorm-srgb";aspect="all";samples=1] + + [:format="etc2-rgb8unorm";aspect="all";samples=1] + + [:format="etc2-rgb8unorm-srgb";aspect="all";samples=1] + + [:format="etc2-rgba8unorm";aspect="all";samples=1] + + [:format="etc2-rgba8unorm-srgb";aspect="all";samples=1] + + [:format="r16float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL + + [:format="stencil8";aspect="all";samples=1] + expected: + if os == "linux" and not debug: FAIL + + [:format="stencil8";aspect="all";samples=4] + expected: + if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimension:storage:*] - [:texel_format="r32float"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureDimensions:storage:*] + [:format="r32float";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="r32sint"] + [:format="r32sint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="r32uint"] + [:format="r32uint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rg32float"] + [:format="rg32float";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rg32sint"] + [:format="rg32sint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rg32uint"] + [:format="rg32uint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba16float"] + [:format="rgba16float";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba16sint"] + [:format="rgba16sint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba16uint"] + [:format="rgba16uint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba32float"] + [:format="rgba32float";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba32sint"] + [:format="rgba32sint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba32uint"] + [:format="rgba32uint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba8sint"] + [:format="rgba8sint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba8snorm"] + [:format="rgba8snorm";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba8uint"] + [:format="rgba8uint";aspect="all"] + expected: + if os == "linux" and not debug: FAIL - [:texel_format="rgba8unorm"] + [:format="rgba8unorm";aspect="all"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureGather:depth_2d_coords:*] @@ -85262,8 +97716,288 @@ [:C="u32";coords="y-min-wrap";level=0] + [:format="astc-10x10-unorm"] + + [:format="astc-10x10-unorm-srgb"] + + [:format="astc-10x5-unorm"] + + [:format="astc-10x5-unorm-srgb"] + + [:format="astc-10x6-unorm"] + + [:format="astc-10x6-unorm-srgb"] + + [:format="astc-10x8-unorm"] + + [:format="astc-10x8-unorm-srgb"] + + [:format="astc-12x10-unorm"] + + [:format="astc-12x10-unorm-srgb"] + + [:format="astc-12x12-unorm"] + + [:format="astc-12x12-unorm-srgb"] + + [:format="astc-4x4-unorm"] + + [:format="astc-4x4-unorm-srgb"] + + [:format="astc-5x4-unorm"] + + [:format="astc-5x4-unorm-srgb"] + + [:format="astc-5x5-unorm"] + + [:format="astc-5x5-unorm-srgb"] + + [:format="astc-6x5-unorm"] + + [:format="astc-6x5-unorm-srgb"] + + [:format="astc-6x6-unorm"] + + [:format="astc-6x6-unorm-srgb"] + + [:format="astc-8x5-unorm"] + + [:format="astc-8x5-unorm-srgb"] + + [:format="astc-8x6-unorm"] + + [:format="astc-8x6-unorm-srgb"] + + [:format="astc-8x8-unorm"] + + [:format="astc-8x8-unorm-srgb"] + + [:format="bc1-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="eac-r11snorm"] + + [:format="eac-r11unorm"] + + [:format="eac-rg11snorm"] + + [:format="eac-rg11unorm"] + + [:format="etc2-rgb8a1unorm"] + + [:format="etc2-rgb8a1unorm-srgb"] + + [:format="etc2-rgb8unorm"] + + [:format="etc2-rgb8unorm-srgb"] + + [:format="etc2-rgba8unorm"] + + [:format="etc2-rgba8unorm-srgb"] + + [:format="r16float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb"] + expected: + if os == "linux" and not debug: FAIL + + [:format="stencil8"] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureLoad:sampled_3d:*] + [:C="i32";coords="in-bounds";level="numLevels"] + + [:C="i32";coords="in-bounds";level="numLevels-1"] + [:C="i32";coords="in-bounds";level="numlevels"] [:C="i32";coords="in-bounds";level="numlevels-1"] @@ -85272,6 +98006,10 @@ [:C="i32";coords="in-bounds";level=0] + [:C="i32";coords="x-max-boundary";level="numLevels"] + + [:C="i32";coords="x-max-boundary";level="numLevels-1"] + [:C="i32";coords="x-max-boundary";level="numlevels"] [:C="i32";coords="x-max-boundary";level="numlevels-1"] @@ -85280,6 +98018,10 @@ [:C="i32";coords="x-max-boundary";level=0] + [:C="i32";coords="x-max-wrap";level="numLevels"] + + [:C="i32";coords="x-max-wrap";level="numLevels-1"] + [:C="i32";coords="x-max-wrap";level="numlevels"] [:C="i32";coords="x-max-wrap";level="numlevels-1"] @@ -85288,6 +98030,10 @@ [:C="i32";coords="x-max-wrap";level=0] + [:C="i32";coords="x-min-boundary";level="numLevels"] + + [:C="i32";coords="x-min-boundary";level="numLevels-1"] + [:C="i32";coords="x-min-boundary";level="numlevels"] [:C="i32";coords="x-min-boundary";level="numlevels-1"] @@ -85296,6 +98042,10 @@ [:C="i32";coords="x-min-boundary";level=0] + [:C="i32";coords="x-min-wrap";level="numLevels"] + + [:C="i32";coords="x-min-wrap";level="numLevels-1"] + [:C="i32";coords="x-min-wrap";level="numlevels"] [:C="i32";coords="x-min-wrap";level="numlevels-1"] @@ -85304,6 +98054,10 @@ [:C="i32";coords="x-min-wrap";level=0] + [:C="i32";coords="y-max-boundary";level="numLevels"] + + [:C="i32";coords="y-max-boundary";level="numLevels-1"] + [:C="i32";coords="y-max-boundary";level="numlevels"] [:C="i32";coords="y-max-boundary";level="numlevels-1"] @@ -85312,6 +98066,10 @@ [:C="i32";coords="y-max-boundary";level=0] + [:C="i32";coords="y-max-wrap";level="numLevels"] + + [:C="i32";coords="y-max-wrap";level="numLevels-1"] + [:C="i32";coords="y-max-wrap";level="numlevels"] [:C="i32";coords="y-max-wrap";level="numlevels-1"] @@ -85320,6 +98078,10 @@ [:C="i32";coords="y-max-wrap";level=0] + [:C="i32";coords="y-min-boundary";level="numLevels"] + + [:C="i32";coords="y-min-boundary";level="numLevels-1"] + [:C="i32";coords="y-min-boundary";level="numlevels"] [:C="i32";coords="y-min-boundary";level="numlevels-1"] @@ -85328,6 +98090,10 @@ [:C="i32";coords="y-min-boundary";level=0] + [:C="i32";coords="y-min-wrap";level="numLevels"] + + [:C="i32";coords="y-min-wrap";level="numLevels-1"] + [:C="i32";coords="y-min-wrap";level="numlevels"] [:C="i32";coords="y-min-wrap";level="numlevels-1"] @@ -85336,6 +98102,10 @@ [:C="i32";coords="y-min-wrap";level=0] + [:C="i32";coords="z-max-boundary";level="numLevels"] + + [:C="i32";coords="z-max-boundary";level="numLevels-1"] + [:C="i32";coords="z-max-boundary";level="numlevels"] [:C="i32";coords="z-max-boundary";level="numlevels-1"] @@ -85344,6 +98114,10 @@ [:C="i32";coords="z-max-boundary";level=0] + [:C="i32";coords="z-max-wrap";level="numLevels"] + + [:C="i32";coords="z-max-wrap";level="numLevels-1"] + [:C="i32";coords="z-max-wrap";level="numlevels"] [:C="i32";coords="z-max-wrap";level="numlevels-1"] @@ -85352,6 +98126,10 @@ [:C="i32";coords="z-max-wrap";level=0] + [:C="i32";coords="z-min-boundary";level="numLevels"] + + [:C="i32";coords="z-min-boundary";level="numLevels-1"] + [:C="i32";coords="z-min-boundary";level="numlevels"] [:C="i32";coords="z-min-boundary";level="numlevels-1"] @@ -85360,6 +98138,10 @@ [:C="i32";coords="z-min-boundary";level=0] + [:C="i32";coords="z-min-wrap";level="numLevels"] + + [:C="i32";coords="z-min-wrap";level="numLevels-1"] + [:C="i32";coords="z-min-wrap";level="numlevels"] [:C="i32";coords="z-min-wrap";level="numlevels-1"] @@ -85368,6 +98150,10 @@ [:C="i32";coords="z-min-wrap";level=0] + [:C="u32";coords="in-bounds";level="numLevels"] + + [:C="u32";coords="in-bounds";level="numLevels-1"] + [:C="u32";coords="in-bounds";level="numlevels"] [:C="u32";coords="in-bounds";level="numlevels-1"] @@ -85376,6 +98162,10 @@ [:C="u32";coords="in-bounds";level=0] + [:C="u32";coords="x-max-boundary";level="numLevels"] + + [:C="u32";coords="x-max-boundary";level="numLevels-1"] + [:C="u32";coords="x-max-boundary";level="numlevels"] [:C="u32";coords="x-max-boundary";level="numlevels-1"] @@ -85384,6 +98174,10 @@ [:C="u32";coords="x-max-boundary";level=0] + [:C="u32";coords="x-max-wrap";level="numLevels"] + + [:C="u32";coords="x-max-wrap";level="numLevels-1"] + [:C="u32";coords="x-max-wrap";level="numlevels"] [:C="u32";coords="x-max-wrap";level="numlevels-1"] @@ -85392,6 +98186,10 @@ [:C="u32";coords="x-max-wrap";level=0] + [:C="u32";coords="x-min-boundary";level="numLevels"] + + [:C="u32";coords="x-min-boundary";level="numLevels-1"] + [:C="u32";coords="x-min-boundary";level="numlevels"] [:C="u32";coords="x-min-boundary";level="numlevels-1"] @@ -85400,6 +98198,10 @@ [:C="u32";coords="x-min-boundary";level=0] + [:C="u32";coords="x-min-wrap";level="numLevels"] + + [:C="u32";coords="x-min-wrap";level="numLevels-1"] + [:C="u32";coords="x-min-wrap";level="numlevels"] [:C="u32";coords="x-min-wrap";level="numlevels-1"] @@ -85408,6 +98210,10 @@ [:C="u32";coords="x-min-wrap";level=0] + [:C="u32";coords="y-max-boundary";level="numLevels"] + + [:C="u32";coords="y-max-boundary";level="numLevels-1"] + [:C="u32";coords="y-max-boundary";level="numlevels"] [:C="u32";coords="y-max-boundary";level="numlevels-1"] @@ -85416,6 +98222,10 @@ [:C="u32";coords="y-max-boundary";level=0] + [:C="u32";coords="y-max-wrap";level="numLevels"] + + [:C="u32";coords="y-max-wrap";level="numLevels-1"] + [:C="u32";coords="y-max-wrap";level="numlevels"] [:C="u32";coords="y-max-wrap";level="numlevels-1"] @@ -85424,6 +98234,10 @@ [:C="u32";coords="y-max-wrap";level=0] + [:C="u32";coords="y-min-boundary";level="numLevels"] + + [:C="u32";coords="y-min-boundary";level="numLevels-1"] + [:C="u32";coords="y-min-boundary";level="numlevels"] [:C="u32";coords="y-min-boundary";level="numlevels-1"] @@ -85432,6 +98246,10 @@ [:C="u32";coords="y-min-boundary";level=0] + [:C="u32";coords="y-min-wrap";level="numLevels"] + + [:C="u32";coords="y-min-wrap";level="numLevels-1"] + [:C="u32";coords="y-min-wrap";level="numlevels"] [:C="u32";coords="y-min-wrap";level="numlevels-1"] @@ -85440,6 +98258,10 @@ [:C="u32";coords="y-min-wrap";level=0] + [:C="u32";coords="z-max-boundary";level="numLevels"] + + [:C="u32";coords="z-max-boundary";level="numLevels-1"] + [:C="u32";coords="z-max-boundary";level="numlevels"] [:C="u32";coords="z-max-boundary";level="numlevels-1"] @@ -85448,6 +98270,10 @@ [:C="u32";coords="z-max-boundary";level=0] + [:C="u32";coords="z-max-wrap";level="numLevels"] + + [:C="u32";coords="z-max-wrap";level="numLevels-1"] + [:C="u32";coords="z-max-wrap";level="numlevels"] [:C="u32";coords="z-max-wrap";level="numlevels-1"] @@ -85456,6 +98282,10 @@ [:C="u32";coords="z-max-wrap";level=0] + [:C="u32";coords="z-min-boundary";level="numLevels"] + + [:C="u32";coords="z-min-boundary";level="numLevels-1"] + [:C="u32";coords="z-min-boundary";level="numlevels"] [:C="u32";coords="z-min-boundary";level="numlevels-1"] @@ -85464,6 +98294,10 @@ [:C="u32";coords="z-min-boundary";level=0] + [:C="u32";coords="z-min-wrap";level="numLevels"] + + [:C="u32";coords="z-min-wrap";level="numLevels-1"] + [:C="u32";coords="z-min-wrap";level="numlevels"] [:C="u32";coords="z-min-wrap";level="numlevels-1"] @@ -85473,60 +98307,210 @@ [:C="u32";coords="z-min-wrap";level=0] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureLoad:storage_texel_formats:*] + [:format="bgra8unorm"] + + [:format="r32float"] + + [:format="r32sint"] + + [:format="r32uint"] + + [:format="rg32float"] + + [:format="rg32sint"] + + [:format="rg32uint"] + + [:format="rgba16float"] + + [:format="rgba16sint"] + + [:format="rgba16uint"] + + [:format="rgba32float"] + + [:format="rgba32sint"] + + [:format="rgba32uint"] + + [:format="rgba8sint"] + + [:format="rgba8snorm"] + + [:format="rgba8uint"] + + [:format="rgba8unorm"] + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLayers:arrayed:*] [:texture_type="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLayers:sampled:*] [:texture_type="texture_2d_array"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_cube_array"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLayers:storage:*] [:] + [:format="r32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLevels:depth:*] [:texture_type="texture_depth_2d"] + [:texture_type="texture_depth_2d";view_type="full"] + expected: + if os == "linux" and not debug: FAIL + + [:texture_type="texture_depth_2d";view_type="partial"] + expected: + if os == "linux" and not debug: FAIL + [:texture_type="texture_depth_2d_array"] + [:texture_type="texture_depth_2d_array";view_type="full"] + expected: + if os == "linux" and not debug: FAIL + + [:texture_type="texture_depth_2d_array";view_type="partial"] + expected: + if os == "linux" and not debug: FAIL + [:texture_type="texture_depth_cube"] + [:texture_type="texture_depth_cube";view_type="full"] + expected: + if os == "linux" and not debug: FAIL + + [:texture_type="texture_depth_cube";view_type="partial"] + expected: + if os == "linux" and not debug: FAIL + [:texture_type="texture_depth_cube_array"] + [:texture_type="texture_depth_cube_array";view_type="full"] + expected: + if os == "linux" and not debug: FAIL + + [:texture_type="texture_depth_cube_array";view_type="partial"] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumLevels:sampled:*] [:texture_type="texture_1d"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_2d"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_2d_array"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_3d"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:texture_type="texture_cube_array"] + expected: + if os == "linux" and not debug: FAIL [:texture_type="texture_cube_array%60"] [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumSamples:depth:*] [:] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureNumSamples:sampled:*] [:] - - -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:control_flow:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:depth_2d_coords:*] @@ -85549,11 +98533,1475 @@ [:] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:sampled_2d_coords,derivatives:*] + [:format="astc-10x10-unorm";mipmapFilter="linear"] + + [:format="astc-10x10-unorm";mipmapFilter="nearest"] + + [:format="astc-10x10-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-10x10-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-10x5-unorm";mipmapFilter="linear"] + + [:format="astc-10x5-unorm";mipmapFilter="nearest"] + + [:format="astc-10x5-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-10x5-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-10x6-unorm";mipmapFilter="linear"] + + [:format="astc-10x6-unorm";mipmapFilter="nearest"] + + [:format="astc-10x6-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-10x6-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-10x8-unorm";mipmapFilter="linear"] + + [:format="astc-10x8-unorm";mipmapFilter="nearest"] + + [:format="astc-10x8-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-10x8-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-12x10-unorm";mipmapFilter="linear"] + + [:format="astc-12x10-unorm";mipmapFilter="nearest"] + + [:format="astc-12x10-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-12x10-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-12x12-unorm";mipmapFilter="linear"] + + [:format="astc-12x12-unorm";mipmapFilter="nearest"] + + [:format="astc-12x12-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-12x12-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-4x4-unorm";mipmapFilter="linear"] + + [:format="astc-4x4-unorm";mipmapFilter="nearest"] + + [:format="astc-4x4-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-4x4-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-5x4-unorm";mipmapFilter="linear"] + + [:format="astc-5x4-unorm";mipmapFilter="nearest"] + + [:format="astc-5x4-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-5x4-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-5x5-unorm";mipmapFilter="linear"] + + [:format="astc-5x5-unorm";mipmapFilter="nearest"] + + [:format="astc-5x5-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-5x5-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-6x5-unorm";mipmapFilter="linear"] + + [:format="astc-6x5-unorm";mipmapFilter="nearest"] + + [:format="astc-6x5-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-6x5-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-6x6-unorm";mipmapFilter="linear"] + + [:format="astc-6x6-unorm";mipmapFilter="nearest"] + + [:format="astc-6x6-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-6x6-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-8x5-unorm";mipmapFilter="linear"] + + [:format="astc-8x5-unorm";mipmapFilter="nearest"] + + [:format="astc-8x5-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-8x5-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-8x6-unorm";mipmapFilter="linear"] + + [:format="astc-8x6-unorm";mipmapFilter="nearest"] + + [:format="astc-8x6-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-8x6-unorm-srgb";mipmapFilter="nearest"] + + [:format="astc-8x8-unorm";mipmapFilter="linear"] + + [:format="astc-8x8-unorm";mipmapFilter="nearest"] + + [:format="astc-8x8-unorm-srgb";mipmapFilter="linear"] + + [:format="astc-8x8-unorm-srgb";mipmapFilter="nearest"] + + [:format="bc1-rgba-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="eac-r11snorm";mipmapFilter="linear"] + + [:format="eac-r11snorm";mipmapFilter="nearest"] + + [:format="eac-r11unorm";mipmapFilter="linear"] + + [:format="eac-r11unorm";mipmapFilter="nearest"] + + [:format="eac-rg11snorm";mipmapFilter="linear"] + + [:format="eac-rg11snorm";mipmapFilter="nearest"] + + [:format="eac-rg11unorm";mipmapFilter="linear"] + + [:format="eac-rg11unorm";mipmapFilter="nearest"] + + [:format="etc2-rgb8a1unorm";mipmapFilter="linear"] + + [:format="etc2-rgb8a1unorm";mipmapFilter="nearest"] + + [:format="etc2-rgb8a1unorm-srgb";mipmapFilter="linear"] + + [:format="etc2-rgb8a1unorm-srgb";mipmapFilter="nearest"] + + [:format="etc2-rgb8unorm";mipmapFilter="linear"] + + [:format="etc2-rgb8unorm";mipmapFilter="nearest"] + + [:format="etc2-rgb8unorm-srgb";mipmapFilter="linear"] + + [:format="etc2-rgb8unorm-srgb";mipmapFilter="nearest"] + + [:format="etc2-rgba8unorm";mipmapFilter="linear"] + + [:format="etc2-rgba8unorm";mipmapFilter="nearest"] + + [:format="etc2-rgba8unorm-srgb";mipmapFilter="linear"] + + [:format="etc2-rgba8unorm-srgb";mipmapFilter="nearest"] + + [:format="r16float";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";mipmapFilter="linear"] + + [:format="r32float";mipmapFilter="nearest"] + + [:format="r8snorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";mipmapFilter="linear"] + + [:format="rg32float";mipmapFilter="nearest"] + + [:format="rg8snorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";mipmapFilter="linear"] + + [:format="rgba32float";mipmapFilter="nearest"] + + [:format="rgba8snorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";mipmapFilter="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";mipmapFilter="nearest"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:sampled_2d_coords:*] [:] + [:format="astc-10x10-unorm";sample_points="spiral"] + + [:format="astc-10x10-unorm";sample_points="texel-centre"] + + [:format="astc-10x10-unorm-srgb";sample_points="spiral"] + + [:format="astc-10x10-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-10x5-unorm";sample_points="spiral"] + + [:format="astc-10x5-unorm";sample_points="texel-centre"] + + [:format="astc-10x5-unorm-srgb";sample_points="spiral"] + + [:format="astc-10x5-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-10x6-unorm";sample_points="spiral"] + + [:format="astc-10x6-unorm";sample_points="texel-centre"] + + [:format="astc-10x6-unorm-srgb";sample_points="spiral"] + + [:format="astc-10x6-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-10x8-unorm";sample_points="spiral"] + + [:format="astc-10x8-unorm";sample_points="texel-centre"] + + [:format="astc-10x8-unorm-srgb";sample_points="spiral"] + + [:format="astc-10x8-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-12x10-unorm";sample_points="spiral"] + + [:format="astc-12x10-unorm";sample_points="texel-centre"] + + [:format="astc-12x10-unorm-srgb";sample_points="spiral"] + + [:format="astc-12x10-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-12x12-unorm";sample_points="spiral"] + + [:format="astc-12x12-unorm";sample_points="texel-centre"] + + [:format="astc-12x12-unorm-srgb";sample_points="spiral"] + + [:format="astc-12x12-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-4x4-unorm";sample_points="spiral"] + + [:format="astc-4x4-unorm";sample_points="texel-centre"] + + [:format="astc-4x4-unorm-srgb";sample_points="spiral"] + + [:format="astc-4x4-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-5x4-unorm";sample_points="spiral"] + + [:format="astc-5x4-unorm";sample_points="texel-centre"] + + [:format="astc-5x4-unorm-srgb";sample_points="spiral"] + + [:format="astc-5x4-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-5x5-unorm";sample_points="spiral"] + + [:format="astc-5x5-unorm";sample_points="texel-centre"] + + [:format="astc-5x5-unorm-srgb";sample_points="spiral"] + + [:format="astc-5x5-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-6x5-unorm";sample_points="spiral"] + + [:format="astc-6x5-unorm";sample_points="texel-centre"] + + [:format="astc-6x5-unorm-srgb";sample_points="spiral"] + + [:format="astc-6x5-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-6x6-unorm";sample_points="spiral"] + + [:format="astc-6x6-unorm";sample_points="texel-centre"] + + [:format="astc-6x6-unorm-srgb";sample_points="spiral"] + + [:format="astc-6x6-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-8x5-unorm";sample_points="spiral"] + + [:format="astc-8x5-unorm";sample_points="texel-centre"] + + [:format="astc-8x5-unorm-srgb";sample_points="spiral"] + + [:format="astc-8x5-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-8x6-unorm";sample_points="spiral"] + + [:format="astc-8x6-unorm";sample_points="texel-centre"] + + [:format="astc-8x6-unorm-srgb";sample_points="spiral"] + + [:format="astc-8x6-unorm-srgb";sample_points="texel-centre"] + + [:format="astc-8x8-unorm";sample_points="spiral"] + + [:format="astc-8x8-unorm";sample_points="texel-centre"] + + [:format="astc-8x8-unorm-srgb";sample_points="spiral"] + + [:format="astc-8x8-unorm-srgb";sample_points="texel-centre"] + + [:format="bc1-rgba-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="eac-r11snorm";sample_points="spiral"] + + [:format="eac-r11snorm";sample_points="texel-centre"] + + [:format="eac-r11unorm";sample_points="spiral"] + + [:format="eac-r11unorm";sample_points="texel-centre"] + + [:format="eac-rg11snorm";sample_points="spiral"] + + [:format="eac-rg11snorm";sample_points="texel-centre"] + + [:format="eac-rg11unorm";sample_points="spiral"] + + [:format="eac-rg11unorm";sample_points="texel-centre"] + + [:format="etc2-rgb8a1unorm";sample_points="spiral"] + + [:format="etc2-rgb8a1unorm";sample_points="texel-centre"] + + [:format="etc2-rgb8a1unorm-srgb";sample_points="spiral"] + + [:format="etc2-rgb8a1unorm-srgb";sample_points="texel-centre"] + + [:format="etc2-rgb8unorm";sample_points="spiral"] + + [:format="etc2-rgb8unorm";sample_points="texel-centre"] + + [:format="etc2-rgb8unorm-srgb";sample_points="spiral"] + + [:format="etc2-rgb8unorm-srgb";sample_points="texel-centre"] + + [:format="etc2-rgba8unorm";sample_points="spiral"] + + [:format="etc2-rgba8unorm";sample_points="texel-centre"] + + [:format="etc2-rgba8unorm-srgb";sample_points="spiral"] + + [:format="etc2-rgba8unorm-srgb";sample_points="texel-centre"] + + [:format="r16float";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";sample_points="spiral"] + + [:format="r32float";sample_points="texel-centre"] + + [:format="r8snorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";sample_points="spiral"] + + [:format="rg32float";sample_points="texel-centre"] + + [:format="rg8snorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";sample_points="spiral"] + + [:format="rgba32float";sample_points="texel-centre"] + + [:format="rgba8snorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:sampled_3d_coords:*] + [:format="astc-10x10-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x10-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x10-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x10-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x10-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x10-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x5-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x5-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x5-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x5-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x5-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x5-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x6-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x6-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x6-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x6-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x6-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x6-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x8-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x8-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x8-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-10x8-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-10x8-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-10x8-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-12x10-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-12x10-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-12x10-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-12x10-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-12x10-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-12x10-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-12x12-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-12x12-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-12x12-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-12x12-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-12x12-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-12x12-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-4x4-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-4x4-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-4x4-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-4x4-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-4x4-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-4x4-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-5x4-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-5x4-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-5x4-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-5x4-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-5x4-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-5x4-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-5x5-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-5x5-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-5x5-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-5x5-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-5x5-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-5x5-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-6x5-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-6x5-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-6x5-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-6x5-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-6x5-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-6x5-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-6x6-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-6x6-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-6x6-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-6x6-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-6x6-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-6x6-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x5-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x5-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x5-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x5-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x5-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x5-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x6-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x6-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x6-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x6-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x6-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x6-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x8-unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x8-unorm";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x8-unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="astc-8x8-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="astc-8x8-unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="astc-8x8-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="bc1-rgba-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc1-rgba-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc2-rgba-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc3-rgba-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-snorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc4-r-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-snorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc5-rg-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bc7-rgba-unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="bgra8unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="eac-r11snorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="eac-r11snorm";viewDimension="cube";sample_points="spiral"] + + [:format="eac-r11snorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="eac-r11unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="eac-r11unorm";viewDimension="cube";sample_points="spiral"] + + [:format="eac-r11unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="eac-rg11snorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="eac-rg11snorm";viewDimension="cube";sample_points="spiral"] + + [:format="eac-rg11snorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="eac-rg11unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="eac-rg11unorm";viewDimension="cube";sample_points="spiral"] + + [:format="eac-rg11unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgb8a1unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgb8a1unorm";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgb8a1unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgb8a1unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgb8a1unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgb8a1unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgb8unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgb8unorm";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgb8unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgb8unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgb8unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgb8unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgba8unorm";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgba8unorm";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgba8unorm";viewDimension="cube";sample_points="texel-centre"] + + [:format="etc2-rgba8unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + + [:format="etc2-rgba8unorm-srgb";viewDimension="cube";sample_points="spiral"] + + [:format="etc2-rgba8unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + + [:format="r16float";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r16float";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32float";viewDimension="3d";sample_points="spiral"] + + [:format="r32float";viewDimension="3d";sample_points="texel-centre"] + + [:format="r32float";viewDimension="cube";sample_points="cube-edges"] + + [:format="r32float";viewDimension="cube";sample_points="spiral"] + + [:format="r32float";viewDimension="cube";sample_points="texel-centre"] + + [:format="r8snorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8snorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r8unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg11b10ufloat";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg16float";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float";viewDimension="3d";sample_points="spiral"] + + [:format="rg32float";viewDimension="3d";sample_points="texel-centre"] + + [:format="rg32float";viewDimension="cube";sample_points="cube-edges"] + + [:format="rg32float";viewDimension="cube";sample_points="spiral"] + + [:format="rg32float";viewDimension="cube";sample_points="texel-centre"] + + [:format="rg8snorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8snorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg8unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb10a2unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgb9e5ufloat";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float";viewDimension="3d";sample_points="spiral"] + + [:format="rgba32float";viewDimension="3d";sample_points="texel-centre"] + + [:format="rgba32float";viewDimension="cube";sample_points="cube-edges"] + + [:format="rgba32float";viewDimension="cube";sample_points="spiral"] + + [:format="rgba32float";viewDimension="cube";sample_points="texel-centre"] + + [:format="rgba8snorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";viewDimension="3d";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";viewDimension="3d";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";viewDimension="cube";sample_points="cube-edges"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";viewDimension="cube";sample_points="spiral"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm-srgb";viewDimension="cube";sample_points="texel-centre"] + expected: + if os == "linux" and not debug: FAIL + [:texture_type="texture_3d"] [:texture_type="texture_cube"] @@ -85567,14 +100015,6 @@ [:] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSample:stage:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] - - [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:arrayed_2d_coords:*] [:] @@ -85583,14 +100023,6 @@ [:] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:control_flow:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] - - [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:sampled_2d_coords:*] [:] @@ -85601,14 +100033,6 @@ [:texture_type="texture_cube"] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:stage:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] - - [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:2d_coords:*] [:] @@ -85625,22 +100049,6 @@ [:] -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:control_flow:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] - - -[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompare:stage:*] - [:stage="compute"] - - [:stage="fragment"] - - [:stage="vertex"] - - [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleCompareLevel:2d_coords:*] [:] @@ -85721,6 +100129,142 @@ [:] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:bgra8unorm_swizzle:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds:*] + [:dim="1d";coords="i32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="1d";coords="u32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=2;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=2;mip=1] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=3;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=3;mip=1] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="i32";mipCount=3;mip=2] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=2;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=2;mip=1] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=3;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=3;mip=1] + expected: + if os == "linux" and not debug: FAIL + + [:dim="2d";coords="u32";mipCount=3;mip=2] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="i32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="i32";mipCount=2;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="i32";mipCount=2;mip=1] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="u32";mipCount=1;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="u32";mipCount=2;mip=0] + expected: + if os == "linux" and not debug: FAIL + + [:dim="3d";coords="u32";mipCount=2;mip=1] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:*] + [:baseLevel=0;arrayLevels=1;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=1;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=2;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=2;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=3;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=3;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=4;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=0;arrayLevels=4;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=1;arrayLevels=2;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=1;arrayLevels=2;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=1;arrayLevels=3;type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:baseLevel=1;arrayLevels=3;type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:store_1d_coords:*] [:format="r32float"] @@ -85857,6 +100401,74 @@ [:format="rgba8unorm"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureStore:texel_formats:*] + [:format="bgra8unorm"] + + [:format="r32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="r32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rg32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba16uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32float"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba32uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8sint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8snorm"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8uint"] + expected: + if os == "linux" and not debug: FAIL + + [:format="rgba8unorm"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,transpose:abstract_float:*] [:inputSource="const";cols=2;rows=2] expected: @@ -85970,6 +100582,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,transpose:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";cols=2;rows=2] expected: if os == "linux" and not debug: FAIL @@ -86062,6 +100676,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,trunc:abstract_float:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -86114,6 +100730,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,trunc:f32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -86251,6 +100869,98 @@ [:stage="vertex"] +[cts.https.html?q=webgpu:shader,execution,expression,call,builtin,workgroupUniformLoad:types:*] + [:type="ComplexStruct";wgsize=[1,128\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="ComplexStruct";wgsize=[1,1\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="ComplexStruct";wgsize=[16,16\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="ComplexStruct";wgsize=[3,7\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="SimpleStruct";wgsize=[1,128\]] + + [:type="SimpleStruct";wgsize=[1,1\]] + + [:type="SimpleStruct";wgsize=[16,16\]] + + [:type="SimpleStruct";wgsize=[3,7\]] + + [:type="array%3Cu32,%204%3E";wgsize=[1,128\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="array%3Cu32,%204%3E";wgsize=[1,1\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="array%3Cu32,%204%3E";wgsize=[16,16\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="array%3Cu32,%204%3E";wgsize=[3,7\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";wgsize=[1,128\]] + + [:type="bool";wgsize=[1,1\]] + + [:type="bool";wgsize=[16,16\]] + + [:type="bool";wgsize=[3,7\]] + + [:type="mat3x2f";wgsize=[1,128\]] + + [:type="mat3x2f";wgsize=[1,1\]] + + [:type="mat3x2f";wgsize=[16,16\]] + + [:type="mat3x2f";wgsize=[3,7\]] + + [:type="u32";wgsize=[1,128\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";wgsize=[1,1\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";wgsize=[16,16\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";wgsize=[3,7\]] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4u";wgsize=[1,128\]] + + [:type="vec4u";wgsize=[1,1\]] + + [:type="vec4u";wgsize=[16,16\]] + + [:type="vec4u";wgsize=[3,7\]] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:array_length:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:atomic_ptr_to_element:*] + [:address_space="storage"] + + [:address_space="workgroup"] + + [cts.https.html?q=webgpu:shader,execution,expression,call,user,ptr_params:mixed_ptr_parameters:*] [:] @@ -86465,7 +101175,7477 @@ [:address_space="workgroup"] +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_array_elements:*] + [:abstract_type="abstract-float";concrete_type="f16";length=1] + + [:abstract_type="abstract-float";concrete_type="f16";length=10] + + [:abstract_type="abstract-float";concrete_type="f16";length=5] + + [:abstract_type="abstract-float";concrete_type="f32";length=1] + + [:abstract_type="abstract-float";concrete_type="f32";length=10] + + [:abstract_type="abstract-float";concrete_type="f32";length=5] + + [:abstract_type="abstract-int";concrete_type="f16";length=1] + + [:abstract_type="abstract-int";concrete_type="f16";length=10] + + [:abstract_type="abstract-int";concrete_type="f16";length=5] + + [:abstract_type="abstract-int";concrete_type="f32";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="i32";length=1] + + [:abstract_type="abstract-int";concrete_type="i32";length=10] + + [:abstract_type="abstract-int";concrete_type="i32";length=5] + + [:abstract_type="abstract-int";concrete_type="u32";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3f";length=1] + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3f";length=10] + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3f";length=5] + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3h";length=1] + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3h";length=10] + + [:abstract_type="mat2x3%3Cabstract-float%3E";concrete_type="mat2x3h";length=5] + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3f";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3f";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3f";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3h";length=1] + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3h";length=10] + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3h";length=5] + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3i";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3i";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3i";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3u";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3u";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec3%3Cabstract-int%3E";concrete_type="vec3u";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4f";length=1] + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4f";length=10] + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4f";length=5] + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4h";length=1] + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4h";length=10] + + [:abstract_type="vec4%3Cabstract-float%3E";concrete_type="vec4h";length=5] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_matrix_column_vectors:*] + [:concrete_type="f16";columns=2;rows=2] + + [:concrete_type="f16";columns=2;rows=3] + + [:concrete_type="f16";columns=2;rows=4] + + [:concrete_type="f16";columns=3;rows=2] + + [:concrete_type="f16";columns=3;rows=3] + + [:concrete_type="f16";columns=3;rows=4] + + [:concrete_type="f16";columns=4;rows=2] + + [:concrete_type="f16";columns=4;rows=3] + + [:concrete_type="f16";columns=4;rows=4] + + [:concrete_type="f32";columns=2;rows=2] + + [:concrete_type="f32";columns=2;rows=3] + + [:concrete_type="f32";columns=2;rows=4] + + [:concrete_type="f32";columns=3;rows=2] + + [:concrete_type="f32";columns=3;rows=3] + + [:concrete_type="f32";columns=3;rows=4] + + [:concrete_type="f32";columns=4;rows=2] + + [:concrete_type="f32";columns=4;rows=3] + + [:concrete_type="f32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_matrix_elements:*] + [:concrete_type="f16";columns=2;rows=2] + + [:concrete_type="f16";columns=2;rows=3] + + [:concrete_type="f16";columns=2;rows=4] + + [:concrete_type="f16";columns=3;rows=2] + + [:concrete_type="f16";columns=3;rows=3] + + [:concrete_type="f16";columns=3;rows=4] + + [:concrete_type="f16";columns=4;rows=2] + + [:concrete_type="f16";columns=4;rows=3] + + [:concrete_type="f16";columns=4;rows=4] + + [:concrete_type="f32";columns=2;rows=2] + + [:concrete_type="f32";columns=2;rows=3] + + [:concrete_type="f32";columns=2;rows=4] + + [:concrete_type="f32";columns=3;rows=2] + + [:concrete_type="f32";columns=3;rows=3] + + [:concrete_type="f32";columns=3;rows=4] + + [:concrete_type="f32";columns=4;rows=2] + + [:concrete_type="f32";columns=4;rows=3] + + [:concrete_type="f32";columns=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_elements:*] + [:abstract_type="abstract-float";concrete_type="f16";width=2] + + [:abstract_type="abstract-float";concrete_type="f16";width=3] + + [:abstract_type="abstract-float";concrete_type="f16";width=4] + + [:abstract_type="abstract-float";concrete_type="f32";width=2] + + [:abstract_type="abstract-float";concrete_type="f32";width=3] + + [:abstract_type="abstract-float";concrete_type="f32";width=4] + + [:abstract_type="abstract-int";concrete_type="f16";width=2] + + [:abstract_type="abstract-int";concrete_type="f16";width=3] + + [:abstract_type="abstract-int";concrete_type="f16";width=4] + + [:abstract_type="abstract-int";concrete_type="f32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="i32";width=2] + + [:abstract_type="abstract-int";concrete_type="i32";width=3] + + [:abstract_type="abstract-int";concrete_type="i32";width=4] + + [:abstract_type="abstract-int";concrete_type="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_mix:*] + [:abstract_type="abstract-float";concrete_type="f16";signature="22"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="2s"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="2ss"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="3s"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="s2"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="s2s"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="s3"] + + [:abstract_type="abstract-float";concrete_type="f16";signature="ss2"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="22"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="2s"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="2ss"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="3s"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="s2"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="s2s"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="s3"] + + [:abstract_type="abstract-float";concrete_type="f32";signature="ss2"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="22"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="2s"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="2ss"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="3s"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="s2"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="s2s"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="s3"] + + [:abstract_type="abstract-int";concrete_type="f16";signature="ss2"] + + [:abstract_type="abstract-int";concrete_type="f32";signature="22"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="2s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="2ss"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="3s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="s2"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="s2s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="s3"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";signature="ss2"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="i32";signature="22"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="2s"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="2ss"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="3s"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="s2"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="s2s"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="s3"] + + [:abstract_type="abstract-int";concrete_type="i32";signature="ss2"] + + [:abstract_type="abstract-int";concrete_type="u32";signature="22"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="2s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="2ss"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="3s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="s2"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="s2s"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="s3"] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";signature="ss2"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:abstract_vector_splat:*] + [:abstract_type="abstract-float";concrete_type="f16";value=100;width=2] + + [:abstract_type="abstract-float";concrete_type="f16";value=100;width=3] + + [:abstract_type="abstract-float";concrete_type="f16";value=100;width=4] + + [:abstract_type="abstract-float";concrete_type="f16";value=1;width=2] + + [:abstract_type="abstract-float";concrete_type="f16";value=1;width=3] + + [:abstract_type="abstract-float";concrete_type="f16";value=1;width=4] + + [:abstract_type="abstract-float";concrete_type="f16";value=2;width=2] + + [:abstract_type="abstract-float";concrete_type="f16";value=2;width=3] + + [:abstract_type="abstract-float";concrete_type="f16";value=2;width=4] + + [:abstract_type="abstract-float";concrete_type="f16";value=5;width=2] + + [:abstract_type="abstract-float";concrete_type="f16";value=5;width=3] + + [:abstract_type="abstract-float";concrete_type="f16";value=5;width=4] + + [:abstract_type="abstract-float";concrete_type="f32";value=100;width=2] + + [:abstract_type="abstract-float";concrete_type="f32";value=100;width=3] + + [:abstract_type="abstract-float";concrete_type="f32";value=100;width=4] + + [:abstract_type="abstract-float";concrete_type="f32";value=1;width=2] + + [:abstract_type="abstract-float";concrete_type="f32";value=1;width=3] + + [:abstract_type="abstract-float";concrete_type="f32";value=1;width=4] + + [:abstract_type="abstract-float";concrete_type="f32";value=2;width=2] + + [:abstract_type="abstract-float";concrete_type="f32";value=2;width=3] + + [:abstract_type="abstract-float";concrete_type="f32";value=2;width=4] + + [:abstract_type="abstract-float";concrete_type="f32";value=5;width=2] + + [:abstract_type="abstract-float";concrete_type="f32";value=5;width=3] + + [:abstract_type="abstract-float";concrete_type="f32";value=5;width=4] + + [:abstract_type="abstract-int";concrete_type="f16";value=100;width=2] + + [:abstract_type="abstract-int";concrete_type="f16";value=100;width=3] + + [:abstract_type="abstract-int";concrete_type="f16";value=100;width=4] + + [:abstract_type="abstract-int";concrete_type="f16";value=1;width=2] + + [:abstract_type="abstract-int";concrete_type="f16";value=1;width=3] + + [:abstract_type="abstract-int";concrete_type="f16";value=1;width=4] + + [:abstract_type="abstract-int";concrete_type="f16";value=2;width=2] + + [:abstract_type="abstract-int";concrete_type="f16";value=2;width=3] + + [:abstract_type="abstract-int";concrete_type="f16";value=2;width=4] + + [:abstract_type="abstract-int";concrete_type="f16";value=5;width=2] + + [:abstract_type="abstract-int";concrete_type="f16";value=5;width=3] + + [:abstract_type="abstract-int";concrete_type="f16";value=5;width=4] + + [:abstract_type="abstract-int";concrete_type="f32";value=100;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=100;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=100;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=1;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=1;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=1;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=2;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=2;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=2;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=5;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=5;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="f32";value=5;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="i32";value=100;width=2] + + [:abstract_type="abstract-int";concrete_type="i32";value=100;width=3] + + [:abstract_type="abstract-int";concrete_type="i32";value=100;width=4] + + [:abstract_type="abstract-int";concrete_type="i32";value=1;width=2] + + [:abstract_type="abstract-int";concrete_type="i32";value=1;width=3] + + [:abstract_type="abstract-int";concrete_type="i32";value=1;width=4] + + [:abstract_type="abstract-int";concrete_type="i32";value=2;width=2] + + [:abstract_type="abstract-int";concrete_type="i32";value=2;width=3] + + [:abstract_type="abstract-int";concrete_type="i32";value=2;width=4] + + [:abstract_type="abstract-int";concrete_type="i32";value=5;width=2] + + [:abstract_type="abstract-int";concrete_type="i32";value=5;width=3] + + [:abstract_type="abstract-int";concrete_type="i32";value=5;width=4] + + [:abstract_type="abstract-int";concrete_type="u32";value=100;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=100;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=100;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=1;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=1;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=1;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=2;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=2;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=2;width=4] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=5;width=2] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=5;width=3] + expected: + if os == "linux" and not debug: FAIL + + [:abstract_type="abstract-int";concrete_type="u32";value=5;width=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_array_elements:*] + [:inputSource="const";type="bool";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f16";length=10;infer_type=false] + + [:inputSource="const";type="f16";length=10;infer_type=true] + + [:inputSource="const";type="f16";length=1;infer_type=false] + + [:inputSource="const";type="f16";length=1;infer_type=true] + + [:inputSource="const";type="f16";length=5;infer_type=false] + + [:inputSource="const";type="f16";length=5;infer_type=true] + + [:inputSource="const";type="f32";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec3f";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="vec4i";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="f16";length=10;infer_type=false] + + [:inputSource="storage_r";type="f16";length=10;infer_type=true] + + [:inputSource="storage_r";type="f16";length=1;infer_type=false] + + [:inputSource="storage_r";type="f16";length=1;infer_type=true] + + [:inputSource="storage_r";type="f16";length=5;infer_type=false] + + [:inputSource="storage_r";type="f16";length=5;infer_type=true] + + [:inputSource="storage_r";type="f32";length=10;infer_type=false] + + [:inputSource="storage_r";type="f32";length=10;infer_type=true] + + [:inputSource="storage_r";type="f32";length=1;infer_type=false] + + [:inputSource="storage_r";type="f32";length=1;infer_type=true] + + [:inputSource="storage_r";type="f32";length=5;infer_type=false] + + [:inputSource="storage_r";type="f32";length=5;infer_type=true] + + [:inputSource="storage_r";type="i32";length=10;infer_type=false] + + [:inputSource="storage_r";type="i32";length=10;infer_type=true] + + [:inputSource="storage_r";type="i32";length=1;infer_type=false] + + [:inputSource="storage_r";type="i32";length=1;infer_type=true] + + [:inputSource="storage_r";type="i32";length=5;infer_type=false] + + [:inputSource="storage_r";type="i32";length=5;infer_type=true] + + [:inputSource="storage_r";type="u32";length=10;infer_type=false] + + [:inputSource="storage_r";type="u32";length=10;infer_type=true] + + [:inputSource="storage_r";type="u32";length=1;infer_type=false] + + [:inputSource="storage_r";type="u32";length=1;infer_type=true] + + [:inputSource="storage_r";type="u32";length=5;infer_type=false] + + [:inputSource="storage_r";type="u32";length=5;infer_type=true] + + [:inputSource="storage_r";type="vec3f";length=10;infer_type=false] + + [:inputSource="storage_r";type="vec3f";length=10;infer_type=true] + + [:inputSource="storage_r";type="vec3f";length=1;infer_type=false] + + [:inputSource="storage_r";type="vec3f";length=1;infer_type=true] + + [:inputSource="storage_r";type="vec3f";length=5;infer_type=false] + + [:inputSource="storage_r";type="vec3f";length=5;infer_type=true] + + [:inputSource="storage_r";type="vec4i";length=10;infer_type=false] + + [:inputSource="storage_r";type="vec4i";length=10;infer_type=true] + + [:inputSource="storage_r";type="vec4i";length=1;infer_type=false] + + [:inputSource="storage_r";type="vec4i";length=1;infer_type=true] + + [:inputSource="storage_r";type="vec4i";length=5;infer_type=false] + + [:inputSource="storage_r";type="vec4i";length=5;infer_type=true] + + [:inputSource="storage_rw";type="bool";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="bool";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="bool";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="bool";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="bool";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="bool";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_rw";type="f16";length=10;infer_type=false] + + [:inputSource="storage_rw";type="f16";length=10;infer_type=true] + + [:inputSource="storage_rw";type="f16";length=1;infer_type=false] + + [:inputSource="storage_rw";type="f16";length=1;infer_type=true] + + [:inputSource="storage_rw";type="f16";length=5;infer_type=false] + + [:inputSource="storage_rw";type="f16";length=5;infer_type=true] + + [:inputSource="storage_rw";type="f32";length=10;infer_type=false] + + [:inputSource="storage_rw";type="f32";length=10;infer_type=true] + + [:inputSource="storage_rw";type="f32";length=1;infer_type=false] + + [:inputSource="storage_rw";type="f32";length=1;infer_type=true] + + [:inputSource="storage_rw";type="f32";length=5;infer_type=false] + + [:inputSource="storage_rw";type="f32";length=5;infer_type=true] + + [:inputSource="storage_rw";type="i32";length=10;infer_type=false] + + [:inputSource="storage_rw";type="i32";length=10;infer_type=true] + + [:inputSource="storage_rw";type="i32";length=1;infer_type=false] + + [:inputSource="storage_rw";type="i32";length=1;infer_type=true] + + [:inputSource="storage_rw";type="i32";length=5;infer_type=false] + + [:inputSource="storage_rw";type="i32";length=5;infer_type=true] + + [:inputSource="storage_rw";type="u32";length=10;infer_type=false] + + [:inputSource="storage_rw";type="u32";length=10;infer_type=true] + + [:inputSource="storage_rw";type="u32";length=1;infer_type=false] + + [:inputSource="storage_rw";type="u32";length=1;infer_type=true] + + [:inputSource="storage_rw";type="u32";length=5;infer_type=false] + + [:inputSource="storage_rw";type="u32";length=5;infer_type=true] + + [:inputSource="storage_rw";type="vec3f";length=10;infer_type=false] + + [:inputSource="storage_rw";type="vec3f";length=10;infer_type=true] + + [:inputSource="storage_rw";type="vec3f";length=1;infer_type=false] + + [:inputSource="storage_rw";type="vec3f";length=1;infer_type=true] + + [:inputSource="storage_rw";type="vec3f";length=5;infer_type=false] + + [:inputSource="storage_rw";type="vec3f";length=5;infer_type=true] + + [:inputSource="storage_rw";type="vec4i";length=10;infer_type=false] + + [:inputSource="storage_rw";type="vec4i";length=10;infer_type=true] + + [:inputSource="storage_rw";type="vec4i";length=1;infer_type=false] + + [:inputSource="storage_rw";type="vec4i";length=1;infer_type=true] + + [:inputSource="storage_rw";type="vec4i";length=5;infer_type=false] + + [:inputSource="storage_rw";type="vec4i";length=5;infer_type=true] + + [:inputSource="uniform";type="bool";length=10;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="bool";length=10;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="bool";length=1;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="bool";length=1;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="bool";length=5;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="bool";length=5;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="uniform";type="f16";length=10;infer_type=false] + + [:inputSource="uniform";type="f16";length=10;infer_type=true] + + [:inputSource="uniform";type="f16";length=1;infer_type=false] + + [:inputSource="uniform";type="f16";length=1;infer_type=true] + + [:inputSource="uniform";type="f16";length=5;infer_type=false] + + [:inputSource="uniform";type="f16";length=5;infer_type=true] + + [:inputSource="uniform";type="f32";length=10;infer_type=false] + + [:inputSource="uniform";type="f32";length=10;infer_type=true] + + [:inputSource="uniform";type="f32";length=1;infer_type=false] + + [:inputSource="uniform";type="f32";length=1;infer_type=true] + + [:inputSource="uniform";type="f32";length=5;infer_type=false] + + [:inputSource="uniform";type="f32";length=5;infer_type=true] + + [:inputSource="uniform";type="i32";length=10;infer_type=false] + + [:inputSource="uniform";type="i32";length=10;infer_type=true] + + [:inputSource="uniform";type="i32";length=1;infer_type=false] + + [:inputSource="uniform";type="i32";length=1;infer_type=true] + + [:inputSource="uniform";type="i32";length=5;infer_type=false] + + [:inputSource="uniform";type="i32";length=5;infer_type=true] + + [:inputSource="uniform";type="u32";length=10;infer_type=false] + + [:inputSource="uniform";type="u32";length=10;infer_type=true] + + [:inputSource="uniform";type="u32";length=1;infer_type=false] + + [:inputSource="uniform";type="u32";length=1;infer_type=true] + + [:inputSource="uniform";type="u32";length=5;infer_type=false] + + [:inputSource="uniform";type="u32";length=5;infer_type=true] + + [:inputSource="uniform";type="vec3f";length=10;infer_type=false] + + [:inputSource="uniform";type="vec3f";length=10;infer_type=true] + + [:inputSource="uniform";type="vec3f";length=1;infer_type=false] + + [:inputSource="uniform";type="vec3f";length=1;infer_type=true] + + [:inputSource="uniform";type="vec3f";length=5;infer_type=false] + + [:inputSource="uniform";type="vec3f";length=5;infer_type=true] + + [:inputSource="uniform";type="vec4i";length=10;infer_type=false] + + [:inputSource="uniform";type="vec4i";length=10;infer_type=true] + + [:inputSource="uniform";type="vec4i";length=1;infer_type=false] + + [:inputSource="uniform";type="vec4i";length=1;infer_type=true] + + [:inputSource="uniform";type="vec4i";length=5;infer_type=false] + + [:inputSource="uniform";type="vec4i";length=5;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_matrix_column_vectors:*] + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_matrix_elements:*] + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_elements:*] + [:inputSource="const";type="bool";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f16";width=2;infer_type=false] + + [:inputSource="const";type="f16";width=2;infer_type=true] + + [:inputSource="const";type="f16";width=3;infer_type=false] + + [:inputSource="const";type="f16";width=3;infer_type=true] + + [:inputSource="const";type="f16";width=4;infer_type=false] + + [:inputSource="const";type="f16";width=4;infer_type=true] + + [:inputSource="const";type="f32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=4;infer_type=true] + + [:inputSource="uniform";type="bool";width=2;infer_type=false] + + [:inputSource="uniform";type="bool";width=2;infer_type=true] + + [:inputSource="uniform";type="bool";width=3;infer_type=false] + + [:inputSource="uniform";type="bool";width=3;infer_type=true] + + [:inputSource="uniform";type="bool";width=4;infer_type=false] + + [:inputSource="uniform";type="bool";width=4;infer_type=true] + + [:inputSource="uniform";type="f16";width=2;infer_type=false] + + [:inputSource="uniform";type="f16";width=2;infer_type=true] + + [:inputSource="uniform";type="f16";width=3;infer_type=false] + + [:inputSource="uniform";type="f16";width=3;infer_type=true] + + [:inputSource="uniform";type="f16";width=4;infer_type=false] + + [:inputSource="uniform";type="f16";width=4;infer_type=true] + + [:inputSource="uniform";type="f32";width=2;infer_type=false] + + [:inputSource="uniform";type="f32";width=2;infer_type=true] + + [:inputSource="uniform";type="f32";width=3;infer_type=false] + + [:inputSource="uniform";type="f32";width=3;infer_type=true] + + [:inputSource="uniform";type="f32";width=4;infer_type=false] + + [:inputSource="uniform";type="f32";width=4;infer_type=true] + + [:inputSource="uniform";type="i32";width=2;infer_type=false] + + [:inputSource="uniform";type="i32";width=2;infer_type=true] + + [:inputSource="uniform";type="i32";width=3;infer_type=false] + + [:inputSource="uniform";type="i32";width=3;infer_type=true] + + [:inputSource="uniform";type="i32";width=4;infer_type=false] + + [:inputSource="uniform";type="i32";width=4;infer_type=true] + + [:inputSource="uniform";type="u32";width=2;infer_type=false] + + [:inputSource="uniform";type="u32";width=2;infer_type=true] + + [:inputSource="uniform";type="u32";width=3;infer_type=false] + + [:inputSource="uniform";type="u32";width=3;infer_type=true] + + [:inputSource="uniform";type="u32";width=4;infer_type=false] + + [:inputSource="uniform";type="u32";width=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_mix:*] + [:inputSource="const";type="bool";signature="22";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="22";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="2ss";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="2ss";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="3s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="3s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s3";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="s3";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="ss2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";signature="ss2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f16";signature="22";infer_type=false] + + [:inputSource="const";type="f16";signature="22";infer_type=true] + + [:inputSource="const";type="f16";signature="2s";infer_type=false] + + [:inputSource="const";type="f16";signature="2s";infer_type=true] + + [:inputSource="const";type="f16";signature="2ss";infer_type=false] + + [:inputSource="const";type="f16";signature="2ss";infer_type=true] + + [:inputSource="const";type="f16";signature="3s";infer_type=false] + + [:inputSource="const";type="f16";signature="3s";infer_type=true] + + [:inputSource="const";type="f16";signature="s2";infer_type=false] + + [:inputSource="const";type="f16";signature="s2";infer_type=true] + + [:inputSource="const";type="f16";signature="s2s";infer_type=false] + + [:inputSource="const";type="f16";signature="s2s";infer_type=true] + + [:inputSource="const";type="f16";signature="s3";infer_type=false] + + [:inputSource="const";type="f16";signature="s3";infer_type=true] + + [:inputSource="const";type="f16";signature="ss2";infer_type=false] + + [:inputSource="const";type="f16";signature="ss2";infer_type=true] + + [:inputSource="const";type="f32";signature="22";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="22";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="2ss";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="2ss";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="3s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="3s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s3";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="s3";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="ss2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";signature="ss2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="22";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="22";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="2ss";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="2ss";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="3s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="3s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s3";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="s3";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="ss2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";signature="ss2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="22";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="22";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="2ss";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="2ss";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="3s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="3s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s2s";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s2s";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s3";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="s3";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="ss2";infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";signature="ss2";infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";signature="22";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="22";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="2s";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="2s";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="2ss";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="2ss";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="3s";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="3s";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="s2";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="s2";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="s2s";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="s2s";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="s3";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="s3";infer_type=true] + + [:inputSource="storage_r";type="bool";signature="ss2";infer_type=false] + + [:inputSource="storage_r";type="bool";signature="ss2";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="22";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="22";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="2s";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="2s";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="2ss";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="2ss";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="3s";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="3s";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="s2";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="s2";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="s2s";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="s2s";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="s3";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="s3";infer_type=true] + + [:inputSource="storage_r";type="f16";signature="ss2";infer_type=false] + + [:inputSource="storage_r";type="f16";signature="ss2";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="22";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="22";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="2s";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="2s";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="2ss";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="2ss";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="3s";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="3s";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="s2";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="s2";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="s2s";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="s2s";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="s3";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="s3";infer_type=true] + + [:inputSource="storage_r";type="f32";signature="ss2";infer_type=false] + + [:inputSource="storage_r";type="f32";signature="ss2";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="22";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="22";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="2s";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="2s";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="2ss";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="2ss";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="3s";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="3s";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="s2";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="s2";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="s2s";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="s2s";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="s3";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="s3";infer_type=true] + + [:inputSource="storage_r";type="i32";signature="ss2";infer_type=false] + + [:inputSource="storage_r";type="i32";signature="ss2";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="22";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="22";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="2s";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="2s";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="2ss";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="2ss";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="3s";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="3s";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="s2";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="s2";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="s2s";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="s2s";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="s3";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="s3";infer_type=true] + + [:inputSource="storage_r";type="u32";signature="ss2";infer_type=false] + + [:inputSource="storage_r";type="u32";signature="ss2";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="22";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="22";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="2s";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="2s";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="2ss";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="2ss";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="3s";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="3s";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="s2";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="s2";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="s2s";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="s2s";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="s3";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="s3";infer_type=true] + + [:inputSource="storage_rw";type="bool";signature="ss2";infer_type=false] + + [:inputSource="storage_rw";type="bool";signature="ss2";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="22";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="22";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="2s";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="2s";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="2ss";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="2ss";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="3s";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="3s";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="s2";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="s2";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="s2s";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="s2s";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="s3";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="s3";infer_type=true] + + [:inputSource="storage_rw";type="f16";signature="ss2";infer_type=false] + + [:inputSource="storage_rw";type="f16";signature="ss2";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="22";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="22";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="2s";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="2s";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="2ss";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="2ss";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="3s";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="3s";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="s2";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="s2";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="s2s";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="s2s";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="s3";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="s3";infer_type=true] + + [:inputSource="storage_rw";type="f32";signature="ss2";infer_type=false] + + [:inputSource="storage_rw";type="f32";signature="ss2";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="22";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="22";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="2s";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="2s";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="2ss";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="2ss";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="3s";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="3s";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="s2";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="s2";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="s2s";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="s2s";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="s3";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="s3";infer_type=true] + + [:inputSource="storage_rw";type="i32";signature="ss2";infer_type=false] + + [:inputSource="storage_rw";type="i32";signature="ss2";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="22";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="22";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="2s";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="2s";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="2ss";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="2ss";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="3s";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="3s";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="s2";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="s2";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="s2s";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="s2s";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="s3";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="s3";infer_type=true] + + [:inputSource="storage_rw";type="u32";signature="ss2";infer_type=false] + + [:inputSource="storage_rw";type="u32";signature="ss2";infer_type=true] + + [:inputSource="uniform";type="bool";signature="22";infer_type=false] + + [:inputSource="uniform";type="bool";signature="22";infer_type=true] + + [:inputSource="uniform";type="bool";signature="2s";infer_type=false] + + [:inputSource="uniform";type="bool";signature="2s";infer_type=true] + + [:inputSource="uniform";type="bool";signature="2ss";infer_type=false] + + [:inputSource="uniform";type="bool";signature="2ss";infer_type=true] + + [:inputSource="uniform";type="bool";signature="3s";infer_type=false] + + [:inputSource="uniform";type="bool";signature="3s";infer_type=true] + + [:inputSource="uniform";type="bool";signature="s2";infer_type=false] + + [:inputSource="uniform";type="bool";signature="s2";infer_type=true] + + [:inputSource="uniform";type="bool";signature="s2s";infer_type=false] + + [:inputSource="uniform";type="bool";signature="s2s";infer_type=true] + + [:inputSource="uniform";type="bool";signature="s3";infer_type=false] + + [:inputSource="uniform";type="bool";signature="s3";infer_type=true] + + [:inputSource="uniform";type="bool";signature="ss2";infer_type=false] + + [:inputSource="uniform";type="bool";signature="ss2";infer_type=true] + + [:inputSource="uniform";type="f16";signature="22";infer_type=false] + + [:inputSource="uniform";type="f16";signature="22";infer_type=true] + + [:inputSource="uniform";type="f16";signature="2s";infer_type=false] + + [:inputSource="uniform";type="f16";signature="2s";infer_type=true] + + [:inputSource="uniform";type="f16";signature="2ss";infer_type=false] + + [:inputSource="uniform";type="f16";signature="2ss";infer_type=true] + + [:inputSource="uniform";type="f16";signature="3s";infer_type=false] + + [:inputSource="uniform";type="f16";signature="3s";infer_type=true] + + [:inputSource="uniform";type="f16";signature="s2";infer_type=false] + + [:inputSource="uniform";type="f16";signature="s2";infer_type=true] + + [:inputSource="uniform";type="f16";signature="s2s";infer_type=false] + + [:inputSource="uniform";type="f16";signature="s2s";infer_type=true] + + [:inputSource="uniform";type="f16";signature="s3";infer_type=false] + + [:inputSource="uniform";type="f16";signature="s3";infer_type=true] + + [:inputSource="uniform";type="f16";signature="ss2";infer_type=false] + + [:inputSource="uniform";type="f16";signature="ss2";infer_type=true] + + [:inputSource="uniform";type="f32";signature="22";infer_type=false] + + [:inputSource="uniform";type="f32";signature="22";infer_type=true] + + [:inputSource="uniform";type="f32";signature="2s";infer_type=false] + + [:inputSource="uniform";type="f32";signature="2s";infer_type=true] + + [:inputSource="uniform";type="f32";signature="2ss";infer_type=false] + + [:inputSource="uniform";type="f32";signature="2ss";infer_type=true] + + [:inputSource="uniform";type="f32";signature="3s";infer_type=false] + + [:inputSource="uniform";type="f32";signature="3s";infer_type=true] + + [:inputSource="uniform";type="f32";signature="s2";infer_type=false] + + [:inputSource="uniform";type="f32";signature="s2";infer_type=true] + + [:inputSource="uniform";type="f32";signature="s2s";infer_type=false] + + [:inputSource="uniform";type="f32";signature="s2s";infer_type=true] + + [:inputSource="uniform";type="f32";signature="s3";infer_type=false] + + [:inputSource="uniform";type="f32";signature="s3";infer_type=true] + + [:inputSource="uniform";type="f32";signature="ss2";infer_type=false] + + [:inputSource="uniform";type="f32";signature="ss2";infer_type=true] + + [:inputSource="uniform";type="i32";signature="22";infer_type=false] + + [:inputSource="uniform";type="i32";signature="22";infer_type=true] + + [:inputSource="uniform";type="i32";signature="2s";infer_type=false] + + [:inputSource="uniform";type="i32";signature="2s";infer_type=true] + + [:inputSource="uniform";type="i32";signature="2ss";infer_type=false] + + [:inputSource="uniform";type="i32";signature="2ss";infer_type=true] + + [:inputSource="uniform";type="i32";signature="3s";infer_type=false] + + [:inputSource="uniform";type="i32";signature="3s";infer_type=true] + + [:inputSource="uniform";type="i32";signature="s2";infer_type=false] + + [:inputSource="uniform";type="i32";signature="s2";infer_type=true] + + [:inputSource="uniform";type="i32";signature="s2s";infer_type=false] + + [:inputSource="uniform";type="i32";signature="s2s";infer_type=true] + + [:inputSource="uniform";type="i32";signature="s3";infer_type=false] + + [:inputSource="uniform";type="i32";signature="s3";infer_type=true] + + [:inputSource="uniform";type="i32";signature="ss2";infer_type=false] + + [:inputSource="uniform";type="i32";signature="ss2";infer_type=true] + + [:inputSource="uniform";type="u32";signature="22";infer_type=false] + + [:inputSource="uniform";type="u32";signature="22";infer_type=true] + + [:inputSource="uniform";type="u32";signature="2s";infer_type=false] + + [:inputSource="uniform";type="u32";signature="2s";infer_type=true] + + [:inputSource="uniform";type="u32";signature="2ss";infer_type=false] + + [:inputSource="uniform";type="u32";signature="2ss";infer_type=true] + + [:inputSource="uniform";type="u32";signature="3s";infer_type=false] + + [:inputSource="uniform";type="u32";signature="3s";infer_type=true] + + [:inputSource="uniform";type="u32";signature="s2";infer_type=false] + + [:inputSource="uniform";type="u32";signature="s2";infer_type=true] + + [:inputSource="uniform";type="u32";signature="s2s";infer_type=false] + + [:inputSource="uniform";type="u32";signature="s2s";infer_type=true] + + [:inputSource="uniform";type="u32";signature="s3";infer_type=false] + + [:inputSource="uniform";type="u32";signature="s3";infer_type=true] + + [:inputSource="uniform";type="u32";signature="ss2";infer_type=false] + + [:inputSource="uniform";type="u32";signature="ss2";infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:concrete_vector_splat:*] + [:inputSource="const";type="bool";value="max";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="max";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="max";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="max";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="max";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="max";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value=100;width=2;infer_type=false] + + [:inputSource="const";type="bool";value=100;width=2;infer_type=true] + + [:inputSource="const";type="bool";value=100;width=3;infer_type=false] + + [:inputSource="const";type="bool";value=100;width=3;infer_type=true] + + [:inputSource="const";type="bool";value=100;width=4;infer_type=false] + + [:inputSource="const";type="bool";value=100;width=4;infer_type=true] + + [:inputSource="const";type="bool";value=1;width=2;infer_type=false] + + [:inputSource="const";type="bool";value=1;width=2;infer_type=true] + + [:inputSource="const";type="bool";value=1;width=3;infer_type=false] + + [:inputSource="const";type="bool";value=1;width=3;infer_type=true] + + [:inputSource="const";type="bool";value=1;width=4;infer_type=false] + + [:inputSource="const";type="bool";value=1;width=4;infer_type=true] + + [:inputSource="const";type="bool";value=2;width=2;infer_type=false] + + [:inputSource="const";type="bool";value=2;width=2;infer_type=true] + + [:inputSource="const";type="bool";value=2;width=3;infer_type=false] + + [:inputSource="const";type="bool";value=2;width=3;infer_type=true] + + [:inputSource="const";type="bool";value=2;width=4;infer_type=false] + + [:inputSource="const";type="bool";value=2;width=4;infer_type=true] + + [:inputSource="const";type="bool";value=5;width=2;infer_type=false] + + [:inputSource="const";type="bool";value=5;width=2;infer_type=true] + + [:inputSource="const";type="bool";value=5;width=3;infer_type=false] + + [:inputSource="const";type="bool";value=5;width=3;infer_type=true] + + [:inputSource="const";type="bool";value=5;width=4;infer_type=false] + + [:inputSource="const";type="bool";value=5;width=4;infer_type=true] + + [:inputSource="const";type="f16";value="max";width=2;infer_type=false] + + [:inputSource="const";type="f16";value="max";width=2;infer_type=true] + + [:inputSource="const";type="f16";value="max";width=3;infer_type=false] + + [:inputSource="const";type="f16";value="max";width=3;infer_type=true] + + [:inputSource="const";type="f16";value="max";width=4;infer_type=false] + + [:inputSource="const";type="f16";value="max";width=4;infer_type=true] + + [:inputSource="const";type="f16";value="min";width=2;infer_type=false] + + [:inputSource="const";type="f16";value="min";width=2;infer_type=true] + + [:inputSource="const";type="f16";value="min";width=3;infer_type=false] + + [:inputSource="const";type="f16";value="min";width=3;infer_type=true] + + [:inputSource="const";type="f16";value="min";width=4;infer_type=false] + + [:inputSource="const";type="f16";value="min";width=4;infer_type=true] + + [:inputSource="const";type="f16";value=100;width=2;infer_type=false] + + [:inputSource="const";type="f16";value=100;width=2;infer_type=true] + + [:inputSource="const";type="f16";value=100;width=3;infer_type=false] + + [:inputSource="const";type="f16";value=100;width=3;infer_type=true] + + [:inputSource="const";type="f16";value=100;width=4;infer_type=false] + + [:inputSource="const";type="f16";value=100;width=4;infer_type=true] + + [:inputSource="const";type="f16";value=1;width=2;infer_type=false] + + [:inputSource="const";type="f16";value=1;width=2;infer_type=true] + + [:inputSource="const";type="f16";value=1;width=3;infer_type=false] + + [:inputSource="const";type="f16";value=1;width=3;infer_type=true] + + [:inputSource="const";type="f16";value=1;width=4;infer_type=false] + + [:inputSource="const";type="f16";value=1;width=4;infer_type=true] + + [:inputSource="const";type="f16";value=2;width=2;infer_type=false] + + [:inputSource="const";type="f16";value=2;width=2;infer_type=true] + + [:inputSource="const";type="f16";value=2;width=3;infer_type=false] + + [:inputSource="const";type="f16";value=2;width=3;infer_type=true] + + [:inputSource="const";type="f16";value=2;width=4;infer_type=false] + + [:inputSource="const";type="f16";value=2;width=4;infer_type=true] + + [:inputSource="const";type="f16";value=5;width=2;infer_type=false] + + [:inputSource="const";type="f16";value=5;width=2;infer_type=true] + + [:inputSource="const";type="f16";value=5;width=3;infer_type=false] + + [:inputSource="const";type="f16";value=5;width=3;infer_type=true] + + [:inputSource="const";type="f16";value=5;width=4;infer_type=false] + + [:inputSource="const";type="f16";value=5;width=4;infer_type=true] + + [:inputSource="const";type="f32";value="max";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="max";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="max";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="max";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="max";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="max";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5;width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";value="max";width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value="max";width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value="max";width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value="max";width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value="max";width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value="max";width=4;infer_type=true] + + [:inputSource="storage_r";type="bool";value="min";width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value="min";width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value="min";width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value="min";width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value="min";width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value="min";width=4;infer_type=true] + + [:inputSource="storage_r";type="bool";value=100;width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value=100;width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value=100;width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value=100;width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value=100;width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value=100;width=4;infer_type=true] + + [:inputSource="storage_r";type="bool";value=1;width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value=1;width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value=1;width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value=1;width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value=1;width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value=1;width=4;infer_type=true] + + [:inputSource="storage_r";type="bool";value=2;width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value=2;width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value=2;width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value=2;width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value=2;width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value=2;width=4;infer_type=true] + + [:inputSource="storage_r";type="bool";value=5;width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";value=5;width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";value=5;width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";value=5;width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";value=5;width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";value=5;width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value="max";width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value="max";width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value="max";width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value="max";width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value="max";width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value="max";width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value="min";width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value="min";width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value="min";width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value="min";width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value="min";width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value="min";width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value=100;width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value=100;width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value=100;width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value=100;width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value=100;width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value=100;width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value=1;width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value=1;width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value=1;width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value=1;width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value=1;width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value=1;width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value=2;width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value=2;width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value=2;width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value=2;width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value=2;width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value=2;width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";value=5;width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";value=5;width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";value=5;width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";value=5;width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";value=5;width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";value=5;width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value="max";width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value="max";width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value="max";width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value="max";width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value="max";width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value="max";width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value="min";width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value="min";width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value="min";width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value="min";width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value="min";width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value="min";width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value=100;width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value=100;width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value=100;width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value=100;width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value=100;width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value=100;width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value=1;width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value=1;width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value=1;width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value=1;width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value=1;width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value=1;width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value=2;width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value=2;width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value=2;width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value=2;width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value=2;width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value=2;width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";value=5;width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";value=5;width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";value=5;width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";value=5;width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";value=5;width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";value=5;width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value="max";width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value="max";width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value="max";width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value="max";width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value="max";width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value="max";width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value="min";width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value="min";width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value="min";width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value="min";width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value="min";width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value="min";width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value=100;width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value=100;width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value=100;width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value=100;width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value=100;width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value=100;width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value=1;width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value=1;width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value=1;width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value=1;width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value=1;width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value=1;width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value=2;width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value=2;width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value=2;width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value=2;width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value=2;width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value=2;width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";value=5;width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";value=5;width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";value=5;width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";value=5;width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";value=5;width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";value=5;width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value="max";width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value="max";width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value="max";width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value="max";width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value="max";width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value="max";width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value="min";width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value="min";width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value="min";width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value="min";width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value="min";width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value="min";width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value=100;width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value=100;width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value=100;width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value=100;width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value=100;width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value=100;width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value=1;width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value=1;width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value=1;width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value=1;width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value=1;width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value=1;width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value=2;width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value=2;width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value=2;width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value=2;width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value=2;width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value=2;width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";value=5;width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";value=5;width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";value=5;width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";value=5;width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";value=5;width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";value=5;width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="max";width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="max";width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="max";width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="max";width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="max";width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="max";width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="min";width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="min";width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="min";width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="min";width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value="min";width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value="min";width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=100;width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=100;width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=100;width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=100;width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=100;width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=100;width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=1;width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=1;width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=1;width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=1;width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=1;width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=1;width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=2;width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=2;width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=2;width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=2;width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=2;width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=2;width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=5;width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=5;width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=5;width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=5;width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";value=5;width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";value=5;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="max";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="max";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="max";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="max";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="max";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="max";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="min";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="min";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="min";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="min";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value="min";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value="min";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=100;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=100;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=100;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=100;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=100;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=100;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=1;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=1;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=1;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=1;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=1;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=1;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=2;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=2;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=2;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=2;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=2;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=2;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=5;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=5;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=5;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=5;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";value=5;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";value=5;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="max";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="max";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="max";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="max";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="max";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="max";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="min";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="min";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="min";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="min";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value="min";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value="min";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=100;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=100;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=100;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=100;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=100;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=100;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=1;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=1;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=1;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=1;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=1;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=1;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=2;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=2;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=2;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=2;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=2;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=2;width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=5;width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=5;width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=5;width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=5;width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";value=5;width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";value=5;width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="max";width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="max";width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="max";width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="max";width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="max";width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="max";width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="min";width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="min";width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="min";width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="min";width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value="min";width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value="min";width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=100;width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=100;width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=100;width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=100;width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=100;width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=100;width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=1;width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=1;width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=1;width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=1;width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=1;width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=1;width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=2;width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=2;width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=2;width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=2;width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=2;width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=2;width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=5;width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=5;width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=5;width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=5;width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";value=5;width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";value=5;width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="max";width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="max";width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="max";width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="max";width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="max";width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="max";width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="min";width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="min";width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="min";width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="min";width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value="min";width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value="min";width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=100;width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=100;width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=100;width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=100;width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=100;width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=100;width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=1;width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=1;width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=1;width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=1;width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=1;width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=1;width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=2;width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=2;width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=2;width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=2;width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=2;width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=2;width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=5;width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=5;width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=5;width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=5;width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";value=5;width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";value=5;width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value="max";width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value="max";width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value="max";width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value="max";width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value="max";width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value="max";width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value="min";width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value="min";width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value="min";width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value="min";width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value="min";width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value="min";width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value=100;width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value=100;width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value=100;width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value=100;width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value=100;width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value=100;width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value=1;width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value=1;width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value=1;width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value=1;width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value=1;width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value=1;width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value=2;width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value=2;width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value=2;width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value=2;width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value=2;width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value=2;width=4;infer_type=true] + + [:inputSource="uniform";type="bool";value=5;width=2;infer_type=false] + + [:inputSource="uniform";type="bool";value=5;width=2;infer_type=true] + + [:inputSource="uniform";type="bool";value=5;width=3;infer_type=false] + + [:inputSource="uniform";type="bool";value=5;width=3;infer_type=true] + + [:inputSource="uniform";type="bool";value=5;width=4;infer_type=false] + + [:inputSource="uniform";type="bool";value=5;width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value="max";width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value="max";width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value="max";width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value="max";width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value="max";width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value="max";width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value="min";width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value="min";width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value="min";width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value="min";width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value="min";width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value="min";width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value=100;width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value=100;width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value=100;width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value=100;width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value=100;width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value=100;width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value=1;width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value=1;width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value=1;width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value=1;width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value=1;width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value=1;width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value=2;width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value=2;width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value=2;width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value=2;width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value=2;width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value=2;width=4;infer_type=true] + + [:inputSource="uniform";type="f16";value=5;width=2;infer_type=false] + + [:inputSource="uniform";type="f16";value=5;width=2;infer_type=true] + + [:inputSource="uniform";type="f16";value=5;width=3;infer_type=false] + + [:inputSource="uniform";type="f16";value=5;width=3;infer_type=true] + + [:inputSource="uniform";type="f16";value=5;width=4;infer_type=false] + + [:inputSource="uniform";type="f16";value=5;width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value="max";width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value="max";width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value="max";width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value="max";width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value="max";width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value="max";width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value="min";width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value="min";width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value="min";width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value="min";width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value="min";width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value="min";width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value=100;width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value=100;width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value=100;width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value=100;width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value=100;width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value=100;width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value=1;width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value=1;width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value=1;width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value=1;width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value=1;width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value=1;width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value=2;width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value=2;width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value=2;width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value=2;width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value=2;width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value=2;width=4;infer_type=true] + + [:inputSource="uniform";type="f32";value=5;width=2;infer_type=false] + + [:inputSource="uniform";type="f32";value=5;width=2;infer_type=true] + + [:inputSource="uniform";type="f32";value=5;width=3;infer_type=false] + + [:inputSource="uniform";type="f32";value=5;width=3;infer_type=true] + + [:inputSource="uniform";type="f32";value=5;width=4;infer_type=false] + + [:inputSource="uniform";type="f32";value=5;width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value="max";width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value="max";width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value="max";width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value="max";width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value="max";width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value="max";width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value="min";width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value="min";width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value="min";width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value="min";width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value="min";width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value="min";width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value=100;width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value=100;width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value=100;width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value=100;width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value=100;width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value=100;width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value=1;width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value=1;width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value=1;width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value=1;width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value=1;width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value=1;width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value=2;width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value=2;width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value=2;width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value=2;width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value=2;width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value=2;width=4;infer_type=true] + + [:inputSource="uniform";type="i32";value=5;width=2;infer_type=false] + + [:inputSource="uniform";type="i32";value=5;width=2;infer_type=true] + + [:inputSource="uniform";type="i32";value=5;width=3;infer_type=false] + + [:inputSource="uniform";type="i32";value=5;width=3;infer_type=true] + + [:inputSource="uniform";type="i32";value=5;width=4;infer_type=false] + + [:inputSource="uniform";type="i32";value=5;width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value="max";width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value="max";width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value="max";width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value="max";width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value="max";width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value="max";width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value="min";width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value="min";width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value="min";width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value="min";width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value="min";width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value="min";width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value=100;width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value=100;width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value=100;width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value=100;width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value=100;width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value=100;width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value=1;width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value=1;width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value=1;width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value=1;width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value=1;width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value=1;width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value=2;width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value=2;width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value=2;width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value=2;width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value=2;width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value=2;width=4;infer_type=true] + + [:inputSource="uniform";type="u32";value=5;width=2;infer_type=false] + + [:inputSource="uniform";type="u32";value=5;width=2;infer_type=true] + + [:inputSource="uniform";type="u32";value=5;width=3;infer_type=false] + + [:inputSource="uniform";type="u32";value=5;width=3;infer_type=true] + + [:inputSource="uniform";type="u32";value=5;width=4;infer_type=false] + + [:inputSource="uniform";type="u32";value=5;width=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:matrix_identity:*] + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="const";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=2;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=3;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";columns=4;rows=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_r";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f16";columns=4;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=2;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=3;rows=4;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=2;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=3;infer_type=true] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=false] + + [:inputSource="uniform";type="f32";columns=4;rows=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:scalar_identity:*] + [:inputSource="const";type="bool";value="max"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value="min"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";value=1] + + [:inputSource="const";type="bool";value=100] + + [:inputSource="const";type="bool";value=2] + + [:inputSource="const";type="bool";value=5] + + [:inputSource="const";type="f16";value="max"] + + [:inputSource="const";type="f16";value="min"] + + [:inputSource="const";type="f16";value=1] + + [:inputSource="const";type="f16";value=100] + + [:inputSource="const";type="f16";value=2] + + [:inputSource="const";type="f16";value=5] + + [:inputSource="const";type="f32";value="max"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value="min"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=1] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=100] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";value=5] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="max"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value="min"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=1] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=100] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";value=5] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="max"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value="min"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=1] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=100] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";value=5] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";value="max"] + + [:inputSource="storage_r";type="bool";value="min"] + + [:inputSource="storage_r";type="bool";value=1] + + [:inputSource="storage_r";type="bool";value=100] + + [:inputSource="storage_r";type="bool";value=2] + + [:inputSource="storage_r";type="bool";value=5] + + [:inputSource="storage_r";type="f16";value="max"] + + [:inputSource="storage_r";type="f16";value="min"] + + [:inputSource="storage_r";type="f16";value=1] + + [:inputSource="storage_r";type="f16";value=100] + + [:inputSource="storage_r";type="f16";value=2] + + [:inputSource="storage_r";type="f16";value=5] + + [:inputSource="storage_r";type="f32";value="max"] + + [:inputSource="storage_r";type="f32";value="min"] + + [:inputSource="storage_r";type="f32";value=1] + + [:inputSource="storage_r";type="f32";value=100] + + [:inputSource="storage_r";type="f32";value=2] + + [:inputSource="storage_r";type="f32";value=5] + + [:inputSource="storage_r";type="i32";value="max"] + + [:inputSource="storage_r";type="i32";value="min"] + + [:inputSource="storage_r";type="i32";value=1] + + [:inputSource="storage_r";type="i32";value=100] + + [:inputSource="storage_r";type="i32";value=2] + + [:inputSource="storage_r";type="i32";value=5] + + [:inputSource="storage_r";type="u32";value="max"] + + [:inputSource="storage_r";type="u32";value="min"] + + [:inputSource="storage_r";type="u32";value=1] + + [:inputSource="storage_r";type="u32";value=100] + + [:inputSource="storage_r";type="u32";value=2] + + [:inputSource="storage_r";type="u32";value=5] + + [:inputSource="storage_rw";type="bool";value="max"] + + [:inputSource="storage_rw";type="bool";value="min"] + + [:inputSource="storage_rw";type="bool";value=1] + + [:inputSource="storage_rw";type="bool";value=100] + + [:inputSource="storage_rw";type="bool";value=2] + + [:inputSource="storage_rw";type="bool";value=5] + + [:inputSource="storage_rw";type="f16";value="max"] + + [:inputSource="storage_rw";type="f16";value="min"] + + [:inputSource="storage_rw";type="f16";value=1] + + [:inputSource="storage_rw";type="f16";value=100] + + [:inputSource="storage_rw";type="f16";value=2] + + [:inputSource="storage_rw";type="f16";value=5] + + [:inputSource="storage_rw";type="f32";value="max"] + + [:inputSource="storage_rw";type="f32";value="min"] + + [:inputSource="storage_rw";type="f32";value=1] + + [:inputSource="storage_rw";type="f32";value=100] + + [:inputSource="storage_rw";type="f32";value=2] + + [:inputSource="storage_rw";type="f32";value=5] + + [:inputSource="storage_rw";type="i32";value="max"] + + [:inputSource="storage_rw";type="i32";value="min"] + + [:inputSource="storage_rw";type="i32";value=1] + + [:inputSource="storage_rw";type="i32";value=100] + + [:inputSource="storage_rw";type="i32";value=2] + + [:inputSource="storage_rw";type="i32";value=5] + + [:inputSource="storage_rw";type="u32";value="max"] + + [:inputSource="storage_rw";type="u32";value="min"] + + [:inputSource="storage_rw";type="u32";value=1] + + [:inputSource="storage_rw";type="u32";value=100] + + [:inputSource="storage_rw";type="u32";value=2] + + [:inputSource="storage_rw";type="u32";value=5] + + [:inputSource="uniform";type="bool";value="max"] + + [:inputSource="uniform";type="bool";value="min"] + + [:inputSource="uniform";type="bool";value=1] + + [:inputSource="uniform";type="bool";value=100] + + [:inputSource="uniform";type="bool";value=2] + + [:inputSource="uniform";type="bool";value=5] + + [:inputSource="uniform";type="f16";value="max"] + + [:inputSource="uniform";type="f16";value="min"] + + [:inputSource="uniform";type="f16";value=1] + + [:inputSource="uniform";type="f16";value=100] + + [:inputSource="uniform";type="f16";value=2] + + [:inputSource="uniform";type="f16";value=5] + + [:inputSource="uniform";type="f32";value="max"] + + [:inputSource="uniform";type="f32";value="min"] + + [:inputSource="uniform";type="f32";value=1] + + [:inputSource="uniform";type="f32";value=100] + + [:inputSource="uniform";type="f32";value=2] + + [:inputSource="uniform";type="f32";value=5] + + [:inputSource="uniform";type="i32";value="max"] + + [:inputSource="uniform";type="i32";value="min"] + + [:inputSource="uniform";type="i32";value=1] + + [:inputSource="uniform";type="i32";value=100] + + [:inputSource="uniform";type="i32";value=2] + + [:inputSource="uniform";type="i32";value=5] + + [:inputSource="uniform";type="u32";value="max"] + + [:inputSource="uniform";type="u32";value="min"] + + [:inputSource="uniform";type="u32";value=1] + + [:inputSource="uniform";type="u32";value=100] + + [:inputSource="uniform";type="u32";value=2] + + [:inputSource="uniform";type="u32";value=5] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:structure:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\];nested=false] + + [:member_types=["bool","u32","f16","vec3f","vec2i"\];nested=true] + + [:member_types=["bool"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["bool"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["i32","f16","vec4i","mat3x2f"\];nested=false] + + [:member_types=["i32","f16","vec4i","mat3x2f"\];nested=true] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];nested=false] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];nested=true] + + [:member_types=["i32","u32"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["i32","u32"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,non_zero:vector_identity:*] + [:inputSource="const";type="bool";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="bool";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f16";width=2;infer_type=false] + + [:inputSource="const";type="f16";width=2;infer_type=true] + + [:inputSource="const";type="f16";width=3;infer_type=false] + + [:inputSource="const";type="f16";width=3;infer_type=true] + + [:inputSource="const";type="f16";width=4;infer_type=false] + + [:inputSource="const";type="f16";width=4;infer_type=true] + + [:inputSource="const";type="f32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="f32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="i32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=2;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=2;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=3;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=3;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=4;infer_type=false] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";type="u32";width=4;infer_type=true] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="storage_r";type="bool";width=2;infer_type=false] + + [:inputSource="storage_r";type="bool";width=2;infer_type=true] + + [:inputSource="storage_r";type="bool";width=3;infer_type=false] + + [:inputSource="storage_r";type="bool";width=3;infer_type=true] + + [:inputSource="storage_r";type="bool";width=4;infer_type=false] + + [:inputSource="storage_r";type="bool";width=4;infer_type=true] + + [:inputSource="storage_r";type="f16";width=2;infer_type=false] + + [:inputSource="storage_r";type="f16";width=2;infer_type=true] + + [:inputSource="storage_r";type="f16";width=3;infer_type=false] + + [:inputSource="storage_r";type="f16";width=3;infer_type=true] + + [:inputSource="storage_r";type="f16";width=4;infer_type=false] + + [:inputSource="storage_r";type="f16";width=4;infer_type=true] + + [:inputSource="storage_r";type="f32";width=2;infer_type=false] + + [:inputSource="storage_r";type="f32";width=2;infer_type=true] + + [:inputSource="storage_r";type="f32";width=3;infer_type=false] + + [:inputSource="storage_r";type="f32";width=3;infer_type=true] + + [:inputSource="storage_r";type="f32";width=4;infer_type=false] + + [:inputSource="storage_r";type="f32";width=4;infer_type=true] + + [:inputSource="storage_r";type="i32";width=2;infer_type=false] + + [:inputSource="storage_r";type="i32";width=2;infer_type=true] + + [:inputSource="storage_r";type="i32";width=3;infer_type=false] + + [:inputSource="storage_r";type="i32";width=3;infer_type=true] + + [:inputSource="storage_r";type="i32";width=4;infer_type=false] + + [:inputSource="storage_r";type="i32";width=4;infer_type=true] + + [:inputSource="storage_r";type="u32";width=2;infer_type=false] + + [:inputSource="storage_r";type="u32";width=2;infer_type=true] + + [:inputSource="storage_r";type="u32";width=3;infer_type=false] + + [:inputSource="storage_r";type="u32";width=3;infer_type=true] + + [:inputSource="storage_r";type="u32";width=4;infer_type=false] + + [:inputSource="storage_r";type="u32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=2;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=2;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=3;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=3;infer_type=true] + + [:inputSource="storage_rw";type="bool";width=4;infer_type=false] + + [:inputSource="storage_rw";type="bool";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f16";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f16";width=4;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="f32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="f32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="i32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="i32";width=4;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=2;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=2;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=3;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=3;infer_type=true] + + [:inputSource="storage_rw";type="u32";width=4;infer_type=false] + + [:inputSource="storage_rw";type="u32";width=4;infer_type=true] + + [:inputSource="uniform";type="bool";width=2;infer_type=false] + + [:inputSource="uniform";type="bool";width=2;infer_type=true] + + [:inputSource="uniform";type="bool";width=3;infer_type=false] + + [:inputSource="uniform";type="bool";width=3;infer_type=true] + + [:inputSource="uniform";type="bool";width=4;infer_type=false] + + [:inputSource="uniform";type="bool";width=4;infer_type=true] + + [:inputSource="uniform";type="f16";width=2;infer_type=false] + + [:inputSource="uniform";type="f16";width=2;infer_type=true] + + [:inputSource="uniform";type="f16";width=3;infer_type=false] + + [:inputSource="uniform";type="f16";width=3;infer_type=true] + + [:inputSource="uniform";type="f16";width=4;infer_type=false] + + [:inputSource="uniform";type="f16";width=4;infer_type=true] + + [:inputSource="uniform";type="f32";width=2;infer_type=false] + + [:inputSource="uniform";type="f32";width=2;infer_type=true] + + [:inputSource="uniform";type="f32";width=3;infer_type=false] + + [:inputSource="uniform";type="f32";width=3;infer_type=true] + + [:inputSource="uniform";type="f32";width=4;infer_type=false] + + [:inputSource="uniform";type="f32";width=4;infer_type=true] + + [:inputSource="uniform";type="i32";width=2;infer_type=false] + + [:inputSource="uniform";type="i32";width=2;infer_type=true] + + [:inputSource="uniform";type="i32";width=3;infer_type=false] + + [:inputSource="uniform";type="i32";width=3;infer_type=true] + + [:inputSource="uniform";type="i32";width=4;infer_type=false] + + [:inputSource="uniform";type="i32";width=4;infer_type=true] + + [:inputSource="uniform";type="u32";width=2;infer_type=false] + + [:inputSource="uniform";type="u32";width=2;infer_type=true] + + [:inputSource="uniform";type="u32";width=3;infer_type=false] + + [:inputSource="uniform";type="u32";width=3;infer_type=true] + + [:inputSource="uniform";type="u32";width=4;infer_type=false] + + [:inputSource="uniform";type="u32";width=4;infer_type=true] + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:array:*] + [:type="bool";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16";length=1] + + [:type="f16";length=10] + + [:type="f16";length=5] + + [:type="f32";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3f";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3f";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3f";length=5] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4i";length=1] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4i";length=10] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4i";length=5] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:matrix:*] + [:type="f16";columns=2;rows=2] + + [:type="f16";columns=2;rows=3] + + [:type="f16";columns=2;rows=4] + + [:type="f16";columns=3;rows=2] + + [:type="f16";columns=3;rows=3] + + [:type="f16";columns=3;rows=4] + + [:type="f16";columns=4;rows=2] + + [:type="f16";columns=4;rows=3] + + [:type="f16";columns=4;rows=4] + + [:type="f32";columns=2;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=2;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=2;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=3;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=3;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=3;rows=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=4;rows=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=4;rows=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";columns=4;rows=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:scalar:*] + [:type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16"] + + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:structure:*] + [:member_types=["bool","u32","f16","vec3f","vec2i"\];nested=false] + + [:member_types=["bool","u32","f16","vec3f","vec2i"\];nested=true] + + [:member_types=["bool"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["bool"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["i32","f16","vec4i","mat3x2f"\];nested=false] + + [:member_types=["i32","f16","vec4i","mat3x2f"\];nested=true] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];nested=false] + + [:member_types=["i32","u32","f32","f16","vec3f","vec4i"\];nested=true] + + [:member_types=["i32","u32"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["i32","u32"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["u32"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];nested=false] + expected: + if os == "linux" and not debug: FAIL + + [:member_types=["vec3f"\];nested=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:vector:*] + [:type="bool";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16";width=2] + + [:type="f16";width=3] + + [:type="f16";width=4] + + [:type="f32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,constructor,zero_value:vector_prefix:*] + [:type="f16";width=2] + + [:type="f16";width=3] + + [:type="f16";width=4] + + [:type="f32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";width=4] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=2] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=3] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";width=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,precedence:precedence:*] + [:expr="add_mul";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_mul";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="add_swizzle";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_eq";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_add";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_and";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="eq_or";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_add";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="mul_deref";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_add";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_and";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_mul";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_or";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shl";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_shr";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_xor";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_and";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="not_or";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="or_eq";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="const";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="const";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="literal";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="literal";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="override";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="override";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="var%3Cprivate%3E";strip_spaces=false] + expected: + if os == "linux" and not debug: FAIL + + [:expr="sub_neg";decl="var%3Cprivate%3E";strip_spaces=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref:*] + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref_index:*] + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="pointer"] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,address_of_and_indirection:deref_member:*] + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="bool";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f16";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_pointer"] + + [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="pointer"] + + [cts.https.html?q=webgpu:shader,execution,expression,unary,af_arithmetic:negation:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -86484,6 +108664,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,af_assignment:abstract:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL @@ -86497,6 +108679,24 @@ [:inputSource="const"] +[cts.https.html?q=webgpu:shader,execution,expression,unary,ai_arithmetic:negation:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,unary,ai_assignment:abstract:*] [:inputSource="const"] expected: @@ -86504,13 +108704,33 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,ai_assignment:i32:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const"] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,ai_assignment:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const"] expected: if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,execution,expression,unary,ai_assignment:u32:*] - [:inputSource="const"] +[cts.https.html?q=webgpu:shader,execution,expression,unary,ai_complement:complement:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] expected: if os == "linux" and not debug: FAIL @@ -86558,6 +108778,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,bool_conversion:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -86793,6 +109015,48 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_float:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_float_mat:*] + [:inputSource="const";cols=2;rows=2] + + [:inputSource="const";cols=2;rows=3] + + [:inputSource="const";cols=2;rows=4] + + [:inputSource="const";cols=3;rows=2] + + [:inputSource="const";cols=3;rows=3] + + [:inputSource="const";cols=3;rows=4] + + [:inputSource="const";cols=4;rows=2] + + [:inputSource="const";cols=4;rows=3] + + [:inputSource="const";cols=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:abstract_int:*] + expected: + if os == "linux" and not debug: OK + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + [cts.https.html?q=webgpu:shader,execution,expression,unary,f16_conversion:bool:*] [:inputSource="const";vectorize="_undef_"] @@ -87153,6 +109417,46 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_float:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_float_mat:*] + [:inputSource="const";cols=2;rows=2] + + [:inputSource="const";cols=2;rows=3] + + [:inputSource="const";cols=2;rows=4] + + [:inputSource="const";cols=3;rows=2] + + [:inputSource="const";cols=3;rows=3] + + [:inputSource="const";cols=3;rows=4] + + [:inputSource="const";cols=4;rows=2] + + [:inputSource="const";cols=4;rows=3] + + [:inputSource="const";cols=4;rows=4] + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:abstract_int:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + [cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:bool:*] [:inputSource="const";vectorize="_undef_"] expected: @@ -87196,6 +109500,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -87480,6 +109786,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,f32_conversion:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -87605,7 +109913,37 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:abstract_float:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:abstract_int:*] + [:inputSource="const";vectorize="_undef_"] + + [:inputSource="const";vectorize=2] + + [:inputSource="const";vectorize=3] + + [:inputSource="const";vectorize=4] + + [cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:bool:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -87790,6 +110128,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,i32_conversion:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -87831,540 +110171,6 @@ [:inputSource="uniform";vectorize=4] -[cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref:*] - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="u32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="u32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="u32";derefType="deref_pointer"] - - -[cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref_index:*] - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="pointer"] - - -[cts.https.html?q=webgpu:shader,execution,expression,unary,indirection:deref_member:*] - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_r";vectorize=4;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="storage_rw";vectorize=4;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize="_undef_";scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=2;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=3;scalarType="i32";derefType="pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="f32";derefType="pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_address_of_identifier"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="deref_pointer"] - - [:inputSource="uniform";vectorize=4;scalarType="i32";derefType="pointer"] - - [cts.https.html?q=webgpu:shader,execution,expression,unary,u32_complement:u32_complement:*] [:inputSource="const";vectorize="_undef_"] expected: @@ -88407,6 +110213,24 @@ [:inputSource="uniform";vectorize=4] +[cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:abstract_float:*] + [:inputSource="const";vectorize="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=2] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=3] + expected: + if os == "linux" and not debug: FAIL + + [:inputSource="const";vectorize=4] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:abstract_int:*] [:inputSource="const";vectorize="_undef_"] @@ -88442,6 +110266,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:bool:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -88484,6 +110310,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:f16:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] [:inputSource="const";vectorize=2] @@ -88626,6 +110454,8 @@ [cts.https.html?q=webgpu:shader,execution,expression,unary,u32_conversion:u32:*] + expected: + if os == "linux" and not debug: OK [:inputSource="const";vectorize="_undef_"] expected: if os == "linux" and not debug: FAIL @@ -88679,6 +110509,46 @@ [:value="small_pos_zero_exp"] +[cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_logical_and:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_logical_or:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,call:arg_eval_pointers:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,flow_control,call:call_basic:*] [:preventValueOptimizations=false] expected: @@ -89025,6 +110895,26 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,flow_control,for:for_logical_and_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,for:for_logical_or_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,flow_control,for:nested_for_break:*] [:preventValueOptimizations=false] expected: @@ -89095,6 +110985,26 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_break_if_logical_and_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_break_if_logical_or_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,flow_control,loop:loop_continue:*] [:preventValueOptimizations=false] expected: @@ -89235,6 +111145,16 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,flow_control,switch:switch_inside_loop_with_continue:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,flow_control,switch:switch_multiple_case:*] [:preventValueOptimizations=false] expected: @@ -89285,6 +111205,26 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,flow_control,while:while_logical_and_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,flow_control,while:while_logical_or_condition:*] + [:preventValueOptimizations=false] + expected: + if os == "linux" and not debug: FAIL + + [:preventValueOptimizations=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,flow_control,while:while_nested_break:*] [:preventValueOptimizations=false] expected: @@ -89305,6 +111245,100 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,limits:const_array_elements:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,limits:function_array_byte_size:*] + [:type="bool"] + + [:type="u32"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,execution,limits:function_parameters:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,limits:function_variable_combined_byte_size:*] + [:type="bool"] + + [:type="u32"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_braces:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_composite_array:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,limits:nesting_depth_composite_struct:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,limits:private_array_byte_size:*] + [:type="bool"] + + [:type="u32"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,execution,limits:private_array_combined_byte_size:*] + [:type="bool"] + + [:type="u32"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,execution,limits:struct_members:*] + [:] + + +[cts.https.html?q=webgpu:shader,execution,limits:switch_case_selectors:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,limits:switch_case_selectors_same_clause:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,limits:workgroup_array_byte_size:*] + [:type="bool"] + + [:type="u32"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,execution,limits:workgroup_array_byte_size_override:*] + [:type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4u"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,memory_layout:read_layout:*] disabled: true expected: @@ -89348,6 +111382,10 @@ [:accessValueType="f16";memType="non_atomic_storage";accessPair="rw";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_texture";accessPair="rw";normalBarrier=false] + + [:accessValueType="f16";memType="non_atomic_texture";accessPair="rw";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="rw";normalBarrier=false] [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="rw";normalBarrier=true] @@ -89358,6 +111396,10 @@ expected: if os == "linux" and not debug: FAIL + [:accessValueType="u32";memType="non_atomic_texture";accessPair="rw";normalBarrier=false] + + [:accessValueType="u32";memType="non_atomic_texture";accessPair="rw";normalBarrier=true] + [:accessValueType="u32";memType="non_atomic_workgroup";accessPair="rw";normalBarrier=false] expected: if os == "linux" and not debug: FAIL @@ -89372,6 +111414,10 @@ [:accessValueType="f16";memType="non_atomic_storage";accessPair="wr";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_texture";accessPair="wr";normalBarrier=false] + + [:accessValueType="f16";memType="non_atomic_texture";accessPair="wr";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="wr";normalBarrier=false] [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="wr";normalBarrier=true] @@ -89382,6 +111428,10 @@ expected: if os == "linux" and not debug: FAIL + [:accessValueType="u32";memType="non_atomic_texture";accessPair="wr";normalBarrier=false] + + [:accessValueType="u32";memType="non_atomic_texture";accessPair="wr";normalBarrier=true] + [:accessValueType="u32";memType="non_atomic_workgroup";accessPair="wr";normalBarrier=false] expected: if os == "linux" and not debug: FAIL @@ -89396,6 +111446,10 @@ [:accessValueType="f16";memType="non_atomic_storage";accessPair="ww";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_texture";accessPair="ww";normalBarrier=false] + + [:accessValueType="f16";memType="non_atomic_texture";accessPair="ww";normalBarrier=true] + [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="ww";normalBarrier=false] [:accessValueType="f16";memType="non_atomic_workgroup";accessPair="ww";normalBarrier=true] @@ -89406,6 +111460,10 @@ expected: if os == "linux" and not debug: FAIL + [:accessValueType="u32";memType="non_atomic_texture";accessPair="ww";normalBarrier=false] + + [:accessValueType="u32";memType="non_atomic_texture";accessPair="ww";normalBarrier=true] + [:accessValueType="u32";memType="non_atomic_workgroup";accessPair="ww";normalBarrier=false] expected: if os == "linux" and not debug: FAIL @@ -89479,6 +111537,32 @@ [:memType="atomic_workgroup";testType="intra_workgroup";extraFlags="rmw_variant"] +[cts.https.html?q=webgpu:shader,execution,memory_model,texture_intra_invocation_coherence:texture_intra_invocation_coherence:*] + [:format="r32float";dim="1d"] + + [:format="r32float";dim="2d"] + + [:format="r32float";dim="2d-array"] + + [:format="r32float";dim="3d"] + + [:format="r32sint";dim="1d"] + + [:format="r32sint";dim="2d"] + + [:format="r32sint";dim="2d-array"] + + [:format="r32sint";dim="3d"] + + [:format="r32uint";dim="1d"] + + [:format="r32uint";dim="2d"] + + [:format="r32uint";dim="2d-array"] + + [:format="r32uint";dim="3d"] + + [cts.https.html?q=webgpu:shader,execution,memory_model,weak:2_plus_2_write:*] [:memType="atomic_storage"] @@ -90954,6 +113038,14 @@ [cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,front_facing:*] + [:nearFar=[0,1\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -90982,6 +113074,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;frontFace="cw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;frontFace="cw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;frontFace="cw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91010,6 +113110,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91038,6 +113146,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;frontFace="cw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;frontFace="cw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;frontFace="cw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91066,6 +113182,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="ccw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91094,6 +113218,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="cw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="cw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;frontFace="cw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91122,6 +113254,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="ccw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91150,6 +113290,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="cw";interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="cw";interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;frontFace="cw";interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91246,6 +113394,14 @@ [cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,interStage:*] + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91258,6 +113414,10 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"linear"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"perspective","sampling":"center"}] expected: if os == "linux" and not debug: FAIL @@ -91266,6 +113426,18 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"perspective"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91278,6 +113450,10 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"linear"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"perspective","sampling":"center"}] expected: if os == "linux" and not debug: FAIL @@ -91286,6 +113462,18 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"perspective"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91298,6 +113486,10 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"linear"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"perspective","sampling":"center"}] expected: if os == "linux" and not debug: FAIL @@ -91306,6 +113498,18 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"perspective"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91318,6 +113522,10 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"linear"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"perspective","sampling":"center"}] expected: if os == "linux" and not debug: FAIL @@ -91326,8 +113534,20 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"perspective"}] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,position:*] + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91356,6 +113576,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91384,6 +113612,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91412,6 +113648,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91442,6 +113686,14 @@ [cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,sample_index:*] + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91470,6 +113722,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91498,6 +113758,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91526,6 +113794,14 @@ expected: if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat"}] expected: if os == "linux" and not debug: FAIL @@ -91555,6 +113831,136 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,shader_io,fragment_builtins:inputs,sample_mask:*] + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"linear","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"linear","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"linear","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"perspective","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"perspective","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=1;interpolation={"type":"perspective","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"linear","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"linear","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"linear","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"perspective","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"perspective","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0,1\];sampleCount=4;interpolation={"type":"perspective","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"linear","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"linear","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"linear","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"perspective","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"perspective","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=1;interpolation={"type":"perspective","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"either"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"flat","sampling":"first"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"linear","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"linear","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"linear","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"perspective","sampling":"center"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"perspective","sampling":"centroid"}] + expected: + if os == "linux" and not debug: FAIL + + [:nearFar=[0.25,0.75\];sampleCount=4;interpolation={"type":"perspective","sampling":"sample"}] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,shader_io,shared_structs:shared_between_stages:*] [:] expected: @@ -91571,6 +113977,22 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,shader_io,user_io:passthrough:*] + [:type="f16"] + + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,shader_io,workgroup_size:workgroup_size:*] disabled: true expected: @@ -91635,6 +114057,48 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,statement,discard:all:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:continuing:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:derivatives:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:function_call:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:loop:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:three_quarters:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,discard:uniform_read_loop:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:frexp_exp_increment:*] [:] expected: @@ -91689,6 +114153,18 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:single_eval_decrement:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:single_eval_increment:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,execution,statement,increment_decrement:vec2_element_decrement:*] [:] expected: @@ -91725,6 +114201,150 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,execution,value_init:array,nested:*] + [:addressSpace="function";type="bool"] + + [:addressSpace="function";type="f16"] + + [:addressSpace="function";type="f32"] + + [:addressSpace="function";type="i32"] + + [:addressSpace="function";type="u32"] + + [:addressSpace="private";type="bool"] + + [:addressSpace="private";type="f16"] + + [:addressSpace="private";type="f32"] + + [:addressSpace="private";type="i32"] + + [:addressSpace="private";type="u32"] + + +[cts.https.html?q=webgpu:shader,execution,value_init:array:*] + [:addressSpace="function";type="bool"] + + [:addressSpace="function";type="f16"] + + [:addressSpace="function";type="f32"] + + [:addressSpace="function";type="i32"] + + [:addressSpace="function";type="u32"] + + [:addressSpace="private";type="bool"] + + [:addressSpace="private";type="f16"] + + [:addressSpace="private";type="f32"] + + [:addressSpace="private";type="i32"] + + [:addressSpace="private";type="u32"] + + +[cts.https.html?q=webgpu:shader,execution,value_init:mat:*] + [:addressSpace="function";type="f16"] + + [:addressSpace="function";type="f32"] + + [:addressSpace="private";type="f16"] + + [:addressSpace="private";type="f32"] + + +[cts.https.html?q=webgpu:shader,execution,value_init:scalars:*] + [:addressSpace="function";type="bool"] + + [:addressSpace="function";type="f16"] + + [:addressSpace="function";type="f32"] + + [:addressSpace="function";type="i32"] + + [:addressSpace="function";type="u32"] + + [:addressSpace="private";type="bool"] + + [:addressSpace="private";type="f16"] + + [:addressSpace="private";type="f32"] + + [:addressSpace="private";type="i32"] + + [:addressSpace="private";type="u32"] + + +[cts.https.html?q=webgpu:shader,execution,value_init:struct:*] + [:addressSpace="function"] + + [:addressSpace="private"] + + +[cts.https.html?q=webgpu:shader,execution,value_init:vec:*] + [:addressSpace="function";type="bool";count=2] + + [:addressSpace="function";type="bool";count=3] + + [:addressSpace="function";type="bool";count=4] + + [:addressSpace="function";type="f16";count=2] + + [:addressSpace="function";type="f16";count=3] + + [:addressSpace="function";type="f16";count=4] + + [:addressSpace="function";type="f32";count=2] + + [:addressSpace="function";type="f32";count=3] + + [:addressSpace="function";type="f32";count=4] + + [:addressSpace="function";type="i32";count=2] + + [:addressSpace="function";type="i32";count=3] + + [:addressSpace="function";type="i32";count=4] + + [:addressSpace="function";type="u32";count=2] + + [:addressSpace="function";type="u32";count=3] + + [:addressSpace="function";type="u32";count=4] + + [:addressSpace="private";type="bool";count=2] + + [:addressSpace="private";type="bool";count=3] + + [:addressSpace="private";type="bool";count=4] + + [:addressSpace="private";type="f16";count=2] + + [:addressSpace="private";type="f16";count=3] + + [:addressSpace="private";type="f16";count=4] + + [:addressSpace="private";type="f32";count=2] + + [:addressSpace="private";type="f32";count=3] + + [:addressSpace="private";type="f32";count=4] + + [:addressSpace="private";type="i32";count=2] + + [:addressSpace="private";type="i32";count=3] + + [:addressSpace="private";type="i32";count=4] + + [:addressSpace="private";type="u32";count=2] + + [:addressSpace="private";type="u32";count=3] + + [:addressSpace="private";type="u32";count=4] + + [cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:*] disabled: true expected: @@ -91829,6 +114449,48 @@ [:case="self"] +[cts.https.html?q=webgpu:shader,validation,decl,const:assert:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,const:function_scope:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,const:immutable:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,decl,const:initializer:*] + [:case="abs_float_init_convert"] + + [:case="abs_int_init_convert"] + + [:case="init_const_expr"] + + [:case="init_func"] + + [:case="init_matching_type"] + + [:case="init_mismatch_type"] + + [:case="init_non_const_func"] + + [:case="init_override_expr"] + + [:case="init_runtime_expr"] + + [:case="no_init"] + + [:case="no_init_no_type"] + + [:case="no_type"] + + [cts.https.html?q=webgpu:shader,validation,decl,const:no_direct_recursion:*] [:target="a"] @@ -91861,6 +114523,460 @@ [:target="b";attribute="size"] +[cts.https.html?q=webgpu:shader,validation,decl,const:placement:*] + [:scope="_undef_"] + expected: + if os == "linux" and not debug: FAIL + + [:scope="fn-decl"] + + [:scope="fn-param"] + + [:scope="fn-return"] + + [:scope="fn-var"] + + [:scope="private-var"] + + [:scope="storage-var"] + + [:scope="struct-member"] + + [:scope="while-stmt"] + + +[cts.https.html?q=webgpu:shader,validation,decl,const:type:*] + [:case="abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + [:case="abstract_int"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_abstract_int"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_runtime"] + + [:case="array_sized"] + + [:case="atomic"] + + [:case="bool"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="mat2x2"] + + [:case="mat4x3f"] + + [:case="struct"] + + [:case="u32"] + + [:case="vec2i"] + + [:case="vec3u"] + + [:case="vec4f"] + + [:case="vec_abstract_int"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:attribute_names:*] + [:case="align"] + expected: + if os == "linux" and not debug: FAIL + + [:case="binding"] + expected: + if os == "linux" and not debug: FAIL + + [:case="builtin"] + expected: + if os == "linux" and not debug: FAIL + + [:case="compute"] + expected: + if os == "linux" and not debug: FAIL + + [:case="fragment"] + expected: + if os == "linux" and not debug: FAIL + + [:case="group"] + expected: + if os == "linux" and not debug: FAIL + + [:case="id"] + expected: + if os == "linux" and not debug: FAIL + + [:case="interpolate"] + expected: + if os == "linux" and not debug: FAIL + + [:case="invariant"] + expected: + if os == "linux" and not debug: FAIL + + [:case="location"] + expected: + if os == "linux" and not debug: FAIL + + [:case="must_use"] + expected: + if os == "linux" and not debug: FAIL + + [:case="size"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vertex"] + expected: + if os == "linux" and not debug: FAIL + + [:case="workgroup_size"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:builtin_value_names:*] + [:case="frag_depth"] + expected: + if os == "linux" and not debug: FAIL + + [:case="front_facing"] + expected: + if os == "linux" and not debug: FAIL + + [:case="global_invocation_id"] + expected: + if os == "linux" and not debug: FAIL + + [:case="instance_index"] + expected: + if os == "linux" and not debug: FAIL + + [:case="local_invocation_id"] + expected: + if os == "linux" and not debug: FAIL + + [:case="local_invocation_index"] + expected: + if os == "linux" and not debug: FAIL + + [:case="num_workgroups"] + expected: + if os == "linux" and not debug: FAIL + + [:case="position_fragment"] + expected: + if os == "linux" and not debug: FAIL + + [:case="position_vertex"] + expected: + if os == "linux" and not debug: FAIL + + [:case="sample_index"] + expected: + if os == "linux" and not debug: FAIL + + [:case="sample_mask_input"] + expected: + if os == "linux" and not debug: FAIL + + [:case="sample_mask_output"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vertex_index"] + expected: + if os == "linux" and not debug: FAIL + + [:case="workgroup_id"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:diagnostic_rule_names:*] + [:case="derivative_uniformity"] + expected: + if os == "linux" and not debug: FAIL + + [:case="rule"] + expected: + if os == "linux" and not debug: FAIL + + [:case="unknown"] + expected: + if os == "linux" and not debug: FAIL + + [:case="unknown_rule"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:diagnostic_severity_names:*] + [:case="error"] + expected: + if os == "linux" and not debug: FAIL + + [:case="info"] + expected: + if os == "linux" and not debug: FAIL + + [:case="off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="warning"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:enable_names:*] + [:case="f16"] + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_flat_names:*] + [:case="either"] + expected: + if os == "linux" and not debug: FAIL + + [:case="first"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_sampling_names:*] + [:case="center"] + expected: + if os == "linux" and not debug: FAIL + + [:case="centroid"] + expected: + if os == "linux" and not debug: FAIL + + [:case="sample"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:interpolation_type_names:*] + [:case="flat"] + expected: + if os == "linux" and not debug: FAIL + + [:case="linear"] + expected: + if os == "linux" and not debug: FAIL + + [:case="perspective"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:language_names:*] + [:case="packed_4x8_integer_dot_product"] + + [:case="pointer_composite_access"] + + [:case="readonly_and_readwrite_storage_textures"] + + [:case="unrestricted_pointer_parameters"] + + +[cts.https.html?q=webgpu:shader,validation,decl,context_dependent_resolution:swizzle_names:*] + [:case="a"] + expected: + if os == "linux" and not debug: FAIL + + [:case="agra"] + expected: + if os == "linux" and not debug: FAIL + + [:case="arr"] + expected: + if os == "linux" and not debug: FAIL + + [:case="b"] + expected: + if os == "linux" and not debug: FAIL + + [:case="bgra"] + expected: + if os == "linux" and not debug: FAIL + + [:case="g"] + expected: + if os == "linux" and not debug: FAIL + + [:case="r"] + expected: + if os == "linux" and not debug: FAIL + + [:case="rgb"] + expected: + if os == "linux" and not debug: FAIL + + [:case="w"] + expected: + if os == "linux" and not debug: FAIL + + [:case="wxyz"] + expected: + if os == "linux" and not debug: FAIL + + [:case="x"] + expected: + if os == "linux" and not debug: FAIL + + [:case="xy"] + expected: + if os == "linux" and not debug: FAIL + + [:case="xyxy"] + expected: + if os == "linux" and not debug: FAIL + + [:case="y"] + expected: + if os == "linux" and not debug: FAIL + + [:case="yxz"] + expected: + if os == "linux" and not debug: FAIL + + [:case="z"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,let:initializer:*] + [:case="init_const_expr"] + + [:case="init_matching_type"] + + [:case="init_mismatch_type"] + + [:case="init_override_expr"] + + [:case="init_runtime_expr"] + + [:case="no_init"] + + [:case="no_type"] + + [:case="ptr_access_mismatch"] + + [:case="ptr_addrspace_mismatch"] + + [:case="ptr_type_mismatch"] + + +[cts.https.html?q=webgpu:shader,validation,decl,let:initializer_type:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,decl,let:module_scope:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,decl,let:type:*] + [:case="array_runtime"] + + [:case="array_sized"] + expected: + if os == "linux" and not debug: FAIL + + [:case="atomic"] + + [:case="bool"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="load_rule"] + + [:case="mat2x2"] + + [:case="mat4x3f"] + + [:case="ptr_function"] + + [:case="ptr_storage"] + + [:case="struct"] + + [:case="u32"] + + [:case="vec2i"] + + [:case="vec3u"] + + [:case="vec4f"] + + +[cts.https.html?q=webgpu:shader,validation,decl,override:function_scope:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,decl,override:id:*] + [:case="duplicate"] + + [:case="max"] + + [:case="min"] + + [:case="neg"] + + [:case="too_large"] + + +[cts.https.html?q=webgpu:shader,validation,decl,override:initializer:*] + [:case="abs_float_init_convert"] + + [:case="abs_int_init_convert"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_func_init"] + + [:case="init_const_expr"] + + [:case="init_matching_type"] + + [:case="init_mismatch_type"] + + [:case="init_mismatch_vector"] + + [:case="init_override_expr"] + + [:case="init_runtime_expr"] + + [:case="mix_order_init"] + + [:case="no_init"] + + [:case="no_init_no_type"] + + [:case="no_type"] + + [:case="non_const_func_init"] + + [cts.https.html?q=webgpu:shader,validation,decl,override:no_direct_recursion:*] [:target="a"] @@ -91873,258 +114989,136 @@ [:target="b"] -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_explicit_type_matches_var:*] - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] +[cts.https.html?q=webgpu:shader,validation,decl,override:type:*] + [:case="abs_float_conversion"] - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + [:case="abs_int_conversion"] - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + [:case="array"] - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + [:case="atomic"] - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + [:case="bool"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="mat2x2f"] + + [:case="matrix"] + + [:case="struct"] + + [:case="u32"] + + [:case="vec2_bool"] + + [:case="vec2i"] + + [:case="vec3u"] + + [:case="vec4f"] + + +[cts.https.html?q=webgpu:shader,validation,decl,var:address_space_access_mode:*] + [:address_space="function";access_mode="";trailing_comma=false] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + [:address_space="function";access_mode="";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + [:address_space="function";access_mode="read";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + [:address_space="function";access_mode="read";trailing_comma=true] - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + [:address_space="function";access_mode="read_write";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + [:address_space="function";access_mode="read_write";trailing_comma=true] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + [:address_space="function";access_mode="write";trailing_comma=false] - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + [:address_space="function";access_mode="write";trailing_comma=true] - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + [:address_space="private";access_mode="";trailing_comma=false] - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";ptrStoreType="u32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";ptrStoreType="u32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_reads:*] - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="private";access_mode="";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + [:address_space="private";access_mode="read";trailing_comma=false] + + [:address_space="private";access_mode="read";trailing_comma=true] + + [:address_space="private";access_mode="read_write";trailing_comma=false] + + [:address_space="private";access_mode="read_write";trailing_comma=true] + + [:address_space="private";access_mode="write";trailing_comma=false] + + [:address_space="private";access_mode="write";trailing_comma=true] + + [:address_space="storage";access_mode="";trailing_comma=false] + + [:address_space="storage";access_mode="";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="storage";access_mode="read";trailing_comma=false] + + [:address_space="storage";access_mode="read";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + [:address_space="storage";access_mode="read_write";trailing_comma=false] + + [:address_space="storage";access_mode="read_write";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="storage";access_mode="write";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + [:address_space="storage";access_mode="write";trailing_comma=true] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="uniform";access_mode="";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:let_ptr_writes:*] - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="uniform";access_mode="";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + [:address_space="uniform";access_mode="read";trailing_comma=false] + + [:address_space="uniform";access_mode="read";trailing_comma=true] + + [:address_space="uniform";access_mode="read_write";trailing_comma=false] + + [:address_space="uniform";access_mode="read_write";trailing_comma=true] + + [:address_space="uniform";access_mode="write";trailing_comma=false] + + [:address_space="uniform";access_mode="write";trailing_comma=true] + + [:address_space="workgroup";access_mode="";trailing_comma=false] + + [:address_space="workgroup";access_mode="";trailing_comma=true] expected: if os == "linux" and not debug: FAIL - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - expected: - if os == "linux" and not debug: FAIL + [:address_space="workgroup";access_mode="read";trailing_comma=false] - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - expected: - if os == "linux" and not debug: FAIL + [:address_space="workgroup";access_mode="read";trailing_comma=true] - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="workgroup";access_mode="read_write";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + [:address_space="workgroup";access_mode="read_write";trailing_comma=true] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + [:address_space="workgroup";access_mode="write";trailing_comma=false] - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_address_space_never_uses_access_mode:*] - [:addressSpace="function";accessMode="read"] - - [:addressSpace="function";accessMode="read_write"] - - [:addressSpace="function";accessMode="write"] - - [:addressSpace="handle";accessMode="read"] - - [:addressSpace="handle";accessMode="read_write"] - - [:addressSpace="handle";accessMode="write"] - - [:addressSpace="private";accessMode="read"] - - [:addressSpace="private";accessMode="read_write"] - - [:addressSpace="private";accessMode="write"] - - [:addressSpace="uniform";accessMode="read"] - - [:addressSpace="uniform";accessMode="read_write"] - - [:addressSpace="uniform";accessMode="write"] - - [:addressSpace="workgroup";accessMode="read"] - - [:addressSpace="workgroup";accessMode="read_write"] - - [:addressSpace="workgroup";accessMode="write"] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_bad_store_type:*] - [:storeType="1"] - - [:storeType="clamp"] - - [:storeType="undeclared"] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_handle_space_invalid:*] - [:] - - -[cts.https.html?q=webgpu:shader,validation,decl,ptr_spelling:ptr_not_instantiable:*] - [:case="RTArrayNotLast"] - - [:case="functionAtomic"] - expected: - if os == "linux" and not debug: FAIL - - [:case="functionRTArray"] - - [:case="nestedRTArray"] - - [:case="privateAtomic"] - expected: - if os == "linux" and not debug: FAIL - - [:case="privateRTArray"] - - [:case="ptr"] - - [:case="uniformAtomic"] - expected: - if os == "linux" and not debug: FAIL - - [:case="uniformRTArray"] - - [:case="workgroupRTArray"] + [:address_space="workgroup";access_mode="write";trailing_comma=true] [cts.https.html?q=webgpu:shader,validation,decl,var:binding_collision_unused_helper:*] @@ -92267,6 +115261,44 @@ [:decl="uniform";group="%40group(0)";binding="%40binding(0)"] +[cts.https.html?q=webgpu:shader,validation,decl,var:explicit_access_mode:*] + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="write";stage="compute"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] + + [cts.https.html?q=webgpu:shader,validation,decl,var:function_addrspace_at_module_scope:*] [:addrspace="function"] @@ -92521,6 +115553,22 @@ [:initializer=true;type="texture_2d%3Cf32%3E"] +[cts.https.html?q=webgpu:shader,validation,decl,var:implicit_access_mode:*] + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] + + [cts.https.html?q=webgpu:shader,validation,decl,var:initializer_kind:*] [:initializer="42u";addrspace="function"] expected: @@ -92597,6 +115645,10 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,decl,var:initializer_type:*] + [:] + + [cts.https.html?q=webgpu:shader,validation,decl,var:module_scope_initializers:*] [:initializer=false;kind="private"] @@ -93449,61 +116501,7 @@ [:type="vec4u";kind="workgroup";via_alias=true] -[cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:explicit_access_mode:*] - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="write";stage="compute"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] - - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="write";stage="compute"] - - -[cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:implicit_access_mode:*] - [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute"] - - [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] - expected: - if os == "linux" and not debug: FAIL - - [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] - - [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] - - [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] - - [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute"] - - -[cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:read_access:*] +[cts.https.html?q=webgpu:shader,validation,decl,var:read_access:*] [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute"] [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute"] @@ -93535,7 +116533,187 @@ [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute"] -[cts.https.html?q=webgpu:shader,validation,decl,var_access_mode:write_access:*] +[cts.https.html?q=webgpu:shader,validation,decl,var:shader_stage:*] + [:stage="compute";kind="function"] + + [:stage="compute";kind="handle_ro"] + + [:stage="compute";kind="handle_rw"] + + [:stage="compute";kind="handle_wo"] + + [:stage="compute";kind="private"] + + [:stage="compute";kind="storage_ro"] + + [:stage="compute";kind="storage_rw"] + + [:stage="compute";kind="uniform"] + + [:stage="compute";kind="workgroup"] + + [:stage="fragment";kind="function"] + + [:stage="fragment";kind="handle_ro"] + + [:stage="fragment";kind="handle_rw"] + + [:stage="fragment";kind="handle_wo"] + + [:stage="fragment";kind="private"] + + [:stage="fragment";kind="storage_ro"] + + [:stage="fragment";kind="storage_rw"] + + [:stage="fragment";kind="uniform"] + + [:stage="fragment";kind="workgroup"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";kind="function"] + + [:stage="vertex";kind="handle_ro"] + + [:stage="vertex";kind="handle_rw"] + + [:stage="vertex";kind="handle_wo"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";kind="private"] + + [:stage="vertex";kind="storage_ro"] + + [:stage="vertex";kind="storage_rw"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";kind="uniform"] + + [:stage="vertex";kind="workgroup"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,decl,var:var_access_mode_bad_other_template_contents:*] + [:accessMode="read";prefix="";suffix=""] + + [:accessMode="read";prefix="";suffix=","] + + [:accessMode="read";prefix="";suffix=",read"] + + [:accessMode="read";prefix="";suffix=",storage"] + + [:accessMode="read";prefix=",";suffix=""] + + [:accessMode="read";prefix=",";suffix=","] + + [:accessMode="read";prefix=",";suffix=",read"] + + [:accessMode="read";prefix=",";suffix=",storage"] + + [:accessMode="read";prefix="storage,";suffix=""] + + [:accessMode="read";prefix="storage,";suffix=","] + + [:accessMode="read";prefix="storage,";suffix=",read"] + + [:accessMode="read";prefix="storage,";suffix=",storage"] + + [:accessMode="read_write";prefix="";suffix=""] + + [:accessMode="read_write";prefix="";suffix=","] + + [:accessMode="read_write";prefix="";suffix=",read"] + + [:accessMode="read_write";prefix="";suffix=",storage"] + + [:accessMode="read_write";prefix=",";suffix=""] + + [:accessMode="read_write";prefix=",";suffix=","] + + [:accessMode="read_write";prefix=",";suffix=",read"] + + [:accessMode="read_write";prefix=",";suffix=",storage"] + + [:accessMode="read_write";prefix="storage,";suffix=""] + + [:accessMode="read_write";prefix="storage,";suffix=","] + + [:accessMode="read_write";prefix="storage,";suffix=",read"] + + [:accessMode="read_write";prefix="storage,";suffix=",storage"] + + +[cts.https.html?q=webgpu:shader,validation,decl,var:var_access_mode_bad_template_delim:*] + [:accessMode="read";prefix="";suffix=""] + + [:accessMode="read";prefix="";suffix="%3C"] + + [:accessMode="read";prefix="";suffix="%3E"] + + [:accessMode="read";prefix="";suffix=","] + + [:accessMode="read";prefix="%3C";suffix=""] + + [:accessMode="read";prefix="%3C";suffix="%3C"] + + [:accessMode="read";prefix="%3C";suffix="%3E"] + + [:accessMode="read";prefix="%3C";suffix=","] + + [:accessMode="read";prefix="%3E";suffix=""] + + [:accessMode="read";prefix="%3E";suffix="%3C"] + + [:accessMode="read";prefix="%3E";suffix="%3E"] + + [:accessMode="read";prefix="%3E";suffix=","] + + [:accessMode="read";prefix=",";suffix=""] + + [:accessMode="read";prefix=",";suffix="%3C"] + + [:accessMode="read";prefix=",";suffix="%3E"] + + [:accessMode="read";prefix=",";suffix=","] + + [:accessMode="read_write";prefix="";suffix=""] + + [:accessMode="read_write";prefix="";suffix="%3C"] + + [:accessMode="read_write";prefix="";suffix="%3E"] + + [:accessMode="read_write";prefix="";suffix=","] + + [:accessMode="read_write";prefix="%3C";suffix=""] + + [:accessMode="read_write";prefix="%3C";suffix="%3C"] + + [:accessMode="read_write";prefix="%3C";suffix="%3E"] + + [:accessMode="read_write";prefix="%3C";suffix=","] + + [:accessMode="read_write";prefix="%3E";suffix=""] + + [:accessMode="read_write";prefix="%3E";suffix="%3C"] + + [:accessMode="read_write";prefix="%3E";suffix="%3E"] + + [:accessMode="read_write";prefix="%3E";suffix=","] + + [:accessMode="read_write";prefix=",";suffix=""] + + [:accessMode="read_write";prefix=",";suffix="%3C"] + + [:accessMode="read_write";prefix=",";suffix="%3E"] + + [:accessMode="read_write";prefix=",";suffix=","] + + +[cts.https.html?q=webgpu:shader,validation,decl,var:write_access:*] [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute"] [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute"] @@ -93567,7 +116745,339 @@ [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute"] -[cts.https.html?q=webgpu:shader,validation,expression,access,vector:vector:*] +[cts.https.html?q=webgpu:shader,validation,expression,access,array:abstract_array_concrete_index:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,access,array:early_eval_errors:*] + [:case="const_func_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_func_oob_neg"] + + [:case="const_func_oob_pos"] + + [:case="const_module_in_bounds"] + + [:case="const_module_oob_neg"] + + [:case="const_module_oob_pos"] + + [:case="override_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_oob_pos"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_array_const_oob_neg"] + + [:case="runtime_array_override_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_oob_pos"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,access,array:index_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2i"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,array:result_type:*] + [:type="bool";elements=4] + + [:type="f16";elements=0] + + [:type="f16";elements=4] + + [:type="f32";elements=0] + + [:type="f32";elements=4] + + [:type="i32";elements=0] + + [:type="i32";elements=4] + + [:type="u32";elements=0] + + [:type="u32";elements=4] + + [:type="vec2%3Cbool%3E";elements=4] + + [:type="vec2%3Cf16%3E";elements=0] + + [:type="vec2%3Cf16%3E";elements=4] + + [:type="vec2%3Cf32%3E";elements=0] + + [:type="vec2%3Cf32%3E";elements=4] + + [:type="vec2%3Ci32%3E";elements=0] + + [:type="vec2%3Ci32%3E";elements=4] + + [:type="vec2%3Cu32%3E";elements=0] + + [:type="vec2%3Cu32%3E";elements=4] + + [:type="vec3%3Cbool%3E";elements=4] + + [:type="vec3%3Cf16%3E";elements=0] + + [:type="vec3%3Cf16%3E";elements=4] + + [:type="vec3%3Cf32%3E";elements=0] + + [:type="vec3%3Cf32%3E";elements=4] + + [:type="vec3%3Ci32%3E";elements=0] + + [:type="vec3%3Ci32%3E";elements=4] + + [:type="vec3%3Cu32%3E";elements=0] + + [:type="vec3%3Cu32%3E";elements=4] + + [:type="vec4%3Cbool%3E";elements=4] + + [:type="vec4%3Cf16%3E";elements=0] + + [:type="vec4%3Cf16%3E";elements=4] + + [:type="vec4%3Cf32%3E";elements=0] + + [:type="vec4%3Cf32%3E";elements=4] + + [:type="vec4%3Ci32%3E";elements=0] + + [:type="vec4%3Ci32%3E";elements=4] + + [:type="vec4%3Cu32%3E";elements=0] + + [:type="vec4%3Cu32%3E";elements=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,matrix:abstract_matrix_concrete_index:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,access,matrix:early_eval_errors:*] + [:case="const_func_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_func_oob_neg"] + + [:case="const_func_oob_pos"] + + [:case="const_module_in_bounds"] + + [:case="const_module_oob_neg"] + + [:case="const_module_oob_pos"] + + [:case="override_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_oob_pos"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_array_const_oob_neg"] + + [:case="runtime_array_override_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_in_bounds"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_oob_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="runtime_oob_pos"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,access,matrix:index_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2i"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,matrix:result_type:*] + [:element="f16";columns=2] + + [:element="f16";columns=3] + + [:element="f16";columns=4] + + [:element="f32";columns=2] + + [:element="f32";columns=3] + + [:element="f32";columns=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,structure:identifier_mismatch:*] + [:decl="ref"] + + [:decl="value"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type:*] + [:decl="ref"] + + [:decl="value"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type_f16:*] + [:decl="ref"] + + [:decl="value"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,structure:result_type_runtime_array:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,structure:shadowed_member:*] + [:decl="ref"] + + [:decl="value"] + + +[cts.https.html?q=webgpu:shader,validation,expression,access,vector:abstract:*] + [:vector_width=2;abstract_type="float";concrete_type="f16"] + + [:vector_width=2;abstract_type="float";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=2;abstract_type="float";concrete_type="i32"] + + [:vector_width=2;abstract_type="float";concrete_type="u32"] + + [:vector_width=2;abstract_type="int";concrete_type="f16"] + + [:vector_width=2;abstract_type="int";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=2;abstract_type="int";concrete_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=2;abstract_type="int";concrete_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=3;abstract_type="float";concrete_type="f16"] + + [:vector_width=3;abstract_type="float";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=3;abstract_type="float";concrete_type="i32"] + + [:vector_width=3;abstract_type="float";concrete_type="u32"] + + [:vector_width=3;abstract_type="int";concrete_type="f16"] + + [:vector_width=3;abstract_type="int";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=3;abstract_type="int";concrete_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=3;abstract_type="int";concrete_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=4;abstract_type="float";concrete_type="f16"] + + [:vector_width=4;abstract_type="float";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=4;abstract_type="float";concrete_type="i32"] + + [:vector_width=4;abstract_type="float";concrete_type="u32"] + + [:vector_width=4;abstract_type="int";concrete_type="f16"] + + [:vector_width=4;abstract_type="int";concrete_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=4;abstract_type="int";concrete_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:vector_width=4;abstract_type="int";concrete_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,access,vector:concrete:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] [:vector_decl="const";vector_width=2;element_type="bool"] expected: if os == "linux" and not debug: FAIL @@ -93785,6 +117295,5506 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:invalid_type_with_itself:*] + [:op="add";type="array";control=false] + + [:op="add";type="array";control=true] + + [:op="add";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";type="atomic";control=true] + + [:op="add";type="ptr";control=false] + + [:op="add";type="ptr";control=true] + + [:op="add";type="sampler";control=false] + + [:op="add";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";type="struct";control=false] + + [:op="add";type="struct";control=true] + + [:op="add";type="texture";control=false] + + [:op="add";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";type="array";control=false] + + [:op="mul";type="array";control=true] + + [:op="mul";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";type="atomic";control=true] + + [:op="mul";type="ptr";control=false] + + [:op="mul";type="ptr";control=true] + + [:op="mul";type="sampler";control=false] + + [:op="mul";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";type="struct";control=false] + + [:op="mul";type="struct";control=true] + + [:op="mul";type="texture";control=false] + + [:op="mul";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";type="array";control=false] + + [:op="sub";type="array";control=true] + + [:op="sub";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";type="atomic";control=true] + + [:op="sub";type="ptr";control=false] + + [:op="sub";type="ptr";control=true] + + [:op="sub";type="sampler";control=false] + + [:op="sub";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";type="struct";control=false] + + [:op="sub";type="struct";control=true] + + [:op="sub";type="texture";control=false] + + [:op="sub";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:scalar_vector:*] + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="bool";compound_assignment=false] + + [:lhs="abstract-float";rhs="bool";compound_assignment=true] + + [:lhs="abstract-float";rhs="f16";compound_assignment=false] + + [:lhs="abstract-float";rhs="f16";compound_assignment=true] + + [:lhs="abstract-float";rhs="f32";compound_assignment=false] + + [:lhs="abstract-float";rhs="f32";compound_assignment=true] + + [:lhs="abstract-float";rhs="i32";compound_assignment=false] + + [:lhs="abstract-float";rhs="i32";compound_assignment=true] + + [:lhs="abstract-float";rhs="u32";compound_assignment=false] + + [:lhs="abstract-float";rhs="u32";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=false] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=true] + + [:lhs="abstract-int";rhs="bool";compound_assignment=false] + + [:lhs="abstract-int";rhs="bool";compound_assignment=true] + + [:lhs="abstract-int";rhs="f16";compound_assignment=false] + + [:lhs="abstract-int";rhs="f16";compound_assignment=true] + + [:lhs="abstract-int";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="f32";compound_assignment=true] + + [:lhs="abstract-int";rhs="i32";compound_assignment=false] + + [:lhs="abstract-int";rhs="i32";compound_assignment=true] + + [:lhs="abstract-int";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="u32";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="bool";rhs="abstract-float";compound_assignment=false] + + [:lhs="bool";rhs="abstract-float";compound_assignment=true] + + [:lhs="bool";rhs="abstract-int";compound_assignment=false] + + [:lhs="bool";rhs="abstract-int";compound_assignment=true] + + [:lhs="bool";rhs="bool";compound_assignment=false] + + [:lhs="bool";rhs="bool";compound_assignment=true] + + [:lhs="bool";rhs="f16";compound_assignment=false] + + [:lhs="bool";rhs="f16";compound_assignment=true] + + [:lhs="bool";rhs="f32";compound_assignment=false] + + [:lhs="bool";rhs="f32";compound_assignment=true] + + [:lhs="bool";rhs="i32";compound_assignment=false] + + [:lhs="bool";rhs="i32";compound_assignment=true] + + [:lhs="bool";rhs="u32";compound_assignment=false] + + [:lhs="bool";rhs="u32";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f16";rhs="abstract-float";compound_assignment=false] + + [:lhs="f16";rhs="abstract-float";compound_assignment=true] + + [:lhs="f16";rhs="abstract-int";compound_assignment=false] + + [:lhs="f16";rhs="abstract-int";compound_assignment=true] + + [:lhs="f16";rhs="bool";compound_assignment=false] + + [:lhs="f16";rhs="bool";compound_assignment=true] + + [:lhs="f16";rhs="f16";compound_assignment=false] + + [:lhs="f16";rhs="f16";compound_assignment=true] + + [:lhs="f16";rhs="f32";compound_assignment=false] + + [:lhs="f16";rhs="f32";compound_assignment=true] + + [:lhs="f16";rhs="i32";compound_assignment=false] + + [:lhs="f16";rhs="i32";compound_assignment=true] + + [:lhs="f16";rhs="u32";compound_assignment=false] + + [:lhs="f16";rhs="u32";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f32";rhs="abstract-float";compound_assignment=false] + + [:lhs="f32";rhs="abstract-float";compound_assignment=true] + + [:lhs="f32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="bool";compound_assignment=false] + + [:lhs="f32";rhs="bool";compound_assignment=true] + + [:lhs="f32";rhs="f16";compound_assignment=false] + + [:lhs="f32";rhs="f16";compound_assignment=true] + + [:lhs="f32";rhs="f32";compound_assignment=false] + + [:lhs="f32";rhs="f32";compound_assignment=true] + + [:lhs="f32";rhs="i32";compound_assignment=false] + + [:lhs="f32";rhs="i32";compound_assignment=true] + + [:lhs="f32";rhs="u32";compound_assignment=false] + + [:lhs="f32";rhs="u32";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="i32";rhs="abstract-float";compound_assignment=false] + + [:lhs="i32";rhs="abstract-float";compound_assignment=true] + + [:lhs="i32";rhs="abstract-int";compound_assignment=false] + + [:lhs="i32";rhs="abstract-int";compound_assignment=true] + + [:lhs="i32";rhs="bool";compound_assignment=false] + + [:lhs="i32";rhs="bool";compound_assignment=true] + + [:lhs="i32";rhs="f16";compound_assignment=false] + + [:lhs="i32";rhs="f16";compound_assignment=true] + + [:lhs="i32";rhs="f32";compound_assignment=false] + + [:lhs="i32";rhs="f32";compound_assignment=true] + + [:lhs="i32";rhs="i32";compound_assignment=false] + + [:lhs="i32";rhs="i32";compound_assignment=true] + + [:lhs="i32";rhs="u32";compound_assignment=false] + + [:lhs="i32";rhs="u32";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="u32";rhs="abstract-float";compound_assignment=false] + + [:lhs="u32";rhs="abstract-float";compound_assignment=true] + + [:lhs="u32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="bool";compound_assignment=false] + + [:lhs="u32";rhs="bool";compound_assignment=true] + + [:lhs="u32";rhs="f16";compound_assignment=false] + + [:lhs="u32";rhs="f16";compound_assignment=true] + + [:lhs="u32";rhs="f32";compound_assignment=false] + + [:lhs="u32";rhs="f32";compound_assignment=true] + + [:lhs="u32";rhs="i32";compound_assignment=false] + + [:lhs="u32";rhs="i32";compound_assignment=true] + + [:lhs="u32";rhs="u32";compound_assignment=false] + + [:lhs="u32";rhs="u32";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,add_sub_mul:scalar_vector_out_of_range:*] + [:op="add";lhs="f16";rhs="f16"] + + [:op="add";lhs="f32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="i32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="u32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Cf16%3E";rhs="f16"] + + [:op="add";lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:op="add";lhs="vec2%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Cf16%3E";rhs="f16"] + + [:op="add";lhs="vec3%3Cf16%3E";rhs="vec3%3Cf16%3E"] + + [:op="add";lhs="vec3%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Ci32%3E";rhs="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec3%3Cu32%3E";rhs="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Cf16%3E";rhs="f16"] + + [:op="add";lhs="vec4%3Cf16%3E";rhs="vec4%3Cf16%3E"] + + [:op="add";lhs="vec4%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Ci32%3E";rhs="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";lhs="vec4%3Cu32%3E";rhs="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="f16";rhs="f16"] + + [:op="mul";lhs="f32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="i32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="u32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Cf16%3E";rhs="f16"] + + [:op="mul";lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:op="mul";lhs="vec2%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Cf16%3E";rhs="f16"] + + [:op="mul";lhs="vec3%3Cf16%3E";rhs="vec3%3Cf16%3E"] + + [:op="mul";lhs="vec3%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Ci32%3E";rhs="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec3%3Cu32%3E";rhs="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Cf16%3E";rhs="f16"] + + [:op="mul";lhs="vec4%3Cf16%3E";rhs="vec4%3Cf16%3E"] + + [:op="mul";lhs="vec4%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Ci32%3E";rhs="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="mul";lhs="vec4%3Cu32%3E";rhs="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="f16";rhs="f16"] + + [:op="sub";lhs="f32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="i32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="u32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Cf16%3E";rhs="f16"] + + [:op="sub";lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:op="sub";lhs="vec2%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Cf16%3E";rhs="f16"] + + [:op="sub";lhs="vec3%3Cf16%3E";rhs="vec3%3Cf16%3E"] + + [:op="sub";lhs="vec3%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Ci32%3E";rhs="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec3%3Cu32%3E";rhs="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Cf16%3E";rhs="f16"] + + [:op="sub";lhs="vec4%3Cf16%3E";rhs="vec4%3Cf16%3E"] + + [:op="sub";lhs="vec4%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Ci32%3E";rhs="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";lhs="vec4%3Cu32%3E";rhs="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,and_or_xor:invalid_types:*] + [:op="and";type="array";control=false] + + [:op="and";type="array";control=true] + + [:op="and";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";type="atomic";control=true] + + [:op="and";type="mat2x2f";control=false] + + [:op="and";type="mat2x2f";control=true] + + [:op="and";type="ptr";control=false] + + [:op="and";type="ptr";control=true] + + [:op="and";type="sampler";control=false] + + [:op="and";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";type="struct";control=false] + + [:op="and";type="struct";control=true] + + [:op="and";type="texture";control=false] + + [:op="and";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";type="array";control=false] + + [:op="or";type="array";control=true] + + [:op="or";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";type="atomic";control=true] + + [:op="or";type="mat2x2f";control=false] + + [:op="or";type="mat2x2f";control=true] + + [:op="or";type="ptr";control=false] + + [:op="or";type="ptr";control=true] + + [:op="or";type="sampler";control=false] + + [:op="or";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";type="struct";control=false] + + [:op="or";type="struct";control=true] + + [:op="or";type="texture";control=false] + + [:op="or";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";type="array";control=false] + + [:op="xor";type="array";control=true] + + [:op="xor";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";type="atomic";control=true] + + [:op="xor";type="mat2x2f";control=false] + + [:op="xor";type="mat2x2f";control=true] + + [:op="xor";type="ptr";control=false] + + [:op="xor";type="ptr";control=true] + + [:op="xor";type="sampler";control=false] + + [:op="xor";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";type="struct";control=false] + + [:op="xor";type="struct";control=true] + + [:op="xor";type="texture";control=false] + + [:op="xor";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,and_or_xor:scalar_vector:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=true] + + [:lhs="abstract-float";rhs="bool";compound_assignment=false] + + [:lhs="abstract-float";rhs="bool";compound_assignment=true] + + [:lhs="abstract-float";rhs="f16";compound_assignment=false] + + [:lhs="abstract-float";rhs="f16";compound_assignment=true] + + [:lhs="abstract-float";rhs="f32";compound_assignment=false] + + [:lhs="abstract-float";rhs="f32";compound_assignment=true] + + [:lhs="abstract-float";rhs="i32";compound_assignment=false] + + [:lhs="abstract-float";rhs="i32";compound_assignment=true] + + [:lhs="abstract-float";rhs="u32";compound_assignment=false] + + [:lhs="abstract-float";rhs="u32";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=false] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=true] + + [:lhs="abstract-int";rhs="bool";compound_assignment=false] + + [:lhs="abstract-int";rhs="bool";compound_assignment=true] + + [:lhs="abstract-int";rhs="f16";compound_assignment=false] + + [:lhs="abstract-int";rhs="f16";compound_assignment=true] + + [:lhs="abstract-int";rhs="f32";compound_assignment=false] + + [:lhs="abstract-int";rhs="f32";compound_assignment=true] + + [:lhs="abstract-int";rhs="i32";compound_assignment=false] + + [:lhs="abstract-int";rhs="i32";compound_assignment=true] + + [:lhs="abstract-int";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="u32";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="bool";rhs="abstract-float";compound_assignment=false] + + [:lhs="bool";rhs="abstract-float";compound_assignment=true] + + [:lhs="bool";rhs="abstract-int";compound_assignment=false] + + [:lhs="bool";rhs="abstract-int";compound_assignment=true] + + [:lhs="bool";rhs="bool";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="bool";compound_assignment=true] + + [:lhs="bool";rhs="f16";compound_assignment=false] + + [:lhs="bool";rhs="f16";compound_assignment=true] + + [:lhs="bool";rhs="f32";compound_assignment=false] + + [:lhs="bool";rhs="f32";compound_assignment=true] + + [:lhs="bool";rhs="i32";compound_assignment=false] + + [:lhs="bool";rhs="i32";compound_assignment=true] + + [:lhs="bool";rhs="u32";compound_assignment=false] + + [:lhs="bool";rhs="u32";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f16";rhs="abstract-float";compound_assignment=false] + + [:lhs="f16";rhs="abstract-float";compound_assignment=true] + + [:lhs="f16";rhs="abstract-int";compound_assignment=false] + + [:lhs="f16";rhs="abstract-int";compound_assignment=true] + + [:lhs="f16";rhs="bool";compound_assignment=false] + + [:lhs="f16";rhs="bool";compound_assignment=true] + + [:lhs="f16";rhs="f16";compound_assignment=false] + + [:lhs="f16";rhs="f16";compound_assignment=true] + + [:lhs="f16";rhs="f32";compound_assignment=false] + + [:lhs="f16";rhs="f32";compound_assignment=true] + + [:lhs="f16";rhs="i32";compound_assignment=false] + + [:lhs="f16";rhs="i32";compound_assignment=true] + + [:lhs="f16";rhs="u32";compound_assignment=false] + + [:lhs="f16";rhs="u32";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f32";rhs="abstract-float";compound_assignment=false] + + [:lhs="f32";rhs="abstract-float";compound_assignment=true] + + [:lhs="f32";rhs="abstract-int";compound_assignment=false] + + [:lhs="f32";rhs="abstract-int";compound_assignment=true] + + [:lhs="f32";rhs="bool";compound_assignment=false] + + [:lhs="f32";rhs="bool";compound_assignment=true] + + [:lhs="f32";rhs="f16";compound_assignment=false] + + [:lhs="f32";rhs="f16";compound_assignment=true] + + [:lhs="f32";rhs="f32";compound_assignment=false] + + [:lhs="f32";rhs="f32";compound_assignment=true] + + [:lhs="f32";rhs="i32";compound_assignment=false] + + [:lhs="f32";rhs="i32";compound_assignment=true] + + [:lhs="f32";rhs="u32";compound_assignment=false] + + [:lhs="f32";rhs="u32";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="i32";rhs="abstract-float";compound_assignment=false] + + [:lhs="i32";rhs="abstract-float";compound_assignment=true] + + [:lhs="i32";rhs="abstract-int";compound_assignment=false] + + [:lhs="i32";rhs="abstract-int";compound_assignment=true] + + [:lhs="i32";rhs="bool";compound_assignment=false] + + [:lhs="i32";rhs="bool";compound_assignment=true] + + [:lhs="i32";rhs="f16";compound_assignment=false] + + [:lhs="i32";rhs="f16";compound_assignment=true] + + [:lhs="i32";rhs="f32";compound_assignment=false] + + [:lhs="i32";rhs="f32";compound_assignment=true] + + [:lhs="i32";rhs="i32";compound_assignment=false] + + [:lhs="i32";rhs="i32";compound_assignment=true] + + [:lhs="i32";rhs="u32";compound_assignment=false] + + [:lhs="i32";rhs="u32";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="u32";rhs="abstract-float";compound_assignment=false] + + [:lhs="u32";rhs="abstract-float";compound_assignment=true] + + [:lhs="u32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="bool";compound_assignment=false] + + [:lhs="u32";rhs="bool";compound_assignment=true] + + [:lhs="u32";rhs="f16";compound_assignment=false] + + [:lhs="u32";rhs="f16";compound_assignment=true] + + [:lhs="u32";rhs="f32";compound_assignment=false] + + [:lhs="u32";rhs="f32";compound_assignment=true] + + [:lhs="u32";rhs="i32";compound_assignment=false] + + [:lhs="u32";rhs="i32";compound_assignment=true] + + [:lhs="u32";rhs="u32";compound_assignment=false] + + [:lhs="u32";rhs="u32";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:invalid_types:*] + [:op="%3C%3C";type="array";control=false] + + [:op="%3C%3C";type="array";control=true] + + [:op="%3C%3C";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3C%3C";type="atomic";control=true] + + [:op="%3C%3C";type="mat2x2f";control=false] + + [:op="%3C%3C";type="mat2x2f";control=true] + + [:op="%3C%3C";type="ptr";control=false] + + [:op="%3C%3C";type="ptr";control=true] + + [:op="%3C%3C";type="sampler";control=false] + + [:op="%3C%3C";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3C%3C";type="struct";control=false] + + [:op="%3C%3C";type="struct";control=true] + + [:op="%3C%3C";type="texture";control=false] + + [:op="%3C%3C";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3E%3E";type="array";control=false] + + [:op="%3E%3E";type="array";control=true] + + [:op="%3E%3E";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3E%3E";type="atomic";control=true] + + [:op="%3E%3E";type="mat2x2f";control=false] + + [:op="%3E%3E";type="mat2x2f";control=true] + + [:op="%3E%3E";type="ptr";control=false] + + [:op="%3E%3E";type="ptr";control=true] + + [:op="%3E%3E";type="sampler";control=false] + + [:op="%3E%3E";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3E%3E";type="struct";control=false] + + [:op="%3E%3E";type="struct";control=true] + + [:op="%3E%3E";type="texture";control=false] + + [:op="%3E%3E";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:partial_eval_errors:*] + [:op="%3C%3C";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3C%3C";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3E%3E";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="%3E%3E";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:scalar_vector:*] + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=true] + + [:lhs="abstract-float";rhs="bool";compound_assignment=false] + + [:lhs="abstract-float";rhs="bool";compound_assignment=true] + + [:lhs="abstract-float";rhs="f16";compound_assignment=false] + + [:lhs="abstract-float";rhs="f16";compound_assignment=true] + + [:lhs="abstract-float";rhs="f32";compound_assignment=false] + + [:lhs="abstract-float";rhs="f32";compound_assignment=true] + + [:lhs="abstract-float";rhs="i32";compound_assignment=false] + + [:lhs="abstract-float";rhs="i32";compound_assignment=true] + + [:lhs="abstract-float";rhs="u32";compound_assignment=false] + + [:lhs="abstract-float";rhs="u32";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="bool";compound_assignment=false] + + [:lhs="abstract-int";rhs="bool";compound_assignment=true] + + [:lhs="abstract-int";rhs="f16";compound_assignment=false] + + [:lhs="abstract-int";rhs="f16";compound_assignment=true] + + [:lhs="abstract-int";rhs="f32";compound_assignment=false] + + [:lhs="abstract-int";rhs="f32";compound_assignment=true] + + [:lhs="abstract-int";rhs="i32";compound_assignment=false] + + [:lhs="abstract-int";rhs="i32";compound_assignment=true] + + [:lhs="abstract-int";rhs="u32";compound_assignment=false] + + [:lhs="abstract-int";rhs="u32";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="bool";rhs="abstract-float";compound_assignment=false] + + [:lhs="bool";rhs="abstract-float";compound_assignment=true] + + [:lhs="bool";rhs="abstract-int";compound_assignment=false] + + [:lhs="bool";rhs="abstract-int";compound_assignment=true] + + [:lhs="bool";rhs="bool";compound_assignment=false] + + [:lhs="bool";rhs="bool";compound_assignment=true] + + [:lhs="bool";rhs="f16";compound_assignment=false] + + [:lhs="bool";rhs="f16";compound_assignment=true] + + [:lhs="bool";rhs="f32";compound_assignment=false] + + [:lhs="bool";rhs="f32";compound_assignment=true] + + [:lhs="bool";rhs="i32";compound_assignment=false] + + [:lhs="bool";rhs="i32";compound_assignment=true] + + [:lhs="bool";rhs="u32";compound_assignment=false] + + [:lhs="bool";rhs="u32";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f16";rhs="abstract-float";compound_assignment=false] + + [:lhs="f16";rhs="abstract-float";compound_assignment=true] + + [:lhs="f16";rhs="abstract-int";compound_assignment=false] + + [:lhs="f16";rhs="abstract-int";compound_assignment=true] + + [:lhs="f16";rhs="bool";compound_assignment=false] + + [:lhs="f16";rhs="bool";compound_assignment=true] + + [:lhs="f16";rhs="f16";compound_assignment=false] + + [:lhs="f16";rhs="f16";compound_assignment=true] + + [:lhs="f16";rhs="f32";compound_assignment=false] + + [:lhs="f16";rhs="f32";compound_assignment=true] + + [:lhs="f16";rhs="i32";compound_assignment=false] + + [:lhs="f16";rhs="i32";compound_assignment=true] + + [:lhs="f16";rhs="u32";compound_assignment=false] + + [:lhs="f16";rhs="u32";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f32";rhs="abstract-float";compound_assignment=false] + + [:lhs="f32";rhs="abstract-float";compound_assignment=true] + + [:lhs="f32";rhs="abstract-int";compound_assignment=false] + + [:lhs="f32";rhs="abstract-int";compound_assignment=true] + + [:lhs="f32";rhs="bool";compound_assignment=false] + + [:lhs="f32";rhs="bool";compound_assignment=true] + + [:lhs="f32";rhs="f16";compound_assignment=false] + + [:lhs="f32";rhs="f16";compound_assignment=true] + + [:lhs="f32";rhs="f32";compound_assignment=false] + + [:lhs="f32";rhs="f32";compound_assignment=true] + + [:lhs="f32";rhs="i32";compound_assignment=false] + + [:lhs="f32";rhs="i32";compound_assignment=true] + + [:lhs="f32";rhs="u32";compound_assignment=false] + + [:lhs="f32";rhs="u32";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="i32";rhs="abstract-float";compound_assignment=false] + + [:lhs="i32";rhs="abstract-float";compound_assignment=true] + + [:lhs="i32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="bool";compound_assignment=false] + + [:lhs="i32";rhs="bool";compound_assignment=true] + + [:lhs="i32";rhs="f16";compound_assignment=false] + + [:lhs="i32";rhs="f16";compound_assignment=true] + + [:lhs="i32";rhs="f32";compound_assignment=false] + + [:lhs="i32";rhs="f32";compound_assignment=true] + + [:lhs="i32";rhs="i32";compound_assignment=false] + + [:lhs="i32";rhs="i32";compound_assignment=true] + + [:lhs="i32";rhs="u32";compound_assignment=false] + + [:lhs="i32";rhs="u32";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="u32";rhs="abstract-float";compound_assignment=false] + + [:lhs="u32";rhs="abstract-float";compound_assignment=true] + + [:lhs="u32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="bool";compound_assignment=false] + + [:lhs="u32";rhs="bool";compound_assignment=true] + + [:lhs="u32";rhs="f16";compound_assignment=false] + + [:lhs="u32";rhs="f16";compound_assignment=true] + + [:lhs="u32";rhs="f32";compound_assignment=false] + + [:lhs="u32";rhs="f32";compound_assignment=true] + + [:lhs="u32";rhs="i32";compound_assignment=false] + + [:lhs="u32";rhs="i32";compound_assignment=true] + + [:lhs="u32";rhs="u32";compound_assignment=false] + + [:lhs="u32";rhs="u32";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_left_abstract:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_left_concrete:*] [:case={"lhs":"-1073741824i","rhs":"1u","pass":true};vectorize="_undef_"] expected: @@ -93938,6 +122948,14 @@ [:case={"lhs":"1","rhs":"-1","pass":false};vectorize=4] + [:case={"lhs":"1","rhs":"63","pass":false};vectorize="_undef_"] + + [:case={"lhs":"1","rhs":"63","pass":false};vectorize=2] + + [:case={"lhs":"1","rhs":"63","pass":false};vectorize=3] + + [:case={"lhs":"1","rhs":"63","pass":false};vectorize=4] + [:case={"lhs":"1073741824i","rhs":"1u","pass":false};vectorize="_undef_"] [:case={"lhs":"1073741824i","rhs":"1u","pass":false};vectorize=2] @@ -94002,6 +123020,14 @@ expected: if os == "linux" and not debug: FAIL + [:case={"lhs":"2","rhs":"62","pass":false};vectorize="_undef_"] + + [:case={"lhs":"2","rhs":"62","pass":false};vectorize=2] + + [:case={"lhs":"2","rhs":"62","pass":false};vectorize=3] + + [:case={"lhs":"2","rhs":"62","pass":false};vectorize=4] + [:case={"lhs":"2147483647i","rhs":"1u","pass":false};vectorize="_undef_"] [:case={"lhs":"2147483647i","rhs":"1u","pass":false};vectorize=2] @@ -94050,29 +123076,17 @@ [:case={"lhs":"4294967295u","rhs":"31u","pass":false};vectorize=4] + [:case={"lhs":"4611686018427388000","rhs":"1u","pass":false};vectorize="_undef_"] -[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_left_vec_size_mismatch:*] - [:vectorize_lhs=2;vectorize_rhs=2] - expected: - if os == "linux" and not debug: FAIL + [:case={"lhs":"4611686018427388000","rhs":"1u","pass":false};vectorize=2] - [:vectorize_lhs=2;vectorize_rhs=3] + [:case={"lhs":"4611686018427388000","rhs":"1u","pass":false};vectorize=3] - [:vectorize_lhs=2;vectorize_rhs=4] + [:case={"lhs":"4611686018427388000","rhs":"1u","pass":false};vectorize=4] - [:vectorize_lhs=3;vectorize_rhs=2] - [:vectorize_lhs=3;vectorize_rhs=3] - expected: - if os == "linux" and not debug: FAIL - - [:vectorize_lhs=3;vectorize_rhs=4] - - [:vectorize_lhs=4;vectorize_rhs=2] - - [:vectorize_lhs=4;vectorize_rhs=3] - - [:vectorize_lhs=4;vectorize_rhs=4] +[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_right_abstract:*] + [:] expected: if os == "linux" and not debug: FAIL @@ -94199,37 +123213,3207 @@ [:case={"lhs":"1u","rhs":"-1","pass":false};vectorize=4] -[cts.https.html?q=webgpu:shader,validation,expression,binary,bitwise_shift:shift_right_vec_size_mismatch:*] - [:vectorize_lhs=2;vectorize_rhs=2] +[cts.https.html?q=webgpu:shader,validation,expression,binary,comparison:invalid_types:*] + [:op="eq";type="array";control=false] + + [:op="eq";type="array";control=true] + + [:op="eq";type="atomic";control=false] expected: if os == "linux" and not debug: FAIL - [:vectorize_lhs=2;vectorize_rhs=3] + [:op="eq";type="atomic";control=true] - [:vectorize_lhs=2;vectorize_rhs=4] + [:op="eq";type="mat2x2f";control=false] - [:vectorize_lhs=3;vectorize_rhs=2] + [:op="eq";type="mat2x2f";control=true] - [:vectorize_lhs=3;vectorize_rhs=3] + [:op="eq";type="ptr";control=false] + + [:op="eq";type="ptr";control=true] + + [:op="eq";type="sampler";control=false] + + [:op="eq";type="sampler";control=true] expected: if os == "linux" and not debug: FAIL - [:vectorize_lhs=3;vectorize_rhs=4] + [:op="eq";type="struct";control=false] - [:vectorize_lhs=4;vectorize_rhs=2] + [:op="eq";type="struct";control=true] - [:vectorize_lhs=4;vectorize_rhs=3] + [:op="eq";type="texture";control=false] - [:vectorize_lhs=4;vectorize_rhs=4] + [:op="eq";type="texture";control=true] expected: if os == "linux" and not debug: FAIL + [:op="ge";type="array";control=false] + + [:op="ge";type="array";control=true] + + [:op="ge";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";type="atomic";control=true] + + [:op="ge";type="mat2x2f";control=false] + + [:op="ge";type="mat2x2f";control=true] + + [:op="ge";type="ptr";control=false] + + [:op="ge";type="ptr";control=true] + + [:op="ge";type="sampler";control=false] + + [:op="ge";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";type="struct";control=false] + + [:op="ge";type="struct";control=true] + + [:op="ge";type="texture";control=false] + + [:op="ge";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";type="array";control=false] + + [:op="gt";type="array";control=true] + + [:op="gt";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";type="atomic";control=true] + + [:op="gt";type="mat2x2f";control=false] + + [:op="gt";type="mat2x2f";control=true] + + [:op="gt";type="ptr";control=false] + + [:op="gt";type="ptr";control=true] + + [:op="gt";type="sampler";control=false] + + [:op="gt";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";type="struct";control=false] + + [:op="gt";type="struct";control=true] + + [:op="gt";type="texture";control=false] + + [:op="gt";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";type="array";control=false] + + [:op="le";type="array";control=true] + + [:op="le";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";type="atomic";control=true] + + [:op="le";type="mat2x2f";control=false] + + [:op="le";type="mat2x2f";control=true] + + [:op="le";type="ptr";control=false] + + [:op="le";type="ptr";control=true] + + [:op="le";type="sampler";control=false] + + [:op="le";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";type="struct";control=false] + + [:op="le";type="struct";control=true] + + [:op="le";type="texture";control=false] + + [:op="le";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";type="array";control=false] + + [:op="lt";type="array";control=true] + + [:op="lt";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";type="atomic";control=true] + + [:op="lt";type="mat2x2f";control=false] + + [:op="lt";type="mat2x2f";control=true] + + [:op="lt";type="ptr";control=false] + + [:op="lt";type="ptr";control=true] + + [:op="lt";type="sampler";control=false] + + [:op="lt";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";type="struct";control=false] + + [:op="lt";type="struct";control=true] + + [:op="lt";type="texture";control=false] + + [:op="lt";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";type="array";control=false] + + [:op="ne";type="array";control=true] + + [:op="ne";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";type="atomic";control=true] + + [:op="ne";type="mat2x2f";control=false] + + [:op="ne";type="mat2x2f";control=true] + + [:op="ne";type="ptr";control=false] + + [:op="ne";type="ptr";control=true] + + [:op="ne";type="sampler";control=false] + + [:op="ne";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";type="struct";control=false] + + [:op="ne";type="struct";control=true] + + [:op="ne";type="texture";control=false] + + [:op="ne";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,comparison:scalar_vector:*] + [:lhs="abstract-float";rhs="abstract-float"] + + [:lhs="abstract-float";rhs="abstract-int"] + + [:lhs="abstract-float";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="f16"] + + [:lhs="abstract-float";rhs="f32"] + + [:lhs="abstract-float";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E"] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E"] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E"] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E"] + + [:lhs="abstract-int";rhs="abstract-float"] + + [:lhs="abstract-int";rhs="abstract-int"] + + [:lhs="abstract-int";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="f16"] + + [:lhs="abstract-int";rhs="f32"] + + [:lhs="abstract-int";rhs="i32"] + + [:lhs="abstract-int";rhs="u32"] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E"] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E"] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E"] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E"] + + [:lhs="bool";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="f16"] + + [:lhs="bool";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="bool";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="bool";rhs="vec2%3Cf16%3E"] + + [:lhs="bool";rhs="vec2%3Cf32%3E"] + + [:lhs="bool";rhs="vec2%3Ci32%3E"] + + [:lhs="bool";rhs="vec2%3Cu32%3E"] + + [:lhs="f16";rhs="abstract-float"] + + [:lhs="f16";rhs="abstract-int"] + + [:lhs="f16";rhs="bool"] + + [:lhs="f16";rhs="f16"] + + [:lhs="f16";rhs="f32"] + + [:lhs="f16";rhs="i32"] + + [:lhs="f16";rhs="u32"] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="f16";rhs="vec2%3Cbool%3E"] + + [:lhs="f16";rhs="vec2%3Cf16%3E"] + + [:lhs="f16";rhs="vec2%3Cf32%3E"] + + [:lhs="f16";rhs="vec2%3Ci32%3E"] + + [:lhs="f16";rhs="vec2%3Cu32%3E"] + + [:lhs="f32";rhs="abstract-float"] + + [:lhs="f32";rhs="abstract-int"] + + [:lhs="f32";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="f16"] + + [:lhs="f32";rhs="f32"] + + [:lhs="f32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="f32";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="vec2%3Cf16%3E"] + + [:lhs="f32";rhs="vec2%3Cf32%3E"] + + [:lhs="f32";rhs="vec2%3Ci32%3E"] + + [:lhs="f32";rhs="vec2%3Cu32%3E"] + + [:lhs="i32";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="abstract-int"] + + [:lhs="i32";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="f16"] + + [:lhs="i32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="i32"] + + [:lhs="i32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="i32";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="vec2%3Cf16%3E"] + + [:lhs="i32";rhs="vec2%3Cf32%3E"] + + [:lhs="i32";rhs="vec2%3Ci32%3E"] + + [:lhs="i32";rhs="vec2%3Cu32%3E"] + + [:lhs="u32";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="abstract-int"] + + [:lhs="u32";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="f16"] + + [:lhs="u32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="u32"] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="u32";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cf16%3E"] + + [:lhs="u32";rhs="vec2%3Cf32%3E"] + + [:lhs="u32";rhs="vec2%3Ci32%3E"] + + [:lhs="u32";rhs="vec2%3Cu32%3E"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="f16"] + + [:lhs="vec2%3Cbool%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float"] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int"] + + [:lhs="vec2%3Cf16%3E";rhs="bool"] + + [:lhs="vec2%3Cf16%3E";rhs="f16"] + + [:lhs="vec2%3Cf16%3E";rhs="f32"] + + [:lhs="vec2%3Cf16%3E";rhs="i32"] + + [:lhs="vec2%3Cf16%3E";rhs="u32"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float"] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int"] + + [:lhs="vec2%3Cf32%3E";rhs="bool"] + + [:lhs="vec2%3Cf32%3E";rhs="f16"] + + [:lhs="vec2%3Cf32%3E";rhs="f32"] + + [:lhs="vec2%3Cf32%3E";rhs="i32"] + + [:lhs="vec2%3Cf32%3E";rhs="u32"] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float"] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int"] + + [:lhs="vec2%3Ci32%3E";rhs="bool"] + + [:lhs="vec2%3Ci32%3E";rhs="f16"] + + [:lhs="vec2%3Ci32%3E";rhs="f32"] + + [:lhs="vec2%3Ci32%3E";rhs="i32"] + + [:lhs="vec2%3Ci32%3E";rhs="u32"] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float"] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int"] + + [:lhs="vec2%3Cu32%3E";rhs="bool"] + + [:lhs="vec2%3Cu32%3E";rhs="f16"] + + [:lhs="vec2%3Cu32%3E";rhs="f32"] + + [:lhs="vec2%3Cu32%3E";rhs="i32"] + + [:lhs="vec2%3Cu32%3E";rhs="u32"] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="f16"] + + [:lhs="vec3%3Cbool%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float"] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int"] + + [:lhs="vec3%3Cf16%3E";rhs="bool"] + + [:lhs="vec3%3Cf16%3E";rhs="f16"] + + [:lhs="vec3%3Cf16%3E";rhs="f32"] + + [:lhs="vec3%3Cf16%3E";rhs="i32"] + + [:lhs="vec3%3Cf16%3E";rhs="u32"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float"] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int"] + + [:lhs="vec3%3Cf32%3E";rhs="bool"] + + [:lhs="vec3%3Cf32%3E";rhs="f16"] + + [:lhs="vec3%3Cf32%3E";rhs="f32"] + + [:lhs="vec3%3Cf32%3E";rhs="i32"] + + [:lhs="vec3%3Cf32%3E";rhs="u32"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float"] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int"] + + [:lhs="vec3%3Ci32%3E";rhs="bool"] + + [:lhs="vec3%3Ci32%3E";rhs="f16"] + + [:lhs="vec3%3Ci32%3E";rhs="f32"] + + [:lhs="vec3%3Ci32%3E";rhs="i32"] + + [:lhs="vec3%3Ci32%3E";rhs="u32"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float"] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int"] + + [:lhs="vec3%3Cu32%3E";rhs="bool"] + + [:lhs="vec3%3Cu32%3E";rhs="f16"] + + [:lhs="vec3%3Cu32%3E";rhs="f32"] + + [:lhs="vec3%3Cu32%3E";rhs="i32"] + + [:lhs="vec3%3Cu32%3E";rhs="u32"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="f16"] + + [:lhs="vec4%3Cbool%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float"] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int"] + + [:lhs="vec4%3Cf16%3E";rhs="bool"] + + [:lhs="vec4%3Cf16%3E";rhs="f16"] + + [:lhs="vec4%3Cf16%3E";rhs="f32"] + + [:lhs="vec4%3Cf16%3E";rhs="i32"] + + [:lhs="vec4%3Cf16%3E";rhs="u32"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float"] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int"] + + [:lhs="vec4%3Cf32%3E";rhs="bool"] + + [:lhs="vec4%3Cf32%3E";rhs="f16"] + + [:lhs="vec4%3Cf32%3E";rhs="f32"] + + [:lhs="vec4%3Cf32%3E";rhs="i32"] + + [:lhs="vec4%3Cf32%3E";rhs="u32"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float"] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int"] + + [:lhs="vec4%3Ci32%3E";rhs="bool"] + + [:lhs="vec4%3Ci32%3E";rhs="f16"] + + [:lhs="vec4%3Ci32%3E";rhs="f32"] + + [:lhs="vec4%3Ci32%3E";rhs="i32"] + + [:lhs="vec4%3Ci32%3E";rhs="u32"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float"] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int"] + + [:lhs="vec4%3Cu32%3E";rhs="bool"] + + [:lhs="vec4%3Cu32%3E";rhs="f16"] + + [:lhs="vec4%3Cu32%3E";rhs="f32"] + + [:lhs="vec4%3Cu32%3E";rhs="i32"] + + [:lhs="vec4%3Cu32%3E";rhs="u32"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E"] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:invalid_type_with_itself:*] + [:op="div";type="array";control=false] + + [:op="div";type="array";control=true] + + [:op="div";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";type="atomic";control=true] + + [:op="div";type="ptr";control=false] + + [:op="div";type="ptr";control=true] + + [:op="div";type="sampler";control=false] + + [:op="div";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";type="struct";control=false] + + [:op="div";type="struct";control=true] + + [:op="div";type="texture";control=false] + + [:op="div";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";type="array";control=false] + + [:op="rem";type="array";control=true] + + [:op="rem";type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";type="atomic";control=true] + + [:op="rem";type="ptr";control=false] + + [:op="rem";type="ptr";control=true] + + [:op="rem";type="sampler";control=false] + + [:op="rem";type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";type="struct";control=false] + + [:op="rem";type="struct";control=true] + + [:op="rem";type="texture";control=false] + + [:op="rem";type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:scalar_vector:*] + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=false] + + [:lhs="abstract-float";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="bool";compound_assignment=false] + + [:lhs="abstract-float";rhs="bool";compound_assignment=true] + + [:lhs="abstract-float";rhs="f16";compound_assignment=false] + + [:lhs="abstract-float";rhs="f16";compound_assignment=true] + + [:lhs="abstract-float";rhs="f32";compound_assignment=false] + + [:lhs="abstract-float";rhs="f32";compound_assignment=true] + + [:lhs="abstract-float";rhs="i32";compound_assignment=false] + + [:lhs="abstract-float";rhs="i32";compound_assignment=true] + + [:lhs="abstract-float";rhs="u32";compound_assignment=false] + + [:lhs="abstract-float";rhs="u32";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-float";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="abstract-float";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="abstract-float";compound_assignment=true] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=false] + + [:lhs="abstract-int";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="bool";compound_assignment=false] + + [:lhs="abstract-int";rhs="bool";compound_assignment=true] + + [:lhs="abstract-int";rhs="f16";compound_assignment=false] + + [:lhs="abstract-int";rhs="f16";compound_assignment=true] + + [:lhs="abstract-int";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="f32";compound_assignment=true] + + [:lhs="abstract-int";rhs="i32";compound_assignment=false] + + [:lhs="abstract-int";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="u32";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="abstract-int";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="abstract-int";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="bool";rhs="abstract-float";compound_assignment=false] + + [:lhs="bool";rhs="abstract-float";compound_assignment=true] + + [:lhs="bool";rhs="abstract-int";compound_assignment=false] + + [:lhs="bool";rhs="abstract-int";compound_assignment=true] + + [:lhs="bool";rhs="bool";compound_assignment=false] + + [:lhs="bool";rhs="bool";compound_assignment=true] + + [:lhs="bool";rhs="f16";compound_assignment=false] + + [:lhs="bool";rhs="f16";compound_assignment=true] + + [:lhs="bool";rhs="f32";compound_assignment=false] + + [:lhs="bool";rhs="f32";compound_assignment=true] + + [:lhs="bool";rhs="i32";compound_assignment=false] + + [:lhs="bool";rhs="i32";compound_assignment=true] + + [:lhs="bool";rhs="u32";compound_assignment=false] + + [:lhs="bool";rhs="u32";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="bool";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f16";rhs="abstract-float";compound_assignment=false] + + [:lhs="f16";rhs="abstract-float";compound_assignment=true] + + [:lhs="f16";rhs="abstract-int";compound_assignment=false] + + [:lhs="f16";rhs="abstract-int";compound_assignment=true] + + [:lhs="f16";rhs="bool";compound_assignment=false] + + [:lhs="f16";rhs="bool";compound_assignment=true] + + [:lhs="f16";rhs="f16";compound_assignment=false] + + [:lhs="f16";rhs="f16";compound_assignment=true] + + [:lhs="f16";rhs="f32";compound_assignment=false] + + [:lhs="f16";rhs="f32";compound_assignment=true] + + [:lhs="f16";rhs="i32";compound_assignment=false] + + [:lhs="f16";rhs="i32";compound_assignment=true] + + [:lhs="f16";rhs="u32";compound_assignment=false] + + [:lhs="f16";rhs="u32";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f16";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="f32";rhs="abstract-float";compound_assignment=false] + + [:lhs="f32";rhs="abstract-float";compound_assignment=true] + + [:lhs="f32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="bool";compound_assignment=false] + + [:lhs="f32";rhs="bool";compound_assignment=true] + + [:lhs="f32";rhs="f16";compound_assignment=false] + + [:lhs="f32";rhs="f16";compound_assignment=true] + + [:lhs="f32";rhs="f32";compound_assignment=false] + + [:lhs="f32";rhs="f32";compound_assignment=true] + + [:lhs="f32";rhs="i32";compound_assignment=false] + + [:lhs="f32";rhs="i32";compound_assignment=true] + + [:lhs="f32";rhs="u32";compound_assignment=false] + + [:lhs="f32";rhs="u32";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="f32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="f32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="i32";rhs="abstract-float";compound_assignment=false] + + [:lhs="i32";rhs="abstract-float";compound_assignment=true] + + [:lhs="i32";rhs="abstract-int";compound_assignment=false] + + [:lhs="i32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="bool";compound_assignment=false] + + [:lhs="i32";rhs="bool";compound_assignment=true] + + [:lhs="i32";rhs="f16";compound_assignment=false] + + [:lhs="i32";rhs="f16";compound_assignment=true] + + [:lhs="i32";rhs="f32";compound_assignment=false] + + [:lhs="i32";rhs="f32";compound_assignment=true] + + [:lhs="i32";rhs="i32";compound_assignment=false] + + [:lhs="i32";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="i32";rhs="u32";compound_assignment=false] + + [:lhs="i32";rhs="u32";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="i32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="u32";rhs="abstract-float";compound_assignment=false] + + [:lhs="u32";rhs="abstract-float";compound_assignment=true] + + [:lhs="u32";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="bool";compound_assignment=false] + + [:lhs="u32";rhs="bool";compound_assignment=true] + + [:lhs="u32";rhs="f16";compound_assignment=false] + + [:lhs="u32";rhs="f16";compound_assignment=true] + + [:lhs="u32";rhs="f32";compound_assignment=false] + + [:lhs="u32";rhs="f32";compound_assignment=true] + + [:lhs="u32";rhs="i32";compound_assignment=false] + + [:lhs="u32";rhs="i32";compound_assignment=true] + + [:lhs="u32";rhs="u32";compound_assignment=false] + + [:lhs="u32";rhs="u32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="u32";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="u32";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="u32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="u32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec3%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-float%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-float%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cabstract-int%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cabstract-int%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cbool%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="abstract-int";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf16%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cf32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cf32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="i32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="u32";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Ci32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-float";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=false] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="abstract-int";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="bool";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f16";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="f32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="i32";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="u32";compound_assignment=true] + expected: + if os == "linux" and not debug: FAIL + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-float%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cabstract-int%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cbool%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf16%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cf32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Ci32%3E";compound_assignment=true] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=false] + + [:lhs="vec4%3Cu32%3E";rhs="vec2%3Cu32%3E";compound_assignment=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,div_rem:scalar_vector_out_of_range:*] + [:op="div";lhs="f16";rhs="f16"] + + [:op="div";lhs="f32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="i32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="u32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Cf16%3E";rhs="f16"] + + [:op="div";lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:op="div";lhs="vec2%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Cf16%3E";rhs="f16"] + + [:op="div";lhs="vec3%3Cf16%3E";rhs="vec3%3Cf16%3E"] + + [:op="div";lhs="vec3%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Ci32%3E";rhs="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec3%3Cu32%3E";rhs="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Cf16%3E";rhs="f16"] + + [:op="div";lhs="vec4%3Cf16%3E";rhs="vec4%3Cf16%3E"] + + [:op="div";lhs="vec4%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Ci32%3E";rhs="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";lhs="vec4%3Cu32%3E";rhs="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="f16";rhs="f16"] + + [:op="rem";lhs="f32";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="i32";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="u32";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Cf16%3E";rhs="f16"] + + [:op="rem";lhs="vec2%3Cf16%3E";rhs="vec2%3Cf16%3E"] + + [:op="rem";lhs="vec2%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Cf32%3E";rhs="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Ci32%3E";rhs="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec2%3Cu32%3E";rhs="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Cf16%3E";rhs="f16"] + + [:op="rem";lhs="vec3%3Cf16%3E";rhs="vec3%3Cf16%3E"] + + [:op="rem";lhs="vec3%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Cf32%3E";rhs="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Ci32%3E";rhs="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec3%3Cu32%3E";rhs="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Cf16%3E";rhs="f16"] + + [:op="rem";lhs="vec4%3Cf16%3E";rhs="vec4%3Cf16%3E"] + + [:op="rem";lhs="vec4%3Cf32%3E";rhs="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Cf32%3E";rhs="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Ci32%3E";rhs="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Ci32%3E";rhs="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Cu32%3E";rhs="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";lhs="vec4%3Cu32%3E";rhs="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,binary,parse:all:*] + [:stmt="and_bool_expr_bool_expr"] + + [:stmt="and_bool_expr_bool_literal"] + + [:stmt="and_bool_expr_int_literal"] + + [:stmt="and_bool_literal_bool_expr"] + + [:stmt="and_bool_literal_bool_literal"] + + [:stmt="and_bool_literal_int_literal"] + + [:stmt="and_int_literal_bool_expr"] + + [:stmt="and_int_literal_bool_literal"] + + [:stmt="or_bool_expr_bool_expr"] + + [:stmt="or_bool_expr_bool_literal"] + + [:stmt="or_bool_expr_int_literal"] + + [:stmt="or_bool_literal_bool_expr"] + + [:stmt="or_bool_literal_bool_literal"] + + [:stmt="or_bool_literal_int_literal"] + + [:stmt="or_int_literal_bool_expr"] + + [:stmt="or_int_literal_bool_literal"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,abs:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="must_use"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="valid"] + + [:test="vec_bool"] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,abs:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -94242,6 +126426,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -94254,6 +126442,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -94266,6 +126458,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94351,27 +126547,107 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acos:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="greater_then_one"] + + [:test="i32"] + + [:test="less_then_negative_one"] + + [:test="matrix"] + + [:test="must_use"] + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acos:values:*] [:stage="constant";type="abstract-float"] + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] [:stage="constant";type="vec2%3Cabstract-float%3E"] + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] [:stage="constant";type="vec3%3Cabstract-float%3E"] + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] [:stage="constant";type="vec4%3Cabstract-float%3E"] + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94421,11 +126697,77 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acosh:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="i32"] + + [:test="less_then_one"] + + [:test="matrix"] + + [:test="must_use"] + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,acosh:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -94436,6 +126778,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -94446,6 +126792,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -94456,6 +126806,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94487,6 +126841,314 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:argument_types:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="f16"] + + [:test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_args"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_args"] + + [:test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="valid"] + + [:test="vec2_bool_implicit"] + + [:test="vec3_bool_implicit"] + + [:test="vec_bool"] + + [:test="vec_f16"] + + [:test="vec_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,all:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:argument_types:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="f16"] + + [:test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_args"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_args"] + + [:test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="valid"] + + [:test="vec2_bool_implicit"] + + [:test="vec3_bool_implicit"] + + [:test="vec_bool"] + + [:test="vec_f16"] + + [:test="vec_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,any:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:access_mode:*] [:mode="read"] @@ -94501,6 +127163,14 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,arrayLength:type:*] [:type="T"] expected: @@ -94651,27 +127321,107 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asin:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="greater_then_one"] + + [:test="i32"] + + [:test="less_then_negative_one"] + + [:test="matrix"] + + [:test="must_use"] + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asin:values:*] [:stage="constant";type="abstract-float"] + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] [:stage="constant";type="vec2%3Cabstract-float%3E"] + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] [:stage="constant";type="vec3%3Cabstract-float%3E"] + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] [:stage="constant";type="vec4%3Cabstract-float%3E"] + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94721,11 +127471,75 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asinh:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="i32"] + + [:test="matrix"] + + [:test="must_use"] + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,asinh:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -94736,6 +127550,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -94746,6 +127564,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -94756,6 +127578,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94787,50 +127613,258 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:integer_argument_x:*] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:invalid_argument_x:*] + [:type="bool"] + [:type="f32"] expected: if os == "linux" and not debug: FAIL [:type="i32"] + [:type="mat2x2%3Cf16%3E"] + + [:type="mat2x2%3Cf32%3E"] + + [:type="mat2x3%3Cf16%3E"] + + [:type="mat2x3%3Cf32%3E"] + + [:type="mat2x4%3Cf16%3E"] + + [:type="mat2x4%3Cf32%3E"] + + [:type="mat3x2%3Cf16%3E"] + + [:type="mat3x2%3Cf32%3E"] + + [:type="mat3x3%3Cf16%3E"] + + [:type="mat3x3%3Cf32%3E"] + + [:type="mat3x4%3Cf16%3E"] + + [:type="mat3x4%3Cf32%3E"] + + [:type="mat4x2%3Cf16%3E"] + + [:type="mat4x2%3Cf32%3E"] + + [:type="mat4x3%3Cf16%3E"] + + [:type="mat4x3%3Cf32%3E"] + + [:type="mat4x4%3Cf16%3E"] + + [:type="mat4x4%3Cf32%3E"] + [:type="u32"] + [:type="vec2%3Cbool%3E"] + [:type="vec2%3Ci32%3E"] [:type="vec2%3Cu32%3E"] + [:type="vec3%3Cbool%3E"] + [:type="vec3%3Ci32%3E"] [:type="vec3%3Cu32%3E"] + [:type="vec4%3Cbool%3E"] + [:type="vec4%3Ci32%3E"] [:type="vec4%3Cu32%3E"] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:integer_argument_y:*] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:invalid_argument_y:*] + [:type="bool"] + [:type="f32"] expected: if os == "linux" and not debug: FAIL [:type="i32"] + [:type="mat2x2%3Cf16%3E"] + + [:type="mat2x2%3Cf32%3E"] + + [:type="mat2x3%3Cf16%3E"] + + [:type="mat2x3%3Cf32%3E"] + + [:type="mat2x4%3Cf16%3E"] + + [:type="mat2x4%3Cf32%3E"] + + [:type="mat3x2%3Cf16%3E"] + + [:type="mat3x2%3Cf32%3E"] + + [:type="mat3x3%3Cf16%3E"] + + [:type="mat3x3%3Cf32%3E"] + + [:type="mat3x4%3Cf16%3E"] + + [:type="mat3x4%3Cf32%3E"] + + [:type="mat4x2%3Cf16%3E"] + + [:type="mat4x2%3Cf32%3E"] + + [:type="mat4x3%3Cf16%3E"] + + [:type="mat4x3%3Cf32%3E"] + + [:type="mat4x4%3Cf16%3E"] + + [:type="mat4x4%3Cf32%3E"] + [:type="u32"] + [:type="vec2%3Cbool%3E"] + [:type="vec2%3Ci32%3E"] [:type="vec2%3Cu32%3E"] + [:type="vec3%3Cbool%3E"] + [:type="vec3%3Ci32%3E"] [:type="vec3%3Cu32%3E"] + [:type="vec4%3Cbool%3E"] + [:type="vec4%3Ci32%3E"] [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:parameters:*] + [:test="af"] + + [:test="af_ai"] + + [:test="af_f16"] + + [:test="af_f32"] + + [:test="ai"] + + [:test="ai_af"] + + [:test="ai_f16"] + + [:test="ai_f32"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="enumerant"] + + [:test="f16_af"] + + [:test="f16_ai"] + + [:test="f16_f32"] + + [:test="f32_af"] + + [:test="f32_ai"] + + [:test="f32_bool"] + expected: + if os == "linux" and not debug: FAIL + + [:test="f32_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="f32_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="f32_vec"] + expected: + if os == "linux" and not debug: FAIL + + [:test="i32_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:test="mixed_types"] + expected: + if os == "linux" and not debug: FAIL + + [:test="mixed_types_2"] + expected: + if os == "linux" and not debug: FAIL + + [:test="must_use"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_f32"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan2:values:*] expected: if os == "linux" and not debug: [OK, TIMEOUT] @@ -94919,11 +127953,75 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="i32"] + + [:test="matrix"] + + [:test="must_use"] + + [:test="no_params"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atan:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -94932,6 +128030,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -94940,6 +128042,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -94948,6 +128054,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -94997,27 +128107,111 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atanh:parameters:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="greater_then_one"] + + [:test="i32"] + + [:test="less_then_negative_one"] + + [:test="matrix"] + + [:test="must_use"] + expected: + if os == "linux" and not debug: FAIL + + [:test="negative_one"] + + [:test="no_params"] + + [:test="one"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_many_params"] + + [:test="u32"] + + [:test="valid"] + + [:test="vec_bool"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atanh:values:*] [:stage="constant";type="abstract-float"] + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] [:stage="constant";type="vec2%3Cabstract-float%3E"] + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] [:stage="constant";type="vec3%3Cabstract-float%3E"] + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] [:stage="constant";type="vec4%3Cabstract-float%3E"] + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -95047,6 +128241,358 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:atomic_parameterization:*] + [:op="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op="and"] + expected: + if os == "linux" and not debug: FAIL + + [:op="compareexchangeweak"] + expected: + if os == "linux" and not debug: FAIL + + [:op="exchange"] + expected: + if os == "linux" and not debug: FAIL + + [:op="load"] + expected: + if os == "linux" and not debug: FAIL + + [:op="max"] + expected: + if os == "linux" and not debug: FAIL + + [:op="min"] + expected: + if os == "linux" and not debug: FAIL + + [:op="or"] + expected: + if os == "linux" and not debug: FAIL + + [:op="store"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:data_parameters:*] + [:op="atomicAdd"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicAnd"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicCompareExchangeWeak1"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicCompareExchangeWeak2"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicExchange"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicMax"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicMin"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicOr"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicStore"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicSub"] + expected: + if os == "linux" and not debug: FAIL + + [:op="atomicXor"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:non_atomic:*] + [:op="add";addrspace="storage";type="i32";atomic=false] + + [:op="add";addrspace="storage";type="i32";atomic=true] + + [:op="add";addrspace="storage";type="u32";atomic=false] + + [:op="add";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";addrspace="workgroup";type="i32";atomic=false] + + [:op="add";addrspace="workgroup";type="i32";atomic=true] + + [:op="add";addrspace="workgroup";type="u32";atomic=false] + + [:op="add";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";addrspace="storage";type="i32";atomic=false] + + [:op="and";addrspace="storage";type="i32";atomic=true] + + [:op="and";addrspace="storage";type="u32";atomic=false] + + [:op="and";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";addrspace="workgroup";type="i32";atomic=false] + + [:op="and";addrspace="workgroup";type="i32";atomic=true] + + [:op="and";addrspace="workgroup";type="u32";atomic=false] + + [:op="and";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="compareexchangeweak";addrspace="storage";type="i32";atomic=false] + + [:op="compareexchangeweak";addrspace="storage";type="i32";atomic=true] + + [:op="compareexchangeweak";addrspace="storage";type="u32";atomic=false] + + [:op="compareexchangeweak";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="compareexchangeweak";addrspace="workgroup";type="i32";atomic=false] + + [:op="compareexchangeweak";addrspace="workgroup";type="i32";atomic=true] + + [:op="compareexchangeweak";addrspace="workgroup";type="u32";atomic=false] + + [:op="compareexchangeweak";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="exchange";addrspace="storage";type="i32";atomic=false] + + [:op="exchange";addrspace="storage";type="i32";atomic=true] + + [:op="exchange";addrspace="storage";type="u32";atomic=false] + + [:op="exchange";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="exchange";addrspace="workgroup";type="i32";atomic=false] + + [:op="exchange";addrspace="workgroup";type="i32";atomic=true] + + [:op="exchange";addrspace="workgroup";type="u32";atomic=false] + + [:op="exchange";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="load";addrspace="storage";type="i32";atomic=false] + + [:op="load";addrspace="storage";type="i32";atomic=true] + + [:op="load";addrspace="storage";type="u32";atomic=false] + + [:op="load";addrspace="storage";type="u32";atomic=true] + + [:op="load";addrspace="workgroup";type="i32";atomic=false] + + [:op="load";addrspace="workgroup";type="i32";atomic=true] + + [:op="load";addrspace="workgroup";type="u32";atomic=false] + + [:op="load";addrspace="workgroup";type="u32";atomic=true] + + [:op="max";addrspace="storage";type="i32";atomic=false] + + [:op="max";addrspace="storage";type="i32";atomic=true] + + [:op="max";addrspace="storage";type="u32";atomic=false] + + [:op="max";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="max";addrspace="workgroup";type="i32";atomic=false] + + [:op="max";addrspace="workgroup";type="i32";atomic=true] + + [:op="max";addrspace="workgroup";type="u32";atomic=false] + + [:op="max";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="min";addrspace="storage";type="i32";atomic=false] + + [:op="min";addrspace="storage";type="i32";atomic=true] + + [:op="min";addrspace="storage";type="u32";atomic=false] + + [:op="min";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="min";addrspace="workgroup";type="i32";atomic=false] + + [:op="min";addrspace="workgroup";type="i32";atomic=true] + + [:op="min";addrspace="workgroup";type="u32";atomic=false] + + [:op="min";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";addrspace="storage";type="i32";atomic=false] + + [:op="or";addrspace="storage";type="i32";atomic=true] + + [:op="or";addrspace="storage";type="u32";atomic=false] + + [:op="or";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";addrspace="workgroup";type="i32";atomic=false] + + [:op="or";addrspace="workgroup";type="i32";atomic=true] + + [:op="or";addrspace="workgroup";type="u32";atomic=false] + + [:op="or";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="store";addrspace="storage";type="i32";atomic=false] + + [:op="store";addrspace="storage";type="i32";atomic=true] + + [:op="store";addrspace="storage";type="u32";atomic=false] + + [:op="store";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="store";addrspace="workgroup";type="i32";atomic=false] + + [:op="store";addrspace="workgroup";type="i32";atomic=true] + + [:op="store";addrspace="workgroup";type="u32";atomic=false] + + [:op="store";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";addrspace="storage";type="i32";atomic=false] + + [:op="sub";addrspace="storage";type="i32";atomic=true] + + [:op="sub";addrspace="storage";type="u32";atomic=false] + + [:op="sub";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";addrspace="workgroup";type="i32";atomic=false] + + [:op="sub";addrspace="workgroup";type="i32";atomic=true] + + [:op="sub";addrspace="workgroup";type="u32";atomic=false] + + [:op="sub";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";addrspace="storage";type="i32";atomic=false] + + [:op="xor";addrspace="storage";type="i32";atomic=true] + + [:op="xor";addrspace="storage";type="u32";atomic=false] + + [:op="xor";addrspace="storage";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";addrspace="workgroup";type="i32";atomic=false] + + [:op="xor";addrspace="workgroup";type="i32";atomic=true] + + [:op="xor";addrspace="workgroup";type="u32";atomic=false] + + [:op="xor";addrspace="workgroup";type="u32";atomic=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:return_types:*] + [:op="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op="and"] + expected: + if os == "linux" and not debug: FAIL + + [:op="compareexchangeweak"] + expected: + if os == "linux" and not debug: FAIL + + [:op="exchange"] + expected: + if os == "linux" and not debug: FAIL + + [:op="load"] + + [:op="max"] + expected: + if os == "linux" and not debug: FAIL + + [:op="min"] + expected: + if os == "linux" and not debug: FAIL + + [:op="or"] + expected: + if os == "linux" and not debug: FAIL + + [:op="store"] + + [:op="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,atomics:stage:*] [:stage="compute";atomicOp="add"] @@ -95653,6 +129199,28 @@ [:var="t";direction="to"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,bitcast:must_use:*] + [:case="bitcast%3Cf32%3E(1u)";use=false] + + [:case="bitcast%3Cf32%3E(1u)";use=true] + + [:case="bitcast%3Cu32%3E(1i)";use=false] + + [:case="bitcast%3Cu32%3E(1i)";use=true] + + [:case="bitcast%3Cvec2f%3E(vec2i())";use=false] + + [:case="bitcast%3Cvec2f%3E(vec2i())";use=true] + + [:case="bitcast%3Cvec3u%3E(vec3u())";use=false] + + [:case="bitcast%3Cvec3u%3E(vec3u())";use=true] + + [:case="bitcast%3Cvec4i%3E(vec4f())";use=false] + + [:case="bitcast%3Cvec4i%3E(vec4f())";use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,bitcast:valid_vec2h:*] [:other_type="f32";type="vec2%3Cf16%3E";direction="from"] @@ -95729,6 +129297,56 @@ [:other_type="vec2u";type="vec4h";direction="to"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:integer_argument:*] [:type="f32"] @@ -95749,11 +129367,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ceil:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -95762,6 +129392,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -95770,6 +129404,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -95778,6 +129416,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -95807,11 +129449,681 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:arguments:*] + [:type="alias"] + + [:type="array"] + expected: + if os == "linux" and not debug: FAIL + + [:type="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool"] + + [:type="enumerant"] + + [:type="f32"] + + [:type="mat2x2%3Cf32%3E"] + + [:type="ptr"] + + [:type="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:type="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:type="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:type="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:low_high:*] + [:type="f16";lowStage="constant";highStage="constant"] + + [:type="f16";lowStage="constant";highStage="override"] + + [:type="f16";lowStage="constant";highStage="runtime"] + + [:type="f16";lowStage="override";highStage="constant"] + + [:type="f16";lowStage="override";highStage="override"] + + [:type="f16";lowStage="override";highStage="runtime"] + + [:type="f16";lowStage="runtime";highStage="constant"] + + [:type="f16";lowStage="runtime";highStage="override"] + + [:type="f16";lowStage="runtime";highStage="runtime"] + + [:type="f32";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf16%3E";lowStage="constant";highStage="constant"] + + [:type="vec2%3Cf16%3E";lowStage="constant";highStage="override"] + + [:type="vec2%3Cf16%3E";lowStage="constant";highStage="runtime"] + + [:type="vec2%3Cf16%3E";lowStage="override";highStage="constant"] + + [:type="vec2%3Cf16%3E";lowStage="override";highStage="override"] + + [:type="vec2%3Cf16%3E";lowStage="override";highStage="runtime"] + + [:type="vec2%3Cf16%3E";lowStage="runtime";highStage="constant"] + + [:type="vec2%3Cf16%3E";lowStage="runtime";highStage="override"] + + [:type="vec2%3Cf16%3E";lowStage="runtime";highStage="runtime"] + + [:type="vec2%3Cf32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cf32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Ci32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cu32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf16%3E";lowStage="constant";highStage="constant"] + + [:type="vec3%3Cf16%3E";lowStage="constant";highStage="override"] + + [:type="vec3%3Cf16%3E";lowStage="constant";highStage="runtime"] + + [:type="vec3%3Cf16%3E";lowStage="override";highStage="constant"] + + [:type="vec3%3Cf16%3E";lowStage="override";highStage="override"] + + [:type="vec3%3Cf16%3E";lowStage="override";highStage="runtime"] + + [:type="vec3%3Cf16%3E";lowStage="runtime";highStage="constant"] + + [:type="vec3%3Cf16%3E";lowStage="runtime";highStage="override"] + + [:type="vec3%3Cf16%3E";lowStage="runtime";highStage="runtime"] + + [:type="vec3%3Cf32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cf32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Ci32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cu32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf16%3E";lowStage="constant";highStage="constant"] + + [:type="vec4%3Cf16%3E";lowStage="constant";highStage="override"] + + [:type="vec4%3Cf16%3E";lowStage="constant";highStage="runtime"] + + [:type="vec4%3Cf16%3E";lowStage="override";highStage="constant"] + + [:type="vec4%3Cf16%3E";lowStage="override";highStage="override"] + + [:type="vec4%3Cf16%3E";lowStage="override";highStage="runtime"] + + [:type="vec4%3Cf16%3E";lowStage="runtime";highStage="constant"] + + [:type="vec4%3Cf16%3E";lowStage="runtime";highStage="override"] + + [:type="vec4%3Cf16%3E";lowStage="runtime";highStage="runtime"] + + [:type="vec4%3Cf32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cf32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Ci32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="constant";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="constant";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="constant";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="override";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="override";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="override";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="runtime";highStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="runtime";highStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cu32%3E";lowStage="runtime";highStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:low_high_abstract:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:mismatched:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] + [:e="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:e="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:e="f16"] + + [:e="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:e="i32"] + + [:e="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec2%3Cf16%3E"] + + [:e="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec2%3Ci32%3E"] + + [:e="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec3%3Cf16%3E"] + + [:e="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec3%3Ci32%3E"] + + [:e="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec4%3Cf16%3E"] + + [:e="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:e="vec4%3Ci32%3E"] + + [:e="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,clamp:values:*] expected: if os == "linux" and not debug: TIMEOUT +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:integer_argument:*] [:type="f32"] @@ -95832,11 +130144,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cos:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -95845,6 +130169,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -95853,6 +130181,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -95861,6 +130193,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -95890,47 +130226,83 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:integer_argument:*] - [:type="f32"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:args:*] + [:arg="bad_0args"] - [:type="i32"] + [:arg="bad_0array"] - [:type="u32"] + [:arg="bad_0bool"] - [:type="vec2%3Ci32%3E"] + [:arg="bad_0int"] - [:type="vec2%3Cu32%3E"] + [:arg="bad_0struct"] - [:type="vec3%3Ci32%3E"] + [:arg="bad_0uint"] - [:type="vec3%3Cu32%3E"] + [:arg="bad_0vec2i"] - [:type="vec4%3Ci32%3E"] + [:arg="bad_0vec2u"] - [:type="vec4%3Cu32%3E"] + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cosh:values:*] [:stage="constant";type="abstract-float"] + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] [:stage="constant";type="vec2%3Cabstract-float%3E"] + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] [:stage="constant";type="vec3%3Cabstract-float%3E"] + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] [:stage="constant";type="vec4%3Cabstract-float%3E"] + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -95960,6 +130332,466 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countLeadingZeros:values:*] + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countOneBits:values:*] + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,countTrailingZeros:values:*] + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0struct"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1struct"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="bad_vec2"] + + [:arg="bad_vec4"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,cross:values:*] + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:args:*] + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_no_parens"] + + [:arg="bad_too_few"] + + [:arg="bad_too_many"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:integer_argument:*] [:type="f32"] @@ -95980,11 +130812,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,degrees:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -95993,6 +130837,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96001,6 +130849,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96009,6 +130861,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96038,33 +130894,833 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:invalid_argument_types:*] + [:type="f16";call=""] - [:arg="0bool"] + [:type="f16";call="dpdx"] - [:arg="0f32"] + [:type="f16";call="dpdxCoarse"] - [:arg="0i32"] + [:type="f16";call="dpdxFine"] - [:arg="0vec2u"] + [:type="f16";call="dpdy"] - [:arg="1args"] + [:type="f16";call="dpdyCoarse"] - [:arg="1bool"] + [:type="f16";call="dpdyFine"] - [:arg="1f32"] + [:type="f16";call="fwidth"] - [:arg="1i32"] + [:type="f16";call="fwidthCoarse"] - [:arg="1vec2u"] + [:type="f16";call="fwidthFine"] - [:arg="3args"] + [:type="f32";call=""] + + [:type="f32";call="dpdx"] + + [:type="f32";call="dpdxCoarse"] + + [:type="f32";call="dpdxFine"] + + [:type="f32";call="dpdy"] + + [:type="f32";call="dpdyCoarse"] + + [:type="f32";call="dpdyFine"] + + [:type="f32";call="fwidth"] + + [:type="f32";call="fwidthCoarse"] + + [:type="f32";call="fwidthFine"] + + [:type="i32";call=""] + + [:type="i32";call="dpdx"] + + [:type="i32";call="dpdxCoarse"] + + [:type="i32";call="dpdxFine"] + + [:type="i32";call="dpdy"] + + [:type="i32";call="dpdyCoarse"] + + [:type="i32";call="dpdyFine"] + + [:type="i32";call="fwidth"] + + [:type="i32";call="fwidthCoarse"] + + [:type="i32";call="fwidthFine"] + + [:type="mat2x2%3Cf32%3E";call=""] + + [:type="mat2x2%3Cf32%3E";call="dpdx"] + + [:type="mat2x2%3Cf32%3E";call="dpdxCoarse"] + + [:type="mat2x2%3Cf32%3E";call="dpdxFine"] + + [:type="mat2x2%3Cf32%3E";call="dpdy"] + + [:type="mat2x2%3Cf32%3E";call="dpdyCoarse"] + + [:type="mat2x2%3Cf32%3E";call="dpdyFine"] + + [:type="mat2x2%3Cf32%3E";call="fwidth"] + + [:type="mat2x2%3Cf32%3E";call="fwidthCoarse"] + + [:type="mat2x2%3Cf32%3E";call="fwidthFine"] + + [:type="u32";call=""] + + [:type="u32";call="dpdx"] + + [:type="u32";call="dpdxCoarse"] + + [:type="u32";call="dpdxFine"] + + [:type="u32";call="dpdy"] + + [:type="u32";call="dpdyCoarse"] + + [:type="u32";call="dpdyFine"] + + [:type="u32";call="fwidth"] + + [:type="u32";call="fwidthCoarse"] + + [:type="u32";call="fwidthFine"] + + [:type="vec2%3Cf16%3E";call=""] + + [:type="vec2%3Cf16%3E";call="dpdx"] + + [:type="vec2%3Cf16%3E";call="dpdxCoarse"] + + [:type="vec2%3Cf16%3E";call="dpdxFine"] + + [:type="vec2%3Cf16%3E";call="dpdy"] + + [:type="vec2%3Cf16%3E";call="dpdyCoarse"] + + [:type="vec2%3Cf16%3E";call="dpdyFine"] + + [:type="vec2%3Cf16%3E";call="fwidth"] + + [:type="vec2%3Cf16%3E";call="fwidthCoarse"] + + [:type="vec2%3Cf16%3E";call="fwidthFine"] + + [:type="vec2%3Ci32%3E";call=""] + + [:type="vec2%3Ci32%3E";call="dpdx"] + + [:type="vec2%3Ci32%3E";call="dpdxCoarse"] + + [:type="vec2%3Ci32%3E";call="dpdxFine"] + + [:type="vec2%3Ci32%3E";call="dpdy"] + + [:type="vec2%3Ci32%3E";call="dpdyCoarse"] + + [:type="vec2%3Ci32%3E";call="dpdyFine"] + + [:type="vec2%3Ci32%3E";call="fwidth"] + + [:type="vec2%3Ci32%3E";call="fwidthCoarse"] + + [:type="vec2%3Ci32%3E";call="fwidthFine"] + + [:type="vec2%3Cu32%3E";call=""] + + [:type="vec2%3Cu32%3E";call="dpdx"] + + [:type="vec2%3Cu32%3E";call="dpdxCoarse"] + + [:type="vec2%3Cu32%3E";call="dpdxFine"] + + [:type="vec2%3Cu32%3E";call="dpdy"] + + [:type="vec2%3Cu32%3E";call="dpdyCoarse"] + + [:type="vec2%3Cu32%3E";call="dpdyFine"] + + [:type="vec2%3Cu32%3E";call="fwidth"] + + [:type="vec2%3Cu32%3E";call="fwidthCoarse"] + + [:type="vec2%3Cu32%3E";call="fwidthFine"] + + [:type="vec3%3Cf16%3E";call=""] + + [:type="vec3%3Cf16%3E";call="dpdx"] + + [:type="vec3%3Cf16%3E";call="dpdxCoarse"] + + [:type="vec3%3Cf16%3E";call="dpdxFine"] + + [:type="vec3%3Cf16%3E";call="dpdy"] + + [:type="vec3%3Cf16%3E";call="dpdyCoarse"] + + [:type="vec3%3Cf16%3E";call="dpdyFine"] + + [:type="vec3%3Cf16%3E";call="fwidth"] + + [:type="vec3%3Cf16%3E";call="fwidthCoarse"] + + [:type="vec3%3Cf16%3E";call="fwidthFine"] + + [:type="vec3%3Ci32%3E";call=""] + + [:type="vec3%3Ci32%3E";call="dpdx"] + + [:type="vec3%3Ci32%3E";call="dpdxCoarse"] + + [:type="vec3%3Ci32%3E";call="dpdxFine"] + + [:type="vec3%3Ci32%3E";call="dpdy"] + + [:type="vec3%3Ci32%3E";call="dpdyCoarse"] + + [:type="vec3%3Ci32%3E";call="dpdyFine"] + + [:type="vec3%3Ci32%3E";call="fwidth"] + + [:type="vec3%3Ci32%3E";call="fwidthCoarse"] + + [:type="vec3%3Ci32%3E";call="fwidthFine"] + + [:type="vec3%3Cu32%3E";call=""] + + [:type="vec3%3Cu32%3E";call="dpdx"] + + [:type="vec3%3Cu32%3E";call="dpdxCoarse"] + + [:type="vec3%3Cu32%3E";call="dpdxFine"] + + [:type="vec3%3Cu32%3E";call="dpdy"] + + [:type="vec3%3Cu32%3E";call="dpdyCoarse"] + + [:type="vec3%3Cu32%3E";call="dpdyFine"] + + [:type="vec3%3Cu32%3E";call="fwidth"] + + [:type="vec3%3Cu32%3E";call="fwidthCoarse"] + + [:type="vec3%3Cu32%3E";call="fwidthFine"] + + [:type="vec4%3Cf16%3E";call=""] + + [:type="vec4%3Cf16%3E";call="dpdx"] + + [:type="vec4%3Cf16%3E";call="dpdxCoarse"] + + [:type="vec4%3Cf16%3E";call="dpdxFine"] + + [:type="vec4%3Cf16%3E";call="dpdy"] + + [:type="vec4%3Cf16%3E";call="dpdyCoarse"] + + [:type="vec4%3Cf16%3E";call="dpdyFine"] + + [:type="vec4%3Cf16%3E";call="fwidth"] + + [:type="vec4%3Cf16%3E";call="fwidthCoarse"] + + [:type="vec4%3Cf16%3E";call="fwidthFine"] + + [:type="vec4%3Ci32%3E";call=""] + + [:type="vec4%3Ci32%3E";call="dpdx"] + + [:type="vec4%3Ci32%3E";call="dpdxCoarse"] + + [:type="vec4%3Ci32%3E";call="dpdxFine"] + + [:type="vec4%3Ci32%3E";call="dpdy"] + + [:type="vec4%3Ci32%3E";call="dpdyCoarse"] + + [:type="vec4%3Ci32%3E";call="dpdyFine"] + + [:type="vec4%3Ci32%3E";call="fwidth"] + + [:type="vec4%3Ci32%3E";call="fwidthCoarse"] + + [:type="vec4%3Ci32%3E";call="fwidthFine"] + + [:type="vec4%3Cu32%3E";call=""] + + [:type="vec4%3Cu32%3E";call="dpdx"] + + [:type="vec4%3Cu32%3E";call="dpdxCoarse"] + + [:type="vec4%3Cu32%3E";call="dpdxFine"] + + [:type="vec4%3Cu32%3E";call="dpdy"] + + [:type="vec4%3Cu32%3E";call="dpdyCoarse"] + + [:type="vec4%3Cu32%3E";call="dpdyFine"] + + [:type="vec4%3Cu32%3E";call="fwidth"] + + [:type="vec4%3Cu32%3E";call="fwidthCoarse"] + + [:type="vec4%3Cu32%3E";call="fwidthFine"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:must_use:*] + [:use=false;func="dpdx"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="dpdxCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="dpdxFine"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="dpdy"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="dpdyCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="dpdyFine"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="fwidth"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="fwidthCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:use=false;func="fwidthFine"] + expected: + if os == "linux" and not debug: FAIL + + [:use=true;func="dpdx"] + + [:use=true;func="dpdxCoarse"] + + [:use=true;func="dpdxFine"] + + [:use=true;func="dpdy"] + + [:use=true;func="dpdyCoarse"] + + [:use=true;func="dpdyFine"] + + [:use=true;func="fwidth"] + + [:use=true;func="fwidthCoarse"] + + [:use=true;func="fwidthFine"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,derivatives:only_in_fragment:*] + [:entry_point="compute";call="bar"] + + [:entry_point="compute";call="dpdx"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="dpdxCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="dpdxFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="dpdy"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="dpdyCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="dpdyFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="fwidth"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="fwidthCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="fwidthFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute_without_call";call="bar"] + + [:entry_point="compute_without_call";call="dpdx"] + + [:entry_point="compute_without_call";call="dpdxCoarse"] + + [:entry_point="compute_without_call";call="dpdxFine"] + + [:entry_point="compute_without_call";call="dpdy"] + + [:entry_point="compute_without_call";call="dpdyCoarse"] + + [:entry_point="compute_without_call";call="dpdyFine"] + + [:entry_point="compute_without_call";call="fwidth"] + + [:entry_point="compute_without_call";call="fwidthCoarse"] + + [:entry_point="compute_without_call";call="fwidthFine"] + + [:entry_point="fragment";call="bar"] + + [:entry_point="fragment";call="dpdx"] + + [:entry_point="fragment";call="dpdxCoarse"] + + [:entry_point="fragment";call="dpdxFine"] + + [:entry_point="fragment";call="dpdy"] + + [:entry_point="fragment";call="dpdyCoarse"] + + [:entry_point="fragment";call="dpdyFine"] + + [:entry_point="fragment";call="fwidth"] + + [:entry_point="fragment";call="fwidthCoarse"] + + [:entry_point="fragment";call="fwidthFine"] + + [:entry_point="fragment_and_compute";call="bar"] + + [:entry_point="fragment_and_compute";call="dpdx"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="dpdxCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="dpdxFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="dpdy"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="dpdyCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="dpdyFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="fwidth"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="fwidthCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_and_compute";call="fwidthFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="none";call="bar"] + + [:entry_point="none";call="dpdx"] + + [:entry_point="none";call="dpdxCoarse"] + + [:entry_point="none";call="dpdxFine"] + + [:entry_point="none";call="dpdy"] + + [:entry_point="none";call="dpdyCoarse"] + + [:entry_point="none";call="dpdyFine"] + + [:entry_point="none";call="fwidth"] + + [:entry_point="none";call="fwidthCoarse"] + + [:entry_point="none";call="fwidthFine"] + + [:entry_point="vertex";call="bar"] + + [:entry_point="vertex";call="dpdx"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="dpdxCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="dpdxFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="dpdy"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="dpdyCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="dpdyFine"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="fwidth"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="fwidthCoarse"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="fwidthFine"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:args:*] + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_no_parens"] + + [:arg="bad_too_few"] + + [:arg="bad_too_many"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:matrix_args:*] + [:cols=2;rows=2;type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=2;rows=2;type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=2;rows=2;type="f16"] + + [:cols=2;rows=2;type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=2;rows=3;type="abstract-float"] + + [:cols=2;rows=3;type="abstract-int"] + + [:cols=2;rows=3;type="f16"] + + [:cols=2;rows=3;type="f32"] + + [:cols=2;rows=4;type="abstract-float"] + + [:cols=2;rows=4;type="abstract-int"] + + [:cols=2;rows=4;type="f16"] + + [:cols=2;rows=4;type="f32"] + + [:cols=3;rows=2;type="abstract-float"] + + [:cols=3;rows=2;type="abstract-int"] + + [:cols=3;rows=2;type="f16"] + + [:cols=3;rows=2;type="f32"] + + [:cols=3;rows=3;type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=3;rows=3;type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=3;rows=3;type="f16"] + + [:cols=3;rows=3;type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=3;rows=4;type="abstract-float"] + + [:cols=3;rows=4;type="abstract-int"] + + [:cols=3;rows=4;type="f16"] + + [:cols=3;rows=4;type="f32"] + + [:cols=4;rows=2;type="abstract-float"] + + [:cols=4;rows=2;type="abstract-int"] + + [:cols=4;rows=2;type="f16"] + + [:cols=4;rows=2;type="f32"] + + [:cols=4;rows=3;type="abstract-float"] + + [:cols=4;rows=3;type="abstract-int"] + + [:cols=4;rows=3;type="f16"] + + [:cols=4;rows=3;type="f32"] + + [:cols=4;rows=4;type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=4;rows=4;type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:cols=4;rows=4;type="f16"] + + [:cols=4;rows=4;type="f32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,determinant:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,distance:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0f32"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0vec2u"] + + [:arg="bad_1args"] + + [:arg="bad_1bool"] + + [:arg="bad_1f32"] + + [:arg="bad_1i32"] + + [:arg="bad_1vec2u"] + + [:arg="bad_3args"] + + [:arg="bad_bool2_bool2"] + + [:arg="bad_bool_bool"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:must_use:*] [:] + [:use=false] + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4I8Packed:supported:*] [:requires=false] @@ -96078,33 +131734,47 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0bool"] - [:arg="0i32"] + [:arg="bad_0f32"] - [:arg="0vec2u"] + [:arg="bad_0i32"] - [:arg="1args"] + [:arg="bad_0struct"] - [:arg="1bool"] + [:arg="bad_0vec2u"] - [:arg="1f32"] + [:arg="bad_1args"] - [:arg="1i32"] + [:arg="bad_1bool"] - [:arg="1vec2u"] + [:arg="bad_1f32"] - [:arg="3args"] + [:arg="bad_1i32"] + + [:arg="bad_1vec2u"] + + [:arg="bad_3args"] + + [:arg="bad_bool2_bool2"] + + [:arg="bad_bool_bool"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:must_use:*] [:] + [:use=false] + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot4U8Packed:supported:*] [:requires=false] @@ -96118,24 +131788,162 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:integer_argument:*] - [:type="f32"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:args:*] + [:arg="bad_0abstract"] - [:type="i32"] + [:arg="bad_0args"] - [:type="u32"] + [:arg="bad_0array"] - [:type="vec2%3Ci32%3E"] + [:arg="bad_0bool"] - [:type="vec2%3Cu32%3E"] + [:arg="bad_0f16"] - [:type="vec3%3Ci32%3E"] + [:arg="bad_0f32"] - [:type="vec3%3Cu32%3E"] + [:arg="bad_0int"] - [:type="vec4%3Ci32%3E"] + [:arg="bad_0struct"] - [:type="vec4%3Cu32%3E"] + [:arg="bad_0uint"] + + [:arg="bad_1abstract"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1f16"] + + [:arg="bad_1f32"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="bad_vec_size"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,dot:values:*] + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp2:values:*] @@ -96143,6 +131951,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96151,6 +131963,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96159,6 +131975,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96167,6 +131987,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96196,24 +132020,44 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:integer_argument:*] - [:type="f32"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:args:*] + [:arg="bad_0args"] - [:type="i32"] + [:arg="bad_0array"] - [:type="u32"] + [:arg="bad_0bool"] - [:type="vec2%3Ci32%3E"] + [:arg="bad_0int"] - [:type="vec2%3Cu32%3E"] + [:arg="bad_0struct"] - [:type="vec3%3Ci32%3E"] + [:arg="bad_0uint"] - [:type="vec3%3Cu32%3E"] + [:arg="bad_0vec2i"] - [:type="vec4%3Ci32%3E"] + [:arg="bad_0vec2u"] - [:type="vec4%3Cu32%3E"] + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,exp:values:*] @@ -96221,6 +132065,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96229,6 +132077,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96237,6 +132089,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96245,6 +132101,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96274,6 +132134,585 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:count_offset:*] + [:offsetStage="constant";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="constant";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="constant";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:typed_arguments:*] + [:input="abstract-float"] + + [:input="alias"] + expected: + if os == "linux" and not debug: FAIL + + [:input="array"] + + [:input="array_runtime"] + + [:input="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:input="bool"] + + [:input="enumerant"] + + [:input="f16"] + + [:input="f32"] + + [:input="mat2x2%3Cf32%3E"] + + [:input="ptr"] + + [:input="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:input="sampler"] + + [:input="struct"] + + [:input="texture"] + + [:input="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:input="vec2%3Cabstract-float%3E"] + + [:input="vec2%3Cf16%3E"] + + [:input="vec2%3Cf32%3E"] + + [:input="vec3%3Cabstract-float%3E"] + + [:input="vec3%3Cf16%3E"] + + [:input="vec3%3Cf32%3E"] + + [:input="vec4%3Cabstract-float%3E"] + + [:input="vec4%3Cf16%3E"] + + [:input="vec4%3Cf32%3E"] + + [:input="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,extractBits:values:*] + [:stage="constant";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_2array"] + + [:arg="bad_2bool"] + + [:arg="bad_2int"] + + [:arg="bad_2struct"] + + [:arg="bad_2uint"] + + [:arg="bad_2vec2i"] + + [:arg="bad_2vec2u"] + + [:arg="bad_2vec3i"] + + [:arg="bad_2vec3u"] + + [:arg="bad_2vec4i"] + + [:arg="bad_2vec4u"] + + [:arg="bad_4arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,faceForward:values:*] + expected: + if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstLeadingBit:values:*] + [:stage="constant";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,firstTrailingBit:values:*] + [:stage="constant";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:integer_argument:*] [:type="f32"] @@ -96294,11 +132733,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,floor:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96307,6 +132758,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96315,6 +132770,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96323,6 +132782,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96352,24 +132815,697 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:integer_argument:*] - [:type="f32"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:args:*] + [:arg="bad_0args"] - [:type="i32"] + [:arg="bad_0array"] - [:type="u32"] + [:arg="bad_0bool"] - [:type="vec2%3Ci32%3E"] + [:arg="bad_0int"] - [:type="vec2%3Cu32%3E"] + [:arg="bad_0struct"] - [:type="vec3%3Ci32%3E"] + [:arg="bad_0uint"] - [:type="vec3%3Cu32%3E"] + [:arg="bad_0vec2i"] - [:type="vec4%3Ci32%3E"] + [:arg="bad_0vec2u"] - [:type="vec4%3Cu32%3E"] + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_2array"] + + [:arg="bad_2bool"] + + [:arg="bad_2int"] + + [:arg="bad_2struct"] + + [:arg="bad_2uint"] + + [:arg="bad_2vec2i"] + + [:arg="bad_2vec2u"] + + [:arg="bad_2vec3i"] + + [:arg="bad_2vec3u"] + + [:arg="bad_2vec4i"] + + [:arg="bad_2vec4u"] + + [:arg="bad_4arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:must_use:*] + [:use=false] + + [:use=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fma:values:*] + expected: + if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,fract:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,frexp:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:count_offset:*] + [:offsetStage="constant";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="constant";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="constant";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="override";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="override"] + expected: + if os == "linux" and not debug: FAIL + + [:offsetStage="runtime";countStage="runtime"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:mismatched:*] + [:arg0="i32";arg1="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="i32";arg1="u32"] + + [:arg0="i32";arg1="vec2%3Ci32%3E"] + + [:arg0="i32";arg1="vec2%3Cu32%3E"] + + [:arg0="i32";arg1="vec3%3Ci32%3E"] + + [:arg0="i32";arg1="vec3%3Cu32%3E"] + + [:arg0="i32";arg1="vec4%3Ci32%3E"] + + [:arg0="i32";arg1="vec4%3Cu32%3E"] + + [:arg0="u32";arg1="i32"] + + [:arg0="u32";arg1="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="u32";arg1="vec2%3Ci32%3E"] + + [:arg0="u32";arg1="vec2%3Cu32%3E"] + + [:arg0="u32";arg1="vec3%3Ci32%3E"] + + [:arg0="u32";arg1="vec3%3Cu32%3E"] + + [:arg0="u32";arg1="vec4%3Ci32%3E"] + + [:arg0="u32";arg1="vec4%3Cu32%3E"] + + [:arg0="vec2%3Ci32%3E";arg1="i32"] + + [:arg0="vec2%3Ci32%3E";arg1="u32"] + + [:arg0="vec2%3Ci32%3E";arg1="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="vec2%3Ci32%3E";arg1="vec2%3Cu32%3E"] + + [:arg0="vec2%3Ci32%3E";arg1="vec3%3Ci32%3E"] + + [:arg0="vec2%3Ci32%3E";arg1="vec3%3Cu32%3E"] + + [:arg0="vec2%3Ci32%3E";arg1="vec4%3Ci32%3E"] + + [:arg0="vec2%3Ci32%3E";arg1="vec4%3Cu32%3E"] + + [:arg0="vec2%3Cu32%3E";arg1="i32"] + + [:arg0="vec2%3Cu32%3E";arg1="u32"] + + [:arg0="vec2%3Cu32%3E";arg1="vec2%3Ci32%3E"] + + [:arg0="vec2%3Cu32%3E";arg1="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="vec2%3Cu32%3E";arg1="vec3%3Ci32%3E"] + + [:arg0="vec2%3Cu32%3E";arg1="vec3%3Cu32%3E"] + + [:arg0="vec2%3Cu32%3E";arg1="vec4%3Ci32%3E"] + + [:arg0="vec2%3Cu32%3E";arg1="vec4%3Cu32%3E"] + + [:arg0="vec3%3Ci32%3E";arg1="i32"] + + [:arg0="vec3%3Ci32%3E";arg1="u32"] + + [:arg0="vec3%3Ci32%3E";arg1="vec2%3Ci32%3E"] + + [:arg0="vec3%3Ci32%3E";arg1="vec2%3Cu32%3E"] + + [:arg0="vec3%3Ci32%3E";arg1="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="vec3%3Ci32%3E";arg1="vec3%3Cu32%3E"] + + [:arg0="vec3%3Ci32%3E";arg1="vec4%3Ci32%3E"] + + [:arg0="vec3%3Ci32%3E";arg1="vec4%3Cu32%3E"] + + [:arg0="vec3%3Cu32%3E";arg1="i32"] + + [:arg0="vec3%3Cu32%3E";arg1="u32"] + + [:arg0="vec3%3Cu32%3E";arg1="vec2%3Ci32%3E"] + + [:arg0="vec3%3Cu32%3E";arg1="vec2%3Cu32%3E"] + + [:arg0="vec3%3Cu32%3E";arg1="vec3%3Ci32%3E"] + + [:arg0="vec3%3Cu32%3E";arg1="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="vec3%3Cu32%3E";arg1="vec4%3Ci32%3E"] + + [:arg0="vec3%3Cu32%3E";arg1="vec4%3Cu32%3E"] + + [:arg0="vec4%3Ci32%3E";arg1="i32"] + + [:arg0="vec4%3Ci32%3E";arg1="u32"] + + [:arg0="vec4%3Ci32%3E";arg1="vec2%3Ci32%3E"] + + [:arg0="vec4%3Ci32%3E";arg1="vec2%3Cu32%3E"] + + [:arg0="vec4%3Ci32%3E";arg1="vec3%3Ci32%3E"] + + [:arg0="vec4%3Ci32%3E";arg1="vec3%3Cu32%3E"] + + [:arg0="vec4%3Ci32%3E";arg1="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg0="vec4%3Ci32%3E";arg1="vec4%3Cu32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="i32"] + + [:arg0="vec4%3Cu32%3E";arg1="u32"] + + [:arg0="vec4%3Cu32%3E";arg1="vec2%3Ci32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="vec2%3Cu32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="vec3%3Ci32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="vec3%3Cu32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="vec4%3Ci32%3E"] + + [:arg0="vec4%3Cu32%3E";arg1="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:typed_arguments:*] + [:input="abstract-float"] + + [:input="alias"] + expected: + if os == "linux" and not debug: FAIL + + [:input="array"] + + [:input="array_runtime"] + + [:input="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:input="bool"] + + [:input="enumerant"] + + [:input="f16"] + + [:input="f32"] + + [:input="mat2x2%3Cf32%3E"] + + [:input="ptr"] + + [:input="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:input="sampler"] + + [:input="struct"] + + [:input="texture"] + + [:input="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:input="vec2%3Cabstract-float%3E"] + + [:input="vec2%3Cf16%3E"] + + [:input="vec2%3Cf32%3E"] + + [:input="vec3%3Cabstract-float%3E"] + + [:input="vec3%3Cf16%3E"] + + [:input="vec3%3Cf32%3E"] + + [:input="vec4%3Cabstract-float%3E"] + + [:input="vec4%3Cf16%3E"] + + [:input="vec4%3Cf32%3E"] + + [:input="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,insertBits:values:*] + [:stage="constant";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,inverseSqrt:values:*] @@ -96377,6 +133513,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96385,6 +133525,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96393,6 +133537,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96401,6 +133549,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96430,6 +133582,324 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1f16"] + + [:arg="bad_1f32"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2f"] + + [:arg="bad_1vec2h"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3f"] + + [:arg="bad_1vec3h"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4f"] + + [:arg="bad_1vec4h"] + + [:arg="bad_1vec4u"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="bad_scalar_vec"] + + [:arg="bad_vec_scalar"] + + [:arg="bad_vec_sizes"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:partial_values:*] + [:stage="constant";typeA="f16";typeB="i32"] + + [:stage="constant";typeA="f32";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cf16%3E";typeB="vec2%3Ci32%3E"] + + [:stage="constant";typeA="vec2%3Cf32%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cf16%3E";typeB="vec3%3Ci32%3E"] + + [:stage="constant";typeA="vec3%3Cf32%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cf16%3E";typeB="vec4%3Ci32%3E"] + + [:stage="constant";typeA="vec4%3Cf32%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="f16";typeB="i32"] + + [:stage="override";typeA="f32";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec2%3Cf16%3E";typeB="vec2%3Ci32%3E"] + + [:stage="override";typeA="vec2%3Cf32%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec3%3Cf16%3E";typeB="vec3%3Ci32%3E"] + + [:stage="override";typeA="vec3%3Cf32%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec4%3Cf16%3E";typeB="vec4%3Ci32%3E"] + + [:stage="override";typeA="vec4%3Cf32%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="runtime";typeA="f16";typeB="i32"] + + [:stage="runtime";typeA="f32";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="runtime";typeA="vec2%3Cf16%3E";typeB="vec2%3Ci32%3E"] + + [:stage="runtime";typeA="vec2%3Cf32%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="runtime";typeA="vec3%3Cf16%3E";typeB="vec3%3Ci32%3E"] + + [:stage="runtime";typeA="vec3%3Cf32%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="runtime";typeA="vec4%3Cf16%3E";typeB="vec4%3Ci32%3E"] + + [:stage="runtime";typeA="vec4%3Cf32%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,ldexp:values:*] + [:stage="constant";typeA="abstract-float";typeB="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="abstract-float";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="abstract-int";typeB="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="abstract-int";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="f16";typeB="abstract-int"] + + [:stage="constant";typeA="f16";typeB="i32"] + + [:stage="constant";typeA="f32";typeB="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="f32";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cabstract-float%3E";typeB="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cabstract-float%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cabstract-int%3E";typeB="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cabstract-int%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cf16%3E";typeB="vec2%3Cabstract-int%3E"] + + [:stage="constant";typeA="vec2%3Cf16%3E";typeB="vec2%3Ci32%3E"] + + [:stage="constant";typeA="vec2%3Cf32%3E";typeB="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec2%3Cf32%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cabstract-float%3E";typeB="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cabstract-float%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cabstract-int%3E";typeB="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cabstract-int%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cf16%3E";typeB="vec3%3Cabstract-int%3E"] + + [:stage="constant";typeA="vec3%3Cf16%3E";typeB="vec3%3Ci32%3E"] + + [:stage="constant";typeA="vec3%3Cf32%3E";typeB="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec3%3Cf32%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cabstract-float%3E";typeB="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cabstract-float%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cabstract-int%3E";typeB="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cabstract-int%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cf16%3E";typeB="vec4%3Cabstract-int%3E"] + + [:stage="constant";typeA="vec4%3Cf16%3E";typeB="vec4%3Ci32%3E"] + + [:stage="constant";typeA="vec4%3Cf32%3E";typeB="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";typeA="vec4%3Cf32%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="f16";typeB="i32"] + + [:stage="override";typeA="f32";typeB="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec2%3Cf16%3E";typeB="vec2%3Ci32%3E"] + + [:stage="override";typeA="vec2%3Cf32%3E";typeB="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec3%3Cf16%3E";typeB="vec3%3Ci32%3E"] + + [:stage="override";typeA="vec3%3Cf32%3E";typeB="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";typeA="vec4%3Cf16%3E";typeB="vec4%3Ci32%3E"] + + [:stage="override";typeA="vec4%3Cf32%3E";typeB="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0mat"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:integer_argument:*] [:type="f32"] expected: @@ -96452,11 +133922,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:scalar:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96475,6 +133957,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96489,10 +133975,16 @@ [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,length:vec3:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] [:stage="constant";type="vec3%3Cabstract-float%3E"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: [PASS, FAIL] + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96511,6 +134003,28 @@ if os == "linux" and not debug: TIMEOUT +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:integer_argument:*] [:type="f32"] @@ -96531,11 +134045,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log2:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96544,6 +134070,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96552,6 +134082,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96560,6 +134094,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96589,6 +134127,28 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:integer_argument:*] [:type="f32"] @@ -96609,11 +134169,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,log:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96622,6 +134194,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96630,6 +134206,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96638,6 +134218,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96667,6 +134251,447 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0struct"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1struct"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,max:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0struct"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1struct"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,min:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_2array"] + + [:arg="bad_2bool"] + + [:arg="bad_2int"] + + [:arg="bad_2struct"] + + [:arg="bad_2uint"] + + [:arg="bad_2vec2i"] + + [:arg="bad_2vec2u"] + + [:arg="bad_2vec3i"] + + [:arg="bad_2vec3u"] + + [:arg="bad_2vec4i"] + + [:arg="bad_2vec4u"] + + [:arg="bad_4arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,mix:values:*] + expected: + if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:integer_argument:*] [:type="f32"] expected: @@ -96689,11 +134714,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,modf:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96704,6 +134741,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96714,6 +134755,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96724,6 +134769,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96755,31 +134804,577 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0struct"] - [:arg="0i32"] + [:arg="bad_2args"] - [:arg="0vec2i"] + [:arg="bad_no_parens"] - [:arg="0vec3i"] + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL - [:arg="0vec4b"] - [:arg="0vec4f"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:invalid_argument:*] + [:type="abstract-int"] - [:arg="0vec4u"] + [:type="bool"] - [:arg="2args"] + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,normalize:values:*] + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:args:*] + [:arg="bad_0args"] + + [:arg="bad_2args"] + + [:arg="bad_abstract_float"] + + [:arg="bad_abstract_int"] + + [:arg="bad_array"] + + [:arg="bad_bool"] + + [:arg="bad_f32"] + + [:arg="bad_i32"] + + [:arg="bad_struct"] + + [:arg="bad_u32"] + + [:arg="bad_vec3f"] + + [:arg="bad_vec4b"] + + [:arg="bad_vec4f"] + + [:arg="bad_vec4i"] + + [:arg="bad_vec4u"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="good_vec2_abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:return:*] + [:type="bool"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16float:value_range:*] + [:constantOrOverrideStage="constant";value0=-65504;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="constant";value0=-65504;value1=-65505] + + [:constantOrOverrideStage="constant";value0=-65504;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="constant";value0=-65504;value1=65505] + + [:constantOrOverrideStage="constant";value0=-65505;value1=-65504] + + [:constantOrOverrideStage="constant";value0=-65505;value1=-65505] + + [:constantOrOverrideStage="constant";value0=-65505;value1=65504] + + [:constantOrOverrideStage="constant";value0=-65505;value1=65505] + + [:constantOrOverrideStage="constant";value0=65504;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="constant";value0=65504;value1=-65505] + + [:constantOrOverrideStage="constant";value0=65504;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="constant";value0=65504;value1=65505] + + [:constantOrOverrideStage="constant";value0=65505;value1=-65504] + + [:constantOrOverrideStage="constant";value0=65505;value1=-65505] + + [:constantOrOverrideStage="constant";value0=65505;value1=65504] + + [:constantOrOverrideStage="constant";value0=65505;value1=65505] + + [:constantOrOverrideStage="override";value0=-65504;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65504;value1=-65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65504;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65504;value1=65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65505;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65505;value1=-65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65505;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=-65505;value1=65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65504;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65504;value1=-65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65504;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65504;value1=65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65505;value1=-65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65505;value1=-65505] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65505;value1=65504] + expected: + if os == "linux" and not debug: FAIL + + [:constantOrOverrideStage="override";value0=65505;value1=65505] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:args:*] + [:arg="bad_0args"] + + [:arg="bad_2args"] + + [:arg="bad_abstract_float"] + + [:arg="bad_abstract_int"] + + [:arg="bad_array"] + + [:arg="bad_bool"] + + [:arg="bad_f32"] + + [:arg="bad_i32"] + + [:arg="bad_struct"] + + [:arg="bad_u32"] + + [:arg="bad_vec3f"] + + [:arg="bad_vec4b"] + + [:arg="bad_vec4f"] + + [:arg="bad_vec4i"] + + [:arg="bad_vec4u"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="good_vec2_abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16snorm:return:*] + [:type="bool"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:args:*] + [:arg="bad_0args"] + + [:arg="bad_2args"] + + [:arg="bad_abstract_float"] + + [:arg="bad_abstract_int"] + + [:arg="bad_array"] + + [:arg="bad_bool"] + + [:arg="bad_f32"] + + [:arg="bad_i32"] + + [:arg="bad_struct"] + + [:arg="bad_u32"] + + [:arg="bad_vec3f"] + + [:arg="bad_vec4b"] + + [:arg="bad_vec4f"] + + [:arg="bad_vec4i"] + + [:arg="bad_vec4u"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="good_vec2_abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack2x16unorm:return:*] + [:type="bool"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:args:*] + [:arg="bad_0args"] + + [:arg="bad_2args"] + + [:arg="bad_abstract_float"] + + [:arg="bad_abstract_int"] + + [:arg="bad_array"] + + [:arg="bad_bool"] + + [:arg="bad_f32"] + + [:arg="bad_i32"] + + [:arg="bad_struct"] + + [:arg="bad_u32"] + + [:arg="bad_vec2f"] + + [:arg="bad_vec3f"] + + [:arg="bad_vec4b"] + + [:arg="bad_vec4i"] + + [:arg="bad_vec4u"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="good_vec4_abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8snorm:return:*] + [:type="bool"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:args:*] + [:arg="bad_0args"] + + [:arg="bad_2args"] + + [:arg="bad_abstract_float"] + + [:arg="bad_abstract_int"] + + [:arg="bad_array"] + + [:arg="bad_bool"] + + [:arg="bad_f32"] + + [:arg="bad_i32"] + + [:arg="bad_struct"] + + [:arg="bad_u32"] + + [:arg="bad_vec2f"] + + [:arg="bad_vec3f"] + + [:arg="bad_vec4b"] + + [:arg="bad_vec4i"] + + [:arg="bad_vec4u"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="good_vec4_abstract_float"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4x8unorm:return:*] + [:type="bool"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0f32"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec4b"] + + [:arg="bad_0vec4f"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2args"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:must_use:*] [:] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8:supported:*] [:requires=false] @@ -96793,31 +135388,43 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0bool"] - [:arg="0i32"] + [:arg="bad_0f32"] - [:arg="0vec2i"] + [:arg="bad_0i32"] - [:arg="0vec3i"] + [:arg="bad_0struct"] - [:arg="0vec4b"] + [:arg="bad_0vec2i"] - [:arg="0vec4f"] + [:arg="bad_0vec3i"] - [:arg="0vec4u"] + [:arg="bad_0vec4b"] - [:arg="2args"] + [:arg="bad_0vec4f"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2args"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:must_use:*] [:] + [:use=false] + + [:use=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xI8Clamp:supported:*] [:requires=false] @@ -96831,31 +135438,43 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0bool"] - [:arg="0i32"] + [:arg="bad_0f32"] - [:arg="0vec2u"] + [:arg="bad_0i32"] - [:arg="0vec3u"] + [:arg="bad_0struct"] - [:arg="0vec4b"] + [:arg="bad_0vec2u"] - [:arg="0vec4f"] + [:arg="bad_0vec3u"] - [:arg="0vec4i"] + [:arg="bad_0vec4b"] - [:arg="2args"] + [:arg="bad_0vec4f"] + + [:arg="bad_0vec4i"] + + [:arg="bad_2args"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:must_use:*] [:] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8:supported:*] [:requires=false] @@ -96869,31 +135488,43 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0bool"] - [:arg="0i32"] + [:arg="bad_0f32"] - [:arg="0vec2u"] + [:arg="bad_0i32"] - [:arg="0vec3u"] + [:arg="bad_0struct"] - [:arg="0vec4b"] + [:arg="bad_0vec2u"] - [:arg="0vec4f"] + [:arg="bad_0vec3u"] - [:arg="0vec4i"] + [:arg="bad_0vec4b"] - [:arg="2args"] + [:arg="bad_0vec4f"] + + [:arg="bad_0vec4i"] + + [:arg="bad_2args"] + + [:arg="good"] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:must_use:*] [:] + [:use=false] + + [:use=true] + expected: + if os == "linux" and not debug: FAIL + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pack4xU8Clamp:supported:*] [:requires=false] @@ -96907,6 +135538,300 @@ [:requires=true] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1args"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_3args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:invalid_argument:*] + [:type="bool"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,pow:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0f16"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2h"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3h"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4h"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:must_use:*] + [:use=false] + + [:use=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,quantizeToF16:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:args:*] + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_no_parens"] + + [:arg="bad_too_few"] + + [:arg="bad_too_many"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:integer_argument:*] [:type="f32"] @@ -96927,11 +135852,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,radians:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -96940,6 +135877,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -96948,6 +135889,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -96956,6 +135901,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -96985,6 +135934,449 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0struct"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1struct"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reflect:values:*] + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0f16"] + + [:arg="bad_0f32"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0veci"] + + [:arg="bad_0vecu"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1f16"] + + [:arg="bad_1f32"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1veci"] + + [:arg="bad_1vecu"] + + [:arg="bad_2arg"] + + [:arg="bad_2array"] + + [:arg="bad_2bool"] + + [:arg="bad_2int"] + + [:arg="bad_2struct"] + + [:arg="bad_2uint"] + + [:arg="bad_2vecf"] + + [:arg="bad_2vech"] + + [:arg="bad_2veci"] + + [:arg="bad_2vecu"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="bad_vec2_vec3"] + + [:arg="bad_vec3_vec4"] + + [:arg="bad_vec4_vec2"] + + [:arg="vec2f"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec3f"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec4f"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:must_use:*] + [:arg="vec2f";use=false] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec2f";use=true] + + [:arg="vec3f";use=false] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec3f";use=true] + + [:arg="vec4f";use=false] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec4f";use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:return:*] + [:arg="vec2f";returnType="bool"] + + [:arg="vec2f";returnType="f32"] + + [:arg="vec2f";returnType="i32"] + + [:arg="vec2f";returnType="u32"] + + [:arg="vec2f";returnType="vec2f"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec2f";returnType="vec3f"] + + [:arg="vec2f";returnType="vec3i"] + + [:arg="vec2f";returnType="vec3u"] + + [:arg="vec2f";returnType="vec4f"] + + [:arg="vec3f";returnType="bool"] + + [:arg="vec3f";returnType="f32"] + + [:arg="vec3f";returnType="i32"] + + [:arg="vec3f";returnType="u32"] + + [:arg="vec3f";returnType="vec2f"] + + [:arg="vec3f";returnType="vec3f"] + expected: + if os == "linux" and not debug: FAIL + + [:arg="vec3f";returnType="vec3i"] + + [:arg="vec3f";returnType="vec3u"] + + [:arg="vec3f";returnType="vec4f"] + + [:arg="vec4f";returnType="bool"] + + [:arg="vec4f";returnType="f32"] + + [:arg="vec4f";returnType="i32"] + + [:arg="vec4f";returnType="u32"] + + [:arg="vec4f";returnType="vec2f"] + + [:arg="vec4f";returnType="vec3f"] + + [:arg="vec4f";returnType="vec3i"] + + [:arg="vec4f";returnType="vec3u"] + + [:arg="vec4f";returnType="vec4f"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,refract:values:*] + expected: + if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:arguments:*] + [:test="alias"] + + [:test="array"] + + [:test="array_runtime"] + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + + [:test="struct"] + + [:test="texture"] + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:float_argument:*] + [:type="abstract-float"] + + [:type="f16"] + + [:type="f32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,reverseBits:values:*] + [:stage="constant";type="i32"] + + [:stage="constant";type="u32"] + + [:stage="constant";type="vec2%3Ci32%3E"] + + [:stage="constant";type="vec2%3Cu32%3E"] + + [:stage="constant";type="vec3%3Ci32%3E"] + + [:stage="constant";type="vec3%3Cu32%3E"] + + [:stage="constant";type="vec4%3Ci32%3E"] + + [:stage="constant";type="vec4%3Cu32%3E"] + + [:stage="override";type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:integer_argument:*] [:type="f32"] @@ -97005,11 +136397,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,round:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -97018,6 +136422,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -97026,6 +136434,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -97034,6 +136446,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -97063,6 +136479,56 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="matrix"] + + [:test="no_parens"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="valid"] + + [:test="vec_bool"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:integer_argument:*] [:type="f32"] @@ -97083,11 +136549,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,saturate:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -97096,6 +136574,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -97104,6 +136586,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -97112,6 +136598,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -97141,18 +136631,1882 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:unsigned_integer_argument:*] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:argument_types_1_and_2:*] + [:type1="abstract-float";type2="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-float";type2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-float";type2="bool"] + + [:type1="abstract-float";type2="f16"] + + [:type1="abstract-float";type2="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-float";type2="i32"] + + [:type1="abstract-float";type2="u32"] + + [:type1="abstract-float";type2="vec2%3Cabstract-float%3E"] + + [:type1="abstract-float";type2="vec2%3Cabstract-int%3E"] + + [:type1="abstract-float";type2="vec2%3Cbool%3E"] + + [:type1="abstract-float";type2="vec2%3Cf16%3E"] + + [:type1="abstract-float";type2="vec2%3Cf32%3E"] + + [:type1="abstract-float";type2="vec2%3Ci32%3E"] + + [:type1="abstract-float";type2="vec2%3Cu32%3E"] + + [:type1="abstract-float";type2="vec3%3Cabstract-float%3E"] + + [:type1="abstract-float";type2="vec3%3Cabstract-int%3E"] + + [:type1="abstract-float";type2="vec3%3Cbool%3E"] + + [:type1="abstract-float";type2="vec3%3Cf16%3E"] + + [:type1="abstract-float";type2="vec3%3Cf32%3E"] + + [:type1="abstract-float";type2="vec3%3Ci32%3E"] + + [:type1="abstract-float";type2="vec3%3Cu32%3E"] + + [:type1="abstract-float";type2="vec4%3Cabstract-float%3E"] + + [:type1="abstract-float";type2="vec4%3Cabstract-int%3E"] + + [:type1="abstract-float";type2="vec4%3Cbool%3E"] + + [:type1="abstract-float";type2="vec4%3Cf16%3E"] + + [:type1="abstract-float";type2="vec4%3Cf32%3E"] + + [:type1="abstract-float";type2="vec4%3Ci32%3E"] + + [:type1="abstract-float";type2="vec4%3Cu32%3E"] + + [:type1="abstract-int";type2="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-int";type2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-int";type2="bool"] + + [:type1="abstract-int";type2="f16"] + + [:type1="abstract-int";type2="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-int";type2="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-int";type2="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="abstract-int";type2="vec2%3Cabstract-float%3E"] + + [:type1="abstract-int";type2="vec2%3Cabstract-int%3E"] + + [:type1="abstract-int";type2="vec2%3Cbool%3E"] + + [:type1="abstract-int";type2="vec2%3Cf16%3E"] + + [:type1="abstract-int";type2="vec2%3Cf32%3E"] + + [:type1="abstract-int";type2="vec2%3Ci32%3E"] + + [:type1="abstract-int";type2="vec2%3Cu32%3E"] + + [:type1="abstract-int";type2="vec3%3Cabstract-float%3E"] + + [:type1="abstract-int";type2="vec3%3Cabstract-int%3E"] + + [:type1="abstract-int";type2="vec3%3Cbool%3E"] + + [:type1="abstract-int";type2="vec3%3Cf16%3E"] + + [:type1="abstract-int";type2="vec3%3Cf32%3E"] + + [:type1="abstract-int";type2="vec3%3Ci32%3E"] + + [:type1="abstract-int";type2="vec3%3Cu32%3E"] + + [:type1="abstract-int";type2="vec4%3Cabstract-float%3E"] + + [:type1="abstract-int";type2="vec4%3Cabstract-int%3E"] + + [:type1="abstract-int";type2="vec4%3Cbool%3E"] + + [:type1="abstract-int";type2="vec4%3Cf16%3E"] + + [:type1="abstract-int";type2="vec4%3Cf32%3E"] + + [:type1="abstract-int";type2="vec4%3Ci32%3E"] + + [:type1="abstract-int";type2="vec4%3Cu32%3E"] + + [:type1="bool";type2="abstract-float"] + + [:type1="bool";type2="abstract-int"] + + [:type1="bool";type2="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="bool";type2="f16"] + + [:type1="bool";type2="f32"] + + [:type1="bool";type2="i32"] + + [:type1="bool";type2="u32"] + + [:type1="bool";type2="vec2%3Cabstract-float%3E"] + + [:type1="bool";type2="vec2%3Cabstract-int%3E"] + + [:type1="bool";type2="vec2%3Cbool%3E"] + + [:type1="bool";type2="vec2%3Cf16%3E"] + + [:type1="bool";type2="vec2%3Cf32%3E"] + + [:type1="bool";type2="vec2%3Ci32%3E"] + + [:type1="bool";type2="vec2%3Cu32%3E"] + + [:type1="bool";type2="vec3%3Cabstract-float%3E"] + + [:type1="bool";type2="vec3%3Cabstract-int%3E"] + + [:type1="bool";type2="vec3%3Cbool%3E"] + + [:type1="bool";type2="vec3%3Cf16%3E"] + + [:type1="bool";type2="vec3%3Cf32%3E"] + + [:type1="bool";type2="vec3%3Ci32%3E"] + + [:type1="bool";type2="vec3%3Cu32%3E"] + + [:type1="bool";type2="vec4%3Cabstract-float%3E"] + + [:type1="bool";type2="vec4%3Cabstract-int%3E"] + + [:type1="bool";type2="vec4%3Cbool%3E"] + + [:type1="bool";type2="vec4%3Cf16%3E"] + + [:type1="bool";type2="vec4%3Cf32%3E"] + + [:type1="bool";type2="vec4%3Ci32%3E"] + + [:type1="bool";type2="vec4%3Cu32%3E"] + + [:type1="f16";type2="abstract-float"] + + [:type1="f16";type2="abstract-int"] + + [:type1="f16";type2="bool"] + + [:type1="f16";type2="f16"] + + [:type1="f16";type2="f32"] + + [:type1="f16";type2="i32"] + + [:type1="f16";type2="u32"] + + [:type1="f16";type2="vec2%3Cabstract-float%3E"] + + [:type1="f16";type2="vec2%3Cabstract-int%3E"] + + [:type1="f16";type2="vec2%3Cbool%3E"] + + [:type1="f16";type2="vec2%3Cf16%3E"] + + [:type1="f16";type2="vec2%3Cf32%3E"] + + [:type1="f16";type2="vec2%3Ci32%3E"] + + [:type1="f16";type2="vec2%3Cu32%3E"] + + [:type1="f16";type2="vec3%3Cabstract-float%3E"] + + [:type1="f16";type2="vec3%3Cabstract-int%3E"] + + [:type1="f16";type2="vec3%3Cbool%3E"] + + [:type1="f16";type2="vec3%3Cf16%3E"] + + [:type1="f16";type2="vec3%3Cf32%3E"] + + [:type1="f16";type2="vec3%3Ci32%3E"] + + [:type1="f16";type2="vec3%3Cu32%3E"] + + [:type1="f16";type2="vec4%3Cabstract-float%3E"] + + [:type1="f16";type2="vec4%3Cabstract-int%3E"] + + [:type1="f16";type2="vec4%3Cbool%3E"] + + [:type1="f16";type2="vec4%3Cf16%3E"] + + [:type1="f16";type2="vec4%3Cf32%3E"] + + [:type1="f16";type2="vec4%3Ci32%3E"] + + [:type1="f16";type2="vec4%3Cu32%3E"] + + [:type1="f32";type2="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="f32";type2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="f32";type2="bool"] + + [:type1="f32";type2="f16"] + + [:type1="f32";type2="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="f32";type2="i32"] + + [:type1="f32";type2="u32"] + + [:type1="f32";type2="vec2%3Cabstract-float%3E"] + + [:type1="f32";type2="vec2%3Cabstract-int%3E"] + + [:type1="f32";type2="vec2%3Cbool%3E"] + + [:type1="f32";type2="vec2%3Cf16%3E"] + + [:type1="f32";type2="vec2%3Cf32%3E"] + + [:type1="f32";type2="vec2%3Ci32%3E"] + + [:type1="f32";type2="vec2%3Cu32%3E"] + + [:type1="f32";type2="vec3%3Cabstract-float%3E"] + + [:type1="f32";type2="vec3%3Cabstract-int%3E"] + + [:type1="f32";type2="vec3%3Cbool%3E"] + + [:type1="f32";type2="vec3%3Cf16%3E"] + + [:type1="f32";type2="vec3%3Cf32%3E"] + + [:type1="f32";type2="vec3%3Ci32%3E"] + + [:type1="f32";type2="vec3%3Cu32%3E"] + + [:type1="f32";type2="vec4%3Cabstract-float%3E"] + + [:type1="f32";type2="vec4%3Cabstract-int%3E"] + + [:type1="f32";type2="vec4%3Cbool%3E"] + + [:type1="f32";type2="vec4%3Cf16%3E"] + + [:type1="f32";type2="vec4%3Cf32%3E"] + + [:type1="f32";type2="vec4%3Ci32%3E"] + + [:type1="f32";type2="vec4%3Cu32%3E"] + + [:type1="i32";type2="abstract-float"] + + [:type1="i32";type2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="i32";type2="bool"] + + [:type1="i32";type2="f16"] + + [:type1="i32";type2="f32"] + + [:type1="i32";type2="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="i32";type2="u32"] + + [:type1="i32";type2="vec2%3Cabstract-float%3E"] + + [:type1="i32";type2="vec2%3Cabstract-int%3E"] + + [:type1="i32";type2="vec2%3Cbool%3E"] + + [:type1="i32";type2="vec2%3Cf16%3E"] + + [:type1="i32";type2="vec2%3Cf32%3E"] + + [:type1="i32";type2="vec2%3Ci32%3E"] + + [:type1="i32";type2="vec2%3Cu32%3E"] + + [:type1="i32";type2="vec3%3Cabstract-float%3E"] + + [:type1="i32";type2="vec3%3Cabstract-int%3E"] + + [:type1="i32";type2="vec3%3Cbool%3E"] + + [:type1="i32";type2="vec3%3Cf16%3E"] + + [:type1="i32";type2="vec3%3Cf32%3E"] + + [:type1="i32";type2="vec3%3Ci32%3E"] + + [:type1="i32";type2="vec3%3Cu32%3E"] + + [:type1="i32";type2="vec4%3Cabstract-float%3E"] + + [:type1="i32";type2="vec4%3Cabstract-int%3E"] + + [:type1="i32";type2="vec4%3Cbool%3E"] + + [:type1="i32";type2="vec4%3Cf16%3E"] + + [:type1="i32";type2="vec4%3Cf32%3E"] + + [:type1="i32";type2="vec4%3Ci32%3E"] + + [:type1="i32";type2="vec4%3Cu32%3E"] + + [:type1="u32";type2="abstract-float"] + + [:type1="u32";type2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="u32";type2="bool"] + + [:type1="u32";type2="f16"] + + [:type1="u32";type2="f32"] + + [:type1="u32";type2="i32"] + + [:type1="u32";type2="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="u32";type2="vec2%3Cabstract-float%3E"] + + [:type1="u32";type2="vec2%3Cabstract-int%3E"] + + [:type1="u32";type2="vec2%3Cbool%3E"] + + [:type1="u32";type2="vec2%3Cf16%3E"] + + [:type1="u32";type2="vec2%3Cf32%3E"] + + [:type1="u32";type2="vec2%3Ci32%3E"] + + [:type1="u32";type2="vec2%3Cu32%3E"] + + [:type1="u32";type2="vec3%3Cabstract-float%3E"] + + [:type1="u32";type2="vec3%3Cabstract-int%3E"] + + [:type1="u32";type2="vec3%3Cbool%3E"] + + [:type1="u32";type2="vec3%3Cf16%3E"] + + [:type1="u32";type2="vec3%3Cf32%3E"] + + [:type1="u32";type2="vec3%3Ci32%3E"] + + [:type1="u32";type2="vec3%3Cu32%3E"] + + [:type1="u32";type2="vec4%3Cabstract-float%3E"] + + [:type1="u32";type2="vec4%3Cabstract-int%3E"] + + [:type1="u32";type2="vec4%3Cbool%3E"] + + [:type1="u32";type2="vec4%3Cf16%3E"] + + [:type1="u32";type2="vec4%3Cf32%3E"] + + [:type1="u32";type2="vec4%3Ci32%3E"] + + [:type1="u32";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="abstract-float"] + + [:type1="vec2%3Cabstract-float%3E";type2="abstract-int"] + + [:type1="vec2%3Cabstract-float%3E";type2="bool"] + + [:type1="vec2%3Cabstract-float%3E";type2="f16"] + + [:type1="vec2%3Cabstract-float%3E";type2="f32"] + + [:type1="vec2%3Cabstract-float%3E";type2="i32"] + + [:type1="vec2%3Cabstract-float%3E";type2="u32"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cabstract-float%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="abstract-float"] + + [:type1="vec2%3Cabstract-int%3E";type2="abstract-int"] + + [:type1="vec2%3Cabstract-int%3E";type2="bool"] + + [:type1="vec2%3Cabstract-int%3E";type2="f16"] + + [:type1="vec2%3Cabstract-int%3E";type2="f32"] + + [:type1="vec2%3Cabstract-int%3E";type2="i32"] + + [:type1="vec2%3Cabstract-int%3E";type2="u32"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-int%3E";type2="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cabstract-int%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cbool%3E";type2="abstract-float"] + + [:type1="vec2%3Cbool%3E";type2="abstract-int"] + + [:type1="vec2%3Cbool%3E";type2="bool"] + + [:type1="vec2%3Cbool%3E";type2="f16"] + + [:type1="vec2%3Cbool%3E";type2="f32"] + + [:type1="vec2%3Cbool%3E";type2="i32"] + + [:type1="vec2%3Cbool%3E";type2="u32"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cbool%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cf16%3E";type2="abstract-float"] + + [:type1="vec2%3Cf16%3E";type2="abstract-int"] + + [:type1="vec2%3Cf16%3E";type2="bool"] + + [:type1="vec2%3Cf16%3E";type2="f16"] + + [:type1="vec2%3Cf16%3E";type2="f32"] + + [:type1="vec2%3Cf16%3E";type2="i32"] + + [:type1="vec2%3Cf16%3E";type2="u32"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cf16%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cf32%3E";type2="abstract-float"] + + [:type1="vec2%3Cf32%3E";type2="abstract-int"] + + [:type1="vec2%3Cf32%3E";type2="bool"] + + [:type1="vec2%3Cf32%3E";type2="f16"] + + [:type1="vec2%3Cf32%3E";type2="f32"] + + [:type1="vec2%3Cf32%3E";type2="i32"] + + [:type1="vec2%3Cf32%3E";type2="u32"] + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cf32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cf32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Ci32%3E";type2="abstract-float"] + + [:type1="vec2%3Ci32%3E";type2="abstract-int"] + + [:type1="vec2%3Ci32%3E";type2="bool"] + + [:type1="vec2%3Ci32%3E";type2="f16"] + + [:type1="vec2%3Ci32%3E";type2="f32"] + + [:type1="vec2%3Ci32%3E";type2="i32"] + + [:type1="vec2%3Ci32%3E";type2="u32"] + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Ci32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Ci32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec2%3Cu32%3E";type2="abstract-float"] + + [:type1="vec2%3Cu32%3E";type2="abstract-int"] + + [:type1="vec2%3Cu32%3E";type2="bool"] + + [:type1="vec2%3Cu32%3E";type2="f16"] + + [:type1="vec2%3Cu32%3E";type2="f32"] + + [:type1="vec2%3Cu32%3E";type2="i32"] + + [:type1="vec2%3Cu32%3E";type2="u32"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec2%3Cu32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="abstract-float"] + + [:type1="vec3%3Cabstract-float%3E";type2="abstract-int"] + + [:type1="vec3%3Cabstract-float%3E";type2="bool"] + + [:type1="vec3%3Cabstract-float%3E";type2="f16"] + + [:type1="vec3%3Cabstract-float%3E";type2="f32"] + + [:type1="vec3%3Cabstract-float%3E";type2="i32"] + + [:type1="vec3%3Cabstract-float%3E";type2="u32"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cabstract-float%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="abstract-float"] + + [:type1="vec3%3Cabstract-int%3E";type2="abstract-int"] + + [:type1="vec3%3Cabstract-int%3E";type2="bool"] + + [:type1="vec3%3Cabstract-int%3E";type2="f16"] + + [:type1="vec3%3Cabstract-int%3E";type2="f32"] + + [:type1="vec3%3Cabstract-int%3E";type2="i32"] + + [:type1="vec3%3Cabstract-int%3E";type2="u32"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-int%3E";type2="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cabstract-int%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cbool%3E";type2="abstract-float"] + + [:type1="vec3%3Cbool%3E";type2="abstract-int"] + + [:type1="vec3%3Cbool%3E";type2="bool"] + + [:type1="vec3%3Cbool%3E";type2="f16"] + + [:type1="vec3%3Cbool%3E";type2="f32"] + + [:type1="vec3%3Cbool%3E";type2="i32"] + + [:type1="vec3%3Cbool%3E";type2="u32"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cbool%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cf16%3E";type2="abstract-float"] + + [:type1="vec3%3Cf16%3E";type2="abstract-int"] + + [:type1="vec3%3Cf16%3E";type2="bool"] + + [:type1="vec3%3Cf16%3E";type2="f16"] + + [:type1="vec3%3Cf16%3E";type2="f32"] + + [:type1="vec3%3Cf16%3E";type2="i32"] + + [:type1="vec3%3Cf16%3E";type2="u32"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cf16%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cf32%3E";type2="abstract-float"] + + [:type1="vec3%3Cf32%3E";type2="abstract-int"] + + [:type1="vec3%3Cf32%3E";type2="bool"] + + [:type1="vec3%3Cf32%3E";type2="f16"] + + [:type1="vec3%3Cf32%3E";type2="f32"] + + [:type1="vec3%3Cf32%3E";type2="i32"] + + [:type1="vec3%3Cf32%3E";type2="u32"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cf32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cf32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Ci32%3E";type2="abstract-float"] + + [:type1="vec3%3Ci32%3E";type2="abstract-int"] + + [:type1="vec3%3Ci32%3E";type2="bool"] + + [:type1="vec3%3Ci32%3E";type2="f16"] + + [:type1="vec3%3Ci32%3E";type2="f32"] + + [:type1="vec3%3Ci32%3E";type2="i32"] + + [:type1="vec3%3Ci32%3E";type2="u32"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Ci32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Ci32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec3%3Cu32%3E";type2="abstract-float"] + + [:type1="vec3%3Cu32%3E";type2="abstract-int"] + + [:type1="vec3%3Cu32%3E";type2="bool"] + + [:type1="vec3%3Cu32%3E";type2="f16"] + + [:type1="vec3%3Cu32%3E";type2="f32"] + + [:type1="vec3%3Cu32%3E";type2="i32"] + + [:type1="vec3%3Cu32%3E";type2="u32"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec3%3Cu32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="abstract-float"] + + [:type1="vec4%3Cabstract-float%3E";type2="abstract-int"] + + [:type1="vec4%3Cabstract-float%3E";type2="bool"] + + [:type1="vec4%3Cabstract-float%3E";type2="f16"] + + [:type1="vec4%3Cabstract-float%3E";type2="f32"] + + [:type1="vec4%3Cabstract-float%3E";type2="i32"] + + [:type1="vec4%3Cabstract-float%3E";type2="u32"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec4%3Cabstract-float%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="abstract-float"] + + [:type1="vec4%3Cabstract-int%3E";type2="abstract-int"] + + [:type1="vec4%3Cabstract-int%3E";type2="bool"] + + [:type1="vec4%3Cabstract-int%3E";type2="f16"] + + [:type1="vec4%3Cabstract-int%3E";type2="f32"] + + [:type1="vec4%3Cabstract-int%3E";type2="i32"] + + [:type1="vec4%3Cabstract-int%3E";type2="u32"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cabstract-int%3E";type2="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cbool%3E";type2="abstract-float"] + + [:type1="vec4%3Cbool%3E";type2="abstract-int"] + + [:type1="vec4%3Cbool%3E";type2="bool"] + + [:type1="vec4%3Cbool%3E";type2="f16"] + + [:type1="vec4%3Cbool%3E";type2="f32"] + + [:type1="vec4%3Cbool%3E";type2="i32"] + + [:type1="vec4%3Cbool%3E";type2="u32"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec4%3Cbool%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Cf16%3E";type2="abstract-float"] + + [:type1="vec4%3Cf16%3E";type2="abstract-int"] + + [:type1="vec4%3Cf16%3E";type2="bool"] + + [:type1="vec4%3Cf16%3E";type2="f16"] + + [:type1="vec4%3Cf16%3E";type2="f32"] + + [:type1="vec4%3Cf16%3E";type2="i32"] + + [:type1="vec4%3Cf16%3E";type2="u32"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cabstract-int%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec4%3Cf16%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Cf32%3E";type2="abstract-float"] + + [:type1="vec4%3Cf32%3E";type2="abstract-int"] + + [:type1="vec4%3Cf32%3E";type2="bool"] + + [:type1="vec4%3Cf32%3E";type2="f16"] + + [:type1="vec4%3Cf32%3E";type2="f32"] + + [:type1="vec4%3Cf32%3E";type2="i32"] + + [:type1="vec4%3Cf32%3E";type2="u32"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cf32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec4%3Cf32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Ci32%3E";type2="abstract-float"] + + [:type1="vec4%3Ci32%3E";type2="abstract-int"] + + [:type1="vec4%3Ci32%3E";type2="bool"] + + [:type1="vec4%3Ci32%3E";type2="f16"] + + [:type1="vec4%3Ci32%3E";type2="f32"] + + [:type1="vec4%3Ci32%3E";type2="i32"] + + [:type1="vec4%3Ci32%3E";type2="u32"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec4%3Ci32%3E";type2="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Ci32%3E";type2="vec4%3Cu32%3E"] + + [:type1="vec4%3Cu32%3E";type2="abstract-float"] + + [:type1="vec4%3Cu32%3E";type2="abstract-int"] + + [:type1="vec4%3Cu32%3E";type2="bool"] + + [:type1="vec4%3Cu32%3E";type2="f16"] + + [:type1="vec4%3Cu32%3E";type2="f32"] + + [:type1="vec4%3Cu32%3E";type2="i32"] + + [:type1="vec4%3Cu32%3E";type2="u32"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cabstract-float%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cabstract-int%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cbool%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cf16%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cf32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Ci32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec2%3Cu32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cabstract-float%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cabstract-int%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cbool%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cf16%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cf32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Ci32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec3%3Cu32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cabstract-float%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cbool%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cf16%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cf32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Ci32%3E"] + + [:type1="vec4%3Cu32%3E";type2="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:argument_types_3:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16"] + [:type="f32"] + [:type="i32"] + [:type="u32"] + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + [:type="vec2%3Cu32%3E"] + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + [:type="vec3%3Cu32%3E"] + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + + [:test="enumerant"] + + [:test="f16"] + + [:test="f32"] + + [:test="i32"] + + [:test="matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:test="mixed_aint_afloat"] + + [:test="mixed_i32_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_args"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="u32"] + + [:test="valid"] + + [:test="vec2_bool_implicit"] + + [:test="vec3_bool_implicit"] + + [:test="vec_bool"] + + [:test="vec_f16"] + + [:test="vec_f32"] + + [:test="vec_i32"] + + [:test="vec_u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,select:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sign:values:*] [:stage="constant";type="abstract-float"] expected: @@ -97235,6 +138589,28 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_2args"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:integer_argument:*] [:type="f32"] @@ -97255,11 +138631,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sin:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -97268,6 +138656,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -97276,6 +138668,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -97284,6 +138680,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -97313,50 +138713,566 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:integer_argument:*] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:values:*] + [:stage="constant";type="abstract-float"] + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:argument_types:*] + [:type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool"] + + [:type="f16"] + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL [:type="i32"] [:type="u32"] + [:type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + [:type="vec2%3Ci32%3E"] [:type="vec2%3Cu32%3E"] + [:type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + [:type="vec3%3Ci32%3E"] [:type="vec3%3Cu32%3E"] + [:type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + [:type="vec4%3Ci32%3E"] [:type="vec4%3Cu32%3E"] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sinh:values:*] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:arguments:*] + [:test="alias"] + + [:test="array"] + expected: + if os == "linux" and not debug: FAIL + + [:test="array_runtime"] + expected: + if os == "linux" and not debug: FAIL + + [:test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:test="enumerant"] + + [:test="f16"] + + [:test="f32"] + + [:test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:test="mixed_aint_afloat"] + + [:test="mixed_f16_afloat"] + + [:test="mixed_f32_afloat"] + + [:test="must_use"] + expected: + if os == "linux" and not debug: FAIL + + [:test="no_args"] + + [:test="ptr"] + + [:test="ptr_deref"] + expected: + if os == "linux" and not debug: FAIL + + [:test="sampler"] + expected: + if os == "linux" and not debug: FAIL + + [:test="struct"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + expected: + if os == "linux" and not debug: FAIL + + [:test="too_few_args"] + + [:test="too_many_args"] + + [:test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="valid"] + + [:test="vec_bool"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_f32"] + + [:test="vec_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:test="vec_u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:early_eval_errors:*] + [:stage="constant"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:partial_eval_errors:*] + [:lowStage="constant";highStage="constant";type="f16"] + + [:lowStage="constant";highStage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="constant";type="vec2%3Cf16%3E"] + + [:lowStage="constant";highStage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="constant";type="vec3%3Cf16%3E"] + + [:lowStage="constant";highStage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="constant";type="vec4%3Cf16%3E"] + + [:lowStage="constant";highStage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="override";type="f16"] + + [:lowStage="constant";highStage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="override";type="vec2%3Cf16%3E"] + + [:lowStage="constant";highStage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="override";type="vec3%3Cf16%3E"] + + [:lowStage="constant";highStage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="override";type="vec4%3Cf16%3E"] + + [:lowStage="constant";highStage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="runtime";type="f16"] + + [:lowStage="constant";highStage="runtime";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="runtime";type="vec2%3Cf16%3E"] + + [:lowStage="constant";highStage="runtime";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="runtime";type="vec3%3Cf16%3E"] + + [:lowStage="constant";highStage="runtime";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="constant";highStage="runtime";type="vec4%3Cf16%3E"] + + [:lowStage="constant";highStage="runtime";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="constant";type="f16"] + + [:lowStage="override";highStage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="constant";type="vec2%3Cf16%3E"] + + [:lowStage="override";highStage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="constant";type="vec3%3Cf16%3E"] + + [:lowStage="override";highStage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="constant";type="vec4%3Cf16%3E"] + + [:lowStage="override";highStage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="override";type="f16"] + + [:lowStage="override";highStage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="override";type="vec2%3Cf16%3E"] + + [:lowStage="override";highStage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="override";type="vec3%3Cf16%3E"] + + [:lowStage="override";highStage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="override";type="vec4%3Cf16%3E"] + + [:lowStage="override";highStage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="runtime";type="f16"] + + [:lowStage="override";highStage="runtime";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="runtime";type="vec2%3Cf16%3E"] + + [:lowStage="override";highStage="runtime";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="runtime";type="vec3%3Cf16%3E"] + + [:lowStage="override";highStage="runtime";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="override";highStage="runtime";type="vec4%3Cf16%3E"] + + [:lowStage="override";highStage="runtime";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="constant";type="f16"] + + [:lowStage="runtime";highStage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="constant";type="vec2%3Cf16%3E"] + + [:lowStage="runtime";highStage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="constant";type="vec3%3Cf16%3E"] + + [:lowStage="runtime";highStage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="constant";type="vec4%3Cf16%3E"] + + [:lowStage="runtime";highStage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="override";type="f16"] + + [:lowStage="runtime";highStage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="override";type="vec2%3Cf16%3E"] + + [:lowStage="runtime";highStage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="override";type="vec3%3Cf16%3E"] + + [:lowStage="runtime";highStage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="override";type="vec4%3Cf16%3E"] + + [:lowStage="runtime";highStage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="runtime";type="f16"] + + [:lowStage="runtime";highStage="runtime";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="runtime";type="vec2%3Cf16%3E"] + + [:lowStage="runtime";highStage="runtime";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="runtime";type="vec3%3Cf16%3E"] + + [:lowStage="runtime";highStage="runtime";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:lowStage="runtime";highStage="runtime";type="vec4%3Cf16%3E"] + + [:lowStage="runtime";highStage="runtime";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,smoothstep:values:*] [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="f16"] [:stage="constant";type="f32"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:stage="override";type="f16"] @@ -97383,6 +139299,28 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:args:*] + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0i32"] + + [:arg="bad_0struct"] + + [:arg="bad_0u32"] + + [:arg="bad_0vec2u"] + + [:arg="bad_no_parens"] + + [:arg="bad_too_few"] + + [:arg="bad_too_many"] + + [:arg="good"] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:integer_argument:*] [:type="f32"] @@ -97403,11 +139341,23 @@ [:type="vec4%3Cu32%3E"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,sqrt:values:*] [:stage="constant";type="abstract-float"] expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -97416,6 +139366,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -97424,6 +139378,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -97432,6 +139390,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -97461,24 +139423,182 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:integer_argument:*] - [:type="f32"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:args:*] + [:arg="bad_0args"] - [:type="i32"] + [:arg="bad_0array"] - [:type="u32"] + [:arg="bad_0bool"] - [:type="vec2%3Ci32%3E"] + [:arg="bad_0int"] - [:type="vec2%3Cu32%3E"] + [:arg="bad_0struct"] - [:type="vec3%3Ci32%3E"] + [:arg="bad_0uint"] - [:type="vec3%3Cu32%3E"] + [:arg="bad_0vec2i"] - [:type="vec4%3Ci32%3E"] + [:arg="bad_0vec2u"] - [:type="vec4%3Cu32%3E"] + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_1arg"] + + [:arg="bad_1array"] + + [:arg="bad_1bool"] + + [:arg="bad_1int"] + + [:arg="bad_1struct"] + + [:arg="bad_1uint"] + + [:arg="bad_1vec2i"] + + [:arg="bad_1vec2u"] + + [:arg="bad_1vec3i"] + + [:arg="bad_1vec3u"] + + [:arg="bad_1vec4i"] + + [:arg="bad_1vec4u"] + + [:arg="bad_3arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,step:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tan:values:*] @@ -97486,6 +139606,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="f16"] [:stage="constant";type="f32"] @@ -97494,6 +139618,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec2%3Cf16%3E"] [:stage="constant";type="vec2%3Cf32%3E"] @@ -97502,6 +139630,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec3%3Cf16%3E"] [:stage="constant";type="vec3%3Cf32%3E"] @@ -97510,6 +139642,10 @@ expected: if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + [:stage="constant";type="vec4%3Cf16%3E"] [:stage="constant";type="vec4%3Cf32%3E"] @@ -97539,27 +139675,25248 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:args:*] + [:arg="bad_0args"] - [:arg="0bool"] + [:arg="bad_0array"] - [:arg="0f32"] + [:arg="bad_0bool"] - [:arg="0i32"] + [:arg="bad_0int"] - [:arg="0vec2u"] + [:arg="bad_0struct"] - [:arg="0vec3u"] + [:arg="bad_0uint"] - [:arg="0vec4u"] + [:arg="bad_0vec2i"] - [:arg="2args"] + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,tanh:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:level_argument,non_storage:*] + [:textureType="texture_1d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="abstract-int"] + + [:textureType="texture_1d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="f16"] + + [:textureType="texture_1d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="i32"] + + [:textureType="texture_1d";levelType="u32"] + + [:textureType="texture_1d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="abstract-int"] + + [:textureType="texture_2d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="f16"] + + [:textureType="texture_2d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="i32"] + + [:textureType="texture_2d";levelType="u32"] + + [:textureType="texture_2d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="abstract-int"] + + [:textureType="texture_2d_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="f16"] + + [:textureType="texture_2d_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="i32"] + + [:textureType="texture_2d_array";levelType="u32"] + + [:textureType="texture_2d_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="abstract-int"] + + [:textureType="texture_3d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="f16"] + + [:textureType="texture_3d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="i32"] + + [:textureType="texture_3d";levelType="u32"] + + [:textureType="texture_3d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="abstract-int"] + + [:textureType="texture_cube";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="f16"] + + [:textureType="texture_cube";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="i32"] + + [:textureType="texture_cube";levelType="u32"] + + [:textureType="texture_cube";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_cube";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_cube";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_cube";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="abstract-int"] + + [:textureType="texture_cube_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="f16"] + + [:textureType="texture_cube_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="i32"] + + [:textureType="texture_cube_array";levelType="u32"] + + [:textureType="texture_cube_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="abstract-int"] + + [:textureType="texture_depth_2d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="f16"] + + [:textureType="texture_depth_2d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="i32"] + + [:textureType="texture_depth_2d";levelType="u32"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="abstract-int"] + + [:textureType="texture_depth_2d_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="f16"] + + [:textureType="texture_depth_2d_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="i32"] + + [:textureType="texture_depth_2d_array";levelType="u32"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="abstract-int"] + + [:textureType="texture_depth_cube";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="f16"] + + [:textureType="texture_depth_cube";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="i32"] + + [:textureType="texture_depth_cube";levelType="u32"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="abstract-int"] + + [:textureType="texture_depth_cube_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="f16"] + + [:textureType="texture_depth_cube_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="i32"] + + [:textureType="texture_depth_cube_array";levelType="u32"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,non_storage:*] + [:returnType="abstract-float";textureType="texture_1d"] + + [:returnType="abstract-float";textureType="texture_2d"] + + [:returnType="abstract-float";textureType="texture_2d_array"] + + [:returnType="abstract-float";textureType="texture_3d"] + + [:returnType="abstract-float";textureType="texture_cube"] + + [:returnType="abstract-float";textureType="texture_cube_array"] + + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-float";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-float";textureType="texture_external"] + + [:returnType="abstract-float";textureType="texture_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_1d"] + + [:returnType="abstract-int";textureType="texture_2d"] + + [:returnType="abstract-int";textureType="texture_2d_array"] + + [:returnType="abstract-int";textureType="texture_3d"] + + [:returnType="abstract-int";textureType="texture_cube"] + + [:returnType="abstract-int";textureType="texture_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_external"] + + [:returnType="abstract-int";textureType="texture_multisampled_2d"] + + [:returnType="bool";textureType="texture_1d"] + + [:returnType="bool";textureType="texture_2d"] + + [:returnType="bool";textureType="texture_2d_array"] + + [:returnType="bool";textureType="texture_3d"] + + [:returnType="bool";textureType="texture_cube"] + + [:returnType="bool";textureType="texture_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_depth_multisampled_2d"] + + [:returnType="bool";textureType="texture_external"] + + [:returnType="bool";textureType="texture_multisampled_2d"] + + [:returnType="f16";textureType="texture_1d"] + + [:returnType="f16";textureType="texture_2d"] + + [:returnType="f16";textureType="texture_2d_array"] + + [:returnType="f16";textureType="texture_3d"] + + [:returnType="f16";textureType="texture_cube"] + + [:returnType="f16";textureType="texture_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_depth_multisampled_2d"] + + [:returnType="f16";textureType="texture_external"] + + [:returnType="f16";textureType="texture_multisampled_2d"] + + [:returnType="f32";textureType="texture_1d"] + + [:returnType="f32";textureType="texture_2d"] + + [:returnType="f32";textureType="texture_2d_array"] + + [:returnType="f32";textureType="texture_3d"] + + [:returnType="f32";textureType="texture_cube"] + + [:returnType="f32";textureType="texture_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_cube"] + + [:returnType="f32";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_depth_multisampled_2d"] + + [:returnType="f32";textureType="texture_external"] + + [:returnType="f32";textureType="texture_multisampled_2d"] + + [:returnType="i32";textureType="texture_1d"] + + [:returnType="i32";textureType="texture_2d"] + + [:returnType="i32";textureType="texture_2d_array"] + + [:returnType="i32";textureType="texture_3d"] + + [:returnType="i32";textureType="texture_cube"] + + [:returnType="i32";textureType="texture_cube_array"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="i32";textureType="texture_depth_multisampled_2d"] + + [:returnType="i32";textureType="texture_external"] + + [:returnType="i32";textureType="texture_multisampled_2d"] + + [:returnType="u32";textureType="texture_1d"] + + [:returnType="u32";textureType="texture_2d"] + + [:returnType="u32";textureType="texture_2d_array"] + + [:returnType="u32";textureType="texture_3d"] + + [:returnType="u32";textureType="texture_cube"] + + [:returnType="u32";textureType="texture_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_depth_multisampled_2d"] + + [:returnType="u32";textureType="texture_external"] + + [:returnType="u32";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec2%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_multisampled_2d"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,storage:*] + [:returnType="abstract-float";textureType="texture_storage_1d"] + + [:returnType="abstract-float";textureType="texture_storage_2d"] + + [:returnType="abstract-float";textureType="texture_storage_2d_array"] + + [:returnType="abstract-float";textureType="texture_storage_3d"] + + [:returnType="abstract-int";textureType="texture_storage_1d"] + + [:returnType="abstract-int";textureType="texture_storage_2d"] + + [:returnType="abstract-int";textureType="texture_storage_2d_array"] + + [:returnType="abstract-int";textureType="texture_storage_3d"] + + [:returnType="bool";textureType="texture_storage_1d"] + + [:returnType="bool";textureType="texture_storage_2d"] + + [:returnType="bool";textureType="texture_storage_2d_array"] + + [:returnType="bool";textureType="texture_storage_3d"] + + [:returnType="f16";textureType="texture_storage_1d"] + + [:returnType="f16";textureType="texture_storage_2d"] + + [:returnType="f16";textureType="texture_storage_2d_array"] + + [:returnType="f16";textureType="texture_storage_3d"] + + [:returnType="f32";textureType="texture_storage_1d"] + + [:returnType="f32";textureType="texture_storage_2d"] + + [:returnType="f32";textureType="texture_storage_2d_array"] + + [:returnType="f32";textureType="texture_storage_3d"] + + [:returnType="i32";textureType="texture_storage_1d"] + + [:returnType="i32";textureType="texture_storage_2d"] + + [:returnType="i32";textureType="texture_storage_2d_array"] + + [:returnType="i32";textureType="texture_storage_3d"] + + [:returnType="u32";textureType="texture_storage_1d"] + + [:returnType="u32";textureType="texture_storage_2d"] + + [:returnType="u32";textureType="texture_storage_2d_array"] + + [:returnType="u32";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_storage_3d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_storage_1d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_storage_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_storage_3d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_storage_1d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_storage_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_storage_3d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_storage_1d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_storage_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_storage_3d"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureDimensions:texture_type,non_storage:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:array_index_argument:*] + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:component_argument,non_const:*] + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="u"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";varType="u"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:component_argument:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] + [:textureType="texture_2d";componentType="abstract-float";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="abstract-float";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="abstract-float";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="abstract-int";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="abstract-int";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="abstract-int";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="bool";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="bool";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="bool";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="f16";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="f16";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="f16";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="f32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="f32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="f32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="i32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="i32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="i32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="u32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="u32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="u32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-float";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-float";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-float";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-int";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-int";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="abstract-int";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="bool";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="bool";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="bool";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="f16";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="f16";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="f16";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="f32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="f32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="f32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="i32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="i32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="i32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="u32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="u32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="u32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="abstract-float";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="abstract-float";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="abstract-float";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="abstract-int";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="abstract-int";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="abstract-int";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="bool";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="bool";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="bool";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="f16";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="f16";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="f16";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="f32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="f32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="f32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="i32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="i32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="i32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="u32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="u32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="u32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-float";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-float";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-float";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-int";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-int";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="abstract-int";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="bool";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="bool";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="bool";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="f16";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="f16";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="f16";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="f32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="f32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="f32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="i32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="i32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="i32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="u32";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="u32";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="u32";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec2%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec3%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-float%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cabstract-int%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cbool%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf16%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cf32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Ci32%3E";sampleType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";componentType="vec4%3Cu32%3E";sampleType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:coords_argument:*] + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="abstract-float"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="abstract-int"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="bool"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="f16"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="f32"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="i32"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="u32"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="abstract-float"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="abstract-int"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="bool"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="f16"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="f32"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="i32"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="u32"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Ci32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="bool"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="f16"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="f32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="i32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="u32"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array";sampleType="vec4%3Cu32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="bool"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="f16"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="f32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="i32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="u32"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument,non_const:*] + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";varType="u"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="l"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";varType="u"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";varType="u"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";varType="l"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument:*] + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="bool"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="f16"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="f32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="i32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="u32"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Ci32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="bool"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="f16"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="f32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="i32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="u32"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array";sampleType="vec4%3Cu32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:return_type:*] + [:returnType="abstract-float";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-float";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-float";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-float";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-int";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-int";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-int";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="bool";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="bool";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="bool";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="bool";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="bool";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="bool";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="bool";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="bool";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="bool";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="f16";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="f16";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="f16";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="f16";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="f16";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="f16";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="f16";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="f16";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="f16";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="f32";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="f32";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="f32";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="f32";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="f32";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="f32";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="f32";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="f32";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="f32";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="i32";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="i32";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="i32";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="i32";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="i32";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="i32";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="i32";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="i32";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="i32";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="u32";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="u32";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="u32";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="u32";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="u32";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="u32";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="u32";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="u32";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="u32";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Ci32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array";sampleType="vec4%3Cu32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube";sampleType="vec4%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array";sampleType="vec4%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGather:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_2d";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d";textureType="texture_2d";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_cube";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_cube";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube_array";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d";offset=true] + + [:testTextureType="texture_external";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_external";textureType="texture_cube";offset=false] + + [:testTextureType="texture_external";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:array_index_argument:*] + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="bool"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:coords_argument:*] + [:textureType="texture_depth_2d";coordType="abstract-float"] + + [:textureType="texture_depth_2d";coordType="abstract-int"] + + [:textureType="texture_depth_2d";coordType="bool"] + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + + [:textureType="texture_depth_2d";coordType="i32"] + + [:textureType="texture_depth_2d";coordType="u32"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + + [:textureType="texture_depth_2d_array";coordType="bool"] + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + + [:textureType="texture_depth_2d_array";coordType="i32"] + + [:textureType="texture_depth_2d_array";coordType="u32"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="abstract-float"] + + [:textureType="texture_depth_cube";coordType="abstract-int"] + + [:textureType="texture_depth_cube";coordType="bool"] + + [:textureType="texture_depth_cube";coordType="f16"] + + [:textureType="texture_depth_cube";coordType="f32"] + + [:textureType="texture_depth_cube";coordType="i32"] + + [:textureType="texture_depth_cube";coordType="u32"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="abstract-float"] + + [:textureType="texture_depth_cube_array";coordType="abstract-int"] + + [:textureType="texture_depth_cube_array";coordType="bool"] + + [:textureType="texture_depth_cube_array";coordType="f16"] + + [:textureType="texture_depth_cube_array";coordType="f32"] + + [:textureType="texture_depth_cube_array";coordType="i32"] + + [:textureType="texture_depth_cube_array";coordType="u32"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:depth_ref_argument:*] + [:textureType="texture_depth_2d";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="bool"] + + [:textureType="texture_depth_2d";depthRefType="f16"] + + [:textureType="texture_depth_2d";depthRefType="f32"] + + [:textureType="texture_depth_2d";depthRefType="i32"] + + [:textureType="texture_depth_2d";depthRefType="u32"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d_array";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="bool"] + + [:textureType="texture_depth_2d_array";depthRefType="f16"] + + [:textureType="texture_depth_2d_array";depthRefType="f32"] + + [:textureType="texture_depth_2d_array";depthRefType="i32"] + + [:textureType="texture_depth_2d_array";depthRefType="u32"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="bool"] + + [:textureType="texture_depth_cube";depthRefType="f16"] + + [:textureType="texture_depth_cube";depthRefType="f32"] + + [:textureType="texture_depth_cube";depthRefType="i32"] + + [:textureType="texture_depth_cube";depthRefType="u32"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube_array";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="bool"] + + [:textureType="texture_depth_cube_array";depthRefType="f16"] + + [:textureType="texture_depth_cube_array";depthRefType="f32"] + + [:textureType="texture_depth_cube_array";depthRefType="i32"] + + [:textureType="texture_depth_cube_array";depthRefType="u32"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument,non_const:*] + [:textureType="texture_depth_2d";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";varType="l"] + + [:textureType="texture_depth_2d";varType="u"] + + [:textureType="texture_depth_2d_array";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";varType="l"] + + [:textureType="texture_depth_2d_array";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument:*] + [:textureType="texture_depth_2d";offsetType="abstract-float"] + + [:textureType="texture_depth_2d";offsetType="abstract-int"] + + [:textureType="texture_depth_2d";offsetType="bool"] + + [:textureType="texture_depth_2d";offsetType="f16"] + + [:textureType="texture_depth_2d";offsetType="f32"] + + [:textureType="texture_depth_2d";offsetType="i32"] + + [:textureType="texture_depth_2d";offsetType="u32"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-float"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-int"] + + [:textureType="texture_depth_2d_array";offsetType="bool"] + + [:textureType="texture_depth_2d_array";offsetType="f16"] + + [:textureType="texture_depth_2d_array";offsetType="f32"] + + [:textureType="texture_depth_2d_array";offsetType="i32"] + + [:textureType="texture_depth_2d_array";offsetType="u32"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:return_type:*] + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_cube"] + + [:returnType="f32";textureType="texture_depth_cube_array"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureGatherCompare:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube_array";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:array_index_argument,non_storage:*] + [:textureType="texture_2d_array";arrayIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array";arrayIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="f16"] + + [:textureType="texture_2d_array";arrayIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="i32"] + + [:textureType="texture_2d_array";arrayIndexType="u32"] + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";arrayIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:array_index_argument,storage:*] + [:textureType="texture_storage_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_storage_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_storage_2d_array";arrayIndexType="bool"] + + [:textureType="texture_storage_2d_array";arrayIndexType="f16"] + + [:textureType="texture_storage_2d_array";arrayIndexType="f32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="i32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="u32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,non_storage:*] + [:textureType="texture_1d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="abstract-int"] + + [:textureType="texture_1d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="f16"] + + [:textureType="texture_1d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="i32"] + + [:textureType="texture_1d";coordType="u32"] + + [:textureType="texture_1d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_1d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_1d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_1d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="f16"] + + [:textureType="texture_2d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="f16"] + + [:textureType="texture_2d_array";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="f16"] + + [:textureType="texture_3d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_3d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_3d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_3d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_3d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_3d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_3d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="f16"] + + [:textureType="texture_depth_multisampled_2d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="abstract-float"] + + [:textureType="texture_external";coordType="abstract-int"] + + [:textureType="texture_external";coordType="bool"] + + [:textureType="texture_external";coordType="f16"] + + [:textureType="texture_external";coordType="f32"] + + [:textureType="texture_external";coordType="i32"] + + [:textureType="texture_external";coordType="u32"] + + [:textureType="texture_external";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_external";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_external";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_external";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_external";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_external";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_external";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_external";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_external";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_external";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_external";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_external";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_multisampled_2d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="f16"] + + [:textureType="texture_multisampled_2d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,storage:*] + [:textureType="texture_storage_1d";coordType="abstract-float"] + + [:textureType="texture_storage_1d";coordType="abstract-int"] + + [:textureType="texture_storage_1d";coordType="bool"] + + [:textureType="texture_storage_1d";coordType="f16"] + + [:textureType="texture_storage_1d";coordType="f32"] + + [:textureType="texture_storage_1d";coordType="i32"] + + [:textureType="texture_storage_1d";coordType="u32"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="abstract-float"] + + [:textureType="texture_storage_2d";coordType="abstract-int"] + + [:textureType="texture_storage_2d";coordType="bool"] + + [:textureType="texture_storage_2d";coordType="f16"] + + [:textureType="texture_storage_2d";coordType="f32"] + + [:textureType="texture_storage_2d";coordType="i32"] + + [:textureType="texture_storage_2d";coordType="u32"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="abstract-float"] + + [:textureType="texture_storage_2d_array";coordType="abstract-int"] + + [:textureType="texture_storage_2d_array";coordType="bool"] + + [:textureType="texture_storage_2d_array";coordType="f16"] + + [:textureType="texture_storage_2d_array";coordType="f32"] + + [:textureType="texture_storage_2d_array";coordType="i32"] + + [:textureType="texture_storage_2d_array";coordType="u32"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="abstract-float"] + + [:textureType="texture_storage_3d";coordType="abstract-int"] + + [:textureType="texture_storage_3d";coordType="bool"] + + [:textureType="texture_storage_3d";coordType="f16"] + + [:textureType="texture_storage_3d";coordType="f32"] + + [:textureType="texture_storage_3d";coordType="i32"] + + [:textureType="texture_storage_3d";coordType="u32"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:level_argument,non_storage:*] + [:textureType="texture_1d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="abstract-int"] + + [:textureType="texture_1d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="f16"] + + [:textureType="texture_1d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="i32"] + + [:textureType="texture_1d";levelType="u32"] + + [:textureType="texture_1d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_1d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="abstract-int"] + + [:textureType="texture_2d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="f16"] + + [:textureType="texture_2d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="i32"] + + [:textureType="texture_2d";levelType="u32"] + + [:textureType="texture_2d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="abstract-int"] + + [:textureType="texture_2d_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="f16"] + + [:textureType="texture_2d_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="i32"] + + [:textureType="texture_2d_array";levelType="u32"] + + [:textureType="texture_2d_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="abstract-int"] + + [:textureType="texture_3d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="f16"] + + [:textureType="texture_3d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="i32"] + + [:textureType="texture_3d";levelType="u32"] + + [:textureType="texture_3d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_3d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="abstract-int"] + + [:textureType="texture_depth_2d";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="f16"] + + [:textureType="texture_depth_2d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="i32"] + + [:textureType="texture_depth_2d";levelType="u32"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="abstract-int"] + + [:textureType="texture_depth_2d_array";levelType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="f16"] + + [:textureType="texture_depth_2d_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="i32"] + + [:textureType="texture_depth_2d_array";levelType="u32"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:return_type,non_storage:*] + [:returnType="abstract-float";textureType="texture_1d"] + + [:returnType="abstract-float";textureType="texture_2d"] + + [:returnType="abstract-float";textureType="texture_2d_array"] + + [:returnType="abstract-float";textureType="texture_3d"] + + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-float";textureType="texture_external"] + + [:returnType="abstract-float";textureType="texture_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_1d"] + + [:returnType="abstract-int";textureType="texture_2d"] + + [:returnType="abstract-int";textureType="texture_2d_array"] + + [:returnType="abstract-int";textureType="texture_3d"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_external"] + + [:returnType="abstract-int";textureType="texture_multisampled_2d"] + + [:returnType="bool";textureType="texture_1d"] + + [:returnType="bool";textureType="texture_2d"] + + [:returnType="bool";textureType="texture_2d_array"] + + [:returnType="bool";textureType="texture_3d"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_multisampled_2d"] + + [:returnType="bool";textureType="texture_external"] + + [:returnType="bool";textureType="texture_multisampled_2d"] + + [:returnType="f16";textureType="texture_1d"] + + [:returnType="f16";textureType="texture_2d"] + + [:returnType="f16";textureType="texture_2d_array"] + + [:returnType="f16";textureType="texture_3d"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_multisampled_2d"] + + [:returnType="f16";textureType="texture_external"] + + [:returnType="f16";textureType="texture_multisampled_2d"] + + [:returnType="f32";textureType="texture_1d"] + + [:returnType="f32";textureType="texture_2d"] + + [:returnType="f32";textureType="texture_2d_array"] + + [:returnType="f32";textureType="texture_3d"] + + [:returnType="f32";textureType="texture_depth_2d"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_multisampled_2d"] + + [:returnType="f32";textureType="texture_external"] + + [:returnType="f32";textureType="texture_multisampled_2d"] + + [:returnType="i32";textureType="texture_1d"] + + [:returnType="i32";textureType="texture_2d"] + + [:returnType="i32";textureType="texture_2d_array"] + + [:returnType="i32";textureType="texture_3d"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_multisampled_2d"] + + [:returnType="i32";textureType="texture_external"] + + [:returnType="i32";textureType="texture_multisampled_2d"] + + [:returnType="u32";textureType="texture_1d"] + + [:returnType="u32";textureType="texture_2d"] + + [:returnType="u32";textureType="texture_2d_array"] + + [:returnType="u32";textureType="texture_3d"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_multisampled_2d"] + + [:returnType="u32";textureType="texture_external"] + + [:returnType="u32";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_multisampled_2d"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:sample_index_argument,non_storage:*] + [:textureType="texture_depth_multisampled_2d";sampleIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="abstract-int"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="f16"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="i32"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="u32"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_multisampled_2d";sampleIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="abstract-int"] + + [:textureType="texture_multisampled_2d";sampleIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="f16"] + + [:textureType="texture_multisampled_2d";sampleIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="i32"] + + [:textureType="texture_multisampled_2d";sampleIndexType="u32"] + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d";sampleIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,non_storage:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,storage:*] + expected: + if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,non_storage:*] + [:returnType="abstract-float";textureType="texture_2d_array"] + + [:returnType="abstract-float";textureType="texture_cube_array"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_2d_array"] + + [:returnType="abstract-int";textureType="texture_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_2d_array"] + + [:returnType="bool";textureType="texture_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_2d_array"] + + [:returnType="f16";textureType="texture_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_2d_array"] + + [:returnType="f32";textureType="texture_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_cube_array"] + + [:returnType="i32";textureType="texture_2d_array"] + + [:returnType="i32";textureType="texture_cube_array"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_2d_array"] + + [:returnType="u32";textureType="texture_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,storage:*] + [:returnType="abstract-float";textureType="texture_storage_2d_array"] + + [:returnType="abstract-int";textureType="texture_storage_2d_array"] + + [:returnType="bool";textureType="texture_storage_2d_array"] + + [:returnType="f16";textureType="texture_storage_2d_array"] + + [:returnType="f32";textureType="texture_storage_2d_array"] + + [:returnType="i32";textureType="texture_storage_2d_array"] + + [:returnType="u32";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_storage_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_storage_2d_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLayers:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:return_type:*] + [:returnType="abstract-float";textureType="texture_1d"] + + [:returnType="abstract-float";textureType="texture_2d"] + + [:returnType="abstract-float";textureType="texture_2d_array"] + + [:returnType="abstract-float";textureType="texture_3d"] + + [:returnType="abstract-float";textureType="texture_cube"] + + [:returnType="abstract-float";textureType="texture_cube_array"] + + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_1d"] + + [:returnType="abstract-int";textureType="texture_2d"] + + [:returnType="abstract-int";textureType="texture_2d_array"] + + [:returnType="abstract-int";textureType="texture_3d"] + + [:returnType="abstract-int";textureType="texture_cube"] + + [:returnType="abstract-int";textureType="texture_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_1d"] + + [:returnType="bool";textureType="texture_2d"] + + [:returnType="bool";textureType="texture_2d_array"] + + [:returnType="bool";textureType="texture_3d"] + + [:returnType="bool";textureType="texture_cube"] + + [:returnType="bool";textureType="texture_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_1d"] + + [:returnType="f16";textureType="texture_2d"] + + [:returnType="f16";textureType="texture_2d_array"] + + [:returnType="f16";textureType="texture_3d"] + + [:returnType="f16";textureType="texture_cube"] + + [:returnType="f16";textureType="texture_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_1d"] + + [:returnType="f32";textureType="texture_2d"] + + [:returnType="f32";textureType="texture_2d_array"] + + [:returnType="f32";textureType="texture_3d"] + + [:returnType="f32";textureType="texture_cube"] + + [:returnType="f32";textureType="texture_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_cube"] + + [:returnType="f32";textureType="texture_depth_cube_array"] + + [:returnType="i32";textureType="texture_1d"] + + [:returnType="i32";textureType="texture_2d"] + + [:returnType="i32";textureType="texture_2d_array"] + + [:returnType="i32";textureType="texture_3d"] + + [:returnType="i32";textureType="texture_cube"] + + [:returnType="i32";textureType="texture_cube_array"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_1d"] + + [:returnType="u32";textureType="texture_2d"] + + [:returnType="u32";textureType="texture_2d_array"] + + [:returnType="u32";textureType="texture_3d"] + + [:returnType="u32";textureType="texture_cube"] + + [:returnType="u32";textureType="texture_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_1d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumLevels:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:return_type:*] + [:returnType="abstract-float";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-float";textureType="texture_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_depth_multisampled_2d"] + + [:returnType="abstract-int";textureType="texture_multisampled_2d"] + + [:returnType="bool";textureType="texture_depth_multisampled_2d"] + + [:returnType="bool";textureType="texture_multisampled_2d"] + + [:returnType="f16";textureType="texture_depth_multisampled_2d"] + + [:returnType="f16";textureType="texture_multisampled_2d"] + + [:returnType="f32";textureType="texture_depth_multisampled_2d"] + + [:returnType="f32";textureType="texture_multisampled_2d"] + + [:returnType="i32";textureType="texture_depth_multisampled_2d"] + + [:returnType="i32";textureType="texture_multisampled_2d"] + + [:returnType="u32";textureType="texture_depth_multisampled_2d"] + + [:returnType="u32";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_multisampled_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_multisampled_2d"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureNumSamples:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:array_index_argument:*] + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_cube_array";arrayIndexType="bool"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="i32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="u32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:coords_argument:*] + [:textureType="texture_1d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_1d%3Cf32%3E";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_1d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_1d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_1d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_1d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_1d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="abstract-float"] + + [:textureType="texture_depth_2d";coordType="abstract-int"] + + [:textureType="texture_depth_2d";coordType="bool"] + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + + [:textureType="texture_depth_2d";coordType="i32"] + + [:textureType="texture_depth_2d";coordType="u32"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + + [:textureType="texture_depth_2d_array";coordType="bool"] + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + + [:textureType="texture_depth_2d_array";coordType="i32"] + + [:textureType="texture_depth_2d_array";coordType="u32"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="abstract-float"] + + [:textureType="texture_depth_cube";coordType="abstract-int"] + + [:textureType="texture_depth_cube";coordType="bool"] + + [:textureType="texture_depth_cube";coordType="f16"] + + [:textureType="texture_depth_cube";coordType="f32"] + + [:textureType="texture_depth_cube";coordType="i32"] + + [:textureType="texture_depth_cube";coordType="u32"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="abstract-float"] + + [:textureType="texture_depth_cube_array";coordType="abstract-int"] + + [:textureType="texture_depth_cube_array";coordType="bool"] + + [:textureType="texture_depth_cube_array";coordType="f16"] + + [:textureType="texture_depth_cube_array";coordType="f32"] + + [:textureType="texture_depth_cube_array";coordType="i32"] + + [:textureType="texture_depth_cube_array";coordType="u32"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument,non_const:*] + [:textureType="texture_2d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";varType="l"] + + [:textureType="texture_2d%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="u"] + + [:textureType="texture_3d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";varType="l"] + + [:textureType="texture_3d%3Cf32%3E";varType="u"] + + [:textureType="texture_depth_2d";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";varType="l"] + + [:textureType="texture_depth_2d";varType="u"] + + [:textureType="texture_depth_2d_array";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";varType="l"] + + [:textureType="texture_depth_2d_array";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument:*] + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="abstract-float"] + + [:textureType="texture_depth_2d";offsetType="abstract-int"] + + [:textureType="texture_depth_2d";offsetType="bool"] + + [:textureType="texture_depth_2d";offsetType="f16"] + + [:textureType="texture_depth_2d";offsetType="f32"] + + [:textureType="texture_depth_2d";offsetType="i32"] + + [:textureType="texture_depth_2d";offsetType="u32"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-float"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-int"] + + [:textureType="texture_depth_2d_array";offsetType="bool"] + + [:textureType="texture_depth_2d_array";offsetType="f16"] + + [:textureType="texture_depth_2d_array";offsetType="f32"] + + [:textureType="texture_depth_2d_array";offsetType="i32"] + + [:textureType="texture_depth_2d_array";offsetType="u32"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:only_in_fragment:*] + [:textureType="texture_1d%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_1d%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_1d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_1d%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_1d%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_2d";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_depth_2d";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_2d";entryPoint="fragment";offset=true] + + [:textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="none";offset=false] + + [:textureType="texture_depth_2d";entryPoint="none";offset=true] + + [:textureType="texture_depth_2d";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="fragment";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="none";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="none";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_cube";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_cube";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="none";offset=false] + + [:textureType="texture_depth_cube";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="none";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:return_type:*] + [:returnType="abstract-float";textureType="texture_1d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_1d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_1d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_3d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_1d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_1d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_depth_2d"] + + [:returnType="f32";textureType="texture_depth_2d_array"] + + [:returnType="f32";textureType="texture_depth_cube"] + + [:returnType="f32";textureType="texture_depth_cube_array"] + + [:returnType="i32";textureType="texture_1d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_1d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_1d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSample:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_2d_array";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_3d%3Cf32%3E";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_cube";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_cube_array";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_external";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_external";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_external";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_external";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_external";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_1d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_2d_array";offset=true] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube";offset=false] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_depth_cube_array";offset=false] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:coords_argument:*] + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_external";coordType="abstract-float"] + + [:textureType="texture_external";coordType="abstract-int"] + + [:textureType="texture_external";coordType="bool"] + + [:textureType="texture_external";coordType="f16"] + + [:textureType="texture_external";coordType="f32"] + + [:textureType="texture_external";coordType="i32"] + + [:textureType="texture_external";coordType="u32"] + + [:textureType="texture_external";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_external";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_external";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_external";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_external";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_external";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_external";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_external";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_external";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_external";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_external";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_external";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_external";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_external";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_external";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:must_use:*] + [:use=false] + + [:use=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:return_type:*] + [:returnType="abstract-float";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_external"] + + [:returnType="abstract-int";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_external"] + + [:returnType="bool";textureType="texture_2d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_external"] + + [:returnType="f16";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_external"] + + [:returnType="f32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_external"] + + [:returnType="i32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_external"] + + [:returnType="u32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_external"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_external"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_external"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_external"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_external"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_external"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_external"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:array_index_argument:*] + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:bias_argument:*] + [:textureType="texture_2d%3Cf32%3E";biasType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";biasType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";biasType="bool"] + + [:textureType="texture_2d%3Cf32%3E";biasType="f16"] + + [:textureType="texture_2d%3Cf32%3E";biasType="f32"] + + [:textureType="texture_2d%3Cf32%3E";biasType="i32"] + + [:textureType="texture_2d%3Cf32%3E";biasType="u32"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";biasType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";biasType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";biasType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";biasType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";biasType="bool"] + + [:textureType="texture_3d%3Cf32%3E";biasType="f16"] + + [:textureType="texture_3d%3Cf32%3E";biasType="f32"] + + [:textureType="texture_3d%3Cf32%3E";biasType="i32"] + + [:textureType="texture_3d%3Cf32%3E";biasType="u32"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";biasType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:coords_argument:*] + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument,non_const:*] + [:textureType="texture_2d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";varType="l"] + + [:textureType="texture_2d%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="u"] + + [:textureType="texture_3d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";varType="l"] + + [:textureType="texture_3d%3Cf32%3E";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument:*] + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:only_in_fragment:*] + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="none";offset=true] + + [:textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_cube%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="fragment";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="none";offset=false] + + [:textureType="texture_cube_array%3Cf32%3E";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:return_type:*] + [:returnType="abstract-float";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_3d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleBias:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:array_index_argument:*] + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-int"] + + [:textureType="texture_depth_cube_array";arrayIndexType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="i32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="u32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:coords_argument:*] + [:textureType="texture_depth_2d";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="f16"] + + [:textureType="texture_depth_cube";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="f16"] + + [:textureType="texture_depth_cube_array";coordType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:depth_ref_argument:*] + [:textureType="texture_depth_2d";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d";depthRefType="abstract-int"] + + [:textureType="texture_depth_2d";depthRefType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="f16"] + + [:textureType="texture_depth_2d";depthRefType="f32"] + + [:textureType="texture_depth_2d";depthRefType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d_array";depthRefType="abstract-int"] + + [:textureType="texture_depth_2d_array";depthRefType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="f16"] + + [:textureType="texture_depth_2d_array";depthRefType="f32"] + + [:textureType="texture_depth_2d_array";depthRefType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube";depthRefType="abstract-int"] + + [:textureType="texture_depth_cube";depthRefType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="f16"] + + [:textureType="texture_depth_cube";depthRefType="f32"] + + [:textureType="texture_depth_cube";depthRefType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube_array";depthRefType="abstract-int"] + + [:textureType="texture_depth_cube_array";depthRefType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="f16"] + + [:textureType="texture_depth_cube_array";depthRefType="f32"] + + [:textureType="texture_depth_cube_array";depthRefType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument,non_const:*] + [:textureType="texture_depth_2d";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";varType="l"] + + [:textureType="texture_depth_2d";varType="u"] + + [:textureType="texture_depth_2d_array";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";varType="l"] + + [:textureType="texture_depth_2d_array";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument:*] + [:textureType="texture_depth_2d";offsetType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="f16"] + + [:textureType="texture_depth_2d";offsetType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="f16"] + + [:textureType="texture_depth_2d_array";offsetType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:only_in_fragment:*] + [:textureType="texture_depth_2d";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_2d";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_depth_2d";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_2d";entryPoint="fragment";offset=true] + + [:textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="none";offset=false] + + [:textureType="texture_depth_2d";entryPoint="none";offset=true] + + [:textureType="texture_depth_2d";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="compute_without_call";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="fragment";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="fragment_and_compute";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="none";offset=false] + + [:textureType="texture_depth_2d_array";entryPoint="none";offset=true] + + [:textureType="texture_depth_2d_array";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";entryPoint="vertex";offset=true] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_cube";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_cube";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";entryPoint="none";offset=false] + + [:textureType="texture_depth_cube";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="compute_without_call";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="fragment";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="fragment_and_compute";offset=false] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";entryPoint="none";offset=false] + + [:textureType="texture_depth_cube_array";entryPoint="vertex";offset=false] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:return_type:*] + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompare:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:array_index_argument:*] + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="bool"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:coords_argument:*] + [:textureType="texture_depth_2d";coordType="abstract-float"] + + [:textureType="texture_depth_2d";coordType="abstract-int"] + + [:textureType="texture_depth_2d";coordType="bool"] + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + + [:textureType="texture_depth_2d";coordType="i32"] + + [:textureType="texture_depth_2d";coordType="u32"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + + [:textureType="texture_depth_2d_array";coordType="bool"] + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + + [:textureType="texture_depth_2d_array";coordType="i32"] + + [:textureType="texture_depth_2d_array";coordType="u32"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="abstract-float"] + + [:textureType="texture_depth_cube";coordType="abstract-int"] + + [:textureType="texture_depth_cube";coordType="bool"] + + [:textureType="texture_depth_cube";coordType="f16"] + + [:textureType="texture_depth_cube";coordType="f32"] + + [:textureType="texture_depth_cube";coordType="i32"] + + [:textureType="texture_depth_cube";coordType="u32"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="abstract-float"] + + [:textureType="texture_depth_cube_array";coordType="abstract-int"] + + [:textureType="texture_depth_cube_array";coordType="bool"] + + [:textureType="texture_depth_cube_array";coordType="f16"] + + [:textureType="texture_depth_cube_array";coordType="f32"] + + [:textureType="texture_depth_cube_array";coordType="i32"] + + [:textureType="texture_depth_cube_array";coordType="u32"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:depth_ref_argument:*] + [:textureType="texture_depth_2d";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";depthRefType="bool"] + + [:textureType="texture_depth_2d";depthRefType="f16"] + + [:textureType="texture_depth_2d";depthRefType="f32"] + + [:textureType="texture_depth_2d";depthRefType="i32"] + + [:textureType="texture_depth_2d";depthRefType="u32"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_2d_array";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";depthRefType="bool"] + + [:textureType="texture_depth_2d_array";depthRefType="f16"] + + [:textureType="texture_depth_2d_array";depthRefType="f32"] + + [:textureType="texture_depth_2d_array";depthRefType="i32"] + + [:textureType="texture_depth_2d_array";depthRefType="u32"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";depthRefType="bool"] + + [:textureType="texture_depth_cube";depthRefType="f16"] + + [:textureType="texture_depth_cube";depthRefType="f32"] + + [:textureType="texture_depth_cube";depthRefType="i32"] + + [:textureType="texture_depth_cube";depthRefType="u32"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";depthRefType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="abstract-float"] + + [:textureType="texture_depth_cube_array";depthRefType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";depthRefType="bool"] + + [:textureType="texture_depth_cube_array";depthRefType="f16"] + + [:textureType="texture_depth_cube_array";depthRefType="f32"] + + [:textureType="texture_depth_cube_array";depthRefType="i32"] + + [:textureType="texture_depth_cube_array";depthRefType="u32"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";depthRefType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument,non_const:*] + [:textureType="texture_depth_2d";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";varType="l"] + + [:textureType="texture_depth_2d";varType="u"] + + [:textureType="texture_depth_2d_array";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";varType="l"] + + [:textureType="texture_depth_2d_array";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument:*] + [:textureType="texture_depth_2d";offsetType="abstract-float"] + + [:textureType="texture_depth_2d";offsetType="abstract-int"] + + [:textureType="texture_depth_2d";offsetType="bool"] + + [:textureType="texture_depth_2d";offsetType="f16"] + + [:textureType="texture_depth_2d";offsetType="f32"] + + [:textureType="texture_depth_2d";offsetType="i32"] + + [:textureType="texture_depth_2d";offsetType="u32"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-float"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-int"] + + [:textureType="texture_depth_2d_array";offsetType="bool"] + + [:textureType="texture_depth_2d_array";offsetType="f16"] + + [:textureType="texture_depth_2d_array";offsetType="f32"] + + [:textureType="texture_depth_2d_array";offsetType="i32"] + + [:textureType="texture_depth_2d_array";offsetType="u32"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:return_type:*] + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:array_index_argument:*] + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:coords_argument:*] + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddX_argument:*] + [:textureType="texture_2d%3Cf32%3E";ddxType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="bool"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="f16"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="f32"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="i32"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="u32"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddxType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddxType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="bool"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="f16"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="f32"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="i32"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="u32"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddxType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="bool"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="f16"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="f32"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="i32"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="u32"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddxType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddxType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddY_argument:*] + [:textureType="texture_2d%3Cf32%3E";ddyType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="bool"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="f16"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="f32"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="i32"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="u32"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";ddyType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";ddyType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="bool"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="f16"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="f32"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="i32"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="u32"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";ddyType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="bool"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="f16"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="f32"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="i32"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="u32"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";ddyType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";ddyType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument,non_const:*] + [:textureType="texture_2d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";varType="l"] + + [:textureType="texture_2d%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="u"] + + [:textureType="texture_3d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";varType="l"] + + [:textureType="texture_3d%3Cf32%3E";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument:*] + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:return_type:*] + [:returnType="abstract-float";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_3d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleGrad:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_2d";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_2d_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_2d_array";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube";textureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_cube_array";textureType="texture_cube_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_depth_multisampled_2d";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_external";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E";textureType="texture_cube_array%3Cf32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:array_index_argument:*] + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_2d_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="bool"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f16"] + + [:textureType="texture_depth_2d_array";arrayIndexType="f32"] + + [:textureType="texture_depth_2d_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-float"] + + [:textureType="texture_depth_cube_array";arrayIndexType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="bool"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f16"] + + [:textureType="texture_depth_cube_array";arrayIndexType="f32"] + + [:textureType="texture_depth_cube_array";arrayIndexType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:coords_argument:*] + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";coordType="bool"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f16"] + + [:textureType="texture_3d%3Cf32%3E";coordType="f32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="i32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="u32"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="abstract-int"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="abstract-float"] + + [:textureType="texture_depth_2d";coordType="abstract-int"] + + [:textureType="texture_depth_2d";coordType="bool"] + + [:textureType="texture_depth_2d";coordType="f16"] + + [:textureType="texture_depth_2d";coordType="f32"] + + [:textureType="texture_depth_2d";coordType="i32"] + + [:textureType="texture_depth_2d";coordType="u32"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="abstract-float"] + + [:textureType="texture_depth_2d_array";coordType="abstract-int"] + + [:textureType="texture_depth_2d_array";coordType="bool"] + + [:textureType="texture_depth_2d_array";coordType="f16"] + + [:textureType="texture_depth_2d_array";coordType="f32"] + + [:textureType="texture_depth_2d_array";coordType="i32"] + + [:textureType="texture_depth_2d_array";coordType="u32"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="abstract-float"] + + [:textureType="texture_depth_cube";coordType="abstract-int"] + + [:textureType="texture_depth_cube";coordType="bool"] + + [:textureType="texture_depth_cube";coordType="f16"] + + [:textureType="texture_depth_cube";coordType="f32"] + + [:textureType="texture_depth_cube";coordType="i32"] + + [:textureType="texture_depth_cube";coordType="u32"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="abstract-float"] + + [:textureType="texture_depth_cube_array";coordType="abstract-int"] + + [:textureType="texture_depth_cube_array";coordType="bool"] + + [:textureType="texture_depth_cube_array";coordType="f16"] + + [:textureType="texture_depth_cube_array";coordType="f32"] + + [:textureType="texture_depth_cube_array";coordType="i32"] + + [:textureType="texture_depth_cube_array";coordType="u32"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:level_argument:*] + [:textureType="texture_2d%3Cf32%3E";levelType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";levelType="bool"] + + [:textureType="texture_2d%3Cf32%3E";levelType="f16"] + + [:textureType="texture_2d%3Cf32%3E";levelType="f32"] + + [:textureType="texture_2d%3Cf32%3E";levelType="i32"] + + [:textureType="texture_2d%3Cf32%3E";levelType="u32"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";levelType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";levelType="bool"] + + [:textureType="texture_3d%3Cf32%3E";levelType="f16"] + + [:textureType="texture_3d%3Cf32%3E";levelType="f32"] + + [:textureType="texture_3d%3Cf32%3E";levelType="i32"] + + [:textureType="texture_3d%3Cf32%3E";levelType="u32"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="abstract-float"] + + [:textureType="texture_cube%3Cf32%3E";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube%3Cf32%3E";levelType="bool"] + + [:textureType="texture_cube%3Cf32%3E";levelType="f16"] + + [:textureType="texture_cube%3Cf32%3E";levelType="f32"] + + [:textureType="texture_cube%3Cf32%3E";levelType="i32"] + + [:textureType="texture_cube%3Cf32%3E";levelType="u32"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_cube%3Cf32%3E";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="abstract-float"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_cube_array%3Cf32%3E";levelType="bool"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="f16"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="f32"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="i32"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="u32"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_cube_array%3Cf32%3E";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="bool"] + + [:textureType="texture_depth_2d";levelType="f16"] + + [:textureType="texture_depth_2d";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="bool"] + + [:textureType="texture_depth_2d_array";levelType="f16"] + + [:textureType="texture_depth_2d_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="bool"] + + [:textureType="texture_depth_cube";levelType="f16"] + + [:textureType="texture_depth_cube";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube";levelType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";levelType="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="bool"] + + [:textureType="texture_depth_cube_array";levelType="f16"] + + [:textureType="texture_depth_cube_array";levelType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_cube_array";levelType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument,non_const:*] + [:textureType="texture_2d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";varType="l"] + + [:textureType="texture_2d%3Cf32%3E";varType="u"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";varType="l"] + + [:textureType="texture_2d_array%3Cf32%3E";varType="u"] + + [:textureType="texture_3d%3Cf32%3E";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";varType="l"] + + [:textureType="texture_3d%3Cf32%3E";varType="u"] + + [:textureType="texture_depth_2d";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";varType="l"] + + [:textureType="texture_depth_2d";varType="u"] + + [:textureType="texture_depth_2d_array";varType="c"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";varType="l"] + + [:textureType="texture_depth_2d_array";varType="u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument:*] + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_2d_array%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-float"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="abstract-int"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="bool"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f16"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="f32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="i32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="u32"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_3d%3Cf32%3E";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="abstract-float"] + + [:textureType="texture_depth_2d";offsetType="abstract-int"] + + [:textureType="texture_depth_2d";offsetType="bool"] + + [:textureType="texture_depth_2d";offsetType="f16"] + + [:textureType="texture_depth_2d";offsetType="f32"] + + [:textureType="texture_depth_2d";offsetType="i32"] + + [:textureType="texture_depth_2d";offsetType="u32"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d";offsetType="vec4%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-float"] + + [:textureType="texture_depth_2d_array";offsetType="abstract-int"] + + [:textureType="texture_depth_2d_array";offsetType="bool"] + + [:textureType="texture_depth_2d_array";offsetType="f16"] + + [:textureType="texture_depth_2d_array";offsetType="f32"] + + [:textureType="texture_depth_2d_array";offsetType="i32"] + + [:textureType="texture_depth_2d_array";offsetType="u32"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_depth_2d_array";offsetType="vec2%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec3%3Cu32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cbool%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf16%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cf32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Ci32%3E"] + + [:textureType="texture_depth_2d_array";offsetType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:return_type:*] + [:returnType="abstract-float";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-float";textureType="texture_depth_2d"] + + [:returnType="abstract-float";textureType="texture_depth_2d_array"] + + [:returnType="abstract-float";textureType="texture_depth_cube"] + + [:returnType="abstract-float";textureType="texture_depth_cube_array"] + + [:returnType="abstract-int";textureType="texture_2d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_3d%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="abstract-int";textureType="texture_depth_2d"] + + [:returnType="abstract-int";textureType="texture_depth_2d_array"] + + [:returnType="abstract-int";textureType="texture_depth_cube"] + + [:returnType="abstract-int";textureType="texture_depth_cube_array"] + + [:returnType="bool";textureType="texture_2d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_3d%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube%3Cf32%3E"] + + [:returnType="bool";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="bool";textureType="texture_depth_2d"] + + [:returnType="bool";textureType="texture_depth_2d_array"] + + [:returnType="bool";textureType="texture_depth_cube"] + + [:returnType="bool";textureType="texture_depth_cube_array"] + + [:returnType="f16";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f16";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f16";textureType="texture_depth_2d"] + + [:returnType="f16";textureType="texture_depth_2d_array"] + + [:returnType="f16";textureType="texture_depth_cube"] + + [:returnType="f16";textureType="texture_depth_cube_array"] + + [:returnType="f32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="f32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="f32";textureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="f32";textureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="i32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="i32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="i32";textureType="texture_depth_2d"] + + [:returnType="i32";textureType="texture_depth_2d_array"] + + [:returnType="i32";textureType="texture_depth_cube"] + + [:returnType="i32";textureType="texture_depth_cube_array"] + + [:returnType="u32";textureType="texture_2d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_3d%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube%3Cf32%3E"] + + [:returnType="u32";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="u32";textureType="texture_depth_2d"] + + [:returnType="u32";textureType="texture_depth_2d_array"] + + [:returnType="u32";textureType="texture_depth_cube"] + + [:returnType="u32";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec2%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec3%3Cu32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-float%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cabstract-int%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cbool%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf16%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_2d_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_cube_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cf32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Ci32%3E";textureType="texture_depth_cube_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_2d_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_3d%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_cube_array%3Cf32%3E"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_2d_array"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube"] + + [:returnType="vec4%3Cu32%3E";textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureSampleLevel:texture_type:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_2d_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_cube_array"] + expected: + if os == "linux" and not debug: FAIL + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:array_index_argument:*] + [:textureType="texture_storage_2d_array";arrayIndexType="abstract-float"] + + [:textureType="texture_storage_2d_array";arrayIndexType="abstract-int"] + + [:textureType="texture_storage_2d_array";arrayIndexType="bool"] + + [:textureType="texture_storage_2d_array";arrayIndexType="f16"] + + [:textureType="texture_storage_2d_array";arrayIndexType="f32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="i32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="u32"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";arrayIndexType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:coords_argument:*] + [:textureType="texture_storage_1d";coordType="abstract-float"] + + [:textureType="texture_storage_1d";coordType="abstract-int"] + + [:textureType="texture_storage_1d";coordType="bool"] + + [:textureType="texture_storage_1d";coordType="f16"] + + [:textureType="texture_storage_1d";coordType="f32"] + + [:textureType="texture_storage_1d";coordType="i32"] + + [:textureType="texture_storage_1d";coordType="u32"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_1d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="abstract-float"] + + [:textureType="texture_storage_2d";coordType="abstract-int"] + + [:textureType="texture_storage_2d";coordType="bool"] + + [:textureType="texture_storage_2d";coordType="f16"] + + [:textureType="texture_storage_2d";coordType="f32"] + + [:textureType="texture_storage_2d";coordType="i32"] + + [:textureType="texture_storage_2d";coordType="u32"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="abstract-float"] + + [:textureType="texture_storage_2d_array";coordType="abstract-int"] + + [:textureType="texture_storage_2d_array";coordType="bool"] + + [:textureType="texture_storage_2d_array";coordType="f16"] + + [:textureType="texture_storage_2d_array";coordType="f32"] + + [:textureType="texture_storage_2d_array";coordType="i32"] + + [:textureType="texture_storage_2d_array";coordType="u32"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";coordType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="abstract-float"] + + [:textureType="texture_storage_3d";coordType="abstract-int"] + + [:textureType="texture_storage_3d";coordType="bool"] + + [:textureType="texture_storage_3d";coordType="f16"] + + [:textureType="texture_storage_3d";coordType="f32"] + + [:textureType="texture_storage_3d";coordType="i32"] + + [:textureType="texture_storage_3d";coordType="u32"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_3d";coordType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:texture_type,storage:*] + [:testTextureType="texture_1d%3Cf32%3E"] + + [:testTextureType="texture_1d%3Cu32%3E"] + + [:testTextureType="texture_2d%3Cf32%3E"] + + [:testTextureType="texture_2d%3Cu32%3E"] + + [:testTextureType="texture_2d_array%3Cf32%3E"] + + [:testTextureType="texture_2d_array%3Cu32%3E"] + + [:testTextureType="texture_3d%3Cf32%3E"] + + [:testTextureType="texture_3d%3Cu32%3E"] + + [:testTextureType="texture_cube%3Cf32%3E"] + + [:testTextureType="texture_cube%3Cu32%3E"] + + [:testTextureType="texture_cube_array%3Cf32%3E"] + + [:testTextureType="texture_cube_array%3Cu32%3E"] + + [:testTextureType="texture_depth_2d"] + + [:testTextureType="texture_depth_2d_array"] + + [:testTextureType="texture_depth_cube"] + + [:testTextureType="texture_depth_cube_array"] + + [:testTextureType="texture_depth_multisampled_2d"] + + [:testTextureType="texture_external"] + + [:testTextureType="texture_multisampled_2d%3Cf32%3E"] + + [:testTextureType="texture_multisampled_2d%3Cu32%3E"] + + [:testTextureType="texture_storage_1d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_1d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_2d_array%3Crgba8unorm,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Cr32uint,%20read%3E"] + + [:testTextureType="texture_storage_3d%3Crgba8unorm,%20read%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,textureStore:value_argument:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] + [:textureType="texture_storage_1d";valueType="abstract-float"] + + [:textureType="texture_storage_1d";valueType="abstract-int"] + + [:textureType="texture_storage_1d";valueType="bool"] + + [:textureType="texture_storage_1d";valueType="f16"] + + [:textureType="texture_storage_1d";valueType="f32"] + + [:textureType="texture_storage_1d";valueType="i32"] + + [:textureType="texture_storage_1d";valueType="u32"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_1d";valueType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_1d";valueType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_storage_1d";valueType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_1d";valueType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d";valueType="abstract-float"] + + [:textureType="texture_storage_2d";valueType="abstract-int"] + + [:textureType="texture_storage_2d";valueType="bool"] + + [:textureType="texture_storage_2d";valueType="f16"] + + [:textureType="texture_storage_2d";valueType="f32"] + + [:textureType="texture_storage_2d";valueType="i32"] + + [:textureType="texture_storage_2d";valueType="u32"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d";valueType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d";valueType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_storage_2d";valueType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d";valueType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";valueType="abstract-float"] + + [:textureType="texture_storage_2d_array";valueType="abstract-int"] + + [:textureType="texture_storage_2d_array";valueType="bool"] + + [:textureType="texture_storage_2d_array";valueType="f16"] + + [:textureType="texture_storage_2d_array";valueType="f32"] + + [:textureType="texture_storage_2d_array";valueType="i32"] + + [:textureType="texture_storage_2d_array";valueType="u32"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_2d_array";valueType="vec4%3Cu32%3E"] + + [:textureType="texture_storage_3d";valueType="abstract-float"] + + [:textureType="texture_storage_3d";valueType="abstract-int"] + + [:textureType="texture_storage_3d";valueType="bool"] + + [:textureType="texture_storage_3d";valueType="f16"] + + [:textureType="texture_storage_3d";valueType="f32"] + + [:textureType="texture_storage_3d";valueType="i32"] + + [:textureType="texture_storage_3d";valueType="u32"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cbool%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cf16%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cf32%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Ci32%3E"] + + [:textureType="texture_storage_3d";valueType="vec2%3Cu32%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cabstract-int%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cbool%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cf16%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cf32%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Ci32%3E"] + + [:textureType="texture_storage_3d";valueType="vec3%3Cu32%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Cabstract-float%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_storage_3d";valueType="vec4%3Cbool%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Cf16%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Cf32%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Ci32%3E"] + + [:textureType="texture_storage_3d";valueType="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:return:*] + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="abstract-float";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f16";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=2;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=3;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=2;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=2;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=3;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=3;output_type="f32";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f16";output_rows=4;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=2;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=3;output_cols=4] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=2] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=3] + + [:input_type="f32";input_rows=4;input_cols=4;output_type="f32";output_rows=4;output_cols=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,transpose:values:*] + [:stage="constant";type="mat2x2%3Cf16%3E"] + + [:stage="constant";type="mat2x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat2x3%3Cf16%3E"] + + [:stage="constant";type="mat2x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat2x4%3Cf16%3E"] + + [:stage="constant";type="mat2x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat3x2%3Cf16%3E"] + + [:stage="constant";type="mat3x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat3x3%3Cf16%3E"] + + [:stage="constant";type="mat3x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat3x4%3Cf16%3E"] + + [:stage="constant";type="mat3x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat4x2%3Cf16%3E"] + + [:stage="constant";type="mat4x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat4x3%3Cf16%3E"] + + [:stage="constant";type="mat4x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="mat4x4%3Cf16%3E"] + + [:stage="constant";type="mat4x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat2x2%3Cf16%3E"] + + [:stage="override";type="mat2x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat2x3%3Cf16%3E"] + + [:stage="override";type="mat2x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat2x4%3Cf16%3E"] + + [:stage="override";type="mat2x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat3x2%3Cf16%3E"] + + [:stage="override";type="mat3x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat3x3%3Cf16%3E"] + + [:stage="override";type="mat3x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat3x4%3Cf16%3E"] + + [:stage="override";type="mat3x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat4x2%3Cf16%3E"] + + [:stage="override";type="mat4x2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat4x3%3Cf16%3E"] + + [:stage="override";type="mat4x3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="mat4x4%3Cf16%3E"] + + [:stage="override";type="mat4x4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:args:*] + [:arg="bad_0args"] + + [:arg="bad_0array"] + + [:arg="bad_0bool"] + + [:arg="bad_0int"] + + [:arg="bad_0struct"] + + [:arg="bad_0uint"] + + [:arg="bad_0vec2i"] + + [:arg="bad_0vec2u"] + + [:arg="bad_0vec3i"] + + [:arg="bad_0vec3u"] + + [:arg="bad_0vec4i"] + + [:arg="bad_0vec4u"] + + [:arg="bad_2arg"] + + [:arg="bad_no_parens"] + + [:arg="good"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,trunc:values:*] + [:stage="constant";type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="f16"] + + [:stage="constant";type="f32"] + + [:stage="constant";type="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec2%3Cf16%3E"] + + [:stage="constant";type="vec2%3Cf32%3E"] + + [:stage="constant";type="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec3%3Cf16%3E"] + + [:stage="constant";type="vec3%3Cf32%3E"] + + [:stage="constant";type="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="constant";type="vec4%3Cf16%3E"] + + [:stage="constant";type="vec4%3Cf32%3E"] + + [:stage="override";type="f16"] + + [:stage="override";type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec2%3Cf16%3E"] + + [:stage="override";type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec3%3Cf16%3E"] + + [:stage="override";type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="vec4%3Cf16%3E"] + + [:stage="override";type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16float:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16snorm:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack2x16unorm:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8snorm:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4x8unorm:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:arguments:*] + [:args="bad_array"] + + [:args="bad_bool"] + + [:args="bad_f16"] + + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:must_use:*] [:] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:supported:*] [:requires=false] @@ -97573,27 +164930,53 @@ [:requires=true] -[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:bad_args:*] - [:arg="0args"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xI8:values:*] + [:stage="constant";type="abstract-int"] - [:arg="0bool"] + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL - [:arg="0f32"] + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL - [:arg="0i32"] - [:arg="0vec2u"] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:arguments:*] + [:args="bad_array"] - [:arg="0vec3u"] + [:args="bad_bool"] - [:arg="0vec4u"] + [:args="bad_f16"] - [:arg="2args"] + [:args="bad_f32"] + + [:args="bad_i32"] + + [:args="bad_more_args"] + + [:args="bad_no_args"] + + [:args="bad_vec2u"] + + [:args="bad_vec3u"] + + [:args="bad_vec4u"] + + [:args="good"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:must_use:*] [:] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + [cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:supported:*] [:requires=false] @@ -97607,6 +164990,7954 @@ [:requires=true] +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,unpack4xU8:values:*] + [:stage="constant";type="abstract-int"] + + [:stage="constant";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="override";type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:array_value:*] + [:case="f32"] + + [:case="i32"] + + [:case="invalid_atomic"] + + [:case="invalid_override_array"] + + [:case="invalid_rta"] + + [:case="invalid_struct"] + + [:case="u32"] + + [:case="valid_array"] + + [:case="valid_struct"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:array_zero_value:*] + [:case="f32"] + + [:case="i32"] + + [:case="invalid_atomic"] + + [:case="invalid_override_array"] + + [:case="invalid_rta"] + + [:case="invalid_struct"] + + [:case="u32"] + + [:case="valid_array"] + + [:case="valid_struct"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_column:*] + [:type1="abstract-float";type2="abstract-float"] + + [:type1="abstract-float";type2="bool"] + + [:type1="abstract-float";type2="f16"] + + [:type1="abstract-float";type2="f32"] + + [:type1="abstract-float";type2="i32"] + + [:type1="abstract-float";type2="u32"] + + [:type1="f16";type2="abstract-float"] + + [:type1="f16";type2="bool"] + + [:type1="f16";type2="f16"] + + [:type1="f16";type2="f32"] + + [:type1="f16";type2="i32"] + + [:type1="f16";type2="u32"] + + [:type1="f32";type2="abstract-float"] + + [:type1="f32";type2="bool"] + + [:type1="f32";type2="f16"] + + [:type1="f32";type2="f32"] + + [:type1="f32";type2="i32"] + + [:type1="f32";type2="u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_copy:*] + [:type1="abstract-float";type2="abstract-float"] + + [:type1="abstract-float";type2="f16"] + + [:type1="abstract-float";type2="f32"] + + [:type1="f16";type2="abstract-float"] + + [:type1="f16";type2="f16"] + + [:type1="f16";type2="f32"] + + [:type1="f32";type2="abstract-float"] + + [:type1="f32";type2="f16"] + + [:type1="f32";type2="f32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_elementwise:*] + [:type1="abstract-float";type2="abstract-float"] + + [:type1="abstract-float";type2="bool"] + + [:type1="abstract-float";type2="f16"] + + [:type1="abstract-float";type2="f32"] + + [:type1="abstract-float";type2="i32"] + + [:type1="abstract-float";type2="u32"] + + [:type1="f16";type2="abstract-float"] + + [:type1="f16";type2="bool"] + + [:type1="f16";type2="f16"] + + [:type1="f16";type2="f32"] + + [:type1="f16";type2="i32"] + + [:type1="f16";type2="u32"] + + [:type1="f32";type2="abstract-float"] + + [:type1="f32";type2="bool"] + + [:type1="f32";type2="f16"] + + [:type1="f32";type2="f32"] + + [:type1="f32";type2="i32"] + + [:type1="f32";type2="u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_zero_value:*] + [:type="f16"] + + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:must_use:*] + [:ctor="S";use=false] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="S";use=true] + + [:ctor="S_0";use=false] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="S_0";use=true] + + [:ctor="array";use=false] + + [:ctor="array";use=true] + + [:ctor="array_0";use=false] + + [:ctor="array_0";use=true] + + [:ctor="array_abs";use=false] + + [:ctor="array_abs";use=true] + + [:ctor="bool";use=false] + + [:ctor="bool";use=true] + + [:ctor="bool_0";use=false] + + [:ctor="bool_0";use=true] + + [:ctor="f16";use=false] + + [:ctor="f16";use=true] + + [:ctor="f16_0";use=false] + + [:ctor="f16_0";use=true] + + [:ctor="f32";use=false] + + [:ctor="f32";use=true] + + [:ctor="f32_0";use=false] + + [:ctor="f32_0";use=true] + + [:ctor="i32";use=false] + + [:ctor="i32";use=true] + + [:ctor="i32_0";use=false] + + [:ctor="i32_0";use=true] + + [:ctor="mat2x2";use=false] + + [:ctor="mat2x2";use=true] + + [:ctor="mat2x2_0";use=false] + + [:ctor="mat2x2_0";use=true] + + [:ctor="mat2x3";use=false] + + [:ctor="mat2x3";use=true] + + [:ctor="mat2x3_0";use=false] + + [:ctor="mat2x3_0";use=true] + + [:ctor="mat2x4";use=false] + + [:ctor="mat2x4";use=true] + + [:ctor="mat2x4_0";use=false] + + [:ctor="mat2x4_0";use=true] + + [:ctor="mat3x2_0";use=false] + + [:ctor="mat3x2_0";use=true] + + [:ctor="mat3x2_f16";use=false] + + [:ctor="mat3x2_f16";use=true] + + [:ctor="mat3x3_0";use=false] + + [:ctor="mat3x3_0";use=true] + + [:ctor="mat3x3_f16";use=false] + + [:ctor="mat3x3_f16";use=true] + + [:ctor="mat3x4_0";use=false] + + [:ctor="mat3x4_0";use=true] + + [:ctor="mat3x4_f16";use=false] + + [:ctor="mat3x4_f16";use=true] + + [:ctor="mat4x2";use=false] + + [:ctor="mat4x2";use=true] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="mat4x2_0_f16";use=false] + + [:ctor="mat4x2_0_f16";use=true] + + [:ctor="mat4x3";use=false] + + [:ctor="mat4x3";use=true] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="mat4x3_0_f16";use=false] + + [:ctor="mat4x3_0_f16";use=true] + + [:ctor="mat4x4";use=false] + + [:ctor="mat4x4";use=true] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="mat4x4_0_f16";use=false] + + [:ctor="mat4x4_0_f16";use=true] + + [:ctor="u32";use=false] + + [:ctor="u32";use=true] + + [:ctor="u32_0";use=false] + + [:ctor="u32_0";use=true] + + [:ctor="vec2_0";use=false] + + [:ctor="vec2_0";use=true] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="vec2f";use=false] + + [:ctor="vec2f";use=true] + + [:ctor="vec3_0";use=false] + + [:ctor="vec3_0";use=true] + expected: + if os == "linux" and not debug: FAIL + + [:ctor="vec3_f16";use=false] + + [:ctor="vec3_f16";use=true] + + [:ctor="vec4";use=false] + + [:ctor="vec4";use=true] + + [:ctor="vec4_0";use=false] + + [:ctor="vec4_0";use=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:partial_eval:*] + [:eleTy="i32";compTy="S";stage="constant"] + + [:eleTy="i32";compTy="S";stage="runtime"] + + [:eleTy="i32";compTy="array";stage="constant"] + + [:eleTy="i32";compTy="array";stage="runtime"] + + [:eleTy="i32";compTy="vec2";stage="constant"] + + [:eleTy="i32";compTy="vec2";stage="runtime"] + + [:eleTy="i32";compTy="vec3";stage="constant"] + + [:eleTy="i32";compTy="vec3";stage="runtime"] + + [:eleTy="i32";compTy="vec4";stage="constant"] + + [:eleTy="i32";compTy="vec4";stage="runtime"] + + [:eleTy="u32";compTy="S";stage="constant"] + + [:eleTy="u32";compTy="S";stage="runtime"] + + [:eleTy="u32";compTy="array";stage="constant"] + + [:eleTy="u32";compTy="array";stage="runtime"] + + [:eleTy="u32";compTy="vec2";stage="constant"] + + [:eleTy="u32";compTy="vec2";stage="runtime"] + + [:eleTy="u32";compTy="vec3";stage="constant"] + + [:eleTy="u32";compTy="vec3";stage="runtime"] + + [:eleTy="u32";compTy="vec4";stage="constant"] + + [:eleTy="u32";compTy="vec4";stage="runtime"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_value:*] + [:type="bool";value_type="S"] + + [:type="bool";value_type="array%3Cu32,%202%3E"] + + [:type="bool";value_type="bool"] + + [:type="bool";value_type="f16"] + + [:type="bool";value_type="f32"] + + [:type="bool";value_type="i32"] + + [:type="bool";value_type="u32"] + + [:type="bool";value_type="vec2u"] + + [:type="f16";value_type="S"] + + [:type="f16";value_type="array%3Cu32,%202%3E"] + + [:type="f16";value_type="bool"] + + [:type="f16";value_type="f16"] + + [:type="f16";value_type="f32"] + + [:type="f16";value_type="i32"] + + [:type="f16";value_type="u32"] + + [:type="f16";value_type="vec2u"] + + [:type="f32";value_type="S"] + + [:type="f32";value_type="array%3Cu32,%202%3E"] + + [:type="f32";value_type="bool"] + + [:type="f32";value_type="f16"] + + [:type="f32";value_type="f32"] + + [:type="f32";value_type="i32"] + + [:type="f32";value_type="u32"] + + [:type="f32";value_type="vec2u"] + + [:type="i32";value_type="S"] + + [:type="i32";value_type="array%3Cu32,%202%3E"] + + [:type="i32";value_type="bool"] + + [:type="i32";value_type="f16"] + + [:type="i32";value_type="f32"] + + [:type="i32";value_type="i32"] + + [:type="i32";value_type="u32"] + + [:type="i32";value_type="vec2u"] + + [:type="u32";value_type="S"] + + [:type="u32";value_type="array%3Cu32,%202%3E"] + + [:type="u32";value_type="bool"] + + [:type="u32";value_type="f16"] + + [:type="u32";value_type="f32"] + + [:type="u32";value_type="i32"] + + [:type="u32";value_type="u32"] + + [:type="u32";value_type="vec2u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_zero_value:*] + [:type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16"] + + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:struct_value:*] + [:case="atomic"] + + [:case="f32x2"] + + [:case="i32"] + + [:case="many_members"] + + [:case="runtime_array"] + + [:case="struct"] + + [:case="valid_array"] + + [:case="vec3u"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:struct_zero_value:*] + [:case="atomic"] + + [:case="f32x2"] + + [:case="i32"] + + [:case="many_members"] + + [:case="runtime_array"] + + [:case="struct"] + + [:case="valid_array"] + + [:case="vec3u"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_copy:*] + [:decl_type="abstract-float";value_type="abstract-float"] + + [:decl_type="abstract-float";value_type="abstract-int"] + + [:decl_type="abstract-float";value_type="bool"] + + [:decl_type="abstract-float";value_type="f16"] + + [:decl_type="abstract-float";value_type="f32"] + + [:decl_type="abstract-float";value_type="i32"] + + [:decl_type="abstract-float";value_type="u32"] + + [:decl_type="abstract-int";value_type="abstract-float"] + + [:decl_type="abstract-int";value_type="abstract-int"] + + [:decl_type="abstract-int";value_type="bool"] + + [:decl_type="abstract-int";value_type="f16"] + + [:decl_type="abstract-int";value_type="f32"] + + [:decl_type="abstract-int";value_type="i32"] + + [:decl_type="abstract-int";value_type="u32"] + + [:decl_type="bool";value_type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:decl_type="bool";value_type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:decl_type="bool";value_type="bool"] + + [:decl_type="bool";value_type="f16"] + + [:decl_type="bool";value_type="f32"] + + [:decl_type="bool";value_type="i32"] + + [:decl_type="bool";value_type="u32"] + + [:decl_type="f16";value_type="abstract-float"] + + [:decl_type="f16";value_type="abstract-int"] + + [:decl_type="f16";value_type="bool"] + + [:decl_type="f16";value_type="f16"] + + [:decl_type="f16";value_type="f32"] + + [:decl_type="f16";value_type="i32"] + + [:decl_type="f16";value_type="u32"] + + [:decl_type="f32";value_type="abstract-float"] + + [:decl_type="f32";value_type="abstract-int"] + + [:decl_type="f32";value_type="bool"] + + [:decl_type="f32";value_type="f16"] + + [:decl_type="f32";value_type="f32"] + + [:decl_type="f32";value_type="i32"] + + [:decl_type="f32";value_type="u32"] + + [:decl_type="i32";value_type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:decl_type="i32";value_type="abstract-int"] + + [:decl_type="i32";value_type="bool"] + + [:decl_type="i32";value_type="f16"] + + [:decl_type="i32";value_type="f32"] + + [:decl_type="i32";value_type="i32"] + + [:decl_type="i32";value_type="u32"] + + [:decl_type="u32";value_type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:decl_type="u32";value_type="abstract-int"] + + [:decl_type="u32";value_type="bool"] + + [:decl_type="u32";value_type="f16"] + + [:decl_type="u32";value_type="f32"] + + [:decl_type="u32";value_type="i32"] + + [:decl_type="u32";value_type="u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_elementwise:*] + [:type="abstract-float";ele_type="abstract-float"] + + [:type="abstract-float";ele_type="abstract-int"] + + [:type="abstract-float";ele_type="bool"] + + [:type="abstract-float";ele_type="f16"] + + [:type="abstract-float";ele_type="f32"] + + [:type="abstract-float";ele_type="i32"] + + [:type="abstract-float";ele_type="mat2x2f"] + + [:type="abstract-float";ele_type="mat3x3h"] + + [:type="abstract-float";ele_type="u32"] + + [:type="abstract-float";ele_type="vec2i"] + + [:type="abstract-float";ele_type="vec3f"] + + [:type="abstract-int";ele_type="abstract-float"] + + [:type="abstract-int";ele_type="abstract-int"] + + [:type="abstract-int";ele_type="bool"] + + [:type="abstract-int";ele_type="f16"] + + [:type="abstract-int";ele_type="f32"] + + [:type="abstract-int";ele_type="i32"] + + [:type="abstract-int";ele_type="mat2x2f"] + + [:type="abstract-int";ele_type="mat3x3h"] + + [:type="abstract-int";ele_type="u32"] + + [:type="abstract-int";ele_type="vec2i"] + + [:type="abstract-int";ele_type="vec3f"] + + [:type="bool";ele_type="abstract-float"] + + [:type="bool";ele_type="abstract-int"] + + [:type="bool";ele_type="bool"] + + [:type="bool";ele_type="f16"] + + [:type="bool";ele_type="f32"] + + [:type="bool";ele_type="i32"] + + [:type="bool";ele_type="mat2x2f"] + + [:type="bool";ele_type="mat3x3h"] + + [:type="bool";ele_type="u32"] + + [:type="bool";ele_type="vec2i"] + + [:type="bool";ele_type="vec3f"] + + [:type="f16";ele_type="abstract-float"] + + [:type="f16";ele_type="abstract-int"] + + [:type="f16";ele_type="bool"] + + [:type="f16";ele_type="f16"] + + [:type="f16";ele_type="f32"] + + [:type="f16";ele_type="i32"] + + [:type="f16";ele_type="mat2x2f"] + + [:type="f16";ele_type="mat3x3h"] + + [:type="f16";ele_type="u32"] + + [:type="f16";ele_type="vec2i"] + + [:type="f16";ele_type="vec3f"] + + [:type="f32";ele_type="abstract-float"] + + [:type="f32";ele_type="abstract-int"] + + [:type="f32";ele_type="bool"] + + [:type="f32";ele_type="f16"] + + [:type="f32";ele_type="f32"] + + [:type="f32";ele_type="i32"] + + [:type="f32";ele_type="mat2x2f"] + + [:type="f32";ele_type="mat3x3h"] + + [:type="f32";ele_type="u32"] + + [:type="f32";ele_type="vec2i"] + + [:type="f32";ele_type="vec3f"] + + [:type="i32";ele_type="abstract-float"] + + [:type="i32";ele_type="abstract-int"] + + [:type="i32";ele_type="bool"] + + [:type="i32";ele_type="f16"] + + [:type="i32";ele_type="f32"] + + [:type="i32";ele_type="i32"] + + [:type="i32";ele_type="mat2x2f"] + + [:type="i32";ele_type="mat3x3h"] + + [:type="i32";ele_type="u32"] + + [:type="i32";ele_type="vec2i"] + + [:type="i32";ele_type="vec3f"] + + [:type="u32";ele_type="abstract-float"] + + [:type="u32";ele_type="abstract-int"] + + [:type="u32";ele_type="bool"] + + [:type="u32";ele_type="f16"] + + [:type="u32";ele_type="f32"] + + [:type="u32";ele_type="i32"] + + [:type="u32";ele_type="mat2x2f"] + + [:type="u32";ele_type="mat3x3h"] + + [:type="u32";ele_type="u32"] + + [:type="u32";ele_type="vec2i"] + + [:type="u32";ele_type="vec3f"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_mixed:*] + [:type="abstract-float";ele_type="abstract-float"] + + [:type="abstract-float";ele_type="abstract-int"] + + [:type="abstract-float";ele_type="bool"] + + [:type="abstract-float";ele_type="f16"] + + [:type="abstract-float";ele_type="f32"] + + [:type="abstract-float";ele_type="i32"] + + [:type="abstract-float";ele_type="u32"] + + [:type="abstract-int";ele_type="abstract-float"] + + [:type="abstract-int";ele_type="abstract-int"] + + [:type="abstract-int";ele_type="bool"] + + [:type="abstract-int";ele_type="f16"] + + [:type="abstract-int";ele_type="f32"] + + [:type="abstract-int";ele_type="i32"] + + [:type="abstract-int";ele_type="u32"] + + [:type="bool";ele_type="abstract-float"] + + [:type="bool";ele_type="abstract-int"] + + [:type="bool";ele_type="bool"] + + [:type="bool";ele_type="f16"] + + [:type="bool";ele_type="f32"] + + [:type="bool";ele_type="i32"] + + [:type="bool";ele_type="u32"] + + [:type="f16";ele_type="abstract-float"] + + [:type="f16";ele_type="abstract-int"] + + [:type="f16";ele_type="bool"] + + [:type="f16";ele_type="f16"] + + [:type="f16";ele_type="f32"] + + [:type="f16";ele_type="i32"] + + [:type="f16";ele_type="u32"] + + [:type="f32";ele_type="abstract-float"] + + [:type="f32";ele_type="abstract-int"] + + [:type="f32";ele_type="bool"] + + [:type="f32";ele_type="f16"] + + [:type="f32";ele_type="f32"] + + [:type="f32";ele_type="i32"] + + [:type="f32";ele_type="u32"] + + [:type="i32";ele_type="abstract-float"] + + [:type="i32";ele_type="abstract-int"] + + [:type="i32";ele_type="bool"] + + [:type="i32";ele_type="f16"] + + [:type="i32";ele_type="f32"] + + [:type="i32";ele_type="i32"] + + [:type="i32";ele_type="u32"] + + [:type="u32";ele_type="abstract-float"] + + [:type="u32";ele_type="abstract-int"] + + [:type="u32";ele_type="bool"] + + [:type="u32";ele_type="f16"] + + [:type="u32";ele_type="f32"] + + [:type="u32";ele_type="i32"] + + [:type="u32";ele_type="u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_splat:*] + [:type="abstract-float";ele_type="abstract-float"] + + [:type="abstract-float";ele_type="abstract-int"] + + [:type="abstract-float";ele_type="bool"] + + [:type="abstract-float";ele_type="f16"] + + [:type="abstract-float";ele_type="f32"] + + [:type="abstract-float";ele_type="i32"] + + [:type="abstract-float";ele_type="mat2x2f"] + + [:type="abstract-float";ele_type="mat3x3h"] + + [:type="abstract-float";ele_type="u32"] + + [:type="abstract-float";ele_type="vec2i"] + + [:type="abstract-float";ele_type="vec3f"] + + [:type="abstract-int";ele_type="abstract-float"] + + [:type="abstract-int";ele_type="abstract-int"] + + [:type="abstract-int";ele_type="bool"] + + [:type="abstract-int";ele_type="f16"] + + [:type="abstract-int";ele_type="f32"] + + [:type="abstract-int";ele_type="i32"] + + [:type="abstract-int";ele_type="mat2x2f"] + + [:type="abstract-int";ele_type="mat3x3h"] + + [:type="abstract-int";ele_type="u32"] + + [:type="abstract-int";ele_type="vec2i"] + + [:type="abstract-int";ele_type="vec3f"] + + [:type="bool";ele_type="abstract-float"] + + [:type="bool";ele_type="abstract-int"] + + [:type="bool";ele_type="bool"] + + [:type="bool";ele_type="f16"] + + [:type="bool";ele_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";ele_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";ele_type="mat2x2f"] + + [:type="bool";ele_type="mat3x3h"] + + [:type="bool";ele_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";ele_type="vec2i"] + + [:type="bool";ele_type="vec3f"] + + [:type="f16";ele_type="abstract-float"] + + [:type="f16";ele_type="abstract-int"] + + [:type="f16";ele_type="bool"] + + [:type="f16";ele_type="f16"] + + [:type="f16";ele_type="f32"] + + [:type="f16";ele_type="i32"] + + [:type="f16";ele_type="mat2x2f"] + + [:type="f16";ele_type="mat3x3h"] + + [:type="f16";ele_type="u32"] + + [:type="f16";ele_type="vec2i"] + + [:type="f16";ele_type="vec3f"] + + [:type="f32";ele_type="abstract-float"] + + [:type="f32";ele_type="abstract-int"] + + [:type="f32";ele_type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";ele_type="f16"] + + [:type="f32";ele_type="f32"] + + [:type="f32";ele_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";ele_type="mat2x2f"] + + [:type="f32";ele_type="mat3x3h"] + + [:type="f32";ele_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f32";ele_type="vec2i"] + + [:type="f32";ele_type="vec3f"] + + [:type="i32";ele_type="abstract-float"] + + [:type="i32";ele_type="abstract-int"] + + [:type="i32";ele_type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";ele_type="f16"] + + [:type="i32";ele_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";ele_type="i32"] + + [:type="i32";ele_type="mat2x2f"] + + [:type="i32";ele_type="mat3x3h"] + + [:type="i32";ele_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32";ele_type="vec2i"] + + [:type="i32";ele_type="vec3f"] + + [:type="u32";ele_type="abstract-float"] + + [:type="u32";ele_type="abstract-int"] + + [:type="u32";ele_type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";ele_type="f16"] + + [:type="u32";ele_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";ele_type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";ele_type="mat2x2f"] + + [:type="u32";ele_type="mat3x3h"] + + [:type="u32";ele_type="u32"] + + [:type="u32";ele_type="vec2i"] + + [:type="u32";ele_type="vec3f"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,value_constructor:vector_zero_value:*] + [:type="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:type="f16"] + + [:type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:must_use:*] + [:use=false] + expected: + if os == "linux" and not debug: FAIL + + [:use=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:no_atomics:*] + [:type="AtomicStruct";call="bar()"] + + [:type="AtomicStruct";call="workgroupUniformLoad(%26wgvar)"] + + [:type="array%3Catomic%3Ci32%3E,%204%3E";call="bar()"] + + [:type="array%3Catomic%3Ci32%3E,%204%3E";call="workgroupUniformLoad(%26wgvar)"] + + [:type="atomic%3Ci32%3E";call="bar()"] + + [:type="atomic%3Ci32%3E";call="workgroupUniformLoad(%26wgvar)"] + + [:type="atomic%3Cu32%3E";call="bar()"] + + [:type="atomic%3Cu32%3E";call="workgroupUniformLoad(%26wgvar)"] + + [:type="bool";call="bar()"] + + [:type="bool";call="workgroupUniformLoad(%26wgvar)"] + + +[cts.https.html?q=webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:only_in_compute:*] + [:entry_point="compute";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute";call="workgroupUniformLoad(%26wgvar)"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute_and_fragment";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="compute_and_fragment";call="workgroupUniformLoad(%26wgvar)"] + + [:entry_point="fragment";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment";call="workgroupUniformLoad(%26wgvar)"] + + [:entry_point="fragment_without_call";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="fragment_without_call";call="workgroupUniformLoad(%26wgvar)"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="none";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="none";call="workgroupUniformLoad(%26wgvar)"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="bar()"] + expected: + if os == "linux" and not debug: FAIL + + [:entry_point="vertex";call="workgroupUniformLoad(%26wgvar)"] + + +[cts.https.html?q=webgpu:shader,validation,expression,early_evaluation:composites:*] + [:case="const_let_array_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_matrix_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_matrix_vec"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_struct_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_vector"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_let_vector_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_scalar"] + + [:case="const_vector"] + + [:case="override_let_array_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_matrix"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_matrix_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_matrix_vec"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_struct_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_vector"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_let_vector_comp"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_scalar"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_vector"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:invalid:*] + [:op="add";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="ai";test="array"] + + [:op="add";rhs="ai";test="atomic"] + + [:op="add";rhs="ai";test="bool"] + + [:op="add";rhs="ai";test="f16"] + + [:op="add";rhs="ai";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="ai";test="i32"] + + [:op="add";rhs="ai";test="matf_ai_matching"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="ai";test="matf_ai_no_matching"] + + [:op="add";rhs="ai";test="matf_size_matching"] + + [:op="add";rhs="ai";test="matf_size_no_match"] + + [:op="add";rhs="ai";test="math_size_matching"] + + [:op="add";rhs="ai";test="math_size_no_matching"] + + [:op="add";rhs="ai";test="sampler"] + + [:op="add";rhs="ai";test="struct"] + + [:op="add";rhs="ai";test="texture"] + + [:op="add";rhs="ai";test="u32"] + + [:op="add";rhs="ai";test="vec"] + + [:op="add";rhs="mat2x3f()";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="mat2x3f()";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="mat2x3f()";test="array"] + + [:op="add";rhs="mat2x3f()";test="atomic"] + + [:op="add";rhs="mat2x3f()";test="bool"] + + [:op="add";rhs="mat2x3f()";test="f16"] + + [:op="add";rhs="mat2x3f()";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add";rhs="mat2x3f()";test="i32"] + + [:op="add";rhs="mat2x3f()";test="matf_ai_matching"] + + [:op="add";rhs="mat2x3f()";test="matf_ai_no_matching"] + + [:op="add";rhs="mat2x3f()";test="matf_size_matching"] + + [:op="add";rhs="mat2x3f()";test="matf_size_no_match"] + + [:op="add";rhs="mat2x3f()";test="math_size_matching"] + + [:op="add";rhs="mat2x3f()";test="math_size_no_matching"] + + [:op="add";rhs="mat2x3f()";test="sampler"] + + [:op="add";rhs="mat2x3f()";test="struct"] + + [:op="add";rhs="mat2x3f()";test="texture"] + + [:op="add";rhs="mat2x3f()";test="u32"] + + [:op="add";rhs="mat2x3f()";test="vec"] + + [:op="add";rhs="mat2x3h()";test="af"] + + [:op="add";rhs="mat2x3h()";test="ai"] + + [:op="add";rhs="mat2x3h()";test="array"] + + [:op="add";rhs="mat2x3h()";test="atomic"] + + [:op="add";rhs="mat2x3h()";test="bool"] + + [:op="add";rhs="mat2x3h()";test="f16"] + + [:op="add";rhs="mat2x3h()";test="f32"] + + [:op="add";rhs="mat2x3h()";test="i32"] + + [:op="add";rhs="mat2x3h()";test="matf_ai_matching"] + + [:op="add";rhs="mat2x3h()";test="matf_ai_no_matching"] + + [:op="add";rhs="mat2x3h()";test="matf_size_matching"] + + [:op="add";rhs="mat2x3h()";test="matf_size_no_match"] + + [:op="add";rhs="mat2x3h()";test="math_size_matching"] + + [:op="add";rhs="mat2x3h()";test="math_size_no_matching"] + + [:op="add";rhs="mat2x3h()";test="sampler"] + + [:op="add";rhs="mat2x3h()";test="struct"] + + [:op="add";rhs="mat2x3h()";test="texture"] + + [:op="add";rhs="mat2x3h()";test="u32"] + + [:op="add";rhs="mat2x3h()";test="vec"] + + [:op="sub";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="ai";test="array"] + + [:op="sub";rhs="ai";test="atomic"] + + [:op="sub";rhs="ai";test="bool"] + + [:op="sub";rhs="ai";test="f16"] + + [:op="sub";rhs="ai";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="ai";test="i32"] + + [:op="sub";rhs="ai";test="matf_ai_matching"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="ai";test="matf_ai_no_matching"] + + [:op="sub";rhs="ai";test="matf_size_matching"] + + [:op="sub";rhs="ai";test="matf_size_no_match"] + + [:op="sub";rhs="ai";test="math_size_matching"] + + [:op="sub";rhs="ai";test="math_size_no_matching"] + + [:op="sub";rhs="ai";test="sampler"] + + [:op="sub";rhs="ai";test="struct"] + + [:op="sub";rhs="ai";test="texture"] + + [:op="sub";rhs="ai";test="u32"] + + [:op="sub";rhs="ai";test="vec"] + + [:op="sub";rhs="mat2x3f()";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="mat2x3f()";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="mat2x3f()";test="array"] + + [:op="sub";rhs="mat2x3f()";test="atomic"] + + [:op="sub";rhs="mat2x3f()";test="bool"] + + [:op="sub";rhs="mat2x3f()";test="f16"] + + [:op="sub";rhs="mat2x3f()";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="sub";rhs="mat2x3f()";test="i32"] + + [:op="sub";rhs="mat2x3f()";test="matf_ai_matching"] + + [:op="sub";rhs="mat2x3f()";test="matf_ai_no_matching"] + + [:op="sub";rhs="mat2x3f()";test="matf_size_matching"] + + [:op="sub";rhs="mat2x3f()";test="matf_size_no_match"] + + [:op="sub";rhs="mat2x3f()";test="math_size_matching"] + + [:op="sub";rhs="mat2x3f()";test="math_size_no_matching"] + + [:op="sub";rhs="mat2x3f()";test="sampler"] + + [:op="sub";rhs="mat2x3f()";test="struct"] + + [:op="sub";rhs="mat2x3f()";test="texture"] + + [:op="sub";rhs="mat2x3f()";test="u32"] + + [:op="sub";rhs="mat2x3f()";test="vec"] + + [:op="sub";rhs="mat2x3h()";test="af"] + + [:op="sub";rhs="mat2x3h()";test="ai"] + + [:op="sub";rhs="mat2x3h()";test="array"] + + [:op="sub";rhs="mat2x3h()";test="atomic"] + + [:op="sub";rhs="mat2x3h()";test="bool"] + + [:op="sub";rhs="mat2x3h()";test="f16"] + + [:op="sub";rhs="mat2x3h()";test="f32"] + + [:op="sub";rhs="mat2x3h()";test="i32"] + + [:op="sub";rhs="mat2x3h()";test="matf_ai_matching"] + + [:op="sub";rhs="mat2x3h()";test="matf_ai_no_matching"] + + [:op="sub";rhs="mat2x3h()";test="matf_size_matching"] + + [:op="sub";rhs="mat2x3h()";test="matf_size_no_match"] + + [:op="sub";rhs="mat2x3h()";test="math_size_matching"] + + [:op="sub";rhs="mat2x3h()";test="math_size_no_matching"] + + [:op="sub";rhs="mat2x3h()";test="sampler"] + + [:op="sub";rhs="mat2x3h()";test="struct"] + + [:op="sub";rhs="mat2x3h()";test="texture"] + + [:op="sub";rhs="mat2x3h()";test="u32"] + + [:op="sub";rhs="mat2x3h()";test="vec"] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_abstract:*] + [:rhs=1.7976931348623157e%2B308;c=2;r=2] + + [:rhs=1.7976931348623157e%2B308;c=2;r=3] + + [:rhs=1.7976931348623157e%2B308;c=2;r=4] + + [:rhs=1.7976931348623157e%2B308;c=3;r=2] + + [:rhs=1.7976931348623157e%2B308;c=3;r=3] + + [:rhs=1.7976931348623157e%2B308;c=3;r=4] + + [:rhs=1.7976931348623157e%2B308;c=4;r=2] + + [:rhs=1.7976931348623157e%2B308;c=4;r=3] + + [:rhs=1.7976931348623157e%2B308;c=4;r=4] + + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_f16:*] + [:rhs=1;c=2;r=2] + + [:rhs=1;c=2;r=3] + + [:rhs=1;c=2;r=4] + + [:rhs=1;c=3;r=2] + + [:rhs=1;c=3;r=3] + + [:rhs=1;c=3;r=4] + + [:rhs=1;c=4;r=2] + + [:rhs=1;c=4;r=3] + + [:rhs=1;c=4;r=4] + + [:rhs=65504;c=2;r=2] + + [:rhs=65504;c=2;r=3] + + [:rhs=65504;c=2;r=4] + + [:rhs=65504;c=3;r=2] + + [:rhs=65504;c=3;r=3] + + [:rhs=65504;c=3;r=4] + + [:rhs=65504;c=4;r=2] + + [:rhs=65504;c=4;r=3] + + [:rhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:overflow_f32:*] + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=3.4028234663852886e%2B38;c=2;r=2] + + [:rhs=3.4028234663852886e%2B38;c=2;r=3] + + [:rhs=3.4028234663852886e%2B38;c=2;r=4] + + [:rhs=3.4028234663852886e%2B38;c=3;r=2] + + [:rhs=3.4028234663852886e%2B38;c=3;r=3] + + [:rhs=3.4028234663852886e%2B38;c=3;r=4] + + [:rhs=3.4028234663852886e%2B38;c=4;r=2] + + [:rhs=3.4028234663852886e%2B38;c=4;r=3] + + [:rhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_abstract:*] + [:rhs=1.7976931348623157e%2B308;c=2;r=2] + + [:rhs=1.7976931348623157e%2B308;c=2;r=3] + + [:rhs=1.7976931348623157e%2B308;c=2;r=4] + + [:rhs=1.7976931348623157e%2B308;c=3;r=2] + + [:rhs=1.7976931348623157e%2B308;c=3;r=3] + + [:rhs=1.7976931348623157e%2B308;c=3;r=4] + + [:rhs=1.7976931348623157e%2B308;c=4;r=2] + + [:rhs=1.7976931348623157e%2B308;c=4;r=3] + + [:rhs=1.7976931348623157e%2B308;c=4;r=4] + + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_f16:*] + [:rhs=1;c=2;r=2] + + [:rhs=1;c=2;r=3] + + [:rhs=1;c=2;r=4] + + [:rhs=1;c=3;r=2] + + [:rhs=1;c=3;r=3] + + [:rhs=1;c=3;r=4] + + [:rhs=1;c=4;r=2] + + [:rhs=1;c=4;r=3] + + [:rhs=1;c=4;r=4] + + [:rhs=65504;c=2;r=2] + + [:rhs=65504;c=2;r=3] + + [:rhs=65504;c=2;r=4] + + [:rhs=65504;c=3;r=2] + + [:rhs=65504;c=3;r=3] + + [:rhs=65504;c=3;r=4] + + [:rhs=65504;c=4;r=2] + + [:rhs=65504;c=4;r=3] + + [:rhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:underflow_f32:*] + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=3.4028234663852886e%2B38;c=2;r=2] + + [:rhs=3.4028234663852886e%2B38;c=2;r=3] + + [:rhs=3.4028234663852886e%2B38;c=2;r=4] + + [:rhs=3.4028234663852886e%2B38;c=3;r=2] + + [:rhs=3.4028234663852886e%2B38;c=3;r=3] + + [:rhs=3.4028234663852886e%2B38;c=3;r=4] + + [:rhs=3.4028234663852886e%2B38;c=4;r=2] + + [:rhs=3.4028234663852886e%2B38;c=4;r=3] + + [:rhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,add_sub:with_abstract:*] + [:op="add";rhs="mat2x3f()";swap=false] + + [:op="add";rhs="mat2x3f()";swap=true] + + [:op="add";rhs="mat2x3h()";swap=false] + + [:op="add";rhs="mat2x3h()";swap=true] + + [:op="sub";rhs="mat2x3f()";swap=false] + + [:op="sub";rhs="mat2x3f()";swap=true] + + [:op="sub";rhs="mat2x3h()";swap=false] + + [:op="sub";rhs="mat2x3h()";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,and_or_xor:invalid:*] + [:op="and";rhs="1i";test="af";swap=false] + + [:op="and";rhs="1i";test="af";swap=true] + + [:op="and";rhs="1i";test="ai";swap=false] + + [:op="and";rhs="1i";test="ai";swap=true] + + [:op="and";rhs="1i";test="array";swap=false] + + [:op="and";rhs="1i";test="array";swap=true] + + [:op="and";rhs="1i";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";rhs="1i";test="atomic";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="and";rhs="1i";test="bool";swap=false] + + [:op="and";rhs="1i";test="bool";swap=true] + + [:op="and";rhs="1i";test="f16";swap=false] + + [:op="and";rhs="1i";test="f16";swap=true] + + [:op="and";rhs="1i";test="f32";swap=false] + + [:op="and";rhs="1i";test="f32";swap=true] + + [:op="and";rhs="1i";test="i32";swap=false] + + [:op="and";rhs="1i";test="i32";swap=true] + + [:op="and";rhs="1i";test="matf_matching";swap=false] + + [:op="and";rhs="1i";test="matf_matching";swap=true] + + [:op="and";rhs="1i";test="matf_no_match";swap=false] + + [:op="and";rhs="1i";test="matf_no_match";swap=true] + + [:op="and";rhs="1i";test="math";swap=false] + + [:op="and";rhs="1i";test="math";swap=true] + + [:op="and";rhs="1i";test="sampler";swap=false] + + [:op="and";rhs="1i";test="sampler";swap=true] + + [:op="and";rhs="1i";test="struct";swap=false] + + [:op="and";rhs="1i";test="struct";swap=true] + + [:op="and";rhs="1i";test="texture";swap=false] + + [:op="and";rhs="1i";test="texture";swap=true] + + [:op="and";rhs="1i";test="u32";swap=false] + + [:op="and";rhs="1i";test="u32";swap=true] + + [:op="and";rhs="1i";test="vec";swap=false] + + [:op="and";rhs="1i";test="vec";swap=true] + + [:op="and";rhs="ai";test="af";swap=false] + + [:op="and";rhs="ai";test="af";swap=true] + + [:op="and";rhs="ai";test="ai";swap=false] + + [:op="and";rhs="ai";test="ai";swap=true] + + [:op="and";rhs="ai";test="array";swap=false] + + [:op="and";rhs="ai";test="array";swap=true] + + [:op="and";rhs="ai";test="atomic";swap=false] + + [:op="and";rhs="ai";test="atomic";swap=true] + + [:op="and";rhs="ai";test="bool";swap=false] + + [:op="and";rhs="ai";test="bool";swap=true] + + [:op="and";rhs="ai";test="f16";swap=false] + + [:op="and";rhs="ai";test="f16";swap=true] + + [:op="and";rhs="ai";test="f32";swap=false] + + [:op="and";rhs="ai";test="f32";swap=true] + + [:op="and";rhs="ai";test="i32";swap=false] + + [:op="and";rhs="ai";test="i32";swap=true] + + [:op="and";rhs="ai";test="matf_matching";swap=false] + + [:op="and";rhs="ai";test="matf_matching";swap=true] + + [:op="and";rhs="ai";test="matf_no_match";swap=false] + + [:op="and";rhs="ai";test="matf_no_match";swap=true] + + [:op="and";rhs="ai";test="math";swap=false] + + [:op="and";rhs="ai";test="math";swap=true] + + [:op="and";rhs="ai";test="sampler";swap=false] + + [:op="and";rhs="ai";test="sampler";swap=true] + + [:op="and";rhs="ai";test="struct";swap=false] + + [:op="and";rhs="ai";test="struct";swap=true] + + [:op="and";rhs="ai";test="texture";swap=false] + + [:op="and";rhs="ai";test="texture";swap=true] + + [:op="and";rhs="ai";test="u32";swap=false] + + [:op="and";rhs="ai";test="u32";swap=true] + + [:op="and";rhs="ai";test="vec";swap=false] + + [:op="and";rhs="ai";test="vec";swap=true] + + [:op="and";rhs="mat2x3f()";test="af";swap=false] + + [:op="and";rhs="mat2x3f()";test="af";swap=true] + + [:op="and";rhs="mat2x3f()";test="ai";swap=false] + + [:op="and";rhs="mat2x3f()";test="ai";swap=true] + + [:op="and";rhs="mat2x3f()";test="array";swap=false] + + [:op="and";rhs="mat2x3f()";test="array";swap=true] + + [:op="and";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="and";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="and";rhs="mat2x3f()";test="bool";swap=false] + + [:op="and";rhs="mat2x3f()";test="bool";swap=true] + + [:op="and";rhs="mat2x3f()";test="f16";swap=false] + + [:op="and";rhs="mat2x3f()";test="f16";swap=true] + + [:op="and";rhs="mat2x3f()";test="f32";swap=false] + + [:op="and";rhs="mat2x3f()";test="f32";swap=true] + + [:op="and";rhs="mat2x3f()";test="i32";swap=false] + + [:op="and";rhs="mat2x3f()";test="i32";swap=true] + + [:op="and";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="and";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="and";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="and";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="and";rhs="mat2x3f()";test="math";swap=false] + + [:op="and";rhs="mat2x3f()";test="math";swap=true] + + [:op="and";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="and";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="and";rhs="mat2x3f()";test="struct";swap=false] + + [:op="and";rhs="mat2x3f()";test="struct";swap=true] + + [:op="and";rhs="mat2x3f()";test="texture";swap=false] + + [:op="and";rhs="mat2x3f()";test="texture";swap=true] + + [:op="and";rhs="mat2x3f()";test="u32";swap=false] + + [:op="and";rhs="mat2x3f()";test="u32";swap=true] + + [:op="and";rhs="mat2x3f()";test="vec";swap=false] + + [:op="and";rhs="mat2x3f()";test="vec";swap=true] + + [:op="and";rhs="mat2x3h()";test="af";swap=false] + + [:op="and";rhs="mat2x3h()";test="af";swap=true] + + [:op="and";rhs="mat2x3h()";test="ai";swap=false] + + [:op="and";rhs="mat2x3h()";test="ai";swap=true] + + [:op="and";rhs="mat2x3h()";test="array";swap=false] + + [:op="and";rhs="mat2x3h()";test="array";swap=true] + + [:op="and";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="and";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="and";rhs="mat2x3h()";test="bool";swap=false] + + [:op="and";rhs="mat2x3h()";test="bool";swap=true] + + [:op="and";rhs="mat2x3h()";test="f16";swap=false] + + [:op="and";rhs="mat2x3h()";test="f16";swap=true] + + [:op="and";rhs="mat2x3h()";test="f32";swap=false] + + [:op="and";rhs="mat2x3h()";test="f32";swap=true] + + [:op="and";rhs="mat2x3h()";test="i32";swap=false] + + [:op="and";rhs="mat2x3h()";test="i32";swap=true] + + [:op="and";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="and";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="and";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="and";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="and";rhs="mat2x3h()";test="math";swap=false] + + [:op="and";rhs="mat2x3h()";test="math";swap=true] + + [:op="and";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="and";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="and";rhs="mat2x3h()";test="struct";swap=false] + + [:op="and";rhs="mat2x3h()";test="struct";swap=true] + + [:op="and";rhs="mat2x3h()";test="texture";swap=false] + + [:op="and";rhs="mat2x3h()";test="texture";swap=true] + + [:op="and";rhs="mat2x3h()";test="u32";swap=false] + + [:op="and";rhs="mat2x3h()";test="u32";swap=true] + + [:op="and";rhs="mat2x3h()";test="vec";swap=false] + + [:op="and";rhs="mat2x3h()";test="vec";swap=true] + + [:op="or";rhs="1i";test="af";swap=false] + + [:op="or";rhs="1i";test="af";swap=true] + + [:op="or";rhs="1i";test="ai";swap=false] + + [:op="or";rhs="1i";test="ai";swap=true] + + [:op="or";rhs="1i";test="array";swap=false] + + [:op="or";rhs="1i";test="array";swap=true] + + [:op="or";rhs="1i";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";rhs="1i";test="atomic";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="or";rhs="1i";test="bool";swap=false] + + [:op="or";rhs="1i";test="bool";swap=true] + + [:op="or";rhs="1i";test="f16";swap=false] + + [:op="or";rhs="1i";test="f16";swap=true] + + [:op="or";rhs="1i";test="f32";swap=false] + + [:op="or";rhs="1i";test="f32";swap=true] + + [:op="or";rhs="1i";test="i32";swap=false] + + [:op="or";rhs="1i";test="i32";swap=true] + + [:op="or";rhs="1i";test="matf_matching";swap=false] + + [:op="or";rhs="1i";test="matf_matching";swap=true] + + [:op="or";rhs="1i";test="matf_no_match";swap=false] + + [:op="or";rhs="1i";test="matf_no_match";swap=true] + + [:op="or";rhs="1i";test="math";swap=false] + + [:op="or";rhs="1i";test="math";swap=true] + + [:op="or";rhs="1i";test="sampler";swap=false] + + [:op="or";rhs="1i";test="sampler";swap=true] + + [:op="or";rhs="1i";test="struct";swap=false] + + [:op="or";rhs="1i";test="struct";swap=true] + + [:op="or";rhs="1i";test="texture";swap=false] + + [:op="or";rhs="1i";test="texture";swap=true] + + [:op="or";rhs="1i";test="u32";swap=false] + + [:op="or";rhs="1i";test="u32";swap=true] + + [:op="or";rhs="1i";test="vec";swap=false] + + [:op="or";rhs="1i";test="vec";swap=true] + + [:op="or";rhs="ai";test="af";swap=false] + + [:op="or";rhs="ai";test="af";swap=true] + + [:op="or";rhs="ai";test="ai";swap=false] + + [:op="or";rhs="ai";test="ai";swap=true] + + [:op="or";rhs="ai";test="array";swap=false] + + [:op="or";rhs="ai";test="array";swap=true] + + [:op="or";rhs="ai";test="atomic";swap=false] + + [:op="or";rhs="ai";test="atomic";swap=true] + + [:op="or";rhs="ai";test="bool";swap=false] + + [:op="or";rhs="ai";test="bool";swap=true] + + [:op="or";rhs="ai";test="f16";swap=false] + + [:op="or";rhs="ai";test="f16";swap=true] + + [:op="or";rhs="ai";test="f32";swap=false] + + [:op="or";rhs="ai";test="f32";swap=true] + + [:op="or";rhs="ai";test="i32";swap=false] + + [:op="or";rhs="ai";test="i32";swap=true] + + [:op="or";rhs="ai";test="matf_matching";swap=false] + + [:op="or";rhs="ai";test="matf_matching";swap=true] + + [:op="or";rhs="ai";test="matf_no_match";swap=false] + + [:op="or";rhs="ai";test="matf_no_match";swap=true] + + [:op="or";rhs="ai";test="math";swap=false] + + [:op="or";rhs="ai";test="math";swap=true] + + [:op="or";rhs="ai";test="sampler";swap=false] + + [:op="or";rhs="ai";test="sampler";swap=true] + + [:op="or";rhs="ai";test="struct";swap=false] + + [:op="or";rhs="ai";test="struct";swap=true] + + [:op="or";rhs="ai";test="texture";swap=false] + + [:op="or";rhs="ai";test="texture";swap=true] + + [:op="or";rhs="ai";test="u32";swap=false] + + [:op="or";rhs="ai";test="u32";swap=true] + + [:op="or";rhs="ai";test="vec";swap=false] + + [:op="or";rhs="ai";test="vec";swap=true] + + [:op="or";rhs="mat2x3f()";test="af";swap=false] + + [:op="or";rhs="mat2x3f()";test="af";swap=true] + + [:op="or";rhs="mat2x3f()";test="ai";swap=false] + + [:op="or";rhs="mat2x3f()";test="ai";swap=true] + + [:op="or";rhs="mat2x3f()";test="array";swap=false] + + [:op="or";rhs="mat2x3f()";test="array";swap=true] + + [:op="or";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="or";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="or";rhs="mat2x3f()";test="bool";swap=false] + + [:op="or";rhs="mat2x3f()";test="bool";swap=true] + + [:op="or";rhs="mat2x3f()";test="f16";swap=false] + + [:op="or";rhs="mat2x3f()";test="f16";swap=true] + + [:op="or";rhs="mat2x3f()";test="f32";swap=false] + + [:op="or";rhs="mat2x3f()";test="f32";swap=true] + + [:op="or";rhs="mat2x3f()";test="i32";swap=false] + + [:op="or";rhs="mat2x3f()";test="i32";swap=true] + + [:op="or";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="or";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="or";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="or";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="or";rhs="mat2x3f()";test="math";swap=false] + + [:op="or";rhs="mat2x3f()";test="math";swap=true] + + [:op="or";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="or";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="or";rhs="mat2x3f()";test="struct";swap=false] + + [:op="or";rhs="mat2x3f()";test="struct";swap=true] + + [:op="or";rhs="mat2x3f()";test="texture";swap=false] + + [:op="or";rhs="mat2x3f()";test="texture";swap=true] + + [:op="or";rhs="mat2x3f()";test="u32";swap=false] + + [:op="or";rhs="mat2x3f()";test="u32";swap=true] + + [:op="or";rhs="mat2x3f()";test="vec";swap=false] + + [:op="or";rhs="mat2x3f()";test="vec";swap=true] + + [:op="or";rhs="mat2x3h()";test="af";swap=false] + + [:op="or";rhs="mat2x3h()";test="af";swap=true] + + [:op="or";rhs="mat2x3h()";test="ai";swap=false] + + [:op="or";rhs="mat2x3h()";test="ai";swap=true] + + [:op="or";rhs="mat2x3h()";test="array";swap=false] + + [:op="or";rhs="mat2x3h()";test="array";swap=true] + + [:op="or";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="or";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="or";rhs="mat2x3h()";test="bool";swap=false] + + [:op="or";rhs="mat2x3h()";test="bool";swap=true] + + [:op="or";rhs="mat2x3h()";test="f16";swap=false] + + [:op="or";rhs="mat2x3h()";test="f16";swap=true] + + [:op="or";rhs="mat2x3h()";test="f32";swap=false] + + [:op="or";rhs="mat2x3h()";test="f32";swap=true] + + [:op="or";rhs="mat2x3h()";test="i32";swap=false] + + [:op="or";rhs="mat2x3h()";test="i32";swap=true] + + [:op="or";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="or";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="or";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="or";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="or";rhs="mat2x3h()";test="math";swap=false] + + [:op="or";rhs="mat2x3h()";test="math";swap=true] + + [:op="or";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="or";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="or";rhs="mat2x3h()";test="struct";swap=false] + + [:op="or";rhs="mat2x3h()";test="struct";swap=true] + + [:op="or";rhs="mat2x3h()";test="texture";swap=false] + + [:op="or";rhs="mat2x3h()";test="texture";swap=true] + + [:op="or";rhs="mat2x3h()";test="u32";swap=false] + + [:op="or";rhs="mat2x3h()";test="u32";swap=true] + + [:op="or";rhs="mat2x3h()";test="vec";swap=false] + + [:op="or";rhs="mat2x3h()";test="vec";swap=true] + + [:op="xor";rhs="1i";test="af";swap=false] + + [:op="xor";rhs="1i";test="af";swap=true] + + [:op="xor";rhs="1i";test="ai";swap=false] + + [:op="xor";rhs="1i";test="ai";swap=true] + + [:op="xor";rhs="1i";test="array";swap=false] + + [:op="xor";rhs="1i";test="array";swap=true] + + [:op="xor";rhs="1i";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";rhs="1i";test="atomic";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="xor";rhs="1i";test="bool";swap=false] + + [:op="xor";rhs="1i";test="bool";swap=true] + + [:op="xor";rhs="1i";test="f16";swap=false] + + [:op="xor";rhs="1i";test="f16";swap=true] + + [:op="xor";rhs="1i";test="f32";swap=false] + + [:op="xor";rhs="1i";test="f32";swap=true] + + [:op="xor";rhs="1i";test="i32";swap=false] + + [:op="xor";rhs="1i";test="i32";swap=true] + + [:op="xor";rhs="1i";test="matf_matching";swap=false] + + [:op="xor";rhs="1i";test="matf_matching";swap=true] + + [:op="xor";rhs="1i";test="matf_no_match";swap=false] + + [:op="xor";rhs="1i";test="matf_no_match";swap=true] + + [:op="xor";rhs="1i";test="math";swap=false] + + [:op="xor";rhs="1i";test="math";swap=true] + + [:op="xor";rhs="1i";test="sampler";swap=false] + + [:op="xor";rhs="1i";test="sampler";swap=true] + + [:op="xor";rhs="1i";test="struct";swap=false] + + [:op="xor";rhs="1i";test="struct";swap=true] + + [:op="xor";rhs="1i";test="texture";swap=false] + + [:op="xor";rhs="1i";test="texture";swap=true] + + [:op="xor";rhs="1i";test="u32";swap=false] + + [:op="xor";rhs="1i";test="u32";swap=true] + + [:op="xor";rhs="1i";test="vec";swap=false] + + [:op="xor";rhs="1i";test="vec";swap=true] + + [:op="xor";rhs="ai";test="af";swap=false] + + [:op="xor";rhs="ai";test="af";swap=true] + + [:op="xor";rhs="ai";test="ai";swap=false] + + [:op="xor";rhs="ai";test="ai";swap=true] + + [:op="xor";rhs="ai";test="array";swap=false] + + [:op="xor";rhs="ai";test="array";swap=true] + + [:op="xor";rhs="ai";test="atomic";swap=false] + + [:op="xor";rhs="ai";test="atomic";swap=true] + + [:op="xor";rhs="ai";test="bool";swap=false] + + [:op="xor";rhs="ai";test="bool";swap=true] + + [:op="xor";rhs="ai";test="f16";swap=false] + + [:op="xor";rhs="ai";test="f16";swap=true] + + [:op="xor";rhs="ai";test="f32";swap=false] + + [:op="xor";rhs="ai";test="f32";swap=true] + + [:op="xor";rhs="ai";test="i32";swap=false] + + [:op="xor";rhs="ai";test="i32";swap=true] + + [:op="xor";rhs="ai";test="matf_matching";swap=false] + + [:op="xor";rhs="ai";test="matf_matching";swap=true] + + [:op="xor";rhs="ai";test="matf_no_match";swap=false] + + [:op="xor";rhs="ai";test="matf_no_match";swap=true] + + [:op="xor";rhs="ai";test="math";swap=false] + + [:op="xor";rhs="ai";test="math";swap=true] + + [:op="xor";rhs="ai";test="sampler";swap=false] + + [:op="xor";rhs="ai";test="sampler";swap=true] + + [:op="xor";rhs="ai";test="struct";swap=false] + + [:op="xor";rhs="ai";test="struct";swap=true] + + [:op="xor";rhs="ai";test="texture";swap=false] + + [:op="xor";rhs="ai";test="texture";swap=true] + + [:op="xor";rhs="ai";test="u32";swap=false] + + [:op="xor";rhs="ai";test="u32";swap=true] + + [:op="xor";rhs="ai";test="vec";swap=false] + + [:op="xor";rhs="ai";test="vec";swap=true] + + [:op="xor";rhs="mat2x3f()";test="af";swap=false] + + [:op="xor";rhs="mat2x3f()";test="af";swap=true] + + [:op="xor";rhs="mat2x3f()";test="ai";swap=false] + + [:op="xor";rhs="mat2x3f()";test="ai";swap=true] + + [:op="xor";rhs="mat2x3f()";test="array";swap=false] + + [:op="xor";rhs="mat2x3f()";test="array";swap=true] + + [:op="xor";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="xor";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="xor";rhs="mat2x3f()";test="bool";swap=false] + + [:op="xor";rhs="mat2x3f()";test="bool";swap=true] + + [:op="xor";rhs="mat2x3f()";test="f16";swap=false] + + [:op="xor";rhs="mat2x3f()";test="f16";swap=true] + + [:op="xor";rhs="mat2x3f()";test="f32";swap=false] + + [:op="xor";rhs="mat2x3f()";test="f32";swap=true] + + [:op="xor";rhs="mat2x3f()";test="i32";swap=false] + + [:op="xor";rhs="mat2x3f()";test="i32";swap=true] + + [:op="xor";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="xor";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="xor";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="xor";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="xor";rhs="mat2x3f()";test="math";swap=false] + + [:op="xor";rhs="mat2x3f()";test="math";swap=true] + + [:op="xor";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="xor";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="xor";rhs="mat2x3f()";test="struct";swap=false] + + [:op="xor";rhs="mat2x3f()";test="struct";swap=true] + + [:op="xor";rhs="mat2x3f()";test="texture";swap=false] + + [:op="xor";rhs="mat2x3f()";test="texture";swap=true] + + [:op="xor";rhs="mat2x3f()";test="u32";swap=false] + + [:op="xor";rhs="mat2x3f()";test="u32";swap=true] + + [:op="xor";rhs="mat2x3f()";test="vec";swap=false] + + [:op="xor";rhs="mat2x3f()";test="vec";swap=true] + + [:op="xor";rhs="mat2x3h()";test="af";swap=false] + + [:op="xor";rhs="mat2x3h()";test="af";swap=true] + + [:op="xor";rhs="mat2x3h()";test="ai";swap=false] + + [:op="xor";rhs="mat2x3h()";test="ai";swap=true] + + [:op="xor";rhs="mat2x3h()";test="array";swap=false] + + [:op="xor";rhs="mat2x3h()";test="array";swap=true] + + [:op="xor";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="xor";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="xor";rhs="mat2x3h()";test="bool";swap=false] + + [:op="xor";rhs="mat2x3h()";test="bool";swap=true] + + [:op="xor";rhs="mat2x3h()";test="f16";swap=false] + + [:op="xor";rhs="mat2x3h()";test="f16";swap=true] + + [:op="xor";rhs="mat2x3h()";test="f32";swap=false] + + [:op="xor";rhs="mat2x3h()";test="f32";swap=true] + + [:op="xor";rhs="mat2x3h()";test="i32";swap=false] + + [:op="xor";rhs="mat2x3h()";test="i32";swap=true] + + [:op="xor";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="xor";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="xor";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="xor";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="xor";rhs="mat2x3h()";test="math";swap=false] + + [:op="xor";rhs="mat2x3h()";test="math";swap=true] + + [:op="xor";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="xor";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="xor";rhs="mat2x3h()";test="struct";swap=false] + + [:op="xor";rhs="mat2x3h()";test="struct";swap=true] + + [:op="xor";rhs="mat2x3h()";test="texture";swap=false] + + [:op="xor";rhs="mat2x3h()";test="texture";swap=true] + + [:op="xor";rhs="mat2x3h()";test="u32";swap=false] + + [:op="xor";rhs="mat2x3h()";test="u32";swap=true] + + [:op="xor";rhs="mat2x3h()";test="vec";swap=false] + + [:op="xor";rhs="mat2x3h()";test="vec";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,bitwise_shift:invalid:*] + [:op="left";rhs="1u";test="af";swap=false] + + [:op="left";rhs="1u";test="af";swap=true] + + [:op="left";rhs="1u";test="ai";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="left";rhs="1u";test="ai";swap=true] + + [:op="left";rhs="1u";test="array";swap=false] + + [:op="left";rhs="1u";test="array";swap=true] + + [:op="left";rhs="1u";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="left";rhs="1u";test="atomic";swap=true] + + [:op="left";rhs="1u";test="bool";swap=false] + + [:op="left";rhs="1u";test="bool";swap=true] + + [:op="left";rhs="1u";test="f16";swap=false] + + [:op="left";rhs="1u";test="f16";swap=true] + + [:op="left";rhs="1u";test="f32";swap=false] + + [:op="left";rhs="1u";test="f32";swap=true] + + [:op="left";rhs="1u";test="i32";swap=false] + + [:op="left";rhs="1u";test="i32";swap=true] + + [:op="left";rhs="1u";test="matf_matching";swap=false] + + [:op="left";rhs="1u";test="matf_matching";swap=true] + + [:op="left";rhs="1u";test="matf_no_match";swap=false] + + [:op="left";rhs="1u";test="matf_no_match";swap=true] + + [:op="left";rhs="1u";test="math";swap=false] + + [:op="left";rhs="1u";test="math";swap=true] + + [:op="left";rhs="1u";test="sampler";swap=false] + + [:op="left";rhs="1u";test="sampler";swap=true] + + [:op="left";rhs="1u";test="struct";swap=false] + + [:op="left";rhs="1u";test="struct";swap=true] + + [:op="left";rhs="1u";test="texture";swap=false] + + [:op="left";rhs="1u";test="texture";swap=true] + + [:op="left";rhs="1u";test="u32";swap=false] + + [:op="left";rhs="1u";test="u32";swap=true] + + [:op="left";rhs="1u";test="vec";swap=false] + + [:op="left";rhs="1u";test="vec";swap=true] + + [:op="left";rhs="ai";test="af";swap=false] + + [:op="left";rhs="ai";test="af";swap=true] + + [:op="left";rhs="ai";test="ai";swap=false] + + [:op="left";rhs="ai";test="ai";swap=true] + + [:op="left";rhs="ai";test="array";swap=false] + + [:op="left";rhs="ai";test="array";swap=true] + + [:op="left";rhs="ai";test="atomic";swap=false] + + [:op="left";rhs="ai";test="atomic";swap=true] + + [:op="left";rhs="ai";test="bool";swap=false] + + [:op="left";rhs="ai";test="bool";swap=true] + + [:op="left";rhs="ai";test="f16";swap=false] + + [:op="left";rhs="ai";test="f16";swap=true] + + [:op="left";rhs="ai";test="f32";swap=false] + + [:op="left";rhs="ai";test="f32";swap=true] + + [:op="left";rhs="ai";test="i32";swap=false] + + [:op="left";rhs="ai";test="i32";swap=true] + + [:op="left";rhs="ai";test="matf_matching";swap=false] + + [:op="left";rhs="ai";test="matf_matching";swap=true] + + [:op="left";rhs="ai";test="matf_no_match";swap=false] + + [:op="left";rhs="ai";test="matf_no_match";swap=true] + + [:op="left";rhs="ai";test="math";swap=false] + + [:op="left";rhs="ai";test="math";swap=true] + + [:op="left";rhs="ai";test="sampler";swap=false] + + [:op="left";rhs="ai";test="sampler";swap=true] + + [:op="left";rhs="ai";test="struct";swap=false] + + [:op="left";rhs="ai";test="struct";swap=true] + + [:op="left";rhs="ai";test="texture";swap=false] + + [:op="left";rhs="ai";test="texture";swap=true] + + [:op="left";rhs="ai";test="u32";swap=false] + + [:op="left";rhs="ai";test="u32";swap=true] + + [:op="left";rhs="ai";test="vec";swap=false] + + [:op="left";rhs="ai";test="vec";swap=true] + + [:op="left";rhs="mat2x3f()";test="af";swap=false] + + [:op="left";rhs="mat2x3f()";test="af";swap=true] + + [:op="left";rhs="mat2x3f()";test="ai";swap=false] + + [:op="left";rhs="mat2x3f()";test="ai";swap=true] + + [:op="left";rhs="mat2x3f()";test="array";swap=false] + + [:op="left";rhs="mat2x3f()";test="array";swap=true] + + [:op="left";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="left";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="left";rhs="mat2x3f()";test="bool";swap=false] + + [:op="left";rhs="mat2x3f()";test="bool";swap=true] + + [:op="left";rhs="mat2x3f()";test="f16";swap=false] + + [:op="left";rhs="mat2x3f()";test="f16";swap=true] + + [:op="left";rhs="mat2x3f()";test="f32";swap=false] + + [:op="left";rhs="mat2x3f()";test="f32";swap=true] + + [:op="left";rhs="mat2x3f()";test="i32";swap=false] + + [:op="left";rhs="mat2x3f()";test="i32";swap=true] + + [:op="left";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="left";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="left";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="left";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="left";rhs="mat2x3f()";test="math";swap=false] + + [:op="left";rhs="mat2x3f()";test="math";swap=true] + + [:op="left";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="left";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="left";rhs="mat2x3f()";test="struct";swap=false] + + [:op="left";rhs="mat2x3f()";test="struct";swap=true] + + [:op="left";rhs="mat2x3f()";test="texture";swap=false] + + [:op="left";rhs="mat2x3f()";test="texture";swap=true] + + [:op="left";rhs="mat2x3f()";test="u32";swap=false] + + [:op="left";rhs="mat2x3f()";test="u32";swap=true] + + [:op="left";rhs="mat2x3f()";test="vec";swap=false] + + [:op="left";rhs="mat2x3f()";test="vec";swap=true] + + [:op="left";rhs="mat2x3h()";test="af";swap=false] + + [:op="left";rhs="mat2x3h()";test="af";swap=true] + + [:op="left";rhs="mat2x3h()";test="ai";swap=false] + + [:op="left";rhs="mat2x3h()";test="ai";swap=true] + + [:op="left";rhs="mat2x3h()";test="array";swap=false] + + [:op="left";rhs="mat2x3h()";test="array";swap=true] + + [:op="left";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="left";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="left";rhs="mat2x3h()";test="bool";swap=false] + + [:op="left";rhs="mat2x3h()";test="bool";swap=true] + + [:op="left";rhs="mat2x3h()";test="f16";swap=false] + + [:op="left";rhs="mat2x3h()";test="f16";swap=true] + + [:op="left";rhs="mat2x3h()";test="f32";swap=false] + + [:op="left";rhs="mat2x3h()";test="f32";swap=true] + + [:op="left";rhs="mat2x3h()";test="i32";swap=false] + + [:op="left";rhs="mat2x3h()";test="i32";swap=true] + + [:op="left";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="left";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="left";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="left";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="left";rhs="mat2x3h()";test="math";swap=false] + + [:op="left";rhs="mat2x3h()";test="math";swap=true] + + [:op="left";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="left";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="left";rhs="mat2x3h()";test="struct";swap=false] + + [:op="left";rhs="mat2x3h()";test="struct";swap=true] + + [:op="left";rhs="mat2x3h()";test="texture";swap=false] + + [:op="left";rhs="mat2x3h()";test="texture";swap=true] + + [:op="left";rhs="mat2x3h()";test="u32";swap=false] + + [:op="left";rhs="mat2x3h()";test="u32";swap=true] + + [:op="left";rhs="mat2x3h()";test="vec";swap=false] + + [:op="left";rhs="mat2x3h()";test="vec";swap=true] + + [:op="right";rhs="1u";test="af";swap=false] + + [:op="right";rhs="1u";test="af";swap=true] + + [:op="right";rhs="1u";test="ai";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="right";rhs="1u";test="ai";swap=true] + + [:op="right";rhs="1u";test="array";swap=false] + + [:op="right";rhs="1u";test="array";swap=true] + + [:op="right";rhs="1u";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="right";rhs="1u";test="atomic";swap=true] + + [:op="right";rhs="1u";test="bool";swap=false] + + [:op="right";rhs="1u";test="bool";swap=true] + + [:op="right";rhs="1u";test="f16";swap=false] + + [:op="right";rhs="1u";test="f16";swap=true] + + [:op="right";rhs="1u";test="f32";swap=false] + + [:op="right";rhs="1u";test="f32";swap=true] + + [:op="right";rhs="1u";test="i32";swap=false] + + [:op="right";rhs="1u";test="i32";swap=true] + + [:op="right";rhs="1u";test="matf_matching";swap=false] + + [:op="right";rhs="1u";test="matf_matching";swap=true] + + [:op="right";rhs="1u";test="matf_no_match";swap=false] + + [:op="right";rhs="1u";test="matf_no_match";swap=true] + + [:op="right";rhs="1u";test="math";swap=false] + + [:op="right";rhs="1u";test="math";swap=true] + + [:op="right";rhs="1u";test="sampler";swap=false] + + [:op="right";rhs="1u";test="sampler";swap=true] + + [:op="right";rhs="1u";test="struct";swap=false] + + [:op="right";rhs="1u";test="struct";swap=true] + + [:op="right";rhs="1u";test="texture";swap=false] + + [:op="right";rhs="1u";test="texture";swap=true] + + [:op="right";rhs="1u";test="u32";swap=false] + + [:op="right";rhs="1u";test="u32";swap=true] + + [:op="right";rhs="1u";test="vec";swap=false] + + [:op="right";rhs="1u";test="vec";swap=true] + + [:op="right";rhs="ai";test="af";swap=false] + + [:op="right";rhs="ai";test="af";swap=true] + + [:op="right";rhs="ai";test="ai";swap=false] + + [:op="right";rhs="ai";test="ai";swap=true] + + [:op="right";rhs="ai";test="array";swap=false] + + [:op="right";rhs="ai";test="array";swap=true] + + [:op="right";rhs="ai";test="atomic";swap=false] + + [:op="right";rhs="ai";test="atomic";swap=true] + + [:op="right";rhs="ai";test="bool";swap=false] + + [:op="right";rhs="ai";test="bool";swap=true] + + [:op="right";rhs="ai";test="f16";swap=false] + + [:op="right";rhs="ai";test="f16";swap=true] + + [:op="right";rhs="ai";test="f32";swap=false] + + [:op="right";rhs="ai";test="f32";swap=true] + + [:op="right";rhs="ai";test="i32";swap=false] + + [:op="right";rhs="ai";test="i32";swap=true] + + [:op="right";rhs="ai";test="matf_matching";swap=false] + + [:op="right";rhs="ai";test="matf_matching";swap=true] + + [:op="right";rhs="ai";test="matf_no_match";swap=false] + + [:op="right";rhs="ai";test="matf_no_match";swap=true] + + [:op="right";rhs="ai";test="math";swap=false] + + [:op="right";rhs="ai";test="math";swap=true] + + [:op="right";rhs="ai";test="sampler";swap=false] + + [:op="right";rhs="ai";test="sampler";swap=true] + + [:op="right";rhs="ai";test="struct";swap=false] + + [:op="right";rhs="ai";test="struct";swap=true] + + [:op="right";rhs="ai";test="texture";swap=false] + + [:op="right";rhs="ai";test="texture";swap=true] + + [:op="right";rhs="ai";test="u32";swap=false] + + [:op="right";rhs="ai";test="u32";swap=true] + + [:op="right";rhs="ai";test="vec";swap=false] + + [:op="right";rhs="ai";test="vec";swap=true] + + [:op="right";rhs="mat2x3f()";test="af";swap=false] + + [:op="right";rhs="mat2x3f()";test="af";swap=true] + + [:op="right";rhs="mat2x3f()";test="ai";swap=false] + + [:op="right";rhs="mat2x3f()";test="ai";swap=true] + + [:op="right";rhs="mat2x3f()";test="array";swap=false] + + [:op="right";rhs="mat2x3f()";test="array";swap=true] + + [:op="right";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="right";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="right";rhs="mat2x3f()";test="bool";swap=false] + + [:op="right";rhs="mat2x3f()";test="bool";swap=true] + + [:op="right";rhs="mat2x3f()";test="f16";swap=false] + + [:op="right";rhs="mat2x3f()";test="f16";swap=true] + + [:op="right";rhs="mat2x3f()";test="f32";swap=false] + + [:op="right";rhs="mat2x3f()";test="f32";swap=true] + + [:op="right";rhs="mat2x3f()";test="i32";swap=false] + + [:op="right";rhs="mat2x3f()";test="i32";swap=true] + + [:op="right";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="right";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="right";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="right";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="right";rhs="mat2x3f()";test="math";swap=false] + + [:op="right";rhs="mat2x3f()";test="math";swap=true] + + [:op="right";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="right";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="right";rhs="mat2x3f()";test="struct";swap=false] + + [:op="right";rhs="mat2x3f()";test="struct";swap=true] + + [:op="right";rhs="mat2x3f()";test="texture";swap=false] + + [:op="right";rhs="mat2x3f()";test="texture";swap=true] + + [:op="right";rhs="mat2x3f()";test="u32";swap=false] + + [:op="right";rhs="mat2x3f()";test="u32";swap=true] + + [:op="right";rhs="mat2x3f()";test="vec";swap=false] + + [:op="right";rhs="mat2x3f()";test="vec";swap=true] + + [:op="right";rhs="mat2x3h()";test="af";swap=false] + + [:op="right";rhs="mat2x3h()";test="af";swap=true] + + [:op="right";rhs="mat2x3h()";test="ai";swap=false] + + [:op="right";rhs="mat2x3h()";test="ai";swap=true] + + [:op="right";rhs="mat2x3h()";test="array";swap=false] + + [:op="right";rhs="mat2x3h()";test="array";swap=true] + + [:op="right";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="right";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="right";rhs="mat2x3h()";test="bool";swap=false] + + [:op="right";rhs="mat2x3h()";test="bool";swap=true] + + [:op="right";rhs="mat2x3h()";test="f16";swap=false] + + [:op="right";rhs="mat2x3h()";test="f16";swap=true] + + [:op="right";rhs="mat2x3h()";test="f32";swap=false] + + [:op="right";rhs="mat2x3h()";test="f32";swap=true] + + [:op="right";rhs="mat2x3h()";test="i32";swap=false] + + [:op="right";rhs="mat2x3h()";test="i32";swap=true] + + [:op="right";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="right";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="right";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="right";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="right";rhs="mat2x3h()";test="math";swap=false] + + [:op="right";rhs="mat2x3h()";test="math";swap=true] + + [:op="right";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="right";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="right";rhs="mat2x3h()";test="struct";swap=false] + + [:op="right";rhs="mat2x3h()";test="struct";swap=true] + + [:op="right";rhs="mat2x3h()";test="texture";swap=false] + + [:op="right";rhs="mat2x3h()";test="texture";swap=true] + + [:op="right";rhs="mat2x3h()";test="u32";swap=false] + + [:op="right";rhs="mat2x3h()";test="u32";swap=true] + + [:op="right";rhs="mat2x3h()";test="vec";swap=false] + + [:op="right";rhs="mat2x3h()";test="vec";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,comparison:invalid:*] + [:op="eq";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="1i";test="ai"] + + [:op="eq";rhs="1i";test="array"] + + [:op="eq";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="1i";test="f16"] + + [:op="eq";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="1i";test="i32"] + + [:op="eq";rhs="1i";test="matf_matching"] + + [:op="eq";rhs="1i";test="matf_no_match"] + + [:op="eq";rhs="1i";test="math"] + + [:op="eq";rhs="1i";test="sampler"] + + [:op="eq";rhs="1i";test="struct"] + + [:op="eq";rhs="1i";test="texture"] + + [:op="eq";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="1i";test="vec"] + + [:op="eq";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="ai";test="array"] + + [:op="eq";rhs="ai";test="atomic"] + + [:op="eq";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="ai";test="f16"] + + [:op="eq";rhs="ai";test="f32"] + + [:op="eq";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="ai";test="matf_matching"] + + [:op="eq";rhs="ai";test="matf_no_match"] + + [:op="eq";rhs="ai";test="math"] + + [:op="eq";rhs="ai";test="sampler"] + + [:op="eq";rhs="ai";test="struct"] + + [:op="eq";rhs="ai";test="texture"] + + [:op="eq";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="eq";rhs="ai";test="vec"] + + [:op="eq";rhs="mat2x3f()";test="af"] + + [:op="eq";rhs="mat2x3f()";test="ai"] + + [:op="eq";rhs="mat2x3f()";test="array"] + + [:op="eq";rhs="mat2x3f()";test="atomic"] + + [:op="eq";rhs="mat2x3f()";test="bool"] + + [:op="eq";rhs="mat2x3f()";test="f16"] + + [:op="eq";rhs="mat2x3f()";test="f32"] + + [:op="eq";rhs="mat2x3f()";test="i32"] + + [:op="eq";rhs="mat2x3f()";test="matf_matching"] + + [:op="eq";rhs="mat2x3f()";test="matf_no_match"] + + [:op="eq";rhs="mat2x3f()";test="math"] + + [:op="eq";rhs="mat2x3f()";test="sampler"] + + [:op="eq";rhs="mat2x3f()";test="struct"] + + [:op="eq";rhs="mat2x3f()";test="texture"] + + [:op="eq";rhs="mat2x3f()";test="u32"] + + [:op="eq";rhs="mat2x3f()";test="vec"] + + [:op="eq";rhs="mat2x3h()";test="af"] + + [:op="eq";rhs="mat2x3h()";test="ai"] + + [:op="eq";rhs="mat2x3h()";test="array"] + + [:op="eq";rhs="mat2x3h()";test="atomic"] + + [:op="eq";rhs="mat2x3h()";test="bool"] + + [:op="eq";rhs="mat2x3h()";test="f16"] + + [:op="eq";rhs="mat2x3h()";test="f32"] + + [:op="eq";rhs="mat2x3h()";test="i32"] + + [:op="eq";rhs="mat2x3h()";test="matf_matching"] + + [:op="eq";rhs="mat2x3h()";test="matf_no_match"] + + [:op="eq";rhs="mat2x3h()";test="math"] + + [:op="eq";rhs="mat2x3h()";test="sampler"] + + [:op="eq";rhs="mat2x3h()";test="struct"] + + [:op="eq";rhs="mat2x3h()";test="texture"] + + [:op="eq";rhs="mat2x3h()";test="u32"] + + [:op="eq";rhs="mat2x3h()";test="vec"] + + [:op="ge";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="1i";test="ai"] + + [:op="ge";rhs="1i";test="array"] + + [:op="ge";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="1i";test="f16"] + + [:op="ge";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="1i";test="i32"] + + [:op="ge";rhs="1i";test="matf_matching"] + + [:op="ge";rhs="1i";test="matf_no_match"] + + [:op="ge";rhs="1i";test="math"] + + [:op="ge";rhs="1i";test="sampler"] + + [:op="ge";rhs="1i";test="struct"] + + [:op="ge";rhs="1i";test="texture"] + + [:op="ge";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="1i";test="vec"] + + [:op="ge";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="ai";test="array"] + + [:op="ge";rhs="ai";test="atomic"] + + [:op="ge";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="ai";test="f16"] + + [:op="ge";rhs="ai";test="f32"] + + [:op="ge";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="ai";test="matf_matching"] + + [:op="ge";rhs="ai";test="matf_no_match"] + + [:op="ge";rhs="ai";test="math"] + + [:op="ge";rhs="ai";test="sampler"] + + [:op="ge";rhs="ai";test="struct"] + + [:op="ge";rhs="ai";test="texture"] + + [:op="ge";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ge";rhs="ai";test="vec"] + + [:op="ge";rhs="mat2x3f()";test="af"] + + [:op="ge";rhs="mat2x3f()";test="ai"] + + [:op="ge";rhs="mat2x3f()";test="array"] + + [:op="ge";rhs="mat2x3f()";test="atomic"] + + [:op="ge";rhs="mat2x3f()";test="bool"] + + [:op="ge";rhs="mat2x3f()";test="f16"] + + [:op="ge";rhs="mat2x3f()";test="f32"] + + [:op="ge";rhs="mat2x3f()";test="i32"] + + [:op="ge";rhs="mat2x3f()";test="matf_matching"] + + [:op="ge";rhs="mat2x3f()";test="matf_no_match"] + + [:op="ge";rhs="mat2x3f()";test="math"] + + [:op="ge";rhs="mat2x3f()";test="sampler"] + + [:op="ge";rhs="mat2x3f()";test="struct"] + + [:op="ge";rhs="mat2x3f()";test="texture"] + + [:op="ge";rhs="mat2x3f()";test="u32"] + + [:op="ge";rhs="mat2x3f()";test="vec"] + + [:op="ge";rhs="mat2x3h()";test="af"] + + [:op="ge";rhs="mat2x3h()";test="ai"] + + [:op="ge";rhs="mat2x3h()";test="array"] + + [:op="ge";rhs="mat2x3h()";test="atomic"] + + [:op="ge";rhs="mat2x3h()";test="bool"] + + [:op="ge";rhs="mat2x3h()";test="f16"] + + [:op="ge";rhs="mat2x3h()";test="f32"] + + [:op="ge";rhs="mat2x3h()";test="i32"] + + [:op="ge";rhs="mat2x3h()";test="matf_matching"] + + [:op="ge";rhs="mat2x3h()";test="matf_no_match"] + + [:op="ge";rhs="mat2x3h()";test="math"] + + [:op="ge";rhs="mat2x3h()";test="sampler"] + + [:op="ge";rhs="mat2x3h()";test="struct"] + + [:op="ge";rhs="mat2x3h()";test="texture"] + + [:op="ge";rhs="mat2x3h()";test="u32"] + + [:op="ge";rhs="mat2x3h()";test="vec"] + + [:op="gt";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="1i";test="ai"] + + [:op="gt";rhs="1i";test="array"] + + [:op="gt";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="1i";test="f16"] + + [:op="gt";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="1i";test="i32"] + + [:op="gt";rhs="1i";test="matf_matching"] + + [:op="gt";rhs="1i";test="matf_no_match"] + + [:op="gt";rhs="1i";test="math"] + + [:op="gt";rhs="1i";test="sampler"] + + [:op="gt";rhs="1i";test="struct"] + + [:op="gt";rhs="1i";test="texture"] + + [:op="gt";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="1i";test="vec"] + + [:op="gt";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="ai";test="array"] + + [:op="gt";rhs="ai";test="atomic"] + + [:op="gt";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="ai";test="f16"] + + [:op="gt";rhs="ai";test="f32"] + + [:op="gt";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="ai";test="matf_matching"] + + [:op="gt";rhs="ai";test="matf_no_match"] + + [:op="gt";rhs="ai";test="math"] + + [:op="gt";rhs="ai";test="sampler"] + + [:op="gt";rhs="ai";test="struct"] + + [:op="gt";rhs="ai";test="texture"] + + [:op="gt";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="gt";rhs="ai";test="vec"] + + [:op="gt";rhs="mat2x3f()";test="af"] + + [:op="gt";rhs="mat2x3f()";test="ai"] + + [:op="gt";rhs="mat2x3f()";test="array"] + + [:op="gt";rhs="mat2x3f()";test="atomic"] + + [:op="gt";rhs="mat2x3f()";test="bool"] + + [:op="gt";rhs="mat2x3f()";test="f16"] + + [:op="gt";rhs="mat2x3f()";test="f32"] + + [:op="gt";rhs="mat2x3f()";test="i32"] + + [:op="gt";rhs="mat2x3f()";test="matf_matching"] + + [:op="gt";rhs="mat2x3f()";test="matf_no_match"] + + [:op="gt";rhs="mat2x3f()";test="math"] + + [:op="gt";rhs="mat2x3f()";test="sampler"] + + [:op="gt";rhs="mat2x3f()";test="struct"] + + [:op="gt";rhs="mat2x3f()";test="texture"] + + [:op="gt";rhs="mat2x3f()";test="u32"] + + [:op="gt";rhs="mat2x3f()";test="vec"] + + [:op="gt";rhs="mat2x3h()";test="af"] + + [:op="gt";rhs="mat2x3h()";test="ai"] + + [:op="gt";rhs="mat2x3h()";test="array"] + + [:op="gt";rhs="mat2x3h()";test="atomic"] + + [:op="gt";rhs="mat2x3h()";test="bool"] + + [:op="gt";rhs="mat2x3h()";test="f16"] + + [:op="gt";rhs="mat2x3h()";test="f32"] + + [:op="gt";rhs="mat2x3h()";test="i32"] + + [:op="gt";rhs="mat2x3h()";test="matf_matching"] + + [:op="gt";rhs="mat2x3h()";test="matf_no_match"] + + [:op="gt";rhs="mat2x3h()";test="math"] + + [:op="gt";rhs="mat2x3h()";test="sampler"] + + [:op="gt";rhs="mat2x3h()";test="struct"] + + [:op="gt";rhs="mat2x3h()";test="texture"] + + [:op="gt";rhs="mat2x3h()";test="u32"] + + [:op="gt";rhs="mat2x3h()";test="vec"] + + [:op="le";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="1i";test="ai"] + + [:op="le";rhs="1i";test="array"] + + [:op="le";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="1i";test="f16"] + + [:op="le";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="1i";test="i32"] + + [:op="le";rhs="1i";test="matf_matching"] + + [:op="le";rhs="1i";test="matf_no_match"] + + [:op="le";rhs="1i";test="math"] + + [:op="le";rhs="1i";test="sampler"] + + [:op="le";rhs="1i";test="struct"] + + [:op="le";rhs="1i";test="texture"] + + [:op="le";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="1i";test="vec"] + + [:op="le";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="ai";test="array"] + + [:op="le";rhs="ai";test="atomic"] + + [:op="le";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="ai";test="f16"] + + [:op="le";rhs="ai";test="f32"] + + [:op="le";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="ai";test="matf_matching"] + + [:op="le";rhs="ai";test="matf_no_match"] + + [:op="le";rhs="ai";test="math"] + + [:op="le";rhs="ai";test="sampler"] + + [:op="le";rhs="ai";test="struct"] + + [:op="le";rhs="ai";test="texture"] + + [:op="le";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="le";rhs="ai";test="vec"] + + [:op="le";rhs="mat2x3f()";test="af"] + + [:op="le";rhs="mat2x3f()";test="ai"] + + [:op="le";rhs="mat2x3f()";test="array"] + + [:op="le";rhs="mat2x3f()";test="atomic"] + + [:op="le";rhs="mat2x3f()";test="bool"] + + [:op="le";rhs="mat2x3f()";test="f16"] + + [:op="le";rhs="mat2x3f()";test="f32"] + + [:op="le";rhs="mat2x3f()";test="i32"] + + [:op="le";rhs="mat2x3f()";test="matf_matching"] + + [:op="le";rhs="mat2x3f()";test="matf_no_match"] + + [:op="le";rhs="mat2x3f()";test="math"] + + [:op="le";rhs="mat2x3f()";test="sampler"] + + [:op="le";rhs="mat2x3f()";test="struct"] + + [:op="le";rhs="mat2x3f()";test="texture"] + + [:op="le";rhs="mat2x3f()";test="u32"] + + [:op="le";rhs="mat2x3f()";test="vec"] + + [:op="le";rhs="mat2x3h()";test="af"] + + [:op="le";rhs="mat2x3h()";test="ai"] + + [:op="le";rhs="mat2x3h()";test="array"] + + [:op="le";rhs="mat2x3h()";test="atomic"] + + [:op="le";rhs="mat2x3h()";test="bool"] + + [:op="le";rhs="mat2x3h()";test="f16"] + + [:op="le";rhs="mat2x3h()";test="f32"] + + [:op="le";rhs="mat2x3h()";test="i32"] + + [:op="le";rhs="mat2x3h()";test="matf_matching"] + + [:op="le";rhs="mat2x3h()";test="matf_no_match"] + + [:op="le";rhs="mat2x3h()";test="math"] + + [:op="le";rhs="mat2x3h()";test="sampler"] + + [:op="le";rhs="mat2x3h()";test="struct"] + + [:op="le";rhs="mat2x3h()";test="texture"] + + [:op="le";rhs="mat2x3h()";test="u32"] + + [:op="le";rhs="mat2x3h()";test="vec"] + + [:op="lt";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="1i";test="ai"] + + [:op="lt";rhs="1i";test="array"] + + [:op="lt";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="1i";test="f16"] + + [:op="lt";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="1i";test="i32"] + + [:op="lt";rhs="1i";test="matf_matching"] + + [:op="lt";rhs="1i";test="matf_no_match"] + + [:op="lt";rhs="1i";test="math"] + + [:op="lt";rhs="1i";test="sampler"] + + [:op="lt";rhs="1i";test="struct"] + + [:op="lt";rhs="1i";test="texture"] + + [:op="lt";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="1i";test="vec"] + + [:op="lt";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="ai";test="array"] + + [:op="lt";rhs="ai";test="atomic"] + + [:op="lt";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="ai";test="f16"] + + [:op="lt";rhs="ai";test="f32"] + + [:op="lt";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="ai";test="matf_matching"] + + [:op="lt";rhs="ai";test="matf_no_match"] + + [:op="lt";rhs="ai";test="math"] + + [:op="lt";rhs="ai";test="sampler"] + + [:op="lt";rhs="ai";test="struct"] + + [:op="lt";rhs="ai";test="texture"] + + [:op="lt";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="lt";rhs="ai";test="vec"] + + [:op="lt";rhs="mat2x3f()";test="af"] + + [:op="lt";rhs="mat2x3f()";test="ai"] + + [:op="lt";rhs="mat2x3f()";test="array"] + + [:op="lt";rhs="mat2x3f()";test="atomic"] + + [:op="lt";rhs="mat2x3f()";test="bool"] + + [:op="lt";rhs="mat2x3f()";test="f16"] + + [:op="lt";rhs="mat2x3f()";test="f32"] + + [:op="lt";rhs="mat2x3f()";test="i32"] + + [:op="lt";rhs="mat2x3f()";test="matf_matching"] + + [:op="lt";rhs="mat2x3f()";test="matf_no_match"] + + [:op="lt";rhs="mat2x3f()";test="math"] + + [:op="lt";rhs="mat2x3f()";test="sampler"] + + [:op="lt";rhs="mat2x3f()";test="struct"] + + [:op="lt";rhs="mat2x3f()";test="texture"] + + [:op="lt";rhs="mat2x3f()";test="u32"] + + [:op="lt";rhs="mat2x3f()";test="vec"] + + [:op="lt";rhs="mat2x3h()";test="af"] + + [:op="lt";rhs="mat2x3h()";test="ai"] + + [:op="lt";rhs="mat2x3h()";test="array"] + + [:op="lt";rhs="mat2x3h()";test="atomic"] + + [:op="lt";rhs="mat2x3h()";test="bool"] + + [:op="lt";rhs="mat2x3h()";test="f16"] + + [:op="lt";rhs="mat2x3h()";test="f32"] + + [:op="lt";rhs="mat2x3h()";test="i32"] + + [:op="lt";rhs="mat2x3h()";test="matf_matching"] + + [:op="lt";rhs="mat2x3h()";test="matf_no_match"] + + [:op="lt";rhs="mat2x3h()";test="math"] + + [:op="lt";rhs="mat2x3h()";test="sampler"] + + [:op="lt";rhs="mat2x3h()";test="struct"] + + [:op="lt";rhs="mat2x3h()";test="texture"] + + [:op="lt";rhs="mat2x3h()";test="u32"] + + [:op="lt";rhs="mat2x3h()";test="vec"] + + [:op="ne";rhs="1i";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="1i";test="ai"] + + [:op="ne";rhs="1i";test="array"] + + [:op="ne";rhs="1i";test="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="1i";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="1i";test="f16"] + + [:op="ne";rhs="1i";test="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="1i";test="i32"] + + [:op="ne";rhs="1i";test="matf_matching"] + + [:op="ne";rhs="1i";test="matf_no_match"] + + [:op="ne";rhs="1i";test="math"] + + [:op="ne";rhs="1i";test="sampler"] + + [:op="ne";rhs="1i";test="struct"] + + [:op="ne";rhs="1i";test="texture"] + + [:op="ne";rhs="1i";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="1i";test="vec"] + + [:op="ne";rhs="ai";test="af"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="ai";test="ai"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="ai";test="array"] + + [:op="ne";rhs="ai";test="atomic"] + + [:op="ne";rhs="ai";test="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="ai";test="f16"] + + [:op="ne";rhs="ai";test="f32"] + + [:op="ne";rhs="ai";test="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="ai";test="matf_matching"] + + [:op="ne";rhs="ai";test="matf_no_match"] + + [:op="ne";rhs="ai";test="math"] + + [:op="ne";rhs="ai";test="sampler"] + + [:op="ne";rhs="ai";test="struct"] + + [:op="ne";rhs="ai";test="texture"] + + [:op="ne";rhs="ai";test="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:op="ne";rhs="ai";test="vec"] + + [:op="ne";rhs="mat2x3f()";test="af"] + + [:op="ne";rhs="mat2x3f()";test="ai"] + + [:op="ne";rhs="mat2x3f()";test="array"] + + [:op="ne";rhs="mat2x3f()";test="atomic"] + + [:op="ne";rhs="mat2x3f()";test="bool"] + + [:op="ne";rhs="mat2x3f()";test="f16"] + + [:op="ne";rhs="mat2x3f()";test="f32"] + + [:op="ne";rhs="mat2x3f()";test="i32"] + + [:op="ne";rhs="mat2x3f()";test="matf_matching"] + + [:op="ne";rhs="mat2x3f()";test="matf_no_match"] + + [:op="ne";rhs="mat2x3f()";test="math"] + + [:op="ne";rhs="mat2x3f()";test="sampler"] + + [:op="ne";rhs="mat2x3f()";test="struct"] + + [:op="ne";rhs="mat2x3f()";test="texture"] + + [:op="ne";rhs="mat2x3f()";test="u32"] + + [:op="ne";rhs="mat2x3f()";test="vec"] + + [:op="ne";rhs="mat2x3h()";test="af"] + + [:op="ne";rhs="mat2x3h()";test="ai"] + + [:op="ne";rhs="mat2x3h()";test="array"] + + [:op="ne";rhs="mat2x3h()";test="atomic"] + + [:op="ne";rhs="mat2x3h()";test="bool"] + + [:op="ne";rhs="mat2x3h()";test="f16"] + + [:op="ne";rhs="mat2x3h()";test="f32"] + + [:op="ne";rhs="mat2x3h()";test="i32"] + + [:op="ne";rhs="mat2x3h()";test="matf_matching"] + + [:op="ne";rhs="mat2x3h()";test="matf_no_match"] + + [:op="ne";rhs="mat2x3h()";test="math"] + + [:op="ne";rhs="mat2x3h()";test="sampler"] + + [:op="ne";rhs="mat2x3h()";test="struct"] + + [:op="ne";rhs="mat2x3h()";test="texture"] + + [:op="ne";rhs="mat2x3h()";test="u32"] + + [:op="ne";rhs="mat2x3h()";test="vec"] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,div_rem:invalid:*] + [:op="div";rhs="1i";test="af";swap=false] + + [:op="div";rhs="1i";test="af";swap=true] + + [:op="div";rhs="1i";test="ai";swap=false] + + [:op="div";rhs="1i";test="ai";swap=true] + + [:op="div";rhs="1i";test="array";swap=false] + + [:op="div";rhs="1i";test="array";swap=true] + + [:op="div";rhs="1i";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="1i";test="atomic";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="1i";test="bool";swap=false] + + [:op="div";rhs="1i";test="bool";swap=true] + + [:op="div";rhs="1i";test="f16";swap=false] + + [:op="div";rhs="1i";test="f16";swap=true] + + [:op="div";rhs="1i";test="f32";swap=false] + + [:op="div";rhs="1i";test="f32";swap=true] + + [:op="div";rhs="1i";test="i32";swap=false] + + [:op="div";rhs="1i";test="i32";swap=true] + + [:op="div";rhs="1i";test="matf_matching";swap=false] + + [:op="div";rhs="1i";test="matf_matching";swap=true] + + [:op="div";rhs="1i";test="matf_no_match";swap=false] + + [:op="div";rhs="1i";test="matf_no_match";swap=true] + + [:op="div";rhs="1i";test="math";swap=false] + + [:op="div";rhs="1i";test="math";swap=true] + + [:op="div";rhs="1i";test="sampler";swap=false] + + [:op="div";rhs="1i";test="sampler";swap=true] + + [:op="div";rhs="1i";test="struct";swap=false] + + [:op="div";rhs="1i";test="struct";swap=true] + + [:op="div";rhs="1i";test="texture";swap=false] + + [:op="div";rhs="1i";test="texture";swap=true] + + [:op="div";rhs="1i";test="u32";swap=false] + + [:op="div";rhs="1i";test="u32";swap=true] + + [:op="div";rhs="1i";test="vec";swap=false] + + [:op="div";rhs="1i";test="vec";swap=true] + + [:op="div";rhs="ai";test="af";swap=false] + + [:op="div";rhs="ai";test="af";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="ai";test="ai";swap=false] + + [:op="div";rhs="ai";test="ai";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="ai";test="array";swap=false] + + [:op="div";rhs="ai";test="array";swap=true] + + [:op="div";rhs="ai";test="atomic";swap=false] + + [:op="div";rhs="ai";test="atomic";swap=true] + + [:op="div";rhs="ai";test="bool";swap=false] + + [:op="div";rhs="ai";test="bool";swap=true] + + [:op="div";rhs="ai";test="f16";swap=false] + + [:op="div";rhs="ai";test="f16";swap=true] + + [:op="div";rhs="ai";test="f32";swap=false] + + [:op="div";rhs="ai";test="f32";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="ai";test="i32";swap=false] + + [:op="div";rhs="ai";test="i32";swap=true] + + [:op="div";rhs="ai";test="matf_matching";swap=false] + + [:op="div";rhs="ai";test="matf_matching";swap=true] + + [:op="div";rhs="ai";test="matf_no_match";swap=false] + + [:op="div";rhs="ai";test="matf_no_match";swap=true] + + [:op="div";rhs="ai";test="math";swap=false] + + [:op="div";rhs="ai";test="math";swap=true] + + [:op="div";rhs="ai";test="sampler";swap=false] + + [:op="div";rhs="ai";test="sampler";swap=true] + + [:op="div";rhs="ai";test="struct";swap=false] + + [:op="div";rhs="ai";test="struct";swap=true] + + [:op="div";rhs="ai";test="texture";swap=false] + + [:op="div";rhs="ai";test="texture";swap=true] + + [:op="div";rhs="ai";test="u32";swap=false] + + [:op="div";rhs="ai";test="u32";swap=true] + + [:op="div";rhs="ai";test="vec";swap=false] + + [:op="div";rhs="ai";test="vec";swap=true] + + [:op="div";rhs="mat2x3f()";test="af";swap=false] + + [:op="div";rhs="mat2x3f()";test="af";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="mat2x3f()";test="ai";swap=false] + + [:op="div";rhs="mat2x3f()";test="ai";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="mat2x3f()";test="array";swap=false] + + [:op="div";rhs="mat2x3f()";test="array";swap=true] + + [:op="div";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="div";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="div";rhs="mat2x3f()";test="bool";swap=false] + + [:op="div";rhs="mat2x3f()";test="bool";swap=true] + + [:op="div";rhs="mat2x3f()";test="f16";swap=false] + + [:op="div";rhs="mat2x3f()";test="f16";swap=true] + + [:op="div";rhs="mat2x3f()";test="f32";swap=false] + + [:op="div";rhs="mat2x3f()";test="f32";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="div";rhs="mat2x3f()";test="i32";swap=false] + + [:op="div";rhs="mat2x3f()";test="i32";swap=true] + + [:op="div";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="div";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="div";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="div";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="div";rhs="mat2x3f()";test="math";swap=false] + + [:op="div";rhs="mat2x3f()";test="math";swap=true] + + [:op="div";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="div";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="div";rhs="mat2x3f()";test="struct";swap=false] + + [:op="div";rhs="mat2x3f()";test="struct";swap=true] + + [:op="div";rhs="mat2x3f()";test="texture";swap=false] + + [:op="div";rhs="mat2x3f()";test="texture";swap=true] + + [:op="div";rhs="mat2x3f()";test="u32";swap=false] + + [:op="div";rhs="mat2x3f()";test="u32";swap=true] + + [:op="div";rhs="mat2x3f()";test="vec";swap=false] + + [:op="div";rhs="mat2x3f()";test="vec";swap=true] + + [:op="div";rhs="mat2x3h()";test="af";swap=false] + + [:op="div";rhs="mat2x3h()";test="af";swap=true] + + [:op="div";rhs="mat2x3h()";test="ai";swap=false] + + [:op="div";rhs="mat2x3h()";test="ai";swap=true] + + [:op="div";rhs="mat2x3h()";test="array";swap=false] + + [:op="div";rhs="mat2x3h()";test="array";swap=true] + + [:op="div";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="div";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="div";rhs="mat2x3h()";test="bool";swap=false] + + [:op="div";rhs="mat2x3h()";test="bool";swap=true] + + [:op="div";rhs="mat2x3h()";test="f16";swap=false] + + [:op="div";rhs="mat2x3h()";test="f16";swap=true] + + [:op="div";rhs="mat2x3h()";test="f32";swap=false] + + [:op="div";rhs="mat2x3h()";test="f32";swap=true] + + [:op="div";rhs="mat2x3h()";test="i32";swap=false] + + [:op="div";rhs="mat2x3h()";test="i32";swap=true] + + [:op="div";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="div";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="div";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="div";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="div";rhs="mat2x3h()";test="math";swap=false] + + [:op="div";rhs="mat2x3h()";test="math";swap=true] + + [:op="div";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="div";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="div";rhs="mat2x3h()";test="struct";swap=false] + + [:op="div";rhs="mat2x3h()";test="struct";swap=true] + + [:op="div";rhs="mat2x3h()";test="texture";swap=false] + + [:op="div";rhs="mat2x3h()";test="texture";swap=true] + + [:op="div";rhs="mat2x3h()";test="u32";swap=false] + + [:op="div";rhs="mat2x3h()";test="u32";swap=true] + + [:op="div";rhs="mat2x3h()";test="vec";swap=false] + + [:op="div";rhs="mat2x3h()";test="vec";swap=true] + + [:op="rem";rhs="1i";test="af";swap=false] + + [:op="rem";rhs="1i";test="af";swap=true] + + [:op="rem";rhs="1i";test="ai";swap=false] + + [:op="rem";rhs="1i";test="ai";swap=true] + + [:op="rem";rhs="1i";test="array";swap=false] + + [:op="rem";rhs="1i";test="array";swap=true] + + [:op="rem";rhs="1i";test="atomic";swap=false] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="1i";test="atomic";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="1i";test="bool";swap=false] + + [:op="rem";rhs="1i";test="bool";swap=true] + + [:op="rem";rhs="1i";test="f16";swap=false] + + [:op="rem";rhs="1i";test="f16";swap=true] + + [:op="rem";rhs="1i";test="f32";swap=false] + + [:op="rem";rhs="1i";test="f32";swap=true] + + [:op="rem";rhs="1i";test="i32";swap=false] + + [:op="rem";rhs="1i";test="i32";swap=true] + + [:op="rem";rhs="1i";test="matf_matching";swap=false] + + [:op="rem";rhs="1i";test="matf_matching";swap=true] + + [:op="rem";rhs="1i";test="matf_no_match";swap=false] + + [:op="rem";rhs="1i";test="matf_no_match";swap=true] + + [:op="rem";rhs="1i";test="math";swap=false] + + [:op="rem";rhs="1i";test="math";swap=true] + + [:op="rem";rhs="1i";test="sampler";swap=false] + + [:op="rem";rhs="1i";test="sampler";swap=true] + + [:op="rem";rhs="1i";test="struct";swap=false] + + [:op="rem";rhs="1i";test="struct";swap=true] + + [:op="rem";rhs="1i";test="texture";swap=false] + + [:op="rem";rhs="1i";test="texture";swap=true] + + [:op="rem";rhs="1i";test="u32";swap=false] + + [:op="rem";rhs="1i";test="u32";swap=true] + + [:op="rem";rhs="1i";test="vec";swap=false] + + [:op="rem";rhs="1i";test="vec";swap=true] + + [:op="rem";rhs="ai";test="af";swap=false] + + [:op="rem";rhs="ai";test="af";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="ai";test="ai";swap=false] + + [:op="rem";rhs="ai";test="ai";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="ai";test="array";swap=false] + + [:op="rem";rhs="ai";test="array";swap=true] + + [:op="rem";rhs="ai";test="atomic";swap=false] + + [:op="rem";rhs="ai";test="atomic";swap=true] + + [:op="rem";rhs="ai";test="bool";swap=false] + + [:op="rem";rhs="ai";test="bool";swap=true] + + [:op="rem";rhs="ai";test="f16";swap=false] + + [:op="rem";rhs="ai";test="f16";swap=true] + + [:op="rem";rhs="ai";test="f32";swap=false] + + [:op="rem";rhs="ai";test="f32";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="ai";test="i32";swap=false] + + [:op="rem";rhs="ai";test="i32";swap=true] + + [:op="rem";rhs="ai";test="matf_matching";swap=false] + + [:op="rem";rhs="ai";test="matf_matching";swap=true] + + [:op="rem";rhs="ai";test="matf_no_match";swap=false] + + [:op="rem";rhs="ai";test="matf_no_match";swap=true] + + [:op="rem";rhs="ai";test="math";swap=false] + + [:op="rem";rhs="ai";test="math";swap=true] + + [:op="rem";rhs="ai";test="sampler";swap=false] + + [:op="rem";rhs="ai";test="sampler";swap=true] + + [:op="rem";rhs="ai";test="struct";swap=false] + + [:op="rem";rhs="ai";test="struct";swap=true] + + [:op="rem";rhs="ai";test="texture";swap=false] + + [:op="rem";rhs="ai";test="texture";swap=true] + + [:op="rem";rhs="ai";test="u32";swap=false] + + [:op="rem";rhs="ai";test="u32";swap=true] + + [:op="rem";rhs="ai";test="vec";swap=false] + + [:op="rem";rhs="ai";test="vec";swap=true] + + [:op="rem";rhs="mat2x3f()";test="af";swap=false] + + [:op="rem";rhs="mat2x3f()";test="af";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="mat2x3f()";test="ai";swap=false] + + [:op="rem";rhs="mat2x3f()";test="ai";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="mat2x3f()";test="array";swap=false] + + [:op="rem";rhs="mat2x3f()";test="array";swap=true] + + [:op="rem";rhs="mat2x3f()";test="atomic";swap=false] + + [:op="rem";rhs="mat2x3f()";test="atomic";swap=true] + + [:op="rem";rhs="mat2x3f()";test="bool";swap=false] + + [:op="rem";rhs="mat2x3f()";test="bool";swap=true] + + [:op="rem";rhs="mat2x3f()";test="f16";swap=false] + + [:op="rem";rhs="mat2x3f()";test="f16";swap=true] + + [:op="rem";rhs="mat2x3f()";test="f32";swap=false] + + [:op="rem";rhs="mat2x3f()";test="f32";swap=true] + expected: + if os == "linux" and not debug: FAIL + + [:op="rem";rhs="mat2x3f()";test="i32";swap=false] + + [:op="rem";rhs="mat2x3f()";test="i32";swap=true] + + [:op="rem";rhs="mat2x3f()";test="matf_matching";swap=false] + + [:op="rem";rhs="mat2x3f()";test="matf_matching";swap=true] + + [:op="rem";rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:op="rem";rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:op="rem";rhs="mat2x3f()";test="math";swap=false] + + [:op="rem";rhs="mat2x3f()";test="math";swap=true] + + [:op="rem";rhs="mat2x3f()";test="sampler";swap=false] + + [:op="rem";rhs="mat2x3f()";test="sampler";swap=true] + + [:op="rem";rhs="mat2x3f()";test="struct";swap=false] + + [:op="rem";rhs="mat2x3f()";test="struct";swap=true] + + [:op="rem";rhs="mat2x3f()";test="texture";swap=false] + + [:op="rem";rhs="mat2x3f()";test="texture";swap=true] + + [:op="rem";rhs="mat2x3f()";test="u32";swap=false] + + [:op="rem";rhs="mat2x3f()";test="u32";swap=true] + + [:op="rem";rhs="mat2x3f()";test="vec";swap=false] + + [:op="rem";rhs="mat2x3f()";test="vec";swap=true] + + [:op="rem";rhs="mat2x3h()";test="af";swap=false] + + [:op="rem";rhs="mat2x3h()";test="af";swap=true] + + [:op="rem";rhs="mat2x3h()";test="ai";swap=false] + + [:op="rem";rhs="mat2x3h()";test="ai";swap=true] + + [:op="rem";rhs="mat2x3h()";test="array";swap=false] + + [:op="rem";rhs="mat2x3h()";test="array";swap=true] + + [:op="rem";rhs="mat2x3h()";test="atomic";swap=false] + + [:op="rem";rhs="mat2x3h()";test="atomic";swap=true] + + [:op="rem";rhs="mat2x3h()";test="bool";swap=false] + + [:op="rem";rhs="mat2x3h()";test="bool";swap=true] + + [:op="rem";rhs="mat2x3h()";test="f16";swap=false] + + [:op="rem";rhs="mat2x3h()";test="f16";swap=true] + + [:op="rem";rhs="mat2x3h()";test="f32";swap=false] + + [:op="rem";rhs="mat2x3h()";test="f32";swap=true] + + [:op="rem";rhs="mat2x3h()";test="i32";swap=false] + + [:op="rem";rhs="mat2x3h()";test="i32";swap=true] + + [:op="rem";rhs="mat2x3h()";test="matf_matching";swap=false] + + [:op="rem";rhs="mat2x3h()";test="matf_matching";swap=true] + + [:op="rem";rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:op="rem";rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:op="rem";rhs="mat2x3h()";test="math";swap=false] + + [:op="rem";rhs="mat2x3h()";test="math";swap=true] + + [:op="rem";rhs="mat2x3h()";test="sampler";swap=false] + + [:op="rem";rhs="mat2x3h()";test="sampler";swap=true] + + [:op="rem";rhs="mat2x3h()";test="struct";swap=false] + + [:op="rem";rhs="mat2x3h()";test="struct";swap=true] + + [:op="rem";rhs="mat2x3h()";test="texture";swap=false] + + [:op="rem";rhs="mat2x3h()";test="texture";swap=true] + + [:op="rem";rhs="mat2x3h()";test="u32";swap=false] + + [:op="rem";rhs="mat2x3h()";test="u32";swap=true] + + [:op="rem";rhs="mat2x3h()";test="vec";swap=false] + + [:op="rem";rhs="mat2x3h()";test="vec";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:f16_and_f32_matrix:*] + [:rhs="mat2x3f()";swap=false] + + [:rhs="mat2x3f()";swap=true] + + [:rhs="mat2x3h()";swap=false] + + [:rhs="mat2x3h()";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:f32_and_f16_matrix:*] + [:rhs="mat2x3f()";swap=false] + + [:rhs="mat2x3f()";swap=true] + + [:rhs="mat2x3h()";swap=false] + + [:rhs="mat2x3h()";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:invalid:*] + [:rhs="ai";test="array";swap=false] + + [:rhs="ai";test="array";swap=true] + + [:rhs="ai";test="atomic";swap=false] + + [:rhs="ai";test="atomic";swap=true] + + [:rhs="ai";test="bool";swap=false] + + [:rhs="ai";test="bool";swap=true] + + [:rhs="ai";test="i32";swap=false] + + [:rhs="ai";test="i32";swap=true] + + [:rhs="ai";test="match";swap=false] + + [:rhs="ai";test="match";swap=true] + + [:rhs="ai";test="matf_no_match";swap=false] + + [:rhs="ai";test="matf_no_match";swap=true] + + [:rhs="ai";test="sampler";swap=false] + + [:rhs="ai";test="sampler";swap=true] + + [:rhs="ai";test="struct";swap=false] + + [:rhs="ai";test="struct";swap=true] + + [:rhs="ai";test="texture";swap=false] + + [:rhs="ai";test="texture";swap=true] + + [:rhs="ai";test="u32";swap=false] + + [:rhs="ai";test="u32";swap=true] + + [:rhs="ai";test="vec";swap=false] + + [:rhs="ai";test="vec";swap=true] + + [:rhs="mat2x3f()";test="array";swap=false] + + [:rhs="mat2x3f()";test="array";swap=true] + + [:rhs="mat2x3f()";test="atomic";swap=false] + + [:rhs="mat2x3f()";test="atomic";swap=true] + + [:rhs="mat2x3f()";test="bool";swap=false] + + [:rhs="mat2x3f()";test="bool";swap=true] + + [:rhs="mat2x3f()";test="i32";swap=false] + + [:rhs="mat2x3f()";test="i32";swap=true] + + [:rhs="mat2x3f()";test="match";swap=false] + + [:rhs="mat2x3f()";test="match";swap=true] + + [:rhs="mat2x3f()";test="matf_no_match";swap=false] + + [:rhs="mat2x3f()";test="matf_no_match";swap=true] + + [:rhs="mat2x3f()";test="sampler";swap=false] + + [:rhs="mat2x3f()";test="sampler";swap=true] + + [:rhs="mat2x3f()";test="struct";swap=false] + + [:rhs="mat2x3f()";test="struct";swap=true] + + [:rhs="mat2x3f()";test="texture";swap=false] + + [:rhs="mat2x3f()";test="texture";swap=true] + + [:rhs="mat2x3f()";test="u32";swap=false] + + [:rhs="mat2x3f()";test="u32";swap=true] + + [:rhs="mat2x3f()";test="vec";swap=false] + + [:rhs="mat2x3f()";test="vec";swap=true] + + [:rhs="mat2x3h()";test="array";swap=false] + + [:rhs="mat2x3h()";test="array";swap=true] + + [:rhs="mat2x3h()";test="atomic";swap=false] + + [:rhs="mat2x3h()";test="atomic";swap=true] + + [:rhs="mat2x3h()";test="bool";swap=false] + + [:rhs="mat2x3h()";test="bool";swap=true] + + [:rhs="mat2x3h()";test="i32";swap=false] + + [:rhs="mat2x3h()";test="i32";swap=true] + + [:rhs="mat2x3h()";test="match";swap=false] + + [:rhs="mat2x3h()";test="match";swap=true] + + [:rhs="mat2x3h()";test="matf_no_match";swap=false] + + [:rhs="mat2x3h()";test="matf_no_match";swap=true] + + [:rhs="mat2x3h()";test="sampler";swap=false] + + [:rhs="mat2x3h()";test="sampler";swap=true] + + [:rhs="mat2x3h()";test="struct";swap=false] + + [:rhs="mat2x3h()";test="struct";swap=true] + + [:rhs="mat2x3h()";test="texture";swap=false] + + [:rhs="mat2x3h()";test="texture";swap=true] + + [:rhs="mat2x3h()";test="u32";swap=false] + + [:rhs="mat2x3h()";test="u32";swap=true] + + [:rhs="mat2x3h()";test="vec";swap=false] + + [:rhs="mat2x3h()";test="vec";swap=true] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:mat_by_mat:*] + [:ty1="";ty2=""] + expected: + if os == "linux" and not debug: FAIL + + [:ty1="";ty2="f"] + + [:ty1="";ty2="h"] + + [:ty1="f";ty2=""] + + [:ty1="f";ty2="f"] + + [:ty1="f";ty2="h"] + + [:ty1="h";ty2=""] + + [:ty1="h";ty2="f"] + + [:ty1="h";ty2="h"] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:mat_by_vec:*] + [:ty1="";ty2=""] + expected: + if os == "linux" and not debug: FAIL + + [:ty1="";ty2="f"] + + [:ty1="";ty2="h"] + + [:ty1="f";ty2=""] + + [:ty1="f";ty2="f"] + + [:ty1="f";ty2="h"] + + [:ty1="h";ty2=""] + + [:ty1="h";ty2="f"] + + [:ty1="h";ty2="h"] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_abstract:*] + [:rhs=1.7976931348623157e%2B308;c=2;r=2] + + [:rhs=1.7976931348623157e%2B308;c=2;r=3] + + [:rhs=1.7976931348623157e%2B308;c=2;r=4] + + [:rhs=1.7976931348623157e%2B308;c=3;r=2] + + [:rhs=1.7976931348623157e%2B308;c=3;r=3] + + [:rhs=1.7976931348623157e%2B308;c=3;r=4] + + [:rhs=1.7976931348623157e%2B308;c=4;r=2] + + [:rhs=1.7976931348623157e%2B308;c=4;r=3] + + [:rhs=1.7976931348623157e%2B308;c=4;r=4] + + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_abstract_internal:*] + [:lhs=1.7976931348623157e%2B308;c=2;r=2] + + [:lhs=1.7976931348623157e%2B308;c=2;r=3] + + [:lhs=1.7976931348623157e%2B308;c=2;r=4] + + [:lhs=1.7976931348623157e%2B308;c=3;r=2] + + [:lhs=1.7976931348623157e%2B308;c=3;r=3] + + [:lhs=1.7976931348623157e%2B308;c=3;r=4] + + [:lhs=1.7976931348623157e%2B308;c=4;r=2] + + [:lhs=1.7976931348623157e%2B308;c=4;r=3] + + [:lhs=1.7976931348623157e%2B308;c=4;r=4] + + [:lhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f16:*] + [:rhs=1;c=2;r=2] + + [:rhs=1;c=2;r=3] + + [:rhs=1;c=2;r=4] + + [:rhs=1;c=3;r=2] + + [:rhs=1;c=3;r=3] + + [:rhs=1;c=3;r=4] + + [:rhs=1;c=4;r=2] + + [:rhs=1;c=4;r=3] + + [:rhs=1;c=4;r=4] + + [:rhs=65504;c=2;r=2] + + [:rhs=65504;c=2;r=3] + + [:rhs=65504;c=2;r=4] + + [:rhs=65504;c=3;r=2] + + [:rhs=65504;c=3;r=3] + + [:rhs=65504;c=3;r=4] + + [:rhs=65504;c=4;r=2] + + [:rhs=65504;c=4;r=3] + + [:rhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f16_internal:*] + [:lhs=1;c=2;r=2] + + [:lhs=1;c=2;r=3] + + [:lhs=1;c=2;r=4] + + [:lhs=1;c=3;r=2] + + [:lhs=1;c=3;r=3] + + [:lhs=1;c=3;r=4] + + [:lhs=1;c=4;r=2] + + [:lhs=1;c=4;r=3] + + [:lhs=1;c=4;r=4] + + [:lhs=65504;c=2;r=2] + + [:lhs=65504;c=2;r=3] + + [:lhs=65504;c=2;r=4] + + [:lhs=65504;c=3;r=2] + + [:lhs=65504;c=3;r=3] + + [:lhs=65504;c=3;r=4] + + [:lhs=65504;c=4;r=2] + + [:lhs=65504;c=4;r=3] + + [:lhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f32:*] + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=3.4028234663852886e%2B38;c=2;r=2] + + [:rhs=3.4028234663852886e%2B38;c=2;r=3] + + [:rhs=3.4028234663852886e%2B38;c=2;r=4] + + [:rhs=3.4028234663852886e%2B38;c=3;r=2] + + [:rhs=3.4028234663852886e%2B38;c=3;r=3] + + [:rhs=3.4028234663852886e%2B38;c=3;r=4] + + [:rhs=3.4028234663852886e%2B38;c=4;r=2] + + [:rhs=3.4028234663852886e%2B38;c=4;r=3] + + [:rhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_mat_f32_internal:*] + [:lhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=3.4028234663852886e%2B38;c=2;r=2] + + [:lhs=3.4028234663852886e%2B38;c=2;r=3] + + [:lhs=3.4028234663852886e%2B38;c=2;r=4] + + [:lhs=3.4028234663852886e%2B38;c=3;r=2] + + [:lhs=3.4028234663852886e%2B38;c=3;r=3] + + [:lhs=3.4028234663852886e%2B38;c=3;r=4] + + [:lhs=3.4028234663852886e%2B38;c=4;r=2] + + [:lhs=3.4028234663852886e%2B38;c=4;r=3] + + [:lhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_abstract:*] + [:rhs=1.7976931348623157e%2B308;c=2;r=2] + + [:rhs=1.7976931348623157e%2B308;c=2;r=3] + + [:rhs=1.7976931348623157e%2B308;c=2;r=4] + + [:rhs=1.7976931348623157e%2B308;c=3;r=2] + + [:rhs=1.7976931348623157e%2B308;c=3;r=3] + + [:rhs=1.7976931348623157e%2B308;c=3;r=4] + + [:rhs=1.7976931348623157e%2B308;c=4;r=2] + + [:rhs=1.7976931348623157e%2B308;c=4;r=3] + + [:rhs=1.7976931348623157e%2B308;c=4;r=4] + + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_f16:*] + [:rhs=1;c=2;r=2] + + [:rhs=1;c=2;r=3] + + [:rhs=1;c=2;r=4] + + [:rhs=1;c=3;r=2] + + [:rhs=1;c=3;r=3] + + [:rhs=1;c=3;r=4] + + [:rhs=1;c=4;r=2] + + [:rhs=1;c=4;r=3] + + [:rhs=1;c=4;r=4] + + [:rhs=65504;c=2;r=2] + + [:rhs=65504;c=2;r=3] + + [:rhs=65504;c=2;r=4] + + [:rhs=65504;c=3;r=2] + + [:rhs=65504;c=3;r=3] + + [:rhs=65504;c=3;r=4] + + [:rhs=65504;c=4;r=2] + + [:rhs=65504;c=4;r=3] + + [:rhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_scalar_f32:*] + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=3.4028234663852886e%2B38;c=2;r=2] + + [:rhs=3.4028234663852886e%2B38;c=2;r=3] + + [:rhs=3.4028234663852886e%2B38;c=2;r=4] + + [:rhs=3.4028234663852886e%2B38;c=3;r=2] + + [:rhs=3.4028234663852886e%2B38;c=3;r=3] + + [:rhs=3.4028234663852886e%2B38;c=3;r=4] + + [:rhs=3.4028234663852886e%2B38;c=4;r=2] + + [:rhs=3.4028234663852886e%2B38;c=4;r=3] + + [:rhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_abstract:*] + [:rhs=1.7976931348623157e%2B308;c=2;r=2] + + [:rhs=1.7976931348623157e%2B308;c=2;r=3] + + [:rhs=1.7976931348623157e%2B308;c=2;r=4] + + [:rhs=1.7976931348623157e%2B308;c=3;r=2] + + [:rhs=1.7976931348623157e%2B308;c=3;r=3] + + [:rhs=1.7976931348623157e%2B308;c=3;r=4] + + [:rhs=1.7976931348623157e%2B308;c=4;r=2] + + [:rhs=1.7976931348623157e%2B308;c=4;r=3] + + [:rhs=1.7976931348623157e%2B308;c=4;r=4] + + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_abstract_internal:*] + [:lhs=1.7976931348623157e%2B308;c=2;r=2] + + [:lhs=1.7976931348623157e%2B308;c=2;r=3] + + [:lhs=1.7976931348623157e%2B308;c=2;r=4] + + [:lhs=1.7976931348623157e%2B308;c=3;r=2] + + [:lhs=1.7976931348623157e%2B308;c=3;r=3] + + [:lhs=1.7976931348623157e%2B308;c=3;r=4] + + [:lhs=1.7976931348623157e%2B308;c=4;r=2] + + [:lhs=1.7976931348623157e%2B308;c=4;r=3] + + [:lhs=1.7976931348623157e%2B308;c=4;r=4] + + [:lhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f16:*] + [:rhs=1;c=2;r=2] + + [:rhs=1;c=2;r=3] + + [:rhs=1;c=2;r=4] + + [:rhs=1;c=3;r=2] + + [:rhs=1;c=3;r=3] + + [:rhs=1;c=3;r=4] + + [:rhs=1;c=4;r=2] + + [:rhs=1;c=4;r=3] + + [:rhs=1;c=4;r=4] + + [:rhs=65504;c=2;r=2] + + [:rhs=65504;c=2;r=3] + + [:rhs=65504;c=2;r=4] + + [:rhs=65504;c=3;r=2] + + [:rhs=65504;c=3;r=3] + + [:rhs=65504;c=3;r=4] + + [:rhs=65504;c=4;r=2] + + [:rhs=65504;c=4;r=3] + + [:rhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f16_internal:*] + [:lhs=1;c=2;r=2] + + [:lhs=1;c=2;r=3] + + [:lhs=1;c=2;r=4] + + [:lhs=1;c=3;r=2] + + [:lhs=1;c=3;r=3] + + [:lhs=1;c=3;r=4] + + [:lhs=1;c=4;r=2] + + [:lhs=1;c=4;r=3] + + [:lhs=1;c=4;r=4] + + [:lhs=65504;c=2;r=2] + + [:lhs=65504;c=2;r=3] + + [:lhs=65504;c=2;r=4] + + [:lhs=65504;c=3;r=2] + + [:lhs=65504;c=3;r=3] + + [:lhs=65504;c=3;r=4] + + [:lhs=65504;c=4;r=2] + + [:lhs=65504;c=4;r=3] + + [:lhs=65504;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f32:*] + [:rhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:rhs=3.4028234663852886e%2B38;c=2;r=2] + + [:rhs=3.4028234663852886e%2B38;c=2;r=3] + + [:rhs=3.4028234663852886e%2B38;c=2;r=4] + + [:rhs=3.4028234663852886e%2B38;c=3;r=2] + + [:rhs=3.4028234663852886e%2B38;c=3;r=3] + + [:rhs=3.4028234663852886e%2B38;c=3;r=4] + + [:rhs=3.4028234663852886e%2B38;c=4;r=2] + + [:rhs=3.4028234663852886e%2B38;c=4;r=3] + + [:rhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:overflow_vec_f32_internal:*] + [:lhs=1;c=2;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=2;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=3;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=2] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=3] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=1;c=4;r=4] + expected: + if os == "linux" and not debug: FAIL + + [:lhs=3.4028234663852886e%2B38;c=2;r=2] + + [:lhs=3.4028234663852886e%2B38;c=2;r=3] + + [:lhs=3.4028234663852886e%2B38;c=2;r=4] + + [:lhs=3.4028234663852886e%2B38;c=3;r=2] + + [:lhs=3.4028234663852886e%2B38;c=3;r=3] + + [:lhs=3.4028234663852886e%2B38;c=3;r=4] + + [:lhs=3.4028234663852886e%2B38;c=4;r=2] + + [:lhs=3.4028234663852886e%2B38;c=4;r=3] + + [:lhs=3.4028234663852886e%2B38;c=4;r=4] + + +[cts.https.html?q=webgpu:shader,validation,expression,matrix,mul:vec_by_mat:*] + [:ty1="";ty2=""] + expected: + if os == "linux" and not debug: FAIL + + [:ty1="";ty2="f"] + + [:ty1="";ty2="h"] + + [:ty1="f";ty2=""] + + [:ty1="f";ty2="f"] + + [:ty1="f";ty2="h"] + + [:ty1="h";ty2=""] + + [:ty1="h";ty2="f"] + + [:ty1="h";ty2="h"] + + +[cts.https.html?q=webgpu:shader,validation,expression,overload_resolution:implicit_conversions:*] + [:case="absfloat_to_bool"] + + [:case="absfloat_to_f16"] + + [:case="absfloat_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="absfloat_to_i32"] + + [:case="absfloat_to_u32"] + + [:case="absint_to_bool"] + + [:case="absint_to_f16"] + + [:case="absint_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="absint_to_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="absint_to_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_absfloat_to_bool"] + + [:case="array_absfloat_to_f16"] + + [:case="array_absfloat_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_absfloat_to_i32"] + + [:case="array_absfloat_to_u32"] + + [:case="array_absint_to_bool"] + + [:case="array_absint_to_f16"] + + [:case="array_absint_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_absint_to_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_absint_to_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="mat2x2_index_absfloat"] + expected: + if os == "linux" and not debug: FAIL + + [:case="mat2x2_index_absint"] + expected: + if os == "linux" and not debug: FAIL + + [:case="mat2x2_index_float"] + expected: + if os == "linux" and not debug: FAIL + + [:case="mat2x2_wrong_result"] + + [:case="vector_absfloat_to_bool"] + + [:case="vector_absfloat_to_f16"] + + [:case="vector_absfloat_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_absfloat_to_i32"] + + [:case="vector_absfloat_to_u32"] + + [:case="vector_absint_to_bool"] + + [:case="vector_absint_to_f16"] + + [:case="vector_absint_to_f32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_absint_to_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_absint_to_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_abstract_to_integer"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_default_ctor_abstract"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_default_ctor_integer"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_swizzle_abstract"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_swizzle_float"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_swizzle_integer"] + expected: + if os == "linux" and not debug: FAIL + + [:case="vector_wrong_result_f32"] + + [:case="vector_wrong_result_i32"] + + [:case="vector_wrong_result_splat"] + + +[cts.https.html?q=webgpu:shader,validation,expression,overload_resolution:overload_resolution:*] + [:arg1="abstract-float";arg2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="abstract-float";arg2="f16"] + + [:arg1="abstract-float";arg2="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="abstract-float";arg2="i32"] + + [:arg1="abstract-float";arg2="u32"] + + [:arg1="abstract-int";arg2="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="abstract-int";arg2="f16"] + + [:arg1="abstract-int";arg2="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="abstract-int";arg2="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="abstract-int";arg2="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="f16";arg2="abstract-float"] + + [:arg1="f16";arg2="abstract-int"] + + [:arg1="f16";arg2="f32"] + + [:arg1="f16";arg2="i32"] + + [:arg1="f16";arg2="u32"] + + [:arg1="f32";arg2="abstract-float"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="f32";arg2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="f32";arg2="f16"] + + [:arg1="f32";arg2="i32"] + + [:arg1="f32";arg2="u32"] + + [:arg1="i32";arg2="abstract-float"] + + [:arg1="i32";arg2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="i32";arg2="f16"] + + [:arg1="i32";arg2="f32"] + + [:arg1="i32";arg2="u32"] + + [:arg1="u32";arg2="abstract-float"] + + [:arg1="u32";arg2="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="u32";arg2="f16"] + + [:arg1="u32";arg2="f32"] + + [:arg1="u32";arg2="i32"] + + [:arg1="vec2%3Cabstract-float%3E";arg2="vec2%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec2%3Cabstract-float%3E";arg2="vec4%3Cf32%3E"] + + [:arg1="vec2%3Cabstract-float%3E";arg2="vec4%3Ci32%3E"] + + [:arg1="vec2%3Cabstract-float%3E";arg2="vec4%3Cu32%3E"] + + [:arg1="vec2%3Cabstract-int%3E";arg2="vec2%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec2%3Cabstract-int%3E";arg2="vec4%3Cf32%3E"] + + [:arg1="vec2%3Cabstract-int%3E";arg2="vec4%3Ci32%3E"] + + [:arg1="vec2%3Cabstract-int%3E";arg2="vec4%3Cu32%3E"] + + [:arg1="vec2%3Cf32%3E";arg2="vec2%3Ci32%3E"] + + [:arg1="vec2%3Cf32%3E";arg2="vec2%3Cu32%3E"] + + [:arg1="vec2%3Cf32%3E";arg2="vec4%3Cf16%3E"] + + [:arg1="vec2%3Ci32%3E";arg2="vec2%3Cf32%3E"] + + [:arg1="vec2%3Ci32%3E";arg2="vec2%3Cu32%3E"] + + [:arg1="vec2%3Ci32%3E";arg2="vec4%3Cf16%3E"] + + [:arg1="vec2%3Cu32%3E";arg2="vec2%3Cf32%3E"] + + [:arg1="vec2%3Cu32%3E";arg2="vec2%3Ci32%3E"] + + [:arg1="vec2%3Cu32%3E";arg2="vec4%3Cf16%3E"] + + [:arg1="vec3%3Cabstract-float%3E";arg2="vec3%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec3%3Cabstract-int%3E";arg2="vec3%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec3%3Cf32%3E";arg2="vec3%3Ci32%3E"] + + [:arg1="vec3%3Cf32%3E";arg2="vec3%3Cu32%3E"] + + [:arg1="vec3%3Ci32%3E";arg2="vec3%3Cf32%3E"] + + [:arg1="vec3%3Ci32%3E";arg2="vec3%3Cu32%3E"] + + [:arg1="vec3%3Cu32%3E";arg2="vec3%3Cf32%3E"] + + [:arg1="vec3%3Cu32%3E";arg2="vec3%3Ci32%3E"] + + [:arg1="vec4%3Cabstract-float%3E";arg2="vec4%3Cabstract-int%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec4%3Cabstract-int%3E";arg2="vec4%3Cabstract-float%3E"] + expected: + if os == "linux" and not debug: FAIL + + [:arg1="vec4%3Cf16%3E";arg2="vec2%3Cf32%3E"] + + [:arg1="vec4%3Cf16%3E";arg2="vec2%3Ci32%3E"] + + [:arg1="vec4%3Cf16%3E";arg2="vec2%3Cu32%3E"] + + [:arg1="vec4%3Cf32%3E";arg2="vec2%3Cabstract-float%3E"] + + [:arg1="vec4%3Cf32%3E";arg2="vec2%3Cabstract-int%3E"] + + [:arg1="vec4%3Cf32%3E";arg2="vec4%3Ci32%3E"] + + [:arg1="vec4%3Cf32%3E";arg2="vec4%3Cu32%3E"] + + [:arg1="vec4%3Ci32%3E";arg2="vec2%3Cabstract-float%3E"] + + [:arg1="vec4%3Ci32%3E";arg2="vec2%3Cabstract-int%3E"] + + [:arg1="vec4%3Ci32%3E";arg2="vec4%3Cf32%3E"] + + [:arg1="vec4%3Ci32%3E";arg2="vec4%3Cu32%3E"] + + [:arg1="vec4%3Cu32%3E";arg2="vec2%3Cabstract-float%3E"] + + [:arg1="vec4%3Cu32%3E";arg2="vec2%3Cabstract-int%3E"] + + [:arg1="vec4%3Cu32%3E";arg2="vec4%3Cf32%3E"] + + [:arg1="vec4%3Cu32%3E";arg2="vec4%3Ci32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,precedence:binary_requires_parentheses:*] + [:op1="add";op2="add"] + + [:op1="add";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="add";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="add";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="add";op2="div"] + + [:op1="add";op2="eq"] + + [:op1="add";op2="ge"] + + [:op1="add";op2="gt"] + + [:op1="add";op2="le"] + + [:op1="add";op2="lt"] + + [:op1="add";op2="mod"] + + [:op1="add";op2="mul"] + + [:op1="add";op2="ne"] + + [:op1="add";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="add";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="add";op2="sub"] + + [:op1="bin_and";op2="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="bin_and"] + + [:op1="bin_and";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="div"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="eq"] + + [:op1="bin_and";op2="ge"] + + [:op1="bin_and";op2="gt"] + + [:op1="bin_and";op2="le"] + + [:op1="bin_and";op2="lt"] + + [:op1="bin_and";op2="mod"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="mul"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="ne"] + + [:op1="bin_and";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_and";op2="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="bin_or"] + + [:op1="bin_or";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="div"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="eq"] + + [:op1="bin_or";op2="ge"] + + [:op1="bin_or";op2="gt"] + + [:op1="bin_or";op2="le"] + + [:op1="bin_or";op2="lt"] + + [:op1="bin_or";op2="mod"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="mul"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="ne"] + + [:op1="bin_or";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_or";op2="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="bin_xor"] + + [:op1="bin_xor";op2="div"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="eq"] + + [:op1="bin_xor";op2="ge"] + + [:op1="bin_xor";op2="gt"] + + [:op1="bin_xor";op2="le"] + + [:op1="bin_xor";op2="lt"] + + [:op1="bin_xor";op2="mod"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="mul"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="ne"] + + [:op1="bin_xor";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="bin_xor";op2="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="add"] + + [:op1="div";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="div"] + + [:op1="div";op2="eq"] + + [:op1="div";op2="ge"] + + [:op1="div";op2="gt"] + + [:op1="div";op2="le"] + + [:op1="div";op2="lt"] + + [:op1="div";op2="mod"] + + [:op1="div";op2="mul"] + + [:op1="div";op2="ne"] + + [:op1="div";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="div";op2="sub"] + + [:op1="eq";op2="add"] + + [:op1="eq";op2="bin_and"] + + [:op1="eq";op2="bin_or"] + + [:op1="eq";op2="bin_xor"] + + [:op1="eq";op2="div"] + + [:op1="eq";op2="eq"] + + [:op1="eq";op2="ge"] + + [:op1="eq";op2="gt"] + + [:op1="eq";op2="le"] + + [:op1="eq";op2="log_and"] + + [:op1="eq";op2="log_or"] + + [:op1="eq";op2="lt"] + + [:op1="eq";op2="mod"] + + [:op1="eq";op2="mul"] + + [:op1="eq";op2="ne"] + + [:op1="eq";op2="shl"] + + [:op1="eq";op2="shr"] + + [:op1="eq";op2="sub"] + + [:op1="ge";op2="add"] + + [:op1="ge";op2="bin_and"] + + [:op1="ge";op2="bin_or"] + + [:op1="ge";op2="bin_xor"] + + [:op1="ge";op2="div"] + + [:op1="ge";op2="eq"] + + [:op1="ge";op2="ge"] + + [:op1="ge";op2="gt"] + + [:op1="ge";op2="le"] + + [:op1="ge";op2="log_and"] + + [:op1="ge";op2="log_or"] + + [:op1="ge";op2="lt"] + + [:op1="ge";op2="mod"] + + [:op1="ge";op2="mul"] + + [:op1="ge";op2="ne"] + + [:op1="ge";op2="shl"] + + [:op1="ge";op2="shr"] + + [:op1="ge";op2="sub"] + + [:op1="gt";op2="add"] + + [:op1="gt";op2="bin_and"] + + [:op1="gt";op2="bin_or"] + + [:op1="gt";op2="bin_xor"] + + [:op1="gt";op2="div"] + + [:op1="gt";op2="eq"] + + [:op1="gt";op2="ge"] + + [:op1="gt";op2="gt"] + + [:op1="gt";op2="le"] + + [:op1="gt";op2="log_and"] + + [:op1="gt";op2="log_or"] + + [:op1="gt";op2="lt"] + + [:op1="gt";op2="mod"] + + [:op1="gt";op2="mul"] + + [:op1="gt";op2="ne"] + + [:op1="gt";op2="shl"] + + [:op1="gt";op2="shr"] + + [:op1="gt";op2="sub"] + + [:op1="le";op2="add"] + + [:op1="le";op2="bin_and"] + + [:op1="le";op2="bin_or"] + + [:op1="le";op2="bin_xor"] + + [:op1="le";op2="div"] + + [:op1="le";op2="eq"] + + [:op1="le";op2="ge"] + + [:op1="le";op2="gt"] + + [:op1="le";op2="le"] + + [:op1="le";op2="log_and"] + + [:op1="le";op2="log_or"] + + [:op1="le";op2="lt"] + + [:op1="le";op2="mod"] + + [:op1="le";op2="mul"] + + [:op1="le";op2="ne"] + + [:op1="le";op2="shl"] + + [:op1="le";op2="shr"] + + [:op1="le";op2="sub"] + + [:op1="log_and";op2="eq"] + + [:op1="log_and";op2="ge"] + + [:op1="log_and";op2="gt"] + + [:op1="log_and";op2="le"] + + [:op1="log_and";op2="lt"] + + [:op1="log_and";op2="ne"] + + [:op1="log_or";op2="eq"] + + [:op1="log_or";op2="ge"] + + [:op1="log_or";op2="gt"] + + [:op1="log_or";op2="le"] + + [:op1="log_or";op2="lt"] + + [:op1="log_or";op2="ne"] + + [:op1="lt";op2="add"] + + [:op1="lt";op2="bin_and"] + + [:op1="lt";op2="bin_or"] + + [:op1="lt";op2="bin_xor"] + + [:op1="lt";op2="div"] + + [:op1="lt";op2="eq"] + + [:op1="lt";op2="le"] + + [:op1="lt";op2="log_and"] + + [:op1="lt";op2="log_or"] + + [:op1="lt";op2="lt"] + + [:op1="lt";op2="mod"] + + [:op1="lt";op2="mul"] + + [:op1="lt";op2="ne"] + + [:op1="lt";op2="shl"] + + [:op1="lt";op2="sub"] + + [:op1="mod";op2="add"] + + [:op1="mod";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mod";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mod";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mod";op2="div"] + + [:op1="mod";op2="eq"] + + [:op1="mod";op2="ge"] + + [:op1="mod";op2="gt"] + + [:op1="mod";op2="le"] + + [:op1="mod";op2="lt"] + + [:op1="mod";op2="mod"] + + [:op1="mod";op2="mul"] + + [:op1="mod";op2="ne"] + + [:op1="mod";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mod";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mod";op2="sub"] + + [:op1="mul";op2="add"] + + [:op1="mul";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mul";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mul";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mul";op2="div"] + + [:op1="mul";op2="eq"] + + [:op1="mul";op2="ge"] + + [:op1="mul";op2="gt"] + + [:op1="mul";op2="le"] + + [:op1="mul";op2="lt"] + + [:op1="mul";op2="mod"] + + [:op1="mul";op2="mul"] + + [:op1="mul";op2="ne"] + + [:op1="mul";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mul";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="mul";op2="sub"] + + [:op1="ne";op2="add"] + + [:op1="ne";op2="bin_and"] + + [:op1="ne";op2="bin_or"] + + [:op1="ne";op2="bin_xor"] + + [:op1="ne";op2="div"] + + [:op1="ne";op2="eq"] + + [:op1="ne";op2="ge"] + + [:op1="ne";op2="gt"] + + [:op1="ne";op2="le"] + + [:op1="ne";op2="log_and"] + + [:op1="ne";op2="log_or"] + + [:op1="ne";op2="lt"] + + [:op1="ne";op2="mod"] + + [:op1="ne";op2="mul"] + + [:op1="ne";op2="ne"] + + [:op1="ne";op2="shl"] + + [:op1="ne";op2="shr"] + + [:op1="ne";op2="sub"] + + [:op1="shl";op2="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="div"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="eq"] + + [:op1="shl";op2="ge"] + + [:op1="shl";op2="gt"] + + [:op1="shl";op2="le"] + + [:op1="shl";op2="lt"] + + [:op1="shl";op2="mod"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="mul"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="ne"] + + [:op1="shl";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shl";op2="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="div"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="eq"] + + [:op1="shr";op2="ge"] + + [:op1="shr";op2="gt"] + + [:op1="shr";op2="le"] + + [:op1="shr";op2="lt"] + + [:op1="shr";op2="mod"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="mul"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="ne"] + + [:op1="shr";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="shr";op2="sub"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="add"] + + [:op1="sub";op2="bin_and"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="bin_or"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="bin_xor"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="div"] + + [:op1="sub";op2="eq"] + + [:op1="sub";op2="ge"] + + [:op1="sub";op2="gt"] + + [:op1="sub";op2="le"] + + [:op1="sub";op2="lt"] + + [:op1="sub";op2="mod"] + + [:op1="sub";op2="mul"] + + [:op1="sub";op2="ne"] + + [:op1="sub";op2="shl"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="shr"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="sub";op2="sub"] + + +[cts.https.html?q=webgpu:shader,validation,expression,precedence:mixed_logical_requires_parentheses:*] + [:op1="log_and";op2="log_and";parens="left"] + + [:op1="log_and";op2="log_and";parens="none"] + + [:op1="log_and";op2="log_and";parens="right"] + + [:op1="log_and";op2="log_or";parens="left"] + + [:op1="log_and";op2="log_or";parens="none"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="log_and";op2="log_or";parens="right"] + + [:op1="log_or";op2="log_and";parens="left"] + + [:op1="log_or";op2="log_and";parens="none"] + expected: + if os == "linux" and not debug: FAIL + + [:op1="log_or";op2="log_and";parens="right"] + + [:op1="log_or";op2="log_or";parens="left"] + + [:op1="log_or";op2="log_or";parens="none"] + + [:op1="log_or";op2="log_or";parens="right"] + + +[cts.https.html?q=webgpu:shader,validation,expression,precedence:other:*] + [:expr="addr_member"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="and_addr"] + + [:expr="and_addr_paren"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="comp_member"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="deref_idx"] + + [:expr="deref_idx_paren"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="deref_member"] + + [:expr="deref_member_paren"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="log_and_member"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="log_or_member"] + expected: + if os == "linux" and not debug: FAIL + + [:expr="neg_member"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,precedence:other_lhs:*] + [:expr="addr_valid1"] + + [:expr="addr_valid2"] + + [:expr="addr_valid3"] + + [:expr="deref_invalid1"] + + [:expr="deref_invalid2"] + + [:expr="deref_valid1"] + + [:expr="deref_valid2"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:basic:*] + [:addressSpace="function";accessMode="read";storageType="bool";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="bool";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="function";accessMode="read";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="function";accessMode="read";storageType="f32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="f32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="i32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="i32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="u32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read";storageType="u32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="bool";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="bool";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="function";accessMode="read_write";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="function";accessMode="read_write";storageType="f32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="f32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="i32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="i32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="u32";derefType="deref_address_of_identifier"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";accessMode="read_write";storageType="u32";derefType="deref_pointer"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="private";accessMode="read";storageType="bool";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read";storageType="bool";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read_write";storageType="bool";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read_write";storageType="bool";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read_write";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read_write";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read_write";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read_write";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read_write";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read_write";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="private";accessMode="read_write";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="private";accessMode="read_write";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read_write";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read_write";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read_write";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read_write";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read_write";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read_write";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="storage";accessMode="read_write";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="storage";accessMode="read_write";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read_write";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read_write";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read_write";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read_write";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read_write";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read_write";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="uniform";accessMode="read_write";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="uniform";accessMode="read_write";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read";storageType="u32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="f16";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="f16";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="f32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="f32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="i32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="i32";derefType="deref_pointer"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="u32";derefType="deref_address_of_identifier"] + + [:addressSpace="workgroup";accessMode="read_write";storageType="u32";derefType="deref_pointer"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:composite:*] + [:addressSpace="function";compositeType="array";storageType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="array";storageType="f16"] + + [:addressSpace="function";compositeType="array";storageType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="array";storageType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="array";storageType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="mat";storageType="f16"] + + [:addressSpace="function";compositeType="mat";storageType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="struct";storageType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="struct";storageType="f16"] + + [:addressSpace="function";compositeType="struct";storageType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="struct";storageType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="struct";storageType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="vec";storageType="bool"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="vec";storageType="f16"] + + [:addressSpace="function";compositeType="vec";storageType="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="vec";storageType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";compositeType="vec";storageType="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="private";compositeType="array";storageType="bool"] + + [:addressSpace="private";compositeType="array";storageType="f16"] + + [:addressSpace="private";compositeType="array";storageType="f32"] + + [:addressSpace="private";compositeType="array";storageType="i32"] + + [:addressSpace="private";compositeType="array";storageType="u32"] + + [:addressSpace="private";compositeType="mat";storageType="f16"] + + [:addressSpace="private";compositeType="mat";storageType="f32"] + + [:addressSpace="private";compositeType="struct";storageType="bool"] + + [:addressSpace="private";compositeType="struct";storageType="f16"] + + [:addressSpace="private";compositeType="struct";storageType="f32"] + + [:addressSpace="private";compositeType="struct";storageType="i32"] + + [:addressSpace="private";compositeType="struct";storageType="u32"] + + [:addressSpace="private";compositeType="vec";storageType="bool"] + + [:addressSpace="private";compositeType="vec";storageType="f16"] + + [:addressSpace="private";compositeType="vec";storageType="f32"] + + [:addressSpace="private";compositeType="vec";storageType="i32"] + + [:addressSpace="private";compositeType="vec";storageType="u32"] + + [:addressSpace="storage";compositeType="array";storageType="f16"] + + [:addressSpace="storage";compositeType="array";storageType="f32"] + + [:addressSpace="storage";compositeType="array";storageType="i32"] + + [:addressSpace="storage";compositeType="array";storageType="u32"] + + [:addressSpace="storage";compositeType="mat";storageType="f16"] + + [:addressSpace="storage";compositeType="mat";storageType="f32"] + + [:addressSpace="storage";compositeType="struct";storageType="f16"] + + [:addressSpace="storage";compositeType="struct";storageType="f32"] + + [:addressSpace="storage";compositeType="struct";storageType="i32"] + + [:addressSpace="storage";compositeType="struct";storageType="u32"] + + [:addressSpace="storage";compositeType="vec";storageType="f16"] + + [:addressSpace="storage";compositeType="vec";storageType="f32"] + + [:addressSpace="storage";compositeType="vec";storageType="i32"] + + [:addressSpace="storage";compositeType="vec";storageType="u32"] + + [:addressSpace="uniform";compositeType="array";storageType="f16"] + + [:addressSpace="uniform";compositeType="array";storageType="f32"] + + [:addressSpace="uniform";compositeType="array";storageType="i32"] + + [:addressSpace="uniform";compositeType="array";storageType="u32"] + + [:addressSpace="uniform";compositeType="mat";storageType="f16"] + + [:addressSpace="uniform";compositeType="mat";storageType="f32"] + + [:addressSpace="uniform";compositeType="struct";storageType="f16"] + + [:addressSpace="uniform";compositeType="struct";storageType="f32"] + + [:addressSpace="uniform";compositeType="struct";storageType="i32"] + + [:addressSpace="uniform";compositeType="struct";storageType="u32"] + + [:addressSpace="uniform";compositeType="vec";storageType="f16"] + + [:addressSpace="uniform";compositeType="vec";storageType="f32"] + + [:addressSpace="uniform";compositeType="vec";storageType="i32"] + + [:addressSpace="uniform";compositeType="vec";storageType="u32"] + + [:addressSpace="workgroup";compositeType="array";storageType="f16"] + + [:addressSpace="workgroup";compositeType="array";storageType="f32"] + + [:addressSpace="workgroup";compositeType="array";storageType="i32"] + + [:addressSpace="workgroup";compositeType="array";storageType="u32"] + + [:addressSpace="workgroup";compositeType="mat";storageType="f16"] + + [:addressSpace="workgroup";compositeType="mat";storageType="f32"] + + [:addressSpace="workgroup";compositeType="struct";storageType="f16"] + + [:addressSpace="workgroup";compositeType="struct";storageType="f32"] + + [:addressSpace="workgroup";compositeType="struct";storageType="i32"] + + [:addressSpace="workgroup";compositeType="struct";storageType="u32"] + + [:addressSpace="workgroup";compositeType="vec";storageType="f16"] + + [:addressSpace="workgroup";compositeType="vec";storageType="f32"] + + [:addressSpace="workgroup";compositeType="vec";storageType="i32"] + + [:addressSpace="workgroup";compositeType="vec";storageType="u32"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,address_of_and_indirection:invalid:*] + [:case="address_of_function"] + + [:case="address_of_let"] + + [:case="address_of_matrix_elem"] + + [:case="address_of_sampler"] + + [:case="address_of_texture"] + + [:case="address_of_vector_elem_via_index"] + + [:case="address_of_vector_elem_via_member"] + + [:case="deref_non_pointer"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,arithmetic_negation:invalid_types:*] + [:type="array";control=false] + + [:type="array";control=true] + + [:type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic";control=true] + + [:type="mat2x2f";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:type="mat2x2f";control=true] + + [:type="ptr";control=false] + + [:type="ptr";control=true] + + [:type="sampler";control=false] + + [:type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:type="struct";control=false] + + [:type="struct";control=true] + + [:type="texture";control=false] + + [:type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,arithmetic_negation:scalar_vector:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,bitwise_complement:invalid_types:*] + [:type="array";control=false] + + [:type="array";control=true] + + [:type="atomic";control=false] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic";control=true] + + [:type="mat2x2f";control=false] + + [:type="mat2x2f";control=true] + + [:type="ptr";control=false] + + [:type="ptr";control=true] + + [:type="sampler";control=false] + + [:type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:type="struct";control=false] + + [:type="struct";control=true] + + [:type="texture";control=false] + + [:type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,bitwise_complement:scalar_vector:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:invalid_types:*] + [:type="array";control=false] + + [:type="array";control=true] + + [:type="atomic";control=false] + + [:type="atomic";control=true] + + [:type="mat2x2f";control=false] + + [:type="mat2x2f";control=true] + + [:type="ptr";control=false] + + [:type="ptr";control=true] + + [:type="sampler";control=false] + + [:type="sampler";control=true] + expected: + if os == "linux" and not debug: FAIL + + [:type="struct";control=false] + + [:type="struct";control=true] + + [:type="texture";control=false] + + [:type="texture";control=true] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:parse:*] + [:stmt="not_bool_expr"] + + [:stmt="not_bool_literal"] + + [:stmt="not_int_expr"] + + [:stmt="not_int_literal"] + + [:stmt="not_not_bool_expr"] + + [:stmt="not_not_bool_literal"] + + +[cts.https.html?q=webgpu:shader,validation,expression,unary,logical_negation:scalar_vector:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="u32"] + + [:type="vec2%3Cabstract-float%3E"] + + [:type="vec2%3Cabstract-int%3E"] + + [:type="vec2%3Cbool%3E"] + + [:type="vec2%3Cf16%3E"] + + [:type="vec2%3Cf32%3E"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2%3Cu32%3E"] + + [:type="vec3%3Cabstract-float%3E"] + + [:type="vec3%3Cabstract-int%3E"] + + [:type="vec3%3Cbool%3E"] + + [:type="vec3%3Cf16%3E"] + + [:type="vec3%3Cf32%3E"] + + [:type="vec3%3Ci32%3E"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec4%3Cabstract-float%3E"] + + [:type="vec4%3Cabstract-int%3E"] + + [:type="vec4%3Cbool%3E"] + + [:type="vec4%3Cf16%3E"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4%3Ci32%3E"] + + [:type="vec4%3Cu32%3E"] + + +[cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_same_type:*] + [:blendSrc0Type="f16";blendSrc1Type="f16"] + + [:blendSrc0Type="f16";blendSrc1Type="f32"] + + [:blendSrc0Type="f16";blendSrc1Type="i32"] + + [:blendSrc0Type="f16";blendSrc1Type="u32"] + + [:blendSrc0Type="f16";blendSrc1Type="vec2f"] + + [:blendSrc0Type="f16";blendSrc1Type="vec2h"] + + [:blendSrc0Type="f16";blendSrc1Type="vec2i"] + + [:blendSrc0Type="f16";blendSrc1Type="vec2u"] + + [:blendSrc0Type="f16";blendSrc1Type="vec3f"] + + [:blendSrc0Type="f16";blendSrc1Type="vec3h"] + + [:blendSrc0Type="f16";blendSrc1Type="vec3i"] + + [:blendSrc0Type="f16";blendSrc1Type="vec3u"] + + [:blendSrc0Type="f16";blendSrc1Type="vec4f"] + + [:blendSrc0Type="f16";blendSrc1Type="vec4h"] + + [:blendSrc0Type="f16";blendSrc1Type="vec4i"] + + [:blendSrc0Type="f16";blendSrc1Type="vec4u"] + + [:blendSrc0Type="f32";blendSrc1Type="f16"] + + [:blendSrc0Type="f32";blendSrc1Type="f32"] + + [:blendSrc0Type="f32";blendSrc1Type="i32"] + + [:blendSrc0Type="f32";blendSrc1Type="u32"] + + [:blendSrc0Type="f32";blendSrc1Type="vec2f"] + + [:blendSrc0Type="f32";blendSrc1Type="vec2h"] + + [:blendSrc0Type="f32";blendSrc1Type="vec2i"] + + [:blendSrc0Type="f32";blendSrc1Type="vec2u"] + + [:blendSrc0Type="f32";blendSrc1Type="vec3f"] + + [:blendSrc0Type="f32";blendSrc1Type="vec3h"] + + [:blendSrc0Type="f32";blendSrc1Type="vec3i"] + + [:blendSrc0Type="f32";blendSrc1Type="vec3u"] + + [:blendSrc0Type="f32";blendSrc1Type="vec4f"] + + [:blendSrc0Type="f32";blendSrc1Type="vec4h"] + + [:blendSrc0Type="f32";blendSrc1Type="vec4i"] + + [:blendSrc0Type="f32";blendSrc1Type="vec4u"] + + [:blendSrc0Type="i32";blendSrc1Type="f16"] + + [:blendSrc0Type="i32";blendSrc1Type="f32"] + + [:blendSrc0Type="i32";blendSrc1Type="i32"] + + [:blendSrc0Type="i32";blendSrc1Type="u32"] + + [:blendSrc0Type="i32";blendSrc1Type="vec2f"] + + [:blendSrc0Type="i32";blendSrc1Type="vec2h"] + + [:blendSrc0Type="i32";blendSrc1Type="vec2i"] + + [:blendSrc0Type="i32";blendSrc1Type="vec2u"] + + [:blendSrc0Type="i32";blendSrc1Type="vec3f"] + + [:blendSrc0Type="i32";blendSrc1Type="vec3h"] + + [:blendSrc0Type="i32";blendSrc1Type="vec3i"] + + [:blendSrc0Type="i32";blendSrc1Type="vec3u"] + + [:blendSrc0Type="i32";blendSrc1Type="vec4f"] + + [:blendSrc0Type="i32";blendSrc1Type="vec4h"] + + [:blendSrc0Type="i32";blendSrc1Type="vec4i"] + + [:blendSrc0Type="i32";blendSrc1Type="vec4u"] + + [:blendSrc0Type="u32";blendSrc1Type="f16"] + + [:blendSrc0Type="u32";blendSrc1Type="f32"] + + [:blendSrc0Type="u32";blendSrc1Type="i32"] + + [:blendSrc0Type="u32";blendSrc1Type="u32"] + + [:blendSrc0Type="u32";blendSrc1Type="vec2f"] + + [:blendSrc0Type="u32";blendSrc1Type="vec2h"] + + [:blendSrc0Type="u32";blendSrc1Type="vec2i"] + + [:blendSrc0Type="u32";blendSrc1Type="vec2u"] + + [:blendSrc0Type="u32";blendSrc1Type="vec3f"] + + [:blendSrc0Type="u32";blendSrc1Type="vec3h"] + + [:blendSrc0Type="u32";blendSrc1Type="vec3i"] + + [:blendSrc0Type="u32";blendSrc1Type="vec3u"] + + [:blendSrc0Type="u32";blendSrc1Type="vec4f"] + + [:blendSrc0Type="u32";blendSrc1Type="vec4h"] + + [:blendSrc0Type="u32";blendSrc1Type="vec4i"] + + [:blendSrc0Type="u32";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec2f";blendSrc1Type="f16"] + + [:blendSrc0Type="vec2f";blendSrc1Type="f32"] + + [:blendSrc0Type="vec2f";blendSrc1Type="i32"] + + [:blendSrc0Type="vec2f";blendSrc1Type="u32"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec2f";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec2h";blendSrc1Type="f16"] + + [:blendSrc0Type="vec2h";blendSrc1Type="f32"] + + [:blendSrc0Type="vec2h";blendSrc1Type="i32"] + + [:blendSrc0Type="vec2h";blendSrc1Type="u32"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec2h";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec2i";blendSrc1Type="f16"] + + [:blendSrc0Type="vec2i";blendSrc1Type="f32"] + + [:blendSrc0Type="vec2i";blendSrc1Type="i32"] + + [:blendSrc0Type="vec2i";blendSrc1Type="u32"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec2i";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec2u";blendSrc1Type="f16"] + + [:blendSrc0Type="vec2u";blendSrc1Type="f32"] + + [:blendSrc0Type="vec2u";blendSrc1Type="i32"] + + [:blendSrc0Type="vec2u";blendSrc1Type="u32"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec2u";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec3f";blendSrc1Type="f16"] + + [:blendSrc0Type="vec3f";blendSrc1Type="f32"] + + [:blendSrc0Type="vec3f";blendSrc1Type="i32"] + + [:blendSrc0Type="vec3f";blendSrc1Type="u32"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec3f";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec3h";blendSrc1Type="f16"] + + [:blendSrc0Type="vec3h";blendSrc1Type="f32"] + + [:blendSrc0Type="vec3h";blendSrc1Type="i32"] + + [:blendSrc0Type="vec3h";blendSrc1Type="u32"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec3h";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec3i";blendSrc1Type="f16"] + + [:blendSrc0Type="vec3i";blendSrc1Type="f32"] + + [:blendSrc0Type="vec3i";blendSrc1Type="i32"] + + [:blendSrc0Type="vec3i";blendSrc1Type="u32"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec3i";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec3u";blendSrc1Type="f16"] + + [:blendSrc0Type="vec3u";blendSrc1Type="f32"] + + [:blendSrc0Type="vec3u";blendSrc1Type="i32"] + + [:blendSrc0Type="vec3u";blendSrc1Type="u32"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec3u";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec4f";blendSrc1Type="f16"] + + [:blendSrc0Type="vec4f";blendSrc1Type="f32"] + + [:blendSrc0Type="vec4f";blendSrc1Type="i32"] + + [:blendSrc0Type="vec4f";blendSrc1Type="u32"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec4f";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec4h";blendSrc1Type="f16"] + + [:blendSrc0Type="vec4h";blendSrc1Type="f32"] + + [:blendSrc0Type="vec4h";blendSrc1Type="i32"] + + [:blendSrc0Type="vec4h";blendSrc1Type="u32"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec4h";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec4i";blendSrc1Type="f16"] + + [:blendSrc0Type="vec4i";blendSrc1Type="f32"] + + [:blendSrc0Type="vec4i";blendSrc1Type="i32"] + + [:blendSrc0Type="vec4i";blendSrc1Type="u32"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec4i";blendSrc1Type="vec4u"] + + [:blendSrc0Type="vec4u";blendSrc1Type="f16"] + + [:blendSrc0Type="vec4u";blendSrc1Type="f32"] + + [:blendSrc0Type="vec4u";blendSrc1Type="i32"] + + [:blendSrc0Type="vec4u";blendSrc1Type="u32"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec2f"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec2h"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec2i"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec2u"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec3f"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec3h"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec3i"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec3u"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec4f"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec4h"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec4i"] + + [:blendSrc0Type="vec4u";blendSrc1Type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_stage_input_output:*] + [:attr="fragment_input"] + + [:attr="fragment_output"] + + [:attr="vertex_input"] + + [:attr="vertex_output"] + + +[cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_syntax_validation:*] + [:attr="comment"] + + [:attr="duplicate"] + + [:attr="empty_params"] + + [:attr="empty_params_no_blend_src_0"] + + [:attr="extra_comma"] + + [:attr="extra_params"] + + [:attr="f32"] + + [:attr="f32_literal"] + + [:attr="hex"] + + [:attr="i32"] + + [:attr="invalid"] + + [:attr="invalid_const_expr"] + + [:attr="max"] + + [:attr="missing_left_paren"] + + [:attr="missing_right_paren"] + + [:attr="misspelling"] + + [:attr="negative"] + + [:attr="newline"] + + [:attr="no_parens"] + + [:attr="no_parens_no_blend_src_0"] + + [:attr="one"] + + [:attr="override_expr"] + + [:attr="u32"] + + [:attr="valid_const_expr"] + + [:attr="vec"] + + [:attr="zero"] + + +[cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:blend_src_usage:*] + [:attr="const"] + + [:attr="entrypoint_input_non_struct"] + + [:attr="entrypoint_output_non_struct"] + + [:attr="function_declaration"] + + [:attr="let"] + + [:attr="non_entrypoint_function_input_non_struct"] + + [:attr="non_entrypoint_function_output_non_struct"] + + [:attr="override"] + + [:attr="struct_member_blend_src_and_builtin"] + + [:attr="struct_member_duplicate_blend_src_0"] + + [:attr="struct_member_duplicate_blend_src_1"] + + [:attr="struct_member_has_non_zero_location_blend_src_0"] + + [:attr="struct_member_has_non_zero_location_blend_src_1"] + + [:attr="struct_member_has_non_zero_location_no_blend_src"] + + [:attr="struct_member_location_0_blend_src_0_blend_src_1"] + + [:attr="struct_member_no_location_blend_src_0"] + + [:attr="struct_member_no_location_blend_src_1"] + + [:attr="struct_member_no_location_no_blend_src"] + + [:attr="struct_member_non_zero_location_blend_src_0_blend_src_1"] + + [:attr="struct_member_only_blend_src_0"] + + [:attr="struct_member_only_blend_src_1"] + + [:attr="var_function"] + + [:attr="var_private"] + + +[cts.https.html?q=webgpu:shader,validation,extension,dual_source_blending:use_blend_src_requires_extension_enabled:*] + [:requireExtension=false;enableExtension=false] + + [:requireExtension=false;enableExtension=true] + + [:requireExtension=true;enableExtension=false] + + [:requireExtension=true;enableExtension=true] + + [cts.https.html?q=webgpu:shader,validation,extension,pointer_composite_access:deref:*] [:case="array_index_access_via_identifier"] @@ -97667,6 +172998,16 @@ [:case="vector_member_access_via_pointer"] +[cts.https.html?q=webgpu:shader,validation,extension,readonly_and_readwrite_storage_textures:textureBarrier:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,extension,readonly_and_readwrite_storage_textures:var_decl:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,functions,alias_analysis:aliasing_inside_function:*] [:address_space="private"] @@ -98973,6 +174314,14 @@ [:use="workgroupUniformLoad";aliased=true] +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:body_required:*] + [:body=""] + + [:body="braces"] + + [:body="semi"] + + [cts.https.html?q=webgpu:shader,validation,functions,restrictions:call_arg_types_match_1_param:*] [:p1_type="f32"] expected: @@ -99145,7 +174494,121 @@ [:stage="%40vertex";entry_point="without"] +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_attributes:*] + [:case="align";placement="func"] + + [:case="align";placement="param"] + + [:case="align";placement="ret"] + + [:case="binding";placement="func"] + + [:case="binding";placement="param"] + + [:case="binding";placement="ret"] + + [:case="builtin";placement="func"] + + [:case="builtin";placement="param"] + + [:case="builtin";placement="ret"] + + [:case="compute";placement="func"] + + [:case="compute";placement="param"] + + [:case="compute";placement="ret"] + + [:case="const";placement="func"] + + [:case="const";placement="param"] + + [:case="const";placement="ret"] + + [:case="diagnostic";placement="func"] + expected: + if os == "linux" and not debug: FAIL + + [:case="diagnostic";placement="param"] + + [:case="diagnostic";placement="ret"] + + [:case="fragment";placement="func"] + + [:case="fragment";placement="param"] + + [:case="fragment";placement="ret"] + + [:case="group";placement="func"] + + [:case="group";placement="param"] + + [:case="group";placement="ret"] + + [:case="id";placement="func"] + expected: + if os == "linux" and not debug: FAIL + + [:case="id";placement="param"] + + [:case="id";placement="ret"] + + [:case="interpolate";placement="func"] + + [:case="interpolate";placement="param"] + + [:case="interpolate";placement="ret"] + + [:case="invariant";placement="func"] + + [:case="invariant";placement="param"] + + [:case="invariant";placement="ret"] + + [:case="location";placement="func"] + + [:case="location";placement="param"] + + [:case="location";placement="ret"] + + [:case="must_use";placement="func"] + expected: + if os == "linux" and not debug: FAIL + + [:case="must_use";placement="param"] + + [:case="must_use";placement="ret"] + + [:case="size";placement="func"] + + [:case="size";placement="param"] + + [:case="size";placement="ret"] + + [:case="vertex";placement="func"] + + [:case="vertex";placement="param"] + + [:case="vertex";placement="ret"] + + [:case="workgroup_size";placement="func"] + expected: + if os == "linux" and not debug: FAIL + + [:case="workgroup_size";placement="param"] + + [:case="workgroup_size";placement="ret"] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_name_required:*] + [:name=false] + + [:name=true] + + [cts.https.html?q=webgpu:shader,validation,functions,restrictions:function_parameter_matching:*] + expected: + if os == "linux" and not debug: [OK, TIMEOUT] [:decl="array1"] expected: if os == "linux" and not debug: FAIL @@ -99338,6 +174801,8 @@ [:case="invalid_ptr7"] + [:case="invalid_ptr8"] + [:case="mat2x2"] [:case="mat2x3"] @@ -99535,6 +175000,14 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:must_use_requires_return:*] + [:ret=false] + + [:ret=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,functions,restrictions:no_direct_recursion:*] [:] @@ -99543,6 +175016,48 @@ [:] +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:non_module_scoped_function:*] + [:loc="inner"] + + [:loc="outer"] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:overload:*] + [:overload=false] + + [:overload=true] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_comma_placement:*] + [:param_1=false;param_2=false;comma=false] + + [:param_1=false;param_2=false;comma=true] + + [:param_1=false;param_2=true;comma=false] + + [:param_1=false;param_2=true;comma=true] + + [:param_1=true;param_2=false;comma=false] + + [:param_1=true;param_2=false;comma=true] + + [:param_1=true;param_2=true;comma=false] + + [:param_1=true;param_2=true;comma=true] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_alias:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_function_name:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_name_can_shadow_global:*] + [:] + + [cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_names_must_differ:*] [:p1="a";p2="a"] @@ -99659,6 +175174,30 @@ [:use="var"] +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_type_can_be_alias:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:param_type_required:*] + [:ty=false;colon=false] + + [:ty=false;colon=true] + + [:ty=true;colon=false] + + [:ty=true;colon=true] + + +[cts.https.html?q=webgpu:shader,validation,functions,restrictions:parens_required:*] + [:parens=false;param=false] + + [:parens=false;param=true] + + [:parens=true;param=false] + + [:parens=true;param=true] + + [cts.https.html?q=webgpu:shader,validation,functions,restrictions:vertex_returns_position:*] [:case="bare_position"] @@ -99669,760 +175208,6 @@ [:case="no_nested_position"] -[cts.https.html?q=webgpu:shader,validation,parse,align:multi_align:*] - [:multi=false] - - [:multi=true] - - -[cts.https.html?q=webgpu:shader,validation,parse,align:parsing:*] - [:align="blank"] - - [:align="comment"] - - [:align="const_expr"] - expected: - if os == "linux" and not debug: FAIL - - [:align="const_f"] - - [:align="const_i"] - - [:align="const_u"] - - [:align="empty"] - - [:align="four_a"] - - [:align="four_f"] - - [:align="four_h"] - - [:align="four_hex"] - - [:align="four_i"] - - [:align="four_u"] - - [:align="large"] - - [:align="large_no_power_two"] - - [:align="larger_than_max_i32"] - - [:align="missing_left_paren"] - - [:align="missing_right_paren"] - - [:align="misspelling"] - - [:align="multiple_values"] - - [:align="negative"] - - [:align="no_params"] - - [:align="non_power_two"] - - [:align="one"] - expected: - if os == "linux" and not debug: FAIL - - [:align="one_f"] - - [:align="tabs"] - - [:align="trailing_comma"] - expected: - if os == "linux" and not debug: FAIL - - [:align="zero_a"] - - -[cts.https.html?q=webgpu:shader,validation,parse,align:placement:*] - [:scope="_undef_";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - expected: - if os == "linux" and not debug: FAIL - - [:scope="fn-decl";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="fn-param";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="fn-return";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="fn-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="private-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="storage-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="struct-member";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - expected: - if os == "linux" and not debug: FAIL - - [:scope="while-stmt";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - -[cts.https.html?q=webgpu:shader,validation,parse,align:required_alignment:*] - [:address_space="storage";align="alignment";type={"name":"S","storage":8,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align="alignment";type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="storage";align="alignment";type={"name":"f32","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"i32","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"u32","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align="alignment";type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align="alignment";type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align="alignment";type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=1;type={"name":"S","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="storage";align=1;type={"name":"f32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"i32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=1;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=1;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=1;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"u32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=1;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=1;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=1;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"S","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="storage";align=2;type={"name":"f32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"i32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=2;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=2;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=2;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"u32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=2;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=2;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=2;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="storage";align=32;type={"name":"S","storage":8,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="storage";align=32;type={"name":"f32","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"i32","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"u32","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="storage";align=32;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - - [:address_space="storage";align=32;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="storage";align=32;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"S","storage":8,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="uniform";align="alignment";type={"name":"f32","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"i32","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"u32","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align="alignment";type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align="alignment";type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align="alignment";type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=1;type={"name":"S","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align=1;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=1;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="uniform";align=1;type={"name":"f32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"i32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=1;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=1;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=1;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"u32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=1;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=1;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=1;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"S","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align=2;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=2;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="uniform";align=2;type={"name":"f32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"i32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=2;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=2;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=2;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"u32","storage":4,"uniform":4}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=2;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=2;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=2;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - expected: - if os == "linux" and not debug: FAIL - - [:address_space="uniform";align=32;type={"name":"S","storage":8,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"f16","storage":2,"uniform":2}] - - [:address_space="uniform";align=32;type={"name":"f32","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"i32","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"u32","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] - - [:address_space="uniform";align=32;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] - - [:address_space="uniform";align=32;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] - - [:address_space="uniform";align=32;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] - - [cts.https.html?q=webgpu:shader,validation,parse,attribute:expressions:*] [:value="const";attribute="align"] @@ -100519,40 +175304,6 @@ [:value="val";attribute="workgroup_size"] -[cts.https.html?q=webgpu:shader,validation,parse,binary_ops:all:*] - [:stmt="and_bool_expr_bool_expr"] - - [:stmt="and_bool_expr_bool_literal"] - - [:stmt="and_bool_expr_int_literal"] - - [:stmt="and_bool_literal_bool_expr"] - - [:stmt="and_bool_literal_bool_literal"] - - [:stmt="and_bool_literal_int_literal"] - - [:stmt="and_int_literal_bool_expr"] - - [:stmt="and_int_literal_bool_literal"] - - [:stmt="or_bool_expr_bool_expr"] - - [:stmt="or_bool_expr_bool_literal"] - - [:stmt="or_bool_expr_int_literal"] - - [:stmt="or_bool_literal_bool_expr"] - - [:stmt="or_bool_literal_bool_literal"] - - [:stmt="or_bool_literal_int_literal"] - - [:stmt="or_int_literal_bool_expr"] - - [:stmt="or_int_literal_bool_literal"] - - [cts.https.html?q=webgpu:shader,validation,parse,blankspace:blankspace:*] [:blankspace=["%20","space"\]] @@ -100599,198 +175350,6 @@ [:contains_null=true;placement="eol"] -[cts.https.html?q=webgpu:shader,validation,parse,break:placement:*] - [:stmt="break"] - - [:stmt="continuing_break"] - - [:stmt="continuing_if_break"] - - [:stmt="for_break"] - - [:stmt="for_if_break"] - - [:stmt="if_break"] - - [:stmt="loop_break"] - - [:stmt="loop_if_break"] - - [:stmt="return_break"] - - [:stmt="switch_break"] - - [:stmt="switch_case_break"] - - [:stmt="switch_case_if_break"] - - [:stmt="while_break"] - - [:stmt="while_if_break"] - - -[cts.https.html?q=webgpu:shader,validation,parse,break_if:non_bool_param:*] - [:type="S"] - - [:type="f16"] - - [:type="f32"] - - [:type="i32"] - - [:type="mat2x2%3Cf16%3E"] - - [:type="mat2x2f"] - - [:type="mat2x3%3Cf16%3E"] - - [:type="mat2x3f"] - - [:type="mat2x4%3Cf16%3E"] - - [:type="mat2x4f"] - - [:type="mat3x2%3Cf16%3E"] - - [:type="mat3x2f"] - - [:type="mat3x3%3Cf16%3E"] - - [:type="mat3x3f"] - - [:type="mat3x4%3Cf16%3E"] - - [:type="mat3x4f"] - - [:type="mat4x2%3Cf16%3E"] - - [:type="mat4x2f"] - - [:type="mat4x3%3Cf16%3E"] - - [:type="mat4x3f"] - - [:type="mat4x4%3Cf16%3E"] - - [:type="mat4x4f"] - - [:type="u32"] - - [:type="vec2%3Cf16%3E"] - - [:type="vec2%3Cf32%3E"] - - [:type="vec2%3Ci32%3E"] - - [:type="vec2%3Cu32%3E"] - - [:type="vec3%3Cf16%3E"] - - [:type="vec3%3Cf32%3E"] - - [:type="vec3%3Ci32%3E"] - - [:type="vec3%3Cu32%3E"] - - [:type="vec4%3Cf16%3E"] - - [:type="vec4%3Cf32%3E"] - - [:type="vec4%3Ci32%3E"] - - [:type="vec4%3Cu32%3E"] - - -[cts.https.html?q=webgpu:shader,validation,parse,break_if:placement:*] - [:stmt="break"] - - [:stmt="compound_break"] - - [:stmt="continuing_break_if"] - - [:stmt="continuing_break_if_not_last"] - - [:stmt="continuing_break_if_parens"] - - [:stmt="continuing_if_break"] - - [:stmt="for_break"] - - [:stmt="for_if_break"] - - [:stmt="if_break"] - - [:stmt="loop_break"] - - [:stmt="loop_if_break"] - - [:stmt="return_break"] - - [:stmt="switch_break"] - - [:stmt="switch_case_break"] - - [:stmt="switch_case_if_break"] - - [:stmt="while_break"] - - [:stmt="while_if_break"] - - -[cts.https.html?q=webgpu:shader,validation,parse,builtin:parse:*] - [:builtin="ident_param"] - - [:builtin="invalid_name"] - - [:builtin="missing_lparen"] - - [:builtin="missing_param"] - - [:builtin="missing_parens"] - - [:builtin="missing_rparen"] - - [:builtin="multiple_params"] - - [:builtin="newline_in_attr"] - - [:builtin="no_params"] - - [:builtin="number_param"] - - [:builtin="pos"] - - [:builtin="trailing_comma"] - expected: - if os == "linux" and not debug: FAIL - - [:builtin="whitespace_in_attr"] - - -[cts.https.html?q=webgpu:shader,validation,parse,builtin:placement:*] - [:scope="_undef_";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - expected: - if os == "linux" and not debug: FAIL - - [:scope="fn-decl";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="fn-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="non-ep-param";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="non-ep-ret";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="private-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="storage-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [:scope="struct-member";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - expected: - if os == "linux" and not debug: FAIL - - [:scope="while-stmt";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - - [cts.https.html?q=webgpu:shader,validation,parse,comments:comments:*] [:] @@ -100829,160 +175388,6 @@ [:terminated=true] -[cts.https.html?q=webgpu:shader,validation,parse,compound:parse:*] - [:stmt="decl"] - expected: - if os == "linux" and not debug: FAIL - - [:stmt="empty"] - - [:stmt="missing_end"] - - [:stmt="missing_start"] - - [:stmt="nested"] - - [:stmt="semicolon"] - - [:stmt="semicolons"] - - -[cts.https.html?q=webgpu:shader,validation,parse,const:placement:*] - [:scope="_undef_"] - expected: - if os == "linux" and not debug: FAIL - - [:scope="fn-decl"] - - [:scope="fn-param"] - - [:scope="fn-return"] - - [:scope="fn-var"] - - [:scope="private-var"] - - [:scope="storage-var"] - - [:scope="struct-member"] - - [:scope="while-stmt"] - - -[cts.https.html?q=webgpu:shader,validation,parse,const_assert:parse:*] - [:case="both_parentheses"] - expected: - if os == "linux" and not debug: FAIL - - [:case="condition_on_newline"] - expected: - if os == "linux" and not debug: FAIL - - [:case="invalid_expression"] - - [:case="left_parenthesis_only"] - - [:case="multiline_with_parentheses"] - expected: - if os == "linux" and not debug: FAIL - - [:case="no_condition_no_parentheses"] - - [:case="no_condition_with_parentheses"] - - [:case="no_parentheses"] - expected: - if os == "linux" and not debug: FAIL - - [:case="not_a_boolean"] - - [:case="right_parenthesis_only"] - - -[cts.https.html?q=webgpu:shader,validation,parse,continuing:placement:*] - [:stmt="continuing"] - - [:stmt="continuing_block"] - - [:stmt="continuing_break"] - - [:stmt="continuing_break_if"] - - [:stmt="continuing_break_if_parens"] - - [:stmt="continuing_const"] - expected: - if os == "linux" and not debug: FAIL - - [:stmt="continuing_const_assert"] - expected: - if os == "linux" and not debug: FAIL - - [:stmt="continuing_continue"] - - [:stmt="continuing_continue_nested"] - - [:stmt="continuing_continuing"] - - [:stmt="continuing_dec"] - - [:stmt="continuing_discard"] - - [:stmt="continuing_empty"] - - [:stmt="continuing_for"] - - [:stmt="continuing_for_break"] - - [:stmt="continuing_functionn_call"] - - [:stmt="continuing_if"] - - [:stmt="continuing_inc"] - - [:stmt="continuing_let"] - - [:stmt="continuing_loop"] - - [:stmt="continuing_loop_nested_continuing"] - - [:stmt="continuing_semicolon"] - - [:stmt="continuing_switch"] - - [:stmt="continuing_switch_break"] - - [:stmt="continuing_var"] - - [:stmt="continuing_while"] - - [:stmt="continuing_while_break"] - - [:stmt="for"] - - [:stmt="if"] - - [:stmt="if_body"] - - [:stmt="if_else"] - - [:stmt="no_body"] - - [:stmt="return"] - - [:stmt="return_for_nested_in_continue"] - - [:stmt="return_if_nested_in_continue"] - - [:stmt="return_in_continue"] - - [:stmt="switch"] - - [:stmt="switch_case"] - - [:stmt="while"] - - [cts.https.html?q=webgpu:shader,validation,parse,diagnostic:after_other_directives:*] [:directive="enable%20f16"] @@ -101375,648 +175780,6 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,parse,diagnostic:conflicting_attribute_same_location:*] - [:loc="compound";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="compound";s1="error";s2="info"] - - [:loc="compound";s1="error";s2="off"] - - [:loc="compound";s1="error";s2="warning"] - - [:loc="compound";s1="info";s2="error"] - - [:loc="compound";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="compound";s1="info";s2="off"] - - [:loc="compound";s1="info";s2="warning"] - - [:loc="compound";s1="off";s2="error"] - - [:loc="compound";s1="off";s2="info"] - - [:loc="compound";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="compound";s1="off";s2="warning"] - - [:loc="compound";s1="warning";s2="error"] - - [:loc="compound";s1="warning";s2="info"] - - [:loc="compound";s1="warning";s2="off"] - - [:loc="compound";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_body";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_body";s1="error";s2="info"] - - [:loc="for_body";s1="error";s2="off"] - - [:loc="for_body";s1="error";s2="warning"] - - [:loc="for_body";s1="info";s2="error"] - - [:loc="for_body";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_body";s1="info";s2="off"] - - [:loc="for_body";s1="info";s2="warning"] - - [:loc="for_body";s1="off";s2="error"] - - [:loc="for_body";s1="off";s2="info"] - - [:loc="for_body";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_body";s1="off";s2="warning"] - - [:loc="for_body";s1="warning";s2="error"] - - [:loc="for_body";s1="warning";s2="info"] - - [:loc="for_body";s1="warning";s2="off"] - - [:loc="for_body";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_stmt";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_stmt";s1="error";s2="info"] - - [:loc="for_stmt";s1="error";s2="off"] - - [:loc="for_stmt";s1="error";s2="warning"] - - [:loc="for_stmt";s1="info";s2="error"] - - [:loc="for_stmt";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_stmt";s1="info";s2="off"] - - [:loc="for_stmt";s1="info";s2="warning"] - - [:loc="for_stmt";s1="off";s2="error"] - - [:loc="for_stmt";s1="off";s2="info"] - - [:loc="for_stmt";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="for_stmt";s1="off";s2="warning"] - - [:loc="for_stmt";s1="warning";s2="error"] - - [:loc="for_stmt";s1="warning";s2="info"] - - [:loc="for_stmt";s1="warning";s2="off"] - - [:loc="for_stmt";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="function";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="function";s1="error";s2="info"] - - [:loc="function";s1="error";s2="off"] - - [:loc="function";s1="error";s2="warning"] - - [:loc="function";s1="info";s2="error"] - - [:loc="function";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="function";s1="info";s2="off"] - - [:loc="function";s1="info";s2="warning"] - - [:loc="function";s1="off";s2="error"] - - [:loc="function";s1="off";s2="info"] - - [:loc="function";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="function";s1="off";s2="warning"] - - [:loc="function";s1="warning";s2="error"] - - [:loc="function";s1="warning";s2="info"] - - [:loc="function";s1="warning";s2="off"] - - [:loc="function";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_else";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_else";s1="error";s2="info"] - - [:loc="if_else";s1="error";s2="off"] - - [:loc="if_else";s1="error";s2="warning"] - - [:loc="if_else";s1="info";s2="error"] - - [:loc="if_else";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_else";s1="info";s2="off"] - - [:loc="if_else";s1="info";s2="warning"] - - [:loc="if_else";s1="off";s2="error"] - - [:loc="if_else";s1="off";s2="info"] - - [:loc="if_else";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_else";s1="off";s2="warning"] - - [:loc="if_else";s1="warning";s2="error"] - - [:loc="if_else";s1="warning";s2="info"] - - [:loc="if_else";s1="warning";s2="off"] - - [:loc="if_else";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_stmt";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_stmt";s1="error";s2="info"] - - [:loc="if_stmt";s1="error";s2="off"] - - [:loc="if_stmt";s1="error";s2="warning"] - - [:loc="if_stmt";s1="info";s2="error"] - - [:loc="if_stmt";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_stmt";s1="info";s2="off"] - - [:loc="if_stmt";s1="info";s2="warning"] - - [:loc="if_stmt";s1="off";s2="error"] - - [:loc="if_stmt";s1="off";s2="info"] - - [:loc="if_stmt";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_stmt";s1="off";s2="warning"] - - [:loc="if_stmt";s1="warning";s2="error"] - - [:loc="if_stmt";s1="warning";s2="info"] - - [:loc="if_stmt";s1="warning";s2="off"] - - [:loc="if_stmt";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_then";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_then";s1="error";s2="info"] - - [:loc="if_then";s1="error";s2="off"] - - [:loc="if_then";s1="error";s2="warning"] - - [:loc="if_then";s1="info";s2="error"] - - [:loc="if_then";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_then";s1="info";s2="off"] - - [:loc="if_then";s1="info";s2="warning"] - - [:loc="if_then";s1="off";s2="error"] - - [:loc="if_then";s1="off";s2="info"] - - [:loc="if_then";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="if_then";s1="off";s2="warning"] - - [:loc="if_then";s1="warning";s2="error"] - - [:loc="if_then";s1="warning";s2="info"] - - [:loc="if_then";s1="warning";s2="off"] - - [:loc="if_then";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_body";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_body";s1="error";s2="info"] - - [:loc="loop_body";s1="error";s2="off"] - - [:loc="loop_body";s1="error";s2="warning"] - - [:loc="loop_body";s1="info";s2="error"] - - [:loc="loop_body";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_body";s1="info";s2="off"] - - [:loc="loop_body";s1="info";s2="warning"] - - [:loc="loop_body";s1="off";s2="error"] - - [:loc="loop_body";s1="off";s2="info"] - - [:loc="loop_body";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_body";s1="off";s2="warning"] - - [:loc="loop_body";s1="warning";s2="error"] - - [:loc="loop_body";s1="warning";s2="info"] - - [:loc="loop_body";s1="warning";s2="off"] - - [:loc="loop_body";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_continuing";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_continuing";s1="error";s2="info"] - - [:loc="loop_continuing";s1="error";s2="off"] - - [:loc="loop_continuing";s1="error";s2="warning"] - - [:loc="loop_continuing";s1="info";s2="error"] - - [:loc="loop_continuing";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_continuing";s1="info";s2="off"] - - [:loc="loop_continuing";s1="info";s2="warning"] - - [:loc="loop_continuing";s1="off";s2="error"] - - [:loc="loop_continuing";s1="off";s2="info"] - - [:loc="loop_continuing";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_continuing";s1="off";s2="warning"] - - [:loc="loop_continuing";s1="warning";s2="error"] - - [:loc="loop_continuing";s1="warning";s2="info"] - - [:loc="loop_continuing";s1="warning";s2="off"] - - [:loc="loop_continuing";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_stmt";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_stmt";s1="error";s2="info"] - - [:loc="loop_stmt";s1="error";s2="off"] - - [:loc="loop_stmt";s1="error";s2="warning"] - - [:loc="loop_stmt";s1="info";s2="error"] - - [:loc="loop_stmt";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_stmt";s1="info";s2="off"] - - [:loc="loop_stmt";s1="info";s2="warning"] - - [:loc="loop_stmt";s1="off";s2="error"] - - [:loc="loop_stmt";s1="off";s2="info"] - - [:loc="loop_stmt";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="loop_stmt";s1="off";s2="warning"] - - [:loc="loop_stmt";s1="warning";s2="error"] - - [:loc="loop_stmt";s1="warning";s2="info"] - - [:loc="loop_stmt";s1="warning";s2="off"] - - [:loc="loop_stmt";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_body";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_body";s1="error";s2="info"] - - [:loc="switch_body";s1="error";s2="off"] - - [:loc="switch_body";s1="error";s2="warning"] - - [:loc="switch_body";s1="info";s2="error"] - - [:loc="switch_body";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_body";s1="info";s2="off"] - - [:loc="switch_body";s1="info";s2="warning"] - - [:loc="switch_body";s1="off";s2="error"] - - [:loc="switch_body";s1="off";s2="info"] - - [:loc="switch_body";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_body";s1="off";s2="warning"] - - [:loc="switch_body";s1="warning";s2="error"] - - [:loc="switch_body";s1="warning";s2="info"] - - [:loc="switch_body";s1="warning";s2="off"] - - [:loc="switch_body";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_case";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_case";s1="error";s2="info"] - - [:loc="switch_case";s1="error";s2="off"] - - [:loc="switch_case";s1="error";s2="warning"] - - [:loc="switch_case";s1="info";s2="error"] - - [:loc="switch_case";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_case";s1="info";s2="off"] - - [:loc="switch_case";s1="info";s2="warning"] - - [:loc="switch_case";s1="off";s2="error"] - - [:loc="switch_case";s1="off";s2="info"] - - [:loc="switch_case";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_case";s1="off";s2="warning"] - - [:loc="switch_case";s1="warning";s2="error"] - - [:loc="switch_case";s1="warning";s2="info"] - - [:loc="switch_case";s1="warning";s2="off"] - - [:loc="switch_case";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_default";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_default";s1="error";s2="info"] - - [:loc="switch_default";s1="error";s2="off"] - - [:loc="switch_default";s1="error";s2="warning"] - - [:loc="switch_default";s1="info";s2="error"] - - [:loc="switch_default";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_default";s1="info";s2="off"] - - [:loc="switch_default";s1="info";s2="warning"] - - [:loc="switch_default";s1="off";s2="error"] - - [:loc="switch_default";s1="off";s2="info"] - - [:loc="switch_default";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_default";s1="off";s2="warning"] - - [:loc="switch_default";s1="warning";s2="error"] - - [:loc="switch_default";s1="warning";s2="info"] - - [:loc="switch_default";s1="warning";s2="off"] - - [:loc="switch_default";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_stmt";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_stmt";s1="error";s2="info"] - - [:loc="switch_stmt";s1="error";s2="off"] - - [:loc="switch_stmt";s1="error";s2="warning"] - - [:loc="switch_stmt";s1="info";s2="error"] - - [:loc="switch_stmt";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_stmt";s1="info";s2="off"] - - [:loc="switch_stmt";s1="info";s2="warning"] - - [:loc="switch_stmt";s1="off";s2="error"] - - [:loc="switch_stmt";s1="off";s2="info"] - - [:loc="switch_stmt";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="switch_stmt";s1="off";s2="warning"] - - [:loc="switch_stmt";s1="warning";s2="error"] - - [:loc="switch_stmt";s1="warning";s2="info"] - - [:loc="switch_stmt";s1="warning";s2="off"] - - [:loc="switch_stmt";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_body";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_body";s1="error";s2="info"] - - [:loc="while_body";s1="error";s2="off"] - - [:loc="while_body";s1="error";s2="warning"] - - [:loc="while_body";s1="info";s2="error"] - - [:loc="while_body";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_body";s1="info";s2="off"] - - [:loc="while_body";s1="info";s2="warning"] - - [:loc="while_body";s1="off";s2="error"] - - [:loc="while_body";s1="off";s2="info"] - - [:loc="while_body";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_body";s1="off";s2="warning"] - - [:loc="while_body";s1="warning";s2="error"] - - [:loc="while_body";s1="warning";s2="info"] - - [:loc="while_body";s1="warning";s2="off"] - - [:loc="while_body";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_stmt";s1="error";s2="error"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_stmt";s1="error";s2="info"] - - [:loc="while_stmt";s1="error";s2="off"] - - [:loc="while_stmt";s1="error";s2="warning"] - - [:loc="while_stmt";s1="info";s2="error"] - - [:loc="while_stmt";s1="info";s2="info"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_stmt";s1="info";s2="off"] - - [:loc="while_stmt";s1="info";s2="warning"] - - [:loc="while_stmt";s1="off";s2="error"] - - [:loc="while_stmt";s1="off";s2="info"] - - [:loc="while_stmt";s1="off";s2="off"] - expected: - if os == "linux" and not debug: FAIL - - [:loc="while_stmt";s1="off";s2="warning"] - - [:loc="while_stmt";s1="warning";s2="error"] - - [:loc="while_stmt";s1="warning";s2="info"] - - [:loc="while_stmt";s1="warning";s2="off"] - - [:loc="while_stmt";s1="warning";s2="warning"] - expected: - if os == "linux" and not debug: FAIL - - [cts.https.html?q=webgpu:shader,validation,parse,diagnostic:conflicting_directive:*] [:s1="error";s2="error"] expected: @@ -102059,6 +175822,166 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,parse,diagnostic:diagnostic_scoping:*] + [:case="call_unaffected_error"] + + [:case="call_unaffected_off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="call_unaffected_warn"] + expected: + if os == "linux" and not debug: FAIL + + [:case="deeper_nest_no_effect"] + + [:case="deepest_nesting_error"] + + [:case="deepest_nesting_off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="deepest_nesting_warn"] + expected: + if os == "linux" and not debug: FAIL + + [:case="global_if_nothing_else_warn"] + expected: + if os == "linux" and not debug: FAIL + + [:case="if_condition_error"] + + [:case="if_condition_off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="if_condition_warn"] + expected: + if os == "linux" and not debug: FAIL + + [:case="other_nest_unaffected"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_global_off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_global_on"] + + [:case="override_global_warn"] + expected: + if os == "linux" and not debug: FAIL + + [:case="switch_error"] + + [:case="switch_off"] + expected: + if os == "linux" and not debug: FAIL + + [:case="switch_warn"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,parse,diagnostic:duplicate_attribute_same_location:*] + [:loc="compound";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="compound";same_rule=true] + + [:loc="for_body";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="for_body";same_rule=true] + + [:loc="for_stmt";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="for_stmt";same_rule=true] + + [:loc="function";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="function";same_rule=true] + + [:loc="if_else";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="if_else";same_rule=true] + + [:loc="if_stmt";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="if_stmt";same_rule=true] + + [:loc="if_then";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="if_then";same_rule=true] + + [:loc="loop_body";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="loop_body";same_rule=true] + + [:loc="loop_continuing";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="loop_continuing";same_rule=true] + + [:loc="loop_stmt";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="loop_stmt";same_rule=true] + + [:loc="switch_body";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="switch_body";same_rule=true] + + [:loc="switch_case";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="switch_case";same_rule=true] + + [:loc="switch_default";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="switch_default";same_rule=true] + + [:loc="switch_stmt";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="switch_stmt";same_rule=true] + + [:loc="while_body";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="while_body";same_rule=true] + + [:loc="while_stmt";same_rule=false] + expected: + if os == "linux" and not debug: FAIL + + [:loc="while_stmt";same_rule=true] + + [cts.https.html?q=webgpu:shader,validation,parse,diagnostic:invalid_locations:*] [:type="attribute";location="function_const"] expected: @@ -102307,24 +176230,6 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,parse,discard:placement:*] - [:place="compute"] - - [:place="fragment"] - expected: - if os == "linux" and not debug: FAIL - - [:place="module"] - - [:place="subcomp"] - - [:place="subfrag"] - - [:place="subvert"] - - [:place="vertex"] - - [cts.https.html?q=webgpu:shader,validation,parse,enable:enable:*] [:case="const_assert_after"] @@ -108825,686 +182730,6 @@ [:val="i32(-2147483648)"] -[cts.https.html?q=webgpu:shader,validation,parse,must_use:builtin_must_use:*] - [:call="abs";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="abs";use=true] - - [:call="acos";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="acos";use=true] - - [:call="acosh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="acosh";use=true] - - [:call="all";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="all";use=true] - - [:call="any";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="any";use=true] - - [:call="arrayLength";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="arrayLength";use=true] - - [:call="asin";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="asin";use=true] - - [:call="asinh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="asinh";use=true] - - [:call="atan";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atan";use=true] - - [:call="atan2";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atan2";use=true] - - [:call="atanh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atanh";use=true] - - [:call="bitcast";use=false] - - [:call="bitcast";use=true] - - [:call="ceil";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="ceil";use=true] - - [:call="clamp";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="clamp";use=true] - - [:call="cos";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="cos";use=true] - - [:call="cosh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="cosh";use=true] - - [:call="countLeadingZeros";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="countLeadingZeros";use=true] - - [:call="countOneBits";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="countOneBits";use=true] - - [:call="countTrailingZeros";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="countTrailingZeros";use=true] - - [:call="cross";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="cross";use=true] - - [:call="degrees";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="degrees";use=true] - - [:call="determinant";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="determinant";use=true] - - [:call="distance";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="distance";use=true] - - [:call="dot";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dot";use=true] - - [:call="dpdx";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdx";use=true] - - [:call="dpdxCoarse";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdxCoarse";use=true] - - [:call="dpdxFine";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdxFine";use=true] - - [:call="dpdy";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdy";use=true] - - [:call="dpdyCoarse";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdyCoarse";use=true] - - [:call="dpdyFine";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="dpdyFine";use=true] - - [:call="exp";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="exp";use=true] - - [:call="exp2";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="exp2";use=true] - - [:call="extractBits";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="extractBits";use=true] - - [:call="faceForward";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="faceForward";use=true] - - [:call="firstLeadingBit";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="firstLeadingBit";use=true] - - [:call="firstTrailingBit";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="firstTrailingBit";use=true] - - [:call="floor";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="floor";use=true] - - [:call="fma";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="fma";use=true] - - [:call="fract";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="fract";use=true] - - [:call="frexp";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="frexp";use=true] - - [:call="fwidth";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="fwidth";use=true] - - [:call="fwidthCoarse";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="fwidthCoarse";use=true] - - [:call="fwidthFine";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="fwidthFine";use=true] - - [:call="i32";use=false] - - [:call="i32";use=true] - - [:call="insertBits";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="insertBits";use=true] - - [:call="inverseSqrt";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="inverseSqrt";use=true] - - [:call="ldexp";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="ldexp";use=true] - - [:call="length";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="length";use=true] - - [:call="log";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="log";use=true] - - [:call="log2";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="log2";use=true] - - [:call="max";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="max";use=true] - - [:call="min";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="min";use=true] - - [:call="mix";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="mix";use=true] - - [:call="modf";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="modf";use=true] - - [:call="normalize";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="normalize";use=true] - - [:call="pack2x16float";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pack2x16float";use=true] - - [:call="pack2x16snorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pack2x16snorm";use=true] - - [:call="pack2x16unorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pack2x16unorm";use=true] - - [:call="pack4x8snorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pack4x8snorm";use=true] - - [:call="pack4x8unorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pack4x8unorm";use=true] - - [:call="pow";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="pow";use=true] - - [:call="quantizeToF16";use=false] - - [:call="quantizeToF16";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="radians";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="radians";use=true] - - [:call="reflect";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="reflect";use=true] - - [:call="refract";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="refract";use=true] - - [:call="reverseBits";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="reverseBits";use=true] - - [:call="round";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="round";use=true] - - [:call="saturate";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="saturate";use=true] - - [:call="select";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="select";use=true] - - [:call="sign";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="sign";use=true] - - [:call="sin";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="sin";use=true] - - [:call="sinh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="sinh";use=true] - - [:call="smoothstep";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="smoothstep";use=true] - - [:call="sqrt";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="sqrt";use=true] - - [:call="step";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="step";use=true] - - [:call="struct";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="struct";use=true] - - [:call="tan";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="tan";use=true] - - [:call="tanh";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="tanh";use=true] - - [:call="textureDimensions";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureDimensions";use=true] - - [:call="textureGather";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureGather";use=true] - - [:call="textureGatherCompare";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureGatherCompare";use=true] - - [:call="textureLoad";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureLoad";use=true] - - [:call="textureNumLayers";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureNumLayers";use=true] - - [:call="textureNumLevels";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureNumLevels";use=true] - - [:call="textureNumSamples";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureNumSamples";use=true] - - [:call="textureSample";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSample";use=true] - - [:call="textureSampleBaseClampToEdge";use=false] - - [:call="textureSampleBaseClampToEdge";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleBias";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleBias";use=true] - - [:call="textureSampleCompare";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleCompare";use=true] - - [:call="textureSampleCompareLevel";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleCompareLevel";use=true] - - [:call="textureSampleGrad";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleGrad";use=true] - - [:call="textureSampleLevel";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="textureSampleLevel";use=true] - - [:call="transpose";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="transpose";use=true] - - [:call="trunc";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="trunc";use=true] - - [:call="u32";use=false] - - [:call="u32";use=true] - - [:call="unpack2x16float";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="unpack2x16float";use=true] - - [:call="unpack2x16snorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="unpack2x16snorm";use=true] - - [:call="unpack2x16unorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="unpack2x16unorm";use=true] - - [:call="unpack4x8snorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="unpack4x8snorm";use=true] - - [:call="unpack4x8unorm";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="unpack4x8unorm";use=true] - - [:call="workgroupUniformLoad";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="workgroupUniformLoad";use=true] - - -[cts.https.html?q=webgpu:shader,validation,parse,must_use:builtin_no_must_use:*] - [:call="atomicAdd";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicAdd";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicAnd";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicAnd";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicCompareExchangeWeak";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicCompareExchangeWeak";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicExchange";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicExchange";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicLoad";use=false] - - [:call="atomicLoad";use=true] - - [:call="atomicMax";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicMax";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicMin";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicMin";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicOr";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicOr";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicSub";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicSub";use=true] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicXor";use=false] - expected: - if os == "linux" and not debug: FAIL - - [:call="atomicXor";use=true] - expected: - if os == "linux" and not debug: FAIL - - [cts.https.html?q=webgpu:shader,validation,parse,must_use:call:*] [:use="";call="condition"] expected: @@ -109610,6 +182835,8 @@ [cts.https.html?q=webgpu:shader,validation,parse,must_use:declaration:*] + [:test="duplicate"] + [:test="empty_parameter"] [:test="function_call"] @@ -109639,174 +182866,6 @@ if os == "linux" and not debug: FAIL -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:compute_parsing:*] - [:val=""] - - [:val="%40%2F%5Ecomment%5E%2Fcompute"] - - [:val="%40%5Ctcompute"] - - [:val="%40compute"] - - [:val="%40compute%20)"] - - [:val="%40compute("] - - [:val="%40compute()"] - - [:val="%40mcompute"] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_compute_function:*] - [:extra="";before=false] - - [:extra="";before=true] - - [:extra="%40compute";before=false] - - [:extra="%40compute";before=true] - - [:extra="%40fragment";before=false] - - [:extra="%40fragment";before=true] - - [:extra="%40vertex";before=false] - - [:extra="%40vertex";before=true] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_fragment_function:*] - [:extra="";before=false] - - [:extra="";before=true] - - [:extra="%40compute";before=false] - - [:extra="%40compute";before=true] - - [:extra="%40fragment";before=false] - - [:extra="%40fragment";before=true] - - [:extra="%40vertex";before=false] - - [:extra="%40vertex";before=true] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:extra_on_vertex_function:*] - [:extra="";before=false] - - [:extra="";before=true] - - [:extra="%40compute";before=false] - - [:extra="%40compute";before=true] - - [:extra="%40fragment";before=false] - - [:extra="%40fragment";before=true] - - [:extra="%40vertex";before=false] - - [:extra="%40vertex";before=true] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:fragment_parsing:*] - [:val=""] - - [:val="%40%2F%5Ecomment%5E%2Ffragment"] - - [:val="%40%5Ctfragment"] - - [:val="%40fragment"] - - [:val="%40fragment%20)"] - - [:val="%40fragment("] - - [:val="%40fragment()"] - - [:val="%40mfragment"] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:multiple_entry_points:*] - [:] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:placement:*] - [:scope="_undef_";attr="%40compute"] - expected: - if os == "linux" and not debug: FAIL - - [:scope="_undef_";attr="%40fragment"] - expected: - if os == "linux" and not debug: FAIL - - [:scope="_undef_";attr="%40vertex"] - expected: - if os == "linux" and not debug: FAIL - - [:scope="fn-param";attr="%40compute"] - - [:scope="fn-param";attr="%40fragment"] - - [:scope="fn-param";attr="%40vertex"] - - [:scope="fn-return";attr="%40compute"] - - [:scope="fn-return";attr="%40fragment"] - - [:scope="fn-return";attr="%40vertex"] - - [:scope="fn-var";attr="%40compute"] - - [:scope="fn-var";attr="%40fragment"] - - [:scope="fn-var";attr="%40vertex"] - - [:scope="private-var";attr="%40compute"] - - [:scope="private-var";attr="%40fragment"] - - [:scope="private-var";attr="%40vertex"] - - [:scope="storage-var";attr="%40compute"] - - [:scope="storage-var";attr="%40fragment"] - - [:scope="storage-var";attr="%40vertex"] - - [:scope="struct-member";attr="%40compute"] - - [:scope="struct-member";attr="%40fragment"] - - [:scope="struct-member";attr="%40vertex"] - - [:scope="while-stmt";attr="%40compute"] - - [:scope="while-stmt";attr="%40fragment"] - - [:scope="while-stmt";attr="%40vertex"] - - -[cts.https.html?q=webgpu:shader,validation,parse,pipeline_stage:vertex_parsing:*] - [:val=""] - - [:val="%40%2F%5Ecomment%5E%2Fvertex"] - - [:val="%40%5Ctvertex"] - - [:val="%40mvertex"] - - [:val="%40vertex"] - - [:val="%40vertex%20)"] - - [:val="%40vertex("] - - [:val="%40vertex()"] - - [cts.https.html?q=webgpu:shader,validation,parse,requires:requires:*] [:case="const_assert_after"] @@ -110021,6 +183080,114 @@ [:] +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:function_param:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_access_mode:*] + [:inject="function"] + + [:inject="module"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="none"] + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="sibling"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_atomic:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + + [:inject="sibling"] + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_atomic_type:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_barriers:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="sibling"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_f16:*] + [:inject="function"] + + [:inject="module"] + + [:inject="none"] + + [:inject="sibling"] + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_handle_type:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,parse,shadow_builtins:shadow_hides_builtin_texture:*] + [:inject="function"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="module"] + + [:inject="none"] + expected: + if os == "linux" and not debug: FAIL + + [:inject="sibling"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,parse,source:empty:*] [:] @@ -110033,140 +183200,760 @@ [:] -[cts.https.html?q=webgpu:shader,validation,parse,unary_ops:all:*] - [:stmt="not_bool_expr"] +[cts.https.html?q=webgpu:shader,validation,shader_io,align:multi_align:*] + [:multi=false] - [:stmt="not_bool_literal"] + [:multi=true] - [:stmt="not_int_expr"] - [:stmt="not_int_literal"] +[cts.https.html?q=webgpu:shader,validation,shader_io,align:parsing:*] + [:align="blank"] - [:stmt="not_not_bool_expr"] + [:align="comment"] - [:stmt="not_not_bool_literal"] + [:align="const_expr"] + expected: + if os == "linux" and not debug: FAIL + [:align="const_f"] -[cts.https.html?q=webgpu:shader,validation,parse,var_and_let:initializer_type:*] - [:variableOrConstant="let"] + [:align="const_i"] - [:variableOrConstant="var"] + [:align="const_u"] + [:align="duplicate"] -[cts.https.html?q=webgpu:shader,validation,parse,var_and_let:var_access_mode_bad_other_template_contents:*] - [:accessMode="read";prefix="";suffix=""] + [:align="empty"] - [:accessMode="read";prefix="";suffix=","] + [:align="four_a"] - [:accessMode="read";prefix="";suffix=",read"] + [:align="four_f"] - [:accessMode="read";prefix="";suffix=",storage"] + [:align="four_h"] - [:accessMode="read";prefix=",";suffix=""] + [:align="four_hex"] - [:accessMode="read";prefix=",";suffix=","] + [:align="four_i"] - [:accessMode="read";prefix=",";suffix=",read"] + [:align="four_u"] - [:accessMode="read";prefix=",";suffix=",storage"] + [:align="large"] - [:accessMode="read";prefix="storage,";suffix=""] + [:align="large_no_power_two"] - [:accessMode="read";prefix="storage,";suffix=","] + [:align="larger_than_max_i32"] - [:accessMode="read";prefix="storage,";suffix=",read"] + [:align="missing_left_paren"] - [:accessMode="read";prefix="storage,";suffix=",storage"] + [:align="missing_right_paren"] - [:accessMode="read_write";prefix="";suffix=""] + [:align="misspelling"] - [:accessMode="read_write";prefix="";suffix=","] + [:align="multiple_values"] - [:accessMode="read_write";prefix="";suffix=",read"] + [:align="negative"] - [:accessMode="read_write";prefix="";suffix=",storage"] + [:align="no_params"] - [:accessMode="read_write";prefix=",";suffix=""] + [:align="non_power_two"] - [:accessMode="read_write";prefix=",";suffix=","] + [:align="one"] + expected: + if os == "linux" and not debug: FAIL - [:accessMode="read_write";prefix=",";suffix=",read"] + [:align="one_f"] - [:accessMode="read_write";prefix=",";suffix=",storage"] + [:align="tabs"] - [:accessMode="read_write";prefix="storage,";suffix=""] + [:align="trailing_comma"] + expected: + if os == "linux" and not debug: FAIL - [:accessMode="read_write";prefix="storage,";suffix=","] + [:align="zero_a"] - [:accessMode="read_write";prefix="storage,";suffix=",read"] - [:accessMode="read_write";prefix="storage,";suffix=",storage"] +[cts.https.html?q=webgpu:shader,validation,shader_io,align:placement:*] + [:scope="_undef_";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + expected: + if os == "linux" and not debug: FAIL + [:scope="fn-decl";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] -[cts.https.html?q=webgpu:shader,validation,parse,var_and_let:var_access_mode_bad_template_delim:*] - [:accessMode="read";prefix="";suffix=""] + [:scope="fn-param";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="";suffix="%3C"] + [:scope="fn-return";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="";suffix="%3E"] + [:scope="fn-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="";suffix=","] + [:scope="private-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="%3C";suffix=""] + [:scope="storage-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="%3C";suffix="%3C"] + [:scope="struct-member";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + expected: + if os == "linux" and not debug: FAIL - [:accessMode="read";prefix="%3C";suffix="%3E"] + [:scope="while-stmt";attribute={"private-var":false,"storage-var":false,"struct-member":true,"fn-decl":false,"fn-param":false,"fn-var":false,"fn-return":false,"while-stmt":false}] - [:accessMode="read";prefix="%3C";suffix=","] - [:accessMode="read";prefix="%3E";suffix=""] +[cts.https.html?q=webgpu:shader,validation,shader_io,align:required_alignment:*] + [:address_space="storage";align="alignment";type={"name":"S","storage":8,"uniform":16}] - [:accessMode="read";prefix="%3E";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] - [:accessMode="read";prefix="%3E";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL - [:accessMode="read";prefix="%3E";suffix=","] + [:address_space="storage";align="alignment";type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] - [:accessMode="read";prefix=",";suffix=""] + [:address_space="storage";align="alignment";type={"name":"f16","storage":2,"uniform":2}] - [:accessMode="read";prefix=",";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"f32","storage":4,"uniform":4}] - [:accessMode="read";prefix=",";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"i32","storage":4,"uniform":4}] - [:accessMode="read";prefix=",";suffix=","] + [:address_space="storage";align="alignment";type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] - [:accessMode="read_write";prefix="";suffix=""] + [:address_space="storage";align="alignment";type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] - [:accessMode="read_write";prefix="";suffix=","] + [:address_space="storage";align="alignment";type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="%3C";suffix=""] + [:address_space="storage";align="alignment";type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] - [:accessMode="read_write";prefix="%3C";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] - [:accessMode="read_write";prefix="%3C";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="%3C";suffix=","] + [:address_space="storage";align="alignment";type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="%3E";suffix=""] + [:address_space="storage";align="alignment";type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] - [:accessMode="read_write";prefix="%3E";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix="%3E";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] - [:accessMode="read_write";prefix="%3E";suffix=","] + [:address_space="storage";align="alignment";type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] - [:accessMode="read_write";prefix=",";suffix=""] + [:address_space="storage";align="alignment";type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix=",";suffix="%3C"] + [:address_space="storage";align="alignment";type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] - [:accessMode="read_write";prefix=",";suffix="%3E"] + [:address_space="storage";align="alignment";type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] - [:accessMode="read_write";prefix=",";suffix=","] + [:address_space="storage";align="alignment";type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align="alignment";type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align="alignment";type={"name":"u32","storage":4,"uniform":4}] + + [:address_space="storage";align="alignment";type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align="alignment";type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + + [:address_space="storage";align="alignment";type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align="alignment";type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align="alignment";type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align="alignment";type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=1;type={"name":"S","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="storage";align=1;type={"name":"f32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"i32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=1;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=1;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=1;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"u32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=1;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=1;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=1;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"S","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="storage";align=2;type={"name":"f32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"i32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=2;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=2;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=2;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"u32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=2;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=2;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=2;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="storage";align=32;type={"name":"S","storage":8,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="storage";align=32;type={"name":"f32","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"i32","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"u32","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="storage";align=32;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + + [:address_space="storage";align=32;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="storage";align=32;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"S","storage":8,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="uniform";align="alignment";type={"name":"f32","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"i32","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"u32","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align="alignment";type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align="alignment";type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align="alignment";type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=1;type={"name":"S","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align=1;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=1;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="uniform";align=1;type={"name":"f32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"i32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=1;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=1;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=1;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"u32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=1;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=1;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=1;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"S","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align=2;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=2;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="uniform";align=2;type={"name":"f32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"i32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=2;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=2;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=2;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"u32","storage":4,"uniform":4}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=2;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=2;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=2;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] + expected: + if os == "linux" and not debug: FAIL + + [:address_space="uniform";align=32;type={"name":"S","storage":8,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"array%3Cvec2%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"array%3Cvec4%3Ci32%3E,%202%3E","storage":8,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"atomic%3Ci32%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"f16","storage":2,"uniform":2}] + + [:address_space="uniform";align=32;type={"name":"f32","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"i32","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"mat2x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"mat2x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat2x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat2x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"mat2x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat2x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"mat3x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"mat3x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat3x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat3x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"mat3x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat3x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"mat4x2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"mat4x2%3Cf32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat4x3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat4x3%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"mat4x4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"mat4x4%3Cf32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"u32","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"vec2%3Cf16%3E","storage":4,"uniform":4}] + + [:address_space="uniform";align=32;type={"name":"vec2%3Ci32%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"vec3%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"vec3%3Cu32%3E","storage":16,"uniform":16}] + + [:address_space="uniform";align=32;type={"name":"vec4%3Cf16%3E","storage":8,"uniform":8}] + + [:address_space="uniform";align=32;type={"name":"vec4%3Cf32%3E","storage":16,"uniform":16}] [cts.https.html?q=webgpu:shader,validation,shader_io,binding:binding:*] @@ -110221,22 +184008,32 @@ [:first="p1";second="p2"] [:first="p1";second="rb"] + expected: + if os == "linux" and not debug: FAIL [:first="p1";second="s1b"] [:first="p1";second="s2b"] [:first="ra";second="p2"] + expected: + if os == "linux" and not debug: FAIL [:first="ra";second="rb"] [:first="ra";second="s1b"] + expected: + if os == "linux" and not debug: FAIL [:first="ra";second="s2b"] + expected: + if os == "linux" and not debug: FAIL [:first="s1a";second="p2"] [:first="s1a";second="rb"] + expected: + if os == "linux" and not debug: FAIL [:first="s1a";second="s1b"] @@ -110245,6 +184042,8 @@ [:first="s2a";second="p2"] [:first="s2a";second="rb"] + expected: + if os == "linux" and not debug: FAIL [:first="s2a";second="s1b"] @@ -110271,6 +184070,62 @@ [:target_stage="fragment";target_io="out"] +[cts.https.html?q=webgpu:shader,validation,shader_io,builtins:parse:*] + [:builtin="duplicate"] + + [:builtin="ident_param"] + + [:builtin="invalid_name"] + + [:builtin="missing_lparen"] + + [:builtin="missing_param"] + + [:builtin="missing_parens"] + + [:builtin="missing_rparen"] + + [:builtin="multiple_params"] + + [:builtin="newline_in_attr"] + + [:builtin="no_params"] + + [:builtin="number_param"] + + [:builtin="pos"] + + [:builtin="trailing_comma"] + expected: + if os == "linux" and not debug: FAIL + + [:builtin="whitespace_in_attr"] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,builtins:placement:*] + [:scope="_undef_";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + expected: + if os == "linux" and not debug: FAIL + + [:scope="fn-decl";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="fn-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="non-ep-param";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="non-ep-ret";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="private-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="storage-var";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [:scope="struct-member";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + expected: + if os == "linux" and not debug: FAIL + + [:scope="while-stmt";attribute={"private-var":false,"storage-var":false,"struct-member":true,"non-ep-param":false,"non-ep-ret":false,"fn-decl":false,"fn-var":false,"fn-return":false,"while-stmt":false}] + + [cts.https.html?q=webgpu:shader,validation,shader_io,builtins:reuse_builtin_name:*] [:name="frag_depth";stage="fragment";io="out";type="f32";use="alias"] @@ -112423,6 +186278,8 @@ [cts.https.html?q=webgpu:shader,validation,shader_io,interpolate:duplicate:*] [:attr=""] + expected: + if os == "linux" and not debug: FAIL [:attr="%40interpolate(flat)"] @@ -112434,6 +186291,14 @@ [:stage="fragment";type="i32";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="fragment";type="i32";use_struct=false;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="i32";use_struct=false;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="i32";use_struct=false;attribute="%40interpolate(linear)"] [:stage="fragment";type="i32";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112456,6 +186321,14 @@ [:stage="fragment";type="i32";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="fragment";type="i32";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="i32";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="i32";use_struct=true;attribute="%40interpolate(linear)"] [:stage="fragment";type="i32";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112478,6 +186351,14 @@ [:stage="fragment";type="u32";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="fragment";type="u32";use_struct=false;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="u32";use_struct=false;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="u32";use_struct=false;attribute="%40interpolate(linear)"] [:stage="fragment";type="u32";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112500,6 +186381,14 @@ [:stage="fragment";type="u32";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="fragment";type="u32";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="u32";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="u32";use_struct=true;attribute="%40interpolate(linear)"] [:stage="fragment";type="u32";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112522,6 +186411,14 @@ [:stage="fragment";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(linear)"] [:stage="fragment";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112544,6 +186441,14 @@ [:stage="fragment";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(linear)"] [:stage="fragment";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112566,6 +186471,14 @@ [:stage="fragment";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(linear)"] [:stage="fragment";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112588,6 +186501,14 @@ [:stage="fragment";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(linear)"] [:stage="fragment";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112608,6 +186529,10 @@ [:stage="vertex";type="i32";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="vertex";type="i32";use_struct=false;attribute="%40interpolate(flat,%20either)"] + + [:stage="vertex";type="i32";use_struct=false;attribute="%40interpolate(flat,%20first)"] + [:stage="vertex";type="i32";use_struct=false;attribute="%40interpolate(linear)"] [:stage="vertex";type="i32";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112630,6 +186555,14 @@ [:stage="vertex";type="i32";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="vertex";type="i32";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";type="i32";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";type="i32";use_struct=true;attribute="%40interpolate(linear)"] [:stage="vertex";type="i32";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112650,6 +186583,10 @@ [:stage="vertex";type="u32";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="vertex";type="u32";use_struct=false;attribute="%40interpolate(flat,%20either)"] + + [:stage="vertex";type="u32";use_struct=false;attribute="%40interpolate(flat,%20first)"] + [:stage="vertex";type="u32";use_struct=false;attribute="%40interpolate(linear)"] [:stage="vertex";type="u32";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112672,6 +186609,14 @@ [:stage="vertex";type="u32";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="vertex";type="u32";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";type="u32";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";type="u32";use_struct=true;attribute="%40interpolate(linear)"] [:stage="vertex";type="u32";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112692,6 +186637,10 @@ [:stage="vertex";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat,%20either)"] + + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(flat,%20first)"] + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(linear)"] [:stage="vertex";type="vec2%3Ci32%3E";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112714,6 +186663,14 @@ [:stage="vertex";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(linear)"] [:stage="vertex";type="vec2%3Ci32%3E";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112734,6 +186691,10 @@ [:stage="vertex";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat)"] + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat,%20either)"] + + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(flat,%20first)"] + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(linear)"] [:stage="vertex";type="vec4%3Cu32%3E";use_struct=false;attribute="%40interpolate(linear,%20center)"] @@ -112756,6 +186717,14 @@ [:stage="vertex";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat)"] + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat,%20either)"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(flat,%20first)"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(linear)"] [:stage="vertex";type="vec4%3Cu32%3E";use_struct=true;attribute="%40interpolate(linear,%20center)"] @@ -112813,8 +186782,12 @@ [:stage="fragment";attribute="%40builtin(position)";use_struct=true] [:stage="fragment";attribute="%40location(0)";use_struct=false] + expected: + if os == "linux" and not debug: FAIL [:stage="fragment";attribute="%40location(0)";use_struct=true] + expected: + if os == "linux" and not debug: FAIL [:stage="vertex";attribute="%40builtin(position)";use_struct=false] @@ -112823,6 +186796,8 @@ [:stage="vertex";attribute="%40location(0)";use_struct=false] [:stage="vertex";attribute="%40location(0)";use_struct=true] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,validation,shader_io,interpolate:type_and_sampling:*] @@ -112832,6 +186807,10 @@ [:stage="fragment";io="in";use_struct=false;type="";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="";sampling="linear"] @@ -112846,6 +186825,10 @@ [:stage="fragment";io="in";use_struct=false;type="center";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="center";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="center";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="center";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="center";sampling="linear"] @@ -112860,6 +186843,10 @@ [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="linear"] @@ -112868,6 +186855,42 @@ [:stage="fragment";io="in";use_struct=false;type="centroid";sampling="sample"] + [:stage="fragment";io="in";use_struct=false;type="either";sampling=""] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="center"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="centroid"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="first"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="flat"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="linear"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="perspective"] + + [:stage="fragment";io="in";use_struct=false;type="either";sampling="sample"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling=""] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="center"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="centroid"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="first"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="flat"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="linear"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="perspective"] + + [:stage="fragment";io="in";use_struct=false;type="first";sampling="sample"] + [:stage="fragment";io="in";use_struct=false;type="flat";sampling=""] [:stage="fragment";io="in";use_struct=false;type="flat";sampling="center"] @@ -112878,6 +186901,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="fragment";io="in";use_struct=false;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";io="in";use_struct=false;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";io="in";use_struct=false;type="flat";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="flat";sampling="linear"] @@ -112894,6 +186925,10 @@ [:stage="fragment";io="in";use_struct=false;type="linear";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="linear";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="linear";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="linear";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="linear";sampling="linear"] @@ -112908,6 +186943,10 @@ [:stage="fragment";io="in";use_struct=false;type="perspective";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="perspective";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="perspective";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="perspective";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="perspective";sampling="linear"] @@ -112922,6 +186961,10 @@ [:stage="fragment";io="in";use_struct=false;type="sample";sampling="centroid"] + [:stage="fragment";io="in";use_struct=false;type="sample";sampling="either"] + + [:stage="fragment";io="in";use_struct=false;type="sample";sampling="first"] + [:stage="fragment";io="in";use_struct=false;type="sample";sampling="flat"] [:stage="fragment";io="in";use_struct=false;type="sample";sampling="linear"] @@ -112936,6 +186979,10 @@ [:stage="fragment";io="in";use_struct=true;type="";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="";sampling="linear"] @@ -112950,6 +186997,10 @@ [:stage="fragment";io="in";use_struct=true;type="center";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="center";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="center";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="center";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="center";sampling="linear"] @@ -112964,6 +187015,10 @@ [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="linear"] @@ -112972,6 +187027,42 @@ [:stage="fragment";io="in";use_struct=true;type="centroid";sampling="sample"] + [:stage="fragment";io="in";use_struct=true;type="either";sampling=""] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="center"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="centroid"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="first"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="flat"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="linear"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="perspective"] + + [:stage="fragment";io="in";use_struct=true;type="either";sampling="sample"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling=""] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="center"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="centroid"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="first"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="flat"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="linear"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="perspective"] + + [:stage="fragment";io="in";use_struct=true;type="first";sampling="sample"] + [:stage="fragment";io="in";use_struct=true;type="flat";sampling=""] [:stage="fragment";io="in";use_struct=true;type="flat";sampling="center"] @@ -112982,6 +187073,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="fragment";io="in";use_struct=true;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";io="in";use_struct=true;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";io="in";use_struct=true;type="flat";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="flat";sampling="linear"] @@ -112998,6 +187097,10 @@ [:stage="fragment";io="in";use_struct=true;type="linear";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="linear";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="linear";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="linear";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="linear";sampling="linear"] @@ -113012,6 +187115,10 @@ [:stage="fragment";io="in";use_struct=true;type="perspective";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="perspective";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="perspective";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="perspective";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="perspective";sampling="linear"] @@ -113026,6 +187133,10 @@ [:stage="fragment";io="in";use_struct=true;type="sample";sampling="centroid"] + [:stage="fragment";io="in";use_struct=true;type="sample";sampling="either"] + + [:stage="fragment";io="in";use_struct=true;type="sample";sampling="first"] + [:stage="fragment";io="in";use_struct=true;type="sample";sampling="flat"] [:stage="fragment";io="in";use_struct=true;type="sample";sampling="linear"] @@ -113040,6 +187151,10 @@ [:stage="fragment";io="out";use_struct=false;type="";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="";sampling="linear"] @@ -113054,6 +187169,10 @@ [:stage="fragment";io="out";use_struct=false;type="center";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="center";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="center";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="center";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="center";sampling="linear"] @@ -113068,6 +187187,10 @@ [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="linear"] @@ -113076,6 +187199,42 @@ [:stage="fragment";io="out";use_struct=false;type="centroid";sampling="sample"] + [:stage="fragment";io="out";use_struct=false;type="either";sampling=""] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="center"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="centroid"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="first"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="flat"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="linear"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="perspective"] + + [:stage="fragment";io="out";use_struct=false;type="either";sampling="sample"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling=""] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="center"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="centroid"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="first"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="flat"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="linear"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="perspective"] + + [:stage="fragment";io="out";use_struct=false;type="first";sampling="sample"] + [:stage="fragment";io="out";use_struct=false;type="flat";sampling=""] [:stage="fragment";io="out";use_struct=false;type="flat";sampling="center"] @@ -113086,6 +187245,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="fragment";io="out";use_struct=false;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";io="out";use_struct=false;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";io="out";use_struct=false;type="flat";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="flat";sampling="linear"] @@ -113102,6 +187269,10 @@ [:stage="fragment";io="out";use_struct=false;type="linear";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="linear";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="linear";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="linear";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="linear";sampling="linear"] @@ -113116,6 +187287,10 @@ [:stage="fragment";io="out";use_struct=false;type="perspective";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="perspective";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="perspective";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="perspective";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="perspective";sampling="linear"] @@ -113130,6 +187305,10 @@ [:stage="fragment";io="out";use_struct=false;type="sample";sampling="centroid"] + [:stage="fragment";io="out";use_struct=false;type="sample";sampling="either"] + + [:stage="fragment";io="out";use_struct=false;type="sample";sampling="first"] + [:stage="fragment";io="out";use_struct=false;type="sample";sampling="flat"] [:stage="fragment";io="out";use_struct=false;type="sample";sampling="linear"] @@ -113144,6 +187323,10 @@ [:stage="fragment";io="out";use_struct=true;type="";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="";sampling="linear"] @@ -113158,6 +187341,10 @@ [:stage="fragment";io="out";use_struct=true;type="center";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="center";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="center";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="center";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="center";sampling="linear"] @@ -113172,6 +187359,10 @@ [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="linear"] @@ -113180,6 +187371,42 @@ [:stage="fragment";io="out";use_struct=true;type="centroid";sampling="sample"] + [:stage="fragment";io="out";use_struct=true;type="either";sampling=""] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="center"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="centroid"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="first"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="flat"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="linear"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="perspective"] + + [:stage="fragment";io="out";use_struct=true;type="either";sampling="sample"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling=""] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="center"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="centroid"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="first"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="flat"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="linear"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="perspective"] + + [:stage="fragment";io="out";use_struct=true;type="first";sampling="sample"] + [:stage="fragment";io="out";use_struct=true;type="flat";sampling=""] [:stage="fragment";io="out";use_struct=true;type="flat";sampling="center"] @@ -113190,6 +187417,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="fragment";io="out";use_struct=true;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="fragment";io="out";use_struct=true;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="fragment";io="out";use_struct=true;type="flat";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="flat";sampling="linear"] @@ -113206,6 +187441,10 @@ [:stage="fragment";io="out";use_struct=true;type="linear";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="linear";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="linear";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="linear";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="linear";sampling="linear"] @@ -113220,6 +187459,10 @@ [:stage="fragment";io="out";use_struct=true;type="perspective";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="perspective";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="perspective";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="perspective";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="perspective";sampling="linear"] @@ -113234,6 +187477,10 @@ [:stage="fragment";io="out";use_struct=true;type="sample";sampling="centroid"] + [:stage="fragment";io="out";use_struct=true;type="sample";sampling="either"] + + [:stage="fragment";io="out";use_struct=true;type="sample";sampling="first"] + [:stage="fragment";io="out";use_struct=true;type="sample";sampling="flat"] [:stage="fragment";io="out";use_struct=true;type="sample";sampling="linear"] @@ -113346,6 +187593,10 @@ [:stage="vertex";io="in";use_struct=true;type="";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="";sampling="linear"] @@ -113360,6 +187611,10 @@ [:stage="vertex";io="in";use_struct=true;type="center";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="center";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="center";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="center";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="center";sampling="linear"] @@ -113374,6 +187629,10 @@ [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="linear"] @@ -113382,6 +187641,42 @@ [:stage="vertex";io="in";use_struct=true;type="centroid";sampling="sample"] + [:stage="vertex";io="in";use_struct=true;type="either";sampling=""] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="center"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="centroid"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="first"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="flat"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="linear"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="perspective"] + + [:stage="vertex";io="in";use_struct=true;type="either";sampling="sample"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling=""] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="center"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="centroid"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="first"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="flat"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="linear"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="perspective"] + + [:stage="vertex";io="in";use_struct=true;type="first";sampling="sample"] + [:stage="vertex";io="in";use_struct=true;type="flat";sampling=""] [:stage="vertex";io="in";use_struct=true;type="flat";sampling="center"] @@ -113392,6 +187687,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="vertex";io="in";use_struct=true;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";io="in";use_struct=true;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";io="in";use_struct=true;type="flat";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="flat";sampling="linear"] @@ -113408,6 +187711,10 @@ [:stage="vertex";io="in";use_struct=true;type="linear";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="linear";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="linear";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="linear";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="linear";sampling="linear"] @@ -113422,6 +187729,10 @@ [:stage="vertex";io="in";use_struct=true;type="perspective";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="perspective";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="perspective";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="perspective";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="perspective";sampling="linear"] @@ -113436,6 +187747,10 @@ [:stage="vertex";io="in";use_struct=true;type="sample";sampling="centroid"] + [:stage="vertex";io="in";use_struct=true;type="sample";sampling="either"] + + [:stage="vertex";io="in";use_struct=true;type="sample";sampling="first"] + [:stage="vertex";io="in";use_struct=true;type="sample";sampling="flat"] [:stage="vertex";io="in";use_struct=true;type="sample";sampling="linear"] @@ -113548,6 +187863,10 @@ [:stage="vertex";io="out";use_struct=true;type="";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="";sampling="linear"] @@ -113562,6 +187881,10 @@ [:stage="vertex";io="out";use_struct=true;type="center";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="center";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="center";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="center";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="center";sampling="linear"] @@ -113576,6 +187899,10 @@ [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="linear"] @@ -113584,6 +187911,42 @@ [:stage="vertex";io="out";use_struct=true;type="centroid";sampling="sample"] + [:stage="vertex";io="out";use_struct=true;type="either";sampling=""] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="center"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="centroid"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="first"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="flat"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="linear"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="perspective"] + + [:stage="vertex";io="out";use_struct=true;type="either";sampling="sample"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling=""] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="center"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="centroid"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="first"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="flat"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="linear"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="perspective"] + + [:stage="vertex";io="out";use_struct=true;type="first";sampling="sample"] + [:stage="vertex";io="out";use_struct=true;type="flat";sampling=""] [:stage="vertex";io="out";use_struct=true;type="flat";sampling="center"] @@ -113594,6 +187957,14 @@ expected: if os == "linux" and not debug: FAIL + [:stage="vertex";io="out";use_struct=true;type="flat";sampling="either"] + expected: + if os == "linux" and not debug: FAIL + + [:stage="vertex";io="out";use_struct=true;type="flat";sampling="first"] + expected: + if os == "linux" and not debug: FAIL + [:stage="vertex";io="out";use_struct=true;type="flat";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="flat";sampling="linear"] @@ -113610,6 +187981,10 @@ [:stage="vertex";io="out";use_struct=true;type="linear";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="linear";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="linear";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="linear";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="linear";sampling="linear"] @@ -113624,6 +187999,10 @@ [:stage="vertex";io="out";use_struct=true;type="perspective";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="perspective";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="perspective";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="perspective";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="perspective";sampling="linear"] @@ -113638,6 +188017,10 @@ [:stage="vertex";io="out";use_struct=true;type="sample";sampling="centroid"] + [:stage="vertex";io="out";use_struct=true;type="sample";sampling="either"] + + [:stage="vertex";io="out";use_struct=true;type="sample";sampling="first"] + [:stage="vertex";io="out";use_struct=true;type="sample";sampling="flat"] [:stage="vertex";io="out";use_struct=true;type="sample";sampling="linear"] @@ -113729,6 +188112,212 @@ [:name="workgroup_id";stage="compute";io="in";type="vec3%3Cu32%3E";use_struct=true] +[cts.https.html?q=webgpu:shader,validation,shader_io,layout_constraints:layout_constraints:*] + [:case="array_atomic"] + + [:case="array_bool"] + + [:case="array_f16"] + + [:case="array_f32"] + + [:case="array_i32"] + + [:case="array_mat2x2f"] + + [:case="array_mat2x2h"] + + [:case="array_mat2x4f"] + + [:case="array_mat2x4h"] + + [:case="array_mat3x2h"] + + [:case="array_mat4x2f"] + + [:case="array_mat4x2h"] + + [:case="array_mat4x4f"] + + [:case="array_mat4x4h"] + + [:case="array_struct_size_5"] + + [:case="array_struct_size_5x2"] + + [:case="array_struct_u32"] + + [:case="array_struct_u32_size16"] + + [:case="array_struct_vec2f"] + + [:case="array_struct_vec2h"] + + [:case="array_struct_vec2h_align16"] + + [:case="array_u32"] + + [:case="array_vec2b"] + + [:case="array_vec2f"] + + [:case="array_vec2h"] + + [:case="array_vec3b"] + + [:case="array_vec3f"] + + [:case="array_vec3h"] + + [:case="array_vec4b"] + + [:case="array_vec4f"] + + [:case="array_vec4h"] + + [:case="atomic_i32"] + + [:case="atomic_u32"] + + [:case="bool"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="mat2x2f"] + + [:case="mat2x2h"] + + [:case="mat2x3f"] + + [:case="mat2x3h"] + + [:case="mat2x4f"] + + [:case="mat2x4h"] + + [:case="mat3x2f"] + + [:case="mat3x2h"] + + [:case="mat3x3f"] + + [:case="mat3x3h"] + + [:case="mat3x4f"] + + [:case="mat3x4h"] + + [:case="mat4x2f"] + + [:case="mat4x2h"] + + [:case="mat4x3f"] + + [:case="mat4x3h"] + + [:case="mat4x4f"] + + [:case="mat4x4h"] + + [:case="runtime_array_atomic"] + + [:case="runtime_array_bool"] + + [:case="runtime_array_f16"] + + [:case="runtime_array_f32"] + + [:case="runtime_array_i32"] + + [:case="runtime_array_mat2x2f"] + + [:case="runtime_array_mat2x2h"] + + [:case="runtime_array_mat2x4f"] + + [:case="runtime_array_mat2x4h"] + + [:case="runtime_array_mat3x2h"] + + [:case="runtime_array_mat4x2f"] + + [:case="runtime_array_mat4x2h"] + + [:case="runtime_array_mat4x4f"] + + [:case="runtime_array_mat4x4h"] + + [:case="runtime_array_u32"] + + [:case="runtime_array_vec2b"] + + [:case="runtime_array_vec2f"] + + [:case="runtime_array_vec2h"] + + [:case="runtime_array_vec3b"] + + [:case="runtime_array_vec3f"] + + [:case="runtime_array_vec3h"] + + [:case="runtime_array_vec4b"] + + [:case="runtime_array_vec4f"] + + [:case="runtime_array_vec4h"] + + [:case="size_too_small"] + + [:case="struct_array_u32"] + + [:case="struct_padding"] + + [:case="struct_runtime_array_u32"] + + [:case="struct_size_5"] + + [:case="struct_size_5_align16"] + expected: + if os == "linux" and not debug: FAIL + + [:case="u32"] + + [:case="vec2b"] + + [:case="vec2f"] + + [:case="vec2h"] + + [:case="vec2i"] + + [:case="vec2u"] + + [:case="vec3b"] + + [:case="vec3f"] + + [:case="vec3h"] + + [:case="vec3i"] + + [:case="vec3u"] + + [:case="vec4b"] + + [:case="vec4f"] + + [:case="vec4h"] + + [:case="vec4i"] + + [:case="vec4u"] + + [cts.https.html?q=webgpu:shader,validation,shader_io,locations:duplicates:*] [:first="p1";second="p2"] @@ -113783,6 +188372,38 @@ [:target_stage="vertex";target_io="out"] +[cts.https.html?q=webgpu:shader,validation,shader_io,locations:out_of_order:*] + [:case="gap_return"] + + [:case="mixed_locations1"] + + [:case="mixed_locations2"] + + [:case="mixed_overlap"] + + [:case="no_zero_params"] + + [:case="non_zero_return"] + + [:case="reverse_overlap"] + + [:case="reverse_params"] + + [:case="reverse_return"] + + [:case="struct"] + + [:case="struct_override"] + + [:case="struct_random"] + + [:case="struct_random_overlap"] + + [:case="with_param_builtin"] + + [:case="with_return_builtin"] + + [cts.https.html?q=webgpu:shader,validation,shader_io,locations:stage_inout:*] [:use_struct=false;target_stage="compute";target_io="in"] expected: @@ -113819,6 +188440,8 @@ [cts.https.html?q=webgpu:shader,validation,shader_io,locations:type:*] [:use_struct=false;type="MyAlias"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="MyStruct"] @@ -113839,8 +188462,12 @@ [:use_struct=false;type="f16"] [:use_struct=false;type="f32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="i32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="mat2x2%3Cf32%3E"] @@ -113935,56 +188562,96 @@ [:use_struct=false;type="texture_storage_3d%3Cr32float,%20write%3E"] [:use_struct=false;type="u32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2%3Cbool%3E"] [:use_struct=false;type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2h"] [:use_struct=false;type="vec2i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec2u"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3%3Cbool%3E"] [:use_struct=false;type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3h"] [:use_struct=false;type="vec3i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec3u"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4%3Cbool%3E"] [:use_struct=false;type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4h"] [:use_struct=false;type="vec4i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=false;type="vec4u"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="MyAlias"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="MyStruct"] @@ -114005,8 +188672,12 @@ [:use_struct=true;type="f16"] [:use_struct=true;type="f32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="i32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="mat2x2%3Cf32%3E"] @@ -114101,54 +188772,92 @@ [:use_struct=true;type="texture_storage_3d%3Cr32float,%20write%3E"] [:use_struct=true;type="u32"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2%3Cbool%3E"] [:use_struct=true;type="vec2%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2h"] [:use_struct=true;type="vec2i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec2u"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3%3Cbool%3E"] [:use_struct=true;type="vec3%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3h"] [:use_struct=true;type="vec3i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec3u"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4%3Cbool%3E"] [:use_struct=true;type="vec4%3Cf32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4%3Ci32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4%3Cu32%3E"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4f"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4h"] [:use_struct=true;type="vec4i"] + expected: + if os == "linux" and not debug: FAIL [:use_struct=true;type="vec4u"] + expected: + if os == "linux" and not debug: FAIL [cts.https.html?q=webgpu:shader,validation,shader_io,locations:validation:*] @@ -114156,6 +188865,8 @@ [:attr="const_expr"] + [:attr="duplicate"] + [:attr="empty_params"] [:attr="extra_comma"] @@ -114197,13 +188908,187 @@ [:attr="zero"] +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:compute_parsing:*] + [:val=""] + + [:val="%40%2F%5Ecomment%5E%2Fcompute"] + + [:val="%40%5Ctcompute"] + + [:val="%40compute"] + + [:val="%40compute%20)"] + + [:val="%40compute("] + + [:val="%40compute()"] + + [:val="%40mcompute"] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_compute_function:*] + [:extra="";before=false] + + [:extra="";before=true] + + [:extra="%40compute";before=false] + + [:extra="%40compute";before=true] + + [:extra="%40fragment";before=false] + + [:extra="%40fragment";before=true] + + [:extra="%40vertex";before=false] + + [:extra="%40vertex";before=true] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_fragment_function:*] + [:extra="";before=false] + + [:extra="";before=true] + + [:extra="%40compute";before=false] + + [:extra="%40compute";before=true] + + [:extra="%40fragment";before=false] + + [:extra="%40fragment";before=true] + + [:extra="%40vertex";before=false] + + [:extra="%40vertex";before=true] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:extra_on_vertex_function:*] + [:extra="";before=false] + + [:extra="";before=true] + + [:extra="%40compute";before=false] + + [:extra="%40compute";before=true] + + [:extra="%40fragment";before=false] + + [:extra="%40fragment";before=true] + + [:extra="%40vertex";before=false] + + [:extra="%40vertex";before=true] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:fragment_parsing:*] + [:val=""] + + [:val="%40%2F%5Ecomment%5E%2Ffragment"] + + [:val="%40%5Ctfragment"] + + [:val="%40fragment"] + + [:val="%40fragment%20)"] + + [:val="%40fragment("] + + [:val="%40fragment()"] + + [:val="%40mfragment"] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:multiple_entry_points:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:placement:*] + [:scope="_undef_";attr="%40compute"] + expected: + if os == "linux" and not debug: FAIL + + [:scope="_undef_";attr="%40fragment"] + expected: + if os == "linux" and not debug: FAIL + + [:scope="_undef_";attr="%40vertex"] + expected: + if os == "linux" and not debug: FAIL + + [:scope="fn-param";attr="%40compute"] + + [:scope="fn-param";attr="%40fragment"] + + [:scope="fn-param";attr="%40vertex"] + + [:scope="fn-return";attr="%40compute"] + + [:scope="fn-return";attr="%40fragment"] + + [:scope="fn-return";attr="%40vertex"] + + [:scope="fn-var";attr="%40compute"] + + [:scope="fn-var";attr="%40fragment"] + + [:scope="fn-var";attr="%40vertex"] + + [:scope="private-var";attr="%40compute"] + + [:scope="private-var";attr="%40fragment"] + + [:scope="private-var";attr="%40vertex"] + + [:scope="storage-var";attr="%40compute"] + + [:scope="storage-var";attr="%40fragment"] + + [:scope="storage-var";attr="%40vertex"] + + [:scope="struct-member";attr="%40compute"] + + [:scope="struct-member";attr="%40fragment"] + + [:scope="struct-member";attr="%40vertex"] + + [:scope="while-stmt";attr="%40compute"] + + [:scope="while-stmt";attr="%40fragment"] + + [:scope="while-stmt";attr="%40vertex"] + + +[cts.https.html?q=webgpu:shader,validation,shader_io,pipeline_stage:vertex_parsing:*] + [:val=""] + + [:val="%40%2F%5Ecomment%5E%2Fvertex"] + + [:val="%40%5Ctvertex"] + + [:val="%40mvertex"] + + [:val="%40vertex"] + + [:val="%40vertex%20)"] + + [:val="%40vertex("] + + [:val="%40vertex()"] + + [cts.https.html?q=webgpu:shader,validation,shader_io,size:size:*] [:attr="comment"] + [:attr="const_expr"] + [:attr="constant"] [:attr="duplicate"] + [:attr="duplicate1"] + + [:attr="duplicate2"] + [:attr="f32"] [:attr="f32_literal"] @@ -114284,6 +189169,10 @@ [:attr="duplicate"] + [:attr="duplicate1"] + + [:attr="duplicate2"] + [:attr="empty"] [:attr="empty_x"] @@ -114429,6 +189318,2568 @@ [:] +[cts.https.html?q=webgpu:shader,validation,statement,break:placement:*] + [:stmt="break"] + + [:stmt="continuing_break"] + + [:stmt="continuing_if_break"] + + [:stmt="for_break"] + + [:stmt="for_if_break"] + + [:stmt="if_break"] + + [:stmt="loop_break"] + + [:stmt="loop_if_break"] + + [:stmt="return_break"] + + [:stmt="switch_break"] + + [:stmt="switch_case_break"] + + [:stmt="switch_case_if_break"] + + [:stmt="while_break"] + + [:stmt="while_if_break"] + + +[cts.https.html?q=webgpu:shader,validation,statement,break_if:condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,break_if:placement:*] + [:stmt="break"] + + [:stmt="compound_break"] + + [:stmt="continuing_break_if"] + + [:stmt="continuing_break_if_not_last"] + + [:stmt="continuing_break_if_parens"] + + [:stmt="continuing_if_break"] + + [:stmt="for_break"] + + [:stmt="for_if_break"] + + [:stmt="if_break"] + + [:stmt="loop_break"] + + [:stmt="loop_if_break"] + + [:stmt="return_break"] + + [:stmt="switch_break"] + + [:stmt="switch_case_break"] + + [:stmt="switch_case_if_break"] + + [:stmt="while_break"] + + [:stmt="while_if_break"] + + +[cts.https.html?q=webgpu:shader,validation,statement,compound:parse:*] + [:stmt="decl"] + expected: + if os == "linux" and not debug: FAIL + + [:stmt="empty"] + + [:stmt="missing_end"] + + [:stmt="missing_start"] + + [:stmt="nested"] + + [:stmt="semicolon"] + + [:stmt="semicolons"] + + +[cts.https.html?q=webgpu:shader,validation,statement,const_assert:parse:*] + [:case="both_parentheses"] + expected: + if os == "linux" and not debug: FAIL + + [:case="condition_on_newline"] + expected: + if os == "linux" and not debug: FAIL + + [:case="invalid_expression"] + + [:case="left_parenthesis_only"] + + [:case="multiline_with_parentheses"] + expected: + if os == "linux" and not debug: FAIL + + [:case="no_condition_no_parentheses"] + + [:case="no_condition_with_parentheses"] + + [:case="no_parentheses"] + expected: + if os == "linux" and not debug: FAIL + + [:case="not_a_boolean"] + + [:case="right_parenthesis_only"] + + +[cts.https.html?q=webgpu:shader,validation,statement,continue:module_scope:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,statement,continue:placement:*] + [:stmt="compound_continue"] + + [:stmt="continue"] + + [:stmt="continuing_continue"] + + [:stmt="continuing_nested_loop_continue"] + + [:stmt="for_condition_continue"] + + [:stmt="for_continue"] + + [:stmt="for_continue_continue"] + + [:stmt="for_init_continue"] + + [:stmt="if_continue"] + + [:stmt="loop_continue"] + + [:stmt="loop_continue_after_decl_used_in_continuing"] + + [:stmt="loop_continue_before_decl_not_used_in_continuing"] + + [:stmt="loop_continue_before_decl_used_in_continuing"] + expected: + if os == "linux" and not debug: FAIL + + [:stmt="loop_continue_expression"] + + [:stmt="loop_nested_continue_before_decl_used_in_continuing"] + expected: + if os == "linux" and not debug: FAIL + + [:stmt="nested_if_continue"] + + [:stmt="nested_switch_case_continue"] + + [:stmt="return_continue"] + + [:stmt="switch_case_continue"] + + [:stmt="while_continue"] + + +[cts.https.html?q=webgpu:shader,validation,statement,continuing:placement:*] + [:stmt="continuing"] + + [:stmt="continuing_block"] + + [:stmt="continuing_break"] + + [:stmt="continuing_break_if"] + + [:stmt="continuing_break_if_parens"] + + [:stmt="continuing_const"] + expected: + if os == "linux" and not debug: FAIL + + [:stmt="continuing_const_assert"] + expected: + if os == "linux" and not debug: FAIL + + [:stmt="continuing_continue"] + + [:stmt="continuing_continue_nested"] + + [:stmt="continuing_continuing"] + + [:stmt="continuing_dec"] + + [:stmt="continuing_discard"] + + [:stmt="continuing_empty"] + + [:stmt="continuing_for"] + + [:stmt="continuing_for_break"] + + [:stmt="continuing_functionn_call"] + + [:stmt="continuing_if"] + + [:stmt="continuing_inc"] + + [:stmt="continuing_let"] + + [:stmt="continuing_loop"] + + [:stmt="continuing_loop_nested_continuing"] + + [:stmt="continuing_semicolon"] + + [:stmt="continuing_switch"] + + [:stmt="continuing_switch_break"] + + [:stmt="continuing_var"] + + [:stmt="continuing_while"] + + [:stmt="continuing_while_break"] + + [:stmt="for"] + + [:stmt="if"] + + [:stmt="if_body"] + + [:stmt="if_else"] + + [:stmt="no_body"] + + [:stmt="return"] + + [:stmt="return_for_nested_in_continue"] + + [:stmt="return_if_nested_in_continue"] + + [:stmt="return_in_continue"] + + [:stmt="switch"] + + [:stmt="switch_case"] + + [:stmt="while"] + + +[cts.https.html?q=webgpu:shader,validation,statement,discard:placement:*] + [:place="compute"] + + [:place="fragment"] + expected: + if os == "linux" and not debug: FAIL + + [:place="module"] + + [:place="subcomp"] + + [:place="subfrag"] + + [:place="subvert"] + + [:place="vertex"] + + +[cts.https.html?q=webgpu:shader,validation,statement,for:condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,for:parse:*] + [:test="break"] + + [:test="cond_cont"] + + [:test="cond_stmt"] + + [:test="cond_true"] + + [:test="cont_call"] + + [:test="cont_compound_assign"] + + [:test="cont_expr"] + + [:test="cont_increment"] + + [:test="cont_let"] + + [:test="cont_let_type"] + + [:test="cont_phony"] + expected: + if os == "linux" and not debug: FAIL + + [:test="cont_var"] + + [:test="cont_var_function"] + + [:test="cont_var_function_type"] + + [:test="cont_var_type"] + + [:test="empty"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_call"] + + [:test="init_compound_assign"] + + [:test="init_cond"] + + [:test="init_cond_cont"] + + [:test="init_const"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_const_type"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_expr"] + + [:test="init_increment"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_let"] + + [:test="init_let_type"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_phony"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_shadow"] + + [:test="init_var"] + + [:test="init_var_function"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_var_function_type"] + expected: + if os == "linux" and not debug: FAIL + + [:test="init_var_type"] + + [:test="no_paren"] + + [:test="no_semicolon"] + + [:test="one_semicolon"] + + +[cts.https.html?q=webgpu:shader,validation,statement,if:condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,if:else_condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,if:parse:*] + [:test="block"] + + [:test="elif"] + + [:test="else"] + + [:test="else_if"] + + [:test="elsif"] + + [:test="expr"] + + [:test="expr_else"] + + [:test="expr_else_if_expr"] + + [:test="expr_else_if_paren_expr"] + + [:test="if"] + + [:test="lparen_true"] + + [:test="paren_expr"] + + [:test="paren_expr_else"] + + [:test="paren_expr_else_if_expr"] + + [:test="paren_expr_else_if_paren_expr"] + + [:test="paren_true"] + + [:test="paren_true_else"] + + [:test="paren_true_else_if_paren_true"] + + [:test="paren_true_else_if_true"] + + [:test="rparen_true"] + + [:test="semicolon"] + + [:test="true"] + + [:test="true_elif"] + + [:test="true_else"] + + [:test="true_else_if"] + + [:test="true_else_if_lparen_true"] + + [:test="true_else_if_no_block"] + + [:test="true_else_if_paren_true"] + + [:test="true_else_if_rparen_true"] + + [:test="true_else_if_semicolon"] + + [:test="true_else_if_true"] + + [:test="true_else_if_true_lbrace"] + + [:test="true_else_if_true_lparen"] + + [:test="true_else_if_true_rbrace"] + + [:test="true_else_if_true_rparen"] + + [:test="true_elsif"] + + [:test="true_lbrace"] + + [:test="true_lparen"] + + [:test="true_rbrace"] + + [:test="true_rparen"] + + +[cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:component:*] + [:type="array";direction="down"] + + [:type="array";direction="up"] + + [:type="array_f";direction="down"] + + [:type="array_f";direction="up"] + + [:type="array_i";direction="down"] + + [:type="array_i";direction="up"] + + [:type="mat2x2f";direction="down"] + + [:type="mat2x2f";direction="up"] + + [:type="mat2x2h";direction="down"] + + [:type="mat2x2h";direction="up"] + + [:type="struct";direction="down"] + + [:type="struct";direction="up"] + + [:type="struct_field";direction="down"] + + [:type="struct_field";direction="up"] + + [:type="struct_var";direction="down"] + + [:type="struct_var";direction="up"] + + [:type="v2f_x";direction="down"] + + [:type="v2f_x";direction="up"] + + [:type="v2h_x";direction="down"] + + [:type="v2h_x";direction="up"] + + [:type="v2i_x";direction="down"] + + [:type="v2i_x";direction="up"] + + [:type="v2i_y";direction="down"] + + [:type="v2i_y";direction="up"] + + [:type="v2u_indexed";direction="down"] + + [:type="v2u_indexed";direction="up"] + + [:type="v2u_x";direction="down"] + + [:type="v2u_x";direction="up"] + + [:type="v2u_xx";direction="down"] + + [:type="v2u_xx";direction="up"] + + [:type="v2u_y";direction="down"] + + [:type="v2u_y";direction="up"] + + [:type="v3i_x";direction="down"] + + [:type="v3i_x";direction="up"] + + [:type="v3i_y";direction="down"] + + [:type="v3i_y";direction="up"] + + [:type="v3i_z";direction="down"] + + [:type="v3i_z";direction="up"] + + [:type="v3u_x";direction="down"] + + [:type="v3u_x";direction="up"] + + [:type="v3u_y";direction="down"] + + [:type="v3u_y";direction="up"] + + [:type="v3u_z";direction="down"] + + [:type="v3u_z";direction="up"] + + [:type="v4i_w";direction="down"] + + [:type="v4i_w";direction="up"] + + [:type="v4i_x";direction="down"] + + [:type="v4i_x";direction="up"] + + [:type="v4i_y";direction="down"] + + [:type="v4i_y";direction="up"] + + [:type="v4i_z";direction="down"] + + [:type="v4i_z";direction="up"] + + [:type="v4u_w";direction="down"] + + [:type="v4u_w";direction="up"] + + [:type="v4u_x";direction="down"] + + [:type="v4u_x";direction="up"] + + [:type="v4u_y";direction="down"] + + [:type="v4u_y";direction="up"] + + [:type="v4u_z";direction="down"] + + [:type="v4u_z";direction="up"] + + +[cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:parse:*] + [:test="assign_to";direction="down"] + + [:test="assign_to";direction="up"] + + [:test="at_global";direction="down"] + + [:test="at_global";direction="up"] + + [:test="builtin";direction="down"] + + [:test="builtin";direction="up"] + + [:test="const";direction="down"] + + [:test="const";direction="up"] + + [:test="cr";direction="down"] + + [:test="cr";direction="up"] + + [:test="enum";direction="down"] + + [:test="enum";direction="up"] + + [:test="expr_add";direction="down"] + + [:test="expr_add";direction="up"] + + [:test="expr_negate";direction="down"] + + [:test="expr_negate";direction="up"] + + [:test="expr_paren";direction="down"] + + [:test="expr_paren";direction="up"] + + [:test="global_const";direction="down"] + + [:test="global_const";direction="up"] + + [:test="in_block";direction="down"] + + [:test="in_block";direction="up"] + + [:test="in_continuing";direction="down"] + + [:test="in_continuing";direction="up"] + + [:test="in_for_cond";direction="down"] + + [:test="in_for_cond";direction="up"] + + [:test="in_for_init";direction="down"] + expected: + if os == "linux" and not debug: FAIL + + [:test="in_for_init";direction="up"] + expected: + if os == "linux" and not debug: FAIL + + [:test="in_for_update";direction="down"] + + [:test="in_for_update";direction="up"] + + [:test="in_for_update_semi";direction="down"] + + [:test="in_for_update_semi";direction="up"] + + [:test="inc_dec";direction="down"] + + [:test="inc_dec";direction="up"] + + [:test="inc_inc";direction="down"] + + [:test="inc_inc";direction="up"] + + [:test="inc_space_dec";direction="down"] + + [:test="inc_space_dec";direction="up"] + + [:test="inc_space_inc";direction="down"] + + [:test="inc_space_inc";direction="up"] + + [:test="let";direction="down"] + + [:test="let";direction="up"] + + [:test="literal_abstract_float";direction="down"] + + [:test="literal_abstract_float";direction="up"] + + [:test="literal_abstract_int";direction="down"] + + [:test="literal_abstract_int";direction="up"] + + [:test="literal_f32";direction="down"] + + [:test="literal_f32";direction="up"] + + [:test="literal_i32";direction="down"] + + [:test="literal_i32";direction="up"] + + [:test="literal_u32";direction="down"] + + [:test="literal_u32";direction="up"] + + [:test="many_star_and_var";direction="down"] + + [:test="many_star_and_var";direction="up"] + + [:test="minux_space_minus";direction="down"] + + [:test="minux_space_minus";direction="up"] + + [:test="newline";direction="down"] + + [:test="newline";direction="up"] + + [:test="no_semi";direction="down"] + + [:test="no_semi";direction="up"] + + [:test="no_var";direction="down"] + + [:test="no_var";direction="up"] + + [:test="override";direction="down"] + + [:test="override";direction="up"] + + [:test="param";direction="down"] + + [:test="param";direction="up"] + + [:test="paren_dec";direction="down"] + + [:test="paren_dec";direction="up"] + + [:test="paren_inc";direction="down"] + + [:test="paren_inc";direction="up"] + + [:test="paren_star_and_var_paren";direction="down"] + + [:test="paren_star_and_var_paren";direction="up"] + + [:test="paren_var_paren";direction="down"] + + [:test="paren_var_paren";direction="up"] + + [:test="plus_space_plus";direction="down"] + + [:test="plus_space_plus";direction="up"] + + [:test="postfix_field";direction="down"] + + [:test="postfix_field";direction="up"] + + [:test="postfix_index";direction="down"] + + [:test="postfix_index";direction="up"] + + [:test="postfix_r";direction="down"] + + [:test="postfix_r";direction="up"] + + [:test="postfix_x";direction="down"] + + [:test="postfix_x";direction="up"] + + [:test="prefix";direction="down"] + + [:test="prefix";direction="up"] + + [:test="private";direction="down"] + + [:test="private";direction="up"] + + [:test="sampler";direction="down"] + + [:test="sampler";direction="up"] + + [:test="sampler_comparison";direction="down"] + + [:test="sampler_comparison";direction="up"] + + [:test="space";direction="down"] + + [:test="space";direction="up"] + + [:test="space_space";direction="down"] + + [:test="space_space";direction="up"] + + [:test="star_and_var";direction="down"] + + [:test="star_and_var";direction="up"] + + [:test="storage";direction="down"] + + [:test="storage";direction="up"] + + [:test="storage_atomic";direction="down"] + + [:test="storage_atomic";direction="up"] + + [:test="storage_r";direction="down"] + + [:test="storage_r";direction="up"] + + [:test="storage_rw";direction="down"] + + [:test="storage_rw";direction="up"] + + [:test="subexpr";direction="down"] + + [:test="subexpr";direction="up"] + + [:test="tab";direction="down"] + + [:test="tab";direction="up"] + + [:test="texture";direction="down"] + + [:test="texture";direction="up"] + + [:test="texture_storage";direction="down"] + + [:test="texture_storage";direction="up"] + + [:test="texture_storage_x";direction="down"] + + [:test="texture_storage_x";direction="up"] + + [:test="texture_x";direction="down"] + + [:test="texture_x";direction="up"] + + [:test="uniform";direction="down"] + + [:test="uniform";direction="up"] + + [:test="var";direction="down"] + + [:test="var";direction="up"] + + [:test="vector";direction="down"] + + [:test="vector";direction="up"] + + [:test="workgroup";direction="down"] + + [:test="workgroup";direction="up"] + + [:test="workgroup_atomic";direction="down"] + + [:test="workgroup_atomic";direction="up"] + + +[cts.https.html?q=webgpu:shader,validation,statement,increment_decrement:var_init_type:*] + [:type="abstractFloat";direction="down"] + + [:type="abstractFloat";direction="up"] + + [:type="abstractInt";direction="down"] + + [:type="abstractInt";direction="up"] + + [:type="array";direction="down"] + + [:type="array";direction="up"] + + [:type="atomic_i32";direction="down"] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic_i32";direction="up"] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic_u32";direction="down"] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic_u32";direction="up"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool";direction="down"] + + [:type="bool";direction="up"] + + [:type="f16";direction="down"] + + [:type="f16";direction="up"] + + [:type="f32";direction="down"] + + [:type="f32";direction="up"] + + [:type="i32";direction="down"] + + [:type="i32";direction="up"] + + [:type="mat2x3f";direction="down"] + + [:type="mat2x3f";direction="up"] + + [:type="mat4x2h";direction="down"] + + [:type="mat4x2h";direction="up"] + + [:type="struct";direction="down"] + + [:type="struct";direction="up"] + + [:type="u32";direction="down"] + + [:type="u32";direction="up"] + + [:type="vec2f";direction="down"] + + [:type="vec2f";direction="up"] + + [:type="vec3b";direction="down"] + + [:type="vec3b";direction="up"] + + [:type="vec3h";direction="down"] + + [:type="vec3h";direction="up"] + + [:type="vec4u";direction="down"] + + [:type="vec4u";direction="up"] + + +[cts.https.html?q=webgpu:shader,validation,statement,loop:break_if_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,loop:parse:*] + [:test="break"] + + [:test="break_continuing"] + + [:test="break_continuing_continue"] + + [:test="break_continuing_if_break"] + + [:test="break_continuing_if_return"] + + [:test="break_continuing_lbrace"] + + [:test="break_continuing_rbrace"] + + [:test="break_continuing_return"] + + [:test="continue"] + expected: + if os == "linux" and not debug: FAIL + + [:test="continuing"] + expected: + if os == "linux" and not debug: FAIL + + [:test="continuing_break"] + + [:test="continuing_break_if"] + + [:test="discard"] + expected: + if os == "linux" and not debug: FAIL + + [:test="empty"] + expected: + if os == "linux" and not debug: FAIL + + [:test="expr_break"] + + [:test="lbrace"] + + [:test="loop"] + + [:test="lparen"] + + [:test="rbrace"] + + [:test="return"] + + [:test="rparen"] + + [:test="semicolon"] + + [:test="var_break"] + + [:test="var_break_continuing_discard"] + + [:test="var_break_continuing_inc"] + + +[cts.https.html?q=webgpu:shader,validation,statement,phony:parse:*] + [:test="block"] + + [:test="compound"] + + [:test="equality"] + + [:test="expr"] + + [:test="in_block"] + + [:test="in_continuing"] + + [:test="in_for_init"] + expected: + if os == "linux" and not debug: FAIL + + [:test="in_for_init_semi"] + + [:test="in_for_update"] + expected: + if os == "linux" and not debug: FAIL + + [:test="in_for_update_semi"] + + [:test="in_paren"] + + [:test="literal"] + + [:test="paren_underscore_paren"] + + [:test="return"] + + [:test="star_ampersand_undsscore"] + + [:test="underscore"] + + [:test="underscore_equal"] + + [:test="underscore_equal_semi"] + + [:test="underscore_equal_underscore_semi"] + + [:test="underscore_semi"] + + [:test="var"] + + +[cts.https.html?q=webgpu:shader,validation,statement,phony:rhs_constructible:*] + [:type="abstractFloat"] + + [:type="abstractInt"] + + [:type="array"] + + [:type="atomic_i32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="atomic_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="struct"] + + [:type="u32"] + + [:type="vec2f"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,phony:rhs_with_decl:*] + [:test="builtin"] + + [:test="builtin_call"] + + [:test="const"] + + [:test="function_const"] + expected: + if os == "linux" and not debug: FAIL + + [:test="function_var"] + + [:test="indexed"] + + [:test="let"] + + [:test="override"] + + [:test="private"] + + [:test="ptr"] + + [:test="ptr_to_unsized"] + + [:test="sampler"] + + [:test="sampler_comparison"] + + [:test="storage"] + + [:test="storage_atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:test="storage_unsized"] + expected: + if os == "linux" and not debug: FAIL + + [:test="texture"] + + [:test="undeclared"] + + [:test="uniform"] + + [:test="user_call"] + + [:test="user_fn"] + + [:test="workgroup"] + + [:test="workgroup_atomic"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,statement,return:parse:*] + [:test="call";fn_returns_value=false] + + [:test="call";fn_returns_value=true] + + [:test="compound_assign";fn_returns_value=false] + + [:test="compound_assign";fn_returns_value=true] + + [:test="expr";fn_returns_value=false] + + [:test="expr";fn_returns_value=true] + + [:test="expr_no_semicolon";fn_returns_value=false] + + [:test="expr_no_semicolon";fn_returns_value=true] + + [:test="increment";fn_returns_value=false] + + [:test="increment";fn_returns_value=true] + + [:test="literal";fn_returns_value=false] + + [:test="literal";fn_returns_value=true] + + [:test="literal_lparen";fn_returns_value=false] + + [:test="literal_lparen";fn_returns_value=true] + + [:test="literal_rparen";fn_returns_value=false] + + [:test="literal_rparen";fn_returns_value=true] + + [:test="lparen_literal";fn_returns_value=false] + + [:test="lparen_literal";fn_returns_value=true] + + [:test="lparen_literal_lparen";fn_returns_value=false] + + [:test="lparen_literal_lparen";fn_returns_value=true] + + [:test="no_expr";fn_returns_value=false] + + [:test="no_expr";fn_returns_value=true] + + [:test="paren_expr";fn_returns_value=false] + + [:test="paren_expr";fn_returns_value=true] + + [:test="phony_assign";fn_returns_value=false] + + [:test="phony_assign";fn_returns_value=true] + + [:test="rparen_literal";fn_returns_value=false] + + [:test="rparen_literal";fn_returns_value=true] + + [:test="rparen_literal_rparen";fn_returns_value=false] + + [:test="rparen_literal_rparen";fn_returns_value=true] + + [:test="v";fn_returns_value=false] + + [:test="v";fn_returns_value=true] + + [:test="v_no_semicolon";fn_returns_value=false] + + [:test="v_no_semicolon";fn_returns_value=true] + + +[cts.https.html?q=webgpu:shader,validation,statement,return:return_missing_value:*] + [:type="_undef_"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="u32"] + + [:type="vec2f"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,return:return_type_match:*] + [:return_value_type="abstract-float";fn_return_type="bool"] + + [:return_value_type="abstract-float";fn_return_type="f16"] + + [:return_value_type="abstract-float";fn_return_type="f32"] + + [:return_value_type="abstract-float";fn_return_type="i32"] + + [:return_value_type="abstract-float";fn_return_type="mat2x3f"] + + [:return_value_type="abstract-float";fn_return_type="mat4x2h"] + + [:return_value_type="abstract-float";fn_return_type="u32"] + + [:return_value_type="abstract-float";fn_return_type="vec2f"] + + [:return_value_type="abstract-float";fn_return_type="vec3b"] + + [:return_value_type="abstract-float";fn_return_type="vec3h"] + + [:return_value_type="abstract-float";fn_return_type="vec4u"] + + [:return_value_type="abstract-int";fn_return_type="bool"] + + [:return_value_type="abstract-int";fn_return_type="f16"] + + [:return_value_type="abstract-int";fn_return_type="f32"] + expected: + if os == "linux" and not debug: FAIL + + [:return_value_type="abstract-int";fn_return_type="i32"] + + [:return_value_type="abstract-int";fn_return_type="mat2x3f"] + + [:return_value_type="abstract-int";fn_return_type="mat4x2h"] + + [:return_value_type="abstract-int";fn_return_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:return_value_type="abstract-int";fn_return_type="vec2f"] + + [:return_value_type="abstract-int";fn_return_type="vec3b"] + + [:return_value_type="abstract-int";fn_return_type="vec3h"] + + [:return_value_type="abstract-int";fn_return_type="vec4u"] + + [:return_value_type="bool";fn_return_type="bool"] + + [:return_value_type="bool";fn_return_type="f16"] + + [:return_value_type="bool";fn_return_type="f32"] + + [:return_value_type="bool";fn_return_type="i32"] + + [:return_value_type="bool";fn_return_type="mat2x3f"] + + [:return_value_type="bool";fn_return_type="mat4x2h"] + + [:return_value_type="bool";fn_return_type="u32"] + + [:return_value_type="bool";fn_return_type="vec2f"] + + [:return_value_type="bool";fn_return_type="vec3b"] + + [:return_value_type="bool";fn_return_type="vec3h"] + + [:return_value_type="bool";fn_return_type="vec4u"] + + [:return_value_type="f16";fn_return_type="bool"] + + [:return_value_type="f16";fn_return_type="f16"] + + [:return_value_type="f16";fn_return_type="f32"] + + [:return_value_type="f16";fn_return_type="i32"] + + [:return_value_type="f16";fn_return_type="mat2x3f"] + + [:return_value_type="f16";fn_return_type="mat4x2h"] + + [:return_value_type="f16";fn_return_type="u32"] + + [:return_value_type="f16";fn_return_type="vec2f"] + + [:return_value_type="f16";fn_return_type="vec3b"] + + [:return_value_type="f16";fn_return_type="vec3h"] + + [:return_value_type="f16";fn_return_type="vec4u"] + + [:return_value_type="f32";fn_return_type="bool"] + + [:return_value_type="f32";fn_return_type="f16"] + + [:return_value_type="f32";fn_return_type="f32"] + + [:return_value_type="f32";fn_return_type="i32"] + + [:return_value_type="f32";fn_return_type="mat2x3f"] + + [:return_value_type="f32";fn_return_type="mat4x2h"] + + [:return_value_type="f32";fn_return_type="u32"] + + [:return_value_type="f32";fn_return_type="vec2f"] + + [:return_value_type="f32";fn_return_type="vec3b"] + + [:return_value_type="f32";fn_return_type="vec3h"] + + [:return_value_type="f32";fn_return_type="vec4u"] + + [:return_value_type="i32";fn_return_type="bool"] + + [:return_value_type="i32";fn_return_type="f16"] + + [:return_value_type="i32";fn_return_type="f32"] + + [:return_value_type="i32";fn_return_type="i32"] + + [:return_value_type="i32";fn_return_type="mat2x3f"] + + [:return_value_type="i32";fn_return_type="mat4x2h"] + + [:return_value_type="i32";fn_return_type="u32"] + + [:return_value_type="i32";fn_return_type="vec2f"] + + [:return_value_type="i32";fn_return_type="vec3b"] + + [:return_value_type="i32";fn_return_type="vec3h"] + + [:return_value_type="i32";fn_return_type="vec4u"] + + [:return_value_type="mat2x3f";fn_return_type="bool"] + + [:return_value_type="mat2x3f";fn_return_type="f16"] + + [:return_value_type="mat2x3f";fn_return_type="f32"] + + [:return_value_type="mat2x3f";fn_return_type="i32"] + + [:return_value_type="mat2x3f";fn_return_type="mat2x3f"] + + [:return_value_type="mat2x3f";fn_return_type="mat4x2h"] + + [:return_value_type="mat2x3f";fn_return_type="u32"] + + [:return_value_type="mat2x3f";fn_return_type="vec2f"] + + [:return_value_type="mat2x3f";fn_return_type="vec3b"] + + [:return_value_type="mat2x3f";fn_return_type="vec3h"] + + [:return_value_type="mat2x3f";fn_return_type="vec4u"] + + [:return_value_type="mat4x2h";fn_return_type="bool"] + + [:return_value_type="mat4x2h";fn_return_type="f16"] + + [:return_value_type="mat4x2h";fn_return_type="f32"] + + [:return_value_type="mat4x2h";fn_return_type="i32"] + + [:return_value_type="mat4x2h";fn_return_type="mat2x3f"] + + [:return_value_type="mat4x2h";fn_return_type="mat4x2h"] + + [:return_value_type="mat4x2h";fn_return_type="u32"] + + [:return_value_type="mat4x2h";fn_return_type="vec2f"] + + [:return_value_type="mat4x2h";fn_return_type="vec3b"] + + [:return_value_type="mat4x2h";fn_return_type="vec3h"] + + [:return_value_type="mat4x2h";fn_return_type="vec4u"] + + [:return_value_type="u32";fn_return_type="bool"] + + [:return_value_type="u32";fn_return_type="f16"] + + [:return_value_type="u32";fn_return_type="f32"] + + [:return_value_type="u32";fn_return_type="i32"] + + [:return_value_type="u32";fn_return_type="mat2x3f"] + + [:return_value_type="u32";fn_return_type="mat4x2h"] + + [:return_value_type="u32";fn_return_type="u32"] + + [:return_value_type="u32";fn_return_type="vec2f"] + + [:return_value_type="u32";fn_return_type="vec3b"] + + [:return_value_type="u32";fn_return_type="vec3h"] + + [:return_value_type="u32";fn_return_type="vec4u"] + + [:return_value_type="vec2af";fn_return_type="bool"] + + [:return_value_type="vec2af";fn_return_type="f16"] + + [:return_value_type="vec2af";fn_return_type="f32"] + + [:return_value_type="vec2af";fn_return_type="i32"] + + [:return_value_type="vec2af";fn_return_type="mat2x3f"] + + [:return_value_type="vec2af";fn_return_type="mat4x2h"] + + [:return_value_type="vec2af";fn_return_type="u32"] + + [:return_value_type="vec2af";fn_return_type="vec2f"] + + [:return_value_type="vec2af";fn_return_type="vec3b"] + + [:return_value_type="vec2af";fn_return_type="vec3h"] + + [:return_value_type="vec2af";fn_return_type="vec4u"] + + [:return_value_type="vec2ai";fn_return_type="bool"] + + [:return_value_type="vec2ai";fn_return_type="f16"] + + [:return_value_type="vec2ai";fn_return_type="f32"] + + [:return_value_type="vec2ai";fn_return_type="i32"] + + [:return_value_type="vec2ai";fn_return_type="mat2x3f"] + + [:return_value_type="vec2ai";fn_return_type="mat4x2h"] + + [:return_value_type="vec2ai";fn_return_type="u32"] + + [:return_value_type="vec2ai";fn_return_type="vec2f"] + expected: + if os == "linux" and not debug: FAIL + + [:return_value_type="vec2ai";fn_return_type="vec3b"] + + [:return_value_type="vec2ai";fn_return_type="vec3h"] + + [:return_value_type="vec2ai";fn_return_type="vec4u"] + + [:return_value_type="vec2f";fn_return_type="bool"] + + [:return_value_type="vec2f";fn_return_type="f16"] + + [:return_value_type="vec2f";fn_return_type="f32"] + + [:return_value_type="vec2f";fn_return_type="i32"] + + [:return_value_type="vec2f";fn_return_type="mat2x3f"] + + [:return_value_type="vec2f";fn_return_type="mat4x2h"] + + [:return_value_type="vec2f";fn_return_type="u32"] + + [:return_value_type="vec2f";fn_return_type="vec2f"] + + [:return_value_type="vec2f";fn_return_type="vec3b"] + + [:return_value_type="vec2f";fn_return_type="vec3h"] + + [:return_value_type="vec2f";fn_return_type="vec4u"] + + [:return_value_type="vec3af";fn_return_type="bool"] + + [:return_value_type="vec3af";fn_return_type="f16"] + + [:return_value_type="vec3af";fn_return_type="f32"] + + [:return_value_type="vec3af";fn_return_type="i32"] + + [:return_value_type="vec3af";fn_return_type="mat2x3f"] + + [:return_value_type="vec3af";fn_return_type="mat4x2h"] + + [:return_value_type="vec3af";fn_return_type="u32"] + + [:return_value_type="vec3af";fn_return_type="vec2f"] + + [:return_value_type="vec3af";fn_return_type="vec3b"] + + [:return_value_type="vec3af";fn_return_type="vec3h"] + + [:return_value_type="vec3af";fn_return_type="vec4u"] + + [:return_value_type="vec3ai";fn_return_type="bool"] + + [:return_value_type="vec3ai";fn_return_type="f16"] + + [:return_value_type="vec3ai";fn_return_type="f32"] + + [:return_value_type="vec3ai";fn_return_type="i32"] + + [:return_value_type="vec3ai";fn_return_type="mat2x3f"] + + [:return_value_type="vec3ai";fn_return_type="mat4x2h"] + + [:return_value_type="vec3ai";fn_return_type="u32"] + + [:return_value_type="vec3ai";fn_return_type="vec2f"] + + [:return_value_type="vec3ai";fn_return_type="vec3b"] + + [:return_value_type="vec3ai";fn_return_type="vec3h"] + + [:return_value_type="vec3ai";fn_return_type="vec4u"] + + [:return_value_type="vec3b";fn_return_type="bool"] + + [:return_value_type="vec3b";fn_return_type="f16"] + + [:return_value_type="vec3b";fn_return_type="f32"] + + [:return_value_type="vec3b";fn_return_type="i32"] + + [:return_value_type="vec3b";fn_return_type="mat2x3f"] + + [:return_value_type="vec3b";fn_return_type="mat4x2h"] + + [:return_value_type="vec3b";fn_return_type="u32"] + + [:return_value_type="vec3b";fn_return_type="vec2f"] + + [:return_value_type="vec3b";fn_return_type="vec3b"] + + [:return_value_type="vec3b";fn_return_type="vec3h"] + + [:return_value_type="vec3b";fn_return_type="vec4u"] + + [:return_value_type="vec3h";fn_return_type="bool"] + + [:return_value_type="vec3h";fn_return_type="f16"] + + [:return_value_type="vec3h";fn_return_type="f32"] + + [:return_value_type="vec3h";fn_return_type="i32"] + + [:return_value_type="vec3h";fn_return_type="mat2x3f"] + + [:return_value_type="vec3h";fn_return_type="mat4x2h"] + + [:return_value_type="vec3h";fn_return_type="u32"] + + [:return_value_type="vec3h";fn_return_type="vec2f"] + + [:return_value_type="vec3h";fn_return_type="vec3b"] + + [:return_value_type="vec3h";fn_return_type="vec3h"] + + [:return_value_type="vec3h";fn_return_type="vec4u"] + + [:return_value_type="vec4af";fn_return_type="bool"] + + [:return_value_type="vec4af";fn_return_type="f16"] + + [:return_value_type="vec4af";fn_return_type="f32"] + + [:return_value_type="vec4af";fn_return_type="i32"] + + [:return_value_type="vec4af";fn_return_type="mat2x3f"] + + [:return_value_type="vec4af";fn_return_type="mat4x2h"] + + [:return_value_type="vec4af";fn_return_type="u32"] + + [:return_value_type="vec4af";fn_return_type="vec2f"] + + [:return_value_type="vec4af";fn_return_type="vec3b"] + + [:return_value_type="vec4af";fn_return_type="vec3h"] + + [:return_value_type="vec4af";fn_return_type="vec4u"] + + [:return_value_type="vec4ai";fn_return_type="bool"] + + [:return_value_type="vec4ai";fn_return_type="f16"] + + [:return_value_type="vec4ai";fn_return_type="f32"] + + [:return_value_type="vec4ai";fn_return_type="i32"] + + [:return_value_type="vec4ai";fn_return_type="mat2x3f"] + + [:return_value_type="vec4ai";fn_return_type="mat4x2h"] + + [:return_value_type="vec4ai";fn_return_type="u32"] + + [:return_value_type="vec4ai";fn_return_type="vec2f"] + + [:return_value_type="vec4ai";fn_return_type="vec3b"] + + [:return_value_type="vec4ai";fn_return_type="vec3h"] + + [:return_value_type="vec4ai";fn_return_type="vec4u"] + expected: + if os == "linux" and not debug: FAIL + + [:return_value_type="vec4u";fn_return_type="bool"] + + [:return_value_type="vec4u";fn_return_type="f16"] + + [:return_value_type="vec4u";fn_return_type="f32"] + + [:return_value_type="vec4u";fn_return_type="i32"] + + [:return_value_type="vec4u";fn_return_type="mat2x3f"] + + [:return_value_type="vec4u";fn_return_type="mat4x2h"] + + [:return_value_type="vec4u";fn_return_type="u32"] + + [:return_value_type="vec4u";fn_return_type="vec2f"] + + [:return_value_type="vec4u";fn_return_type="vec3b"] + + [:return_value_type="vec4u";fn_return_type="vec3h"] + + [:return_value_type="vec4u";fn_return_type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,return:return_unexpected_value:*] + [:type="_undef_"] + + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:invalid_functions:*] + [:function="next_for_type"] + + [:function="next_return_for_type"] + + +[cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:invalid_statements:*] + [:body="break"] + + [:body="break_if"] + + [:body="compound1"] + expected: + if os == "linux" and not debug: FAIL + + [:body="continue"] + + [:body="for1"] + expected: + if os == "linux" and not debug: FAIL + + [:body="for2"] + expected: + if os == "linux" and not debug: FAIL + + [:body="for3"] + + [:body="for4"] + + [:body="for5"] + + [:body="for6"] + + [:body="loop1"] + expected: + if os == "linux" and not debug: FAIL + + [:body="loop2"] + expected: + if os == "linux" and not debug: FAIL + + [:body="loop3"] + expected: + if os == "linux" and not debug: FAIL + + [:body="loop4"] + + [:body="loop5"] + + [:body="loop6"] + + [:body="loop7"] + + [:body="loop8"] + + [:body="sequence1"] + + [:body="switch1"] + + +[cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:valid_functions:*] + [:function="empty"] + + [:function="next_return"] + + [:function="no_final_return"] + + +[cts.https.html?q=webgpu:shader,validation,statement,statement_behavior:valid_statements:*] + [:body="assign"] + + [:body="break1"] + + [:body="break2"] + + [:body="break_if"] + + [:body="compound1"] + + [:body="compound2"] + + [:body="compound_assign"] + + [:body="const_assert"] + expected: + if os == "linux" and not debug: FAIL + + [:body="continue1"] + + [:body="discard"] + + [:body="empty"] + + [:body="for1"] + + [:body="for2"] + + [:body="for3"] + + [:body="function_call1"] + + [:body="function_call2"] + + [:body="if1"] + + [:body="if2"] + + [:body="let"] + + [:body="loop1"] + + [:body="loop2"] + + [:body="loop3"] + + [:body="loop4"] + expected: + if os == "linux" and not debug: FAIL + + [:body="phony_assign"] + + [:body="return"] + + [:body="sequence1"] + + [:body="sequence2"] + + [:body="sequence3"] + expected: + if os == "linux" and not debug: FAIL + + [:body="switch1"] + + [:body="switch3"] + + [:body="switch4"] + + [:body="swtich2"] + + [:body="var1"] + + [:body="var2"] + + [:body="while1"] + + [:body="while2"] + + [:body="while3"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,statement,switch:case_types_match:*] + [:case_a_type="abstract-int";case_b_type="abstract-int"] + + [:case_a_type="abstract-int";case_b_type="i32"] + + [:case_a_type="abstract-int";case_b_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:case_a_type="i32";case_b_type="abstract-int"] + + [:case_a_type="i32";case_b_type="i32"] + + [:case_a_type="i32";case_b_type="u32"] + + [:case_a_type="u32";case_b_type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:case_a_type="u32";case_b_type="i32"] + + [:case_a_type="u32";case_b_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,statement,switch:condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + expected: + if os == "linux" and not debug: FAIL + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2af"] + + [:type="vec2ai"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + expected: + if os == "linux" and not debug: FAIL + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,switch:condition_type_match_case_type:*] + [:cond_type="abstract-int";case_type="abstract-int"] + + [:cond_type="abstract-int";case_type="i32"] + + [:cond_type="abstract-int";case_type="u32"] + expected: + if os == "linux" and not debug: FAIL + + [:cond_type="i32";case_type="abstract-int"] + + [:cond_type="i32";case_type="i32"] + + [:cond_type="i32";case_type="u32"] + + [:cond_type="u32";case_type="abstract-int"] + expected: + if os == "linux" and not debug: FAIL + + [:cond_type="u32";case_type="i32"] + + [:cond_type="u32";case_type="u32"] + + +[cts.https.html?q=webgpu:shader,validation,statement,switch:parse:*] + [:test="L_case_1_2_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_case_1_default"] + + [:test="L_case_1_case_2_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_colon_case_2_colon_default_colon"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_colon_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_colon_default_colon"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_default_2"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_default_case_2"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_1_default_colon"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_2_1_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_2_case_1_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_2_default_case_1"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_C1_case_C1_default"] + + [:test="L_case_C1_case_C2_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_C1_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_C2_case_expr_default"] + + [:test="L_case_builtin_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_default_1"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_default_2_1"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_default_2_case_1"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_case_expr_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_1"] + + [:test="L_default_2_case_1"] + + [:test="L_default_block_default_block"] + + [:test="L_default_break"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_case_1_2"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_case_1_break"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_case_1_case_2"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_case_1_colon_break"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_case_2_case_1"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_colon"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_colon_break"] + expected: + if os == "linux" and not debug: FAIL + + [:test="L_default_default"] + + [:test="L_empty_block"] + + [:test="L_lparen"] + + [:test="L_no_block"] + + [:test="L_no_default"] + + [:test="L_paren_default"] + expected: + if os == "linux" and not debug: FAIL + + [:test="lparen_L"] + + [:test="lparen_L_lparen"] + + [:test="no_cond"] + + [:test="no_cond_no_block"] + + [:test="rparen_L_rparen"] + + +[cts.https.html?q=webgpu:shader,validation,statement,while:condition_type:*] + [:type="abstract-float"] + + [:type="abstract-int"] + + [:type="array"] + + [:type="atomic"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x3f"] + + [:type="mat4x2h"] + + [:type="sampler"] + + [:type="struct"] + + [:type="texture"] + + [:type="u32"] + + [:type="vec2af"] + + [:type="vec2ai"] + + [:type="vec2f"] + + [:type="vec3af"] + + [:type="vec3ai"] + + [:type="vec3b"] + + [:type="vec3h"] + + [:type="vec4af"] + + [:type="vec4ai"] + + [:type="vec4u"] + + +[cts.https.html?q=webgpu:shader,validation,statement,while:parse:*] + [:test="block"] + + [:test="expr"] + + [:test="lparen_true"] + + [:test="lparen_true_lparen"] + + [:test="paren_expr"] + + [:test="paren_true"] + + [:test="rparen_true"] + + [:test="rparen_true_rparen"] + + [:test="semicolon"] + + [:test="true"] + + [:test="true_break"] + + [:test="true_discard"] + + [:test="true_lbrace"] + + [:test="true_lparen"] + + [:test="true_rbrace"] + + [:test="true_return"] + + [:test="true_rparen"] + + [:test="while"] + + +[cts.https.html?q=webgpu:shader,validation,types,alias:any_type:*] + [:type="S"] + + [:type="T"] + + [:type="anotherAlias"] + + [:type="array%3Ci32,%204%3E"] + + [:type="array%3Cu32%3E"] + + [:type="array%3Cvec2%3Cu32%3E,%208%3E"] + + [:type="atomic%3Ci32%3E"] + + [:type="atomic%3Cu32%3E"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x2%3Cf32%3E"] + + [:type="mat2x2f"] + + [:type="mat2x3%3Cf32%3E"] + + [:type="mat2x4%3Cf32%3E"] + + [:type="mat3x2%3Cf32%3E"] + + [:type="mat3x3%3Cf32%3E"] + + [:type="mat3x4%3Cf32%3E"] + + [:type="mat4x2%3Cf32%3E"] + + [:type="mat4x3%3Cf32%3E"] + + [:type="mat4x4%3Cf32%3E"] + + [:type="ptr%3Cfunction,%20u32%3E"] + + [:type="ptr%3Cprivate,%20i32%3E"] + + [:type="ptr%3Cstorage,%20vec2u%3E"] + + [:type="ptr%3Cstorage,%20vec3i,%20read%3E"] + + [:type="ptr%3Cstorage,%20vec4f,%20read_write%3E"] + + [:type="ptr%3Cuniform,%20vec2f%3E"] + + [:type="ptr%3Cworkgroup,%20f32%3E"] + + [:type="random_alias"] + + [:type="sampler"] + + [:type="sampler_comparison"] + + [:type="texture_1d%3Cf32%3E"] + + [:type="texture_2d%3Cu32%3E"] + + [:type="texture_2d_array%3Ci32%3E"] + + [:type="texture_3d%3Cf32%3E"] + + [:type="texture_cube%3Ci32%3E"] + + [:type="texture_cube_array%3Cu32%3E"] + + [:type="texture_depth_2d"] + + [:type="texture_depth_2d_array"] + + [:type="texture_depth_cube"] + + [:type="texture_depth_cube_array"] + + [:type="texture_depth_multisampled_2d"] + + [:type="texture_external"] + expected: + if os == "linux" and not debug: FAIL + + [:type="texture_multisampled_2d%3Cf32%3E"] + + [:type="texture_storage_1d%3Cr32float,%20read%3E"] + + [:type="texture_storage_1d%3Cr32sint,%20read_write%3E"] + + [:type="texture_storage_1d%3Cr32uint,%20write%3E"] + + [:type="texture_storage_1d%3Crgba8snorm,%20write%3E"] + + [:type="texture_storage_2d%3Crgba16uint,%20write%3E"] + + [:type="texture_storage_2d_array%3Crgba32float,%20write%3E"] + + [:type="texture_storage_3d%3Cbgra8unorm,%20write%3E"] + + [:type="u32"] + + [:type="vec2%3Ci32%3E"] + + [:type="vec2f"] + + [:type="vec3%3Cu32%3E"] + + [:type="vec3u"] + + [:type="vec4%3Cf32%3E"] + + [:type="vec4i"] + + +[cts.https.html?q=webgpu:shader,validation,types,alias:match_non_alias:*] + [:case="constructor"] + + [:case="function_param"] + + [:case="predeclared_alias"] + expected: + if os == "linux" and not debug: FAIL + + [:case="struct_element"] + + [:case="template_param"] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:shader,validation,types,alias:no_direct_recursion:*] [:target="T"] @@ -114503,6 +191954,1128 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:shader,validation,types,array:invalid:*] + [:case="bad_size"] + + [:case="bad_type"] + + [:case="const_neg"] + + [:case="const_zero"] + + [:case="f16_without_enable"] + + [:case="float_size"] + + [:case="incompatible_element"] + + [:case="incompatible_override_element"] + + [:case="incompatible_overrides"] + + [:case="incompatible_rta"] + + [:case="incompatible_size"] + + [:case="inline_struct"] + + [:case="missing_l_template"] + + [:case="missing_l_template_rta"] + + [:case="missing_r_template"] + + [:case="missing_r_template_rta"] + + [:case="missing_type"] + + [:case="negative_size"] + + [:case="override_function"] + + [:case="override_nested"] + + [:case="override_nested_struct"] + + [:case="override_private"] + + [:case="override_storage"] + + [:case="override_uniform"] + + [:case="runtime_nested"] + + [:case="sampler"] + + [:case="texture"] + + [:case="zero_size"] + + +[cts.https.html?q=webgpu:shader,validation,types,array:valid:*] + [:case="alias_element"] + + [:case="array"] + + [:case="atomici"] + + [:case="atomicu"] + + [:case="bool"] + + [:case="const_count"] + + [:case="const_expr_count1"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_expr_count2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="const_expr_func"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="literal_count"] + + [:case="literali_count"] + + [:case="literalu_count"] + + [:case="mat2x2f"] + + [:case="mat4x4h"] + + [:case="override_count"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_expr1"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_expr2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_neg"] + expected: + if os == "linux" and not debug: FAIL + + [:case="override_zero"] + expected: + if os == "linux" and not debug: FAIL + + [:case="same_const_value1"] + + [:case="same_const_value2"] + + [:case="same_const_value3"] + + [:case="same_override"] + + [:case="same_rta"] + + [:case="shadow"] + expected: + if os == "linux" and not debug: FAIL + + [:case="struct"] + + [:case="trailing_comma1"] + expected: + if os == "linux" and not debug: FAIL + + [:case="trailing_comma2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="u32"] + + [:case="vec2u"] + + [:case="vec3i"] + + [:case="vec4f"] + + +[cts.https.html?q=webgpu:shader,validation,types,atomics:address_space:*] + [:aspace="function"] + + [:aspace="function-let"] + + [:aspace="private"] + + [:aspace="storage"] + + [:aspace="storage-ro"] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="uniform"] + + [:aspace="workgroup"] + + +[cts.https.html?q=webgpu:shader,validation,types,atomics:invalid_operations:*] + [:op="abs"] + expected: + if os == "linux" and not debug: FAIL + + [:op="add"] + expected: + if os == "linux" and not debug: FAIL + + [:op="address_abs"] + + [:op="deref"] + + [:op="equality"] + + [:op="load"] + expected: + if os == "linux" and not debug: FAIL + + [:op="store"] + + +[cts.https.html?q=webgpu:shader,validation,types,atomics:parse:*] + [:case="comment"] + + [:case="missing_l_template"] + + [:case="missing_r_template"] + + [:case="missing_template_param"] + + [:case="no_type"] + + [:case="space_as_l_template"] + + [:case="space_in_specifier"] + + [:case="template_comma"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,atomics:trailing_comma:*] + [:type="i32";comma=""] + + [:type="i32";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:type="u32";comma=""] + + [:type="u32";comma=","] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,atomics:type:*] + [:type="R"] + + [:type="S"] + + [:type="array%3Ci32%3E"] + + [:type="array%3Ci32,%204%3E"] + + [:type="array%3Cu32%3E"] + + [:type="array%3Cu32,%201%3E"] + + [:type="atomic%3Ci32%3E"] + + [:type="atomic%3Cu32%3E"] + + [:type="bool"] + + [:type="f16"] + + [:type="f32"] + + [:type="i32"] + + [:type="mat2x2f"] + + [:type="sampler"] + + [:type="u32"] + + [:type="vec2u"] + + [:type="vec3i"] + + [:type="vec4f"] + + +[cts.https.html?q=webgpu:shader,validation,types,enumerant:decl_value:*] + [:value="bgra8unorm"] + + [:value="function"] + + [:value="handle"] + + [:value="private"] + + [:value="r32float"] + + [:value="r32sint"] + + [:value="r32uint"] + + [:value="read"] + + [:value="read_write"] + + [:value="rg32float"] + + [:value="rg32sint"] + + [:value="rg32uint"] + + [:value="rgba16float"] + + [:value="rgba16sint"] + + [:value="rgba16uint"] + + [:value="rgba32float"] + + [:value="rgba32sint"] + + [:value="rgba32uint"] + + [:value="rgba8sint"] + + [:value="rgba8snorm"] + + [:value="rgba8uint"] + + [:value="rgba8unorm"] + + [:value="storage"] + + [:value="uniform"] + + [:value="workgroup"] + + [:value="write"] + + +[cts.https.html?q=webgpu:shader,validation,types,enumerant:type_declaration:*] + [:enum="access_mode"] + + [:enum="address_space"] + + [:enum="texel_format"] + + +[cts.https.html?q=webgpu:shader,validation,types,enumerant:value_type:*] + [:enum="access_mode"] + + [:enum="address_space"] + + [:enum="texel_format"] + + +[cts.https.html?q=webgpu:shader,validation,types,matrix:invalid:*] + [:case="mat"] + + [:case="mat1x1"] + + [:case="mat2"] + + [:case="mat2x"] + + [:case="mat2x1"] + + [:case="mat2x2_array"] + + [:case="mat2x2_i32"] + + [:case="mat2x2_struct"] + + [:case="mat2x2_vec4f"] + + [:case="mat2x2b"] + + [:case="mat2x2i"] + + [:case="mat2x2u"] + + [:case="mat2x5"] + + [:case="mat3x3_u32"] + + [:case="mat4x4_bool"] + + [:case="mat5x5"] + + [:case="mat_f32"] + + [:case="matx2"] + + [:case="missing_comp"] + + [:case="missing_left_template"] + + [:case="missing_right_template"] + + [:case="missing_template"] + + [:case="no_enable_mat2x2h"] + + [:case="no_enable_mat2x3h"] + + [:case="no_enable_mat2x4h"] + + [:case="no_enable_mat3x2h"] + + [:case="no_enable_mat3x3h"] + + [:case="no_enable_mat3x4h"] + + [:case="no_enable_mat4x2h"] + + [:case="no_enable_mat4x3h"] + + [:case="no_enable_mat4x4h"] + + +[cts.https.html?q=webgpu:shader,validation,types,matrix:valid:*] + [:case="abstract_2x2"] + + [:case="abstract_2x3"] + + [:case="abstract_2x4"] + + [:case="alias"] + expected: + if os == "linux" and not debug: FAIL + + [:case="mat2x2_f16"] + + [:case="mat2x2_f32"] + + [:case="mat2x2f"] + + [:case="mat2x2h"] + + [:case="mat2x3_f16"] + + [:case="mat2x3_f32"] + + [:case="mat2x3f"] + + [:case="mat2x3h"] + + [:case="mat2x4_f16"] + + [:case="mat2x4_f32"] + + [:case="mat2x4f"] + + [:case="mat2x4h"] + + [:case="mat3x2_f16"] + + [:case="mat3x2_f32"] + + [:case="mat3x2f"] + + [:case="mat3x2h"] + + [:case="mat3x3_f16"] + + [:case="mat3x3_f32"] + + [:case="mat3x3f"] + + [:case="mat3x3h"] + + [:case="mat3x4_f16"] + + [:case="mat3x4_f32"] + + [:case="mat3x4f"] + + [:case="mat3x4h"] + + [:case="mat4x2_f16"] + + [:case="mat4x2_f32"] + + [:case="mat4x2f"] + + [:case="mat4x2h"] + + [:case="mat4x3_f16"] + + [:case="mat4x3_f32"] + + [:case="mat4x3f"] + + [:case="mat4x3h"] + + [:case="mat4x4_f16"] + + [:case="mat4x4_f32"] + + [:case="mat4x4f"] + + [:case="mat4x4h"] + + [:case="shadow_mat2x2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat2x2f"] + + [:case="shadow_mat2x2h"] + + [:case="shadow_mat2x3"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat2x3f"] + + [:case="shadow_mat2x3h"] + + [:case="shadow_mat2x4"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat2x4f"] + + [:case="shadow_mat2x4h"] + + [:case="shadow_mat3x2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat3x2f"] + + [:case="shadow_mat3x2h"] + + [:case="shadow_mat3x3"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat3x3f"] + + [:case="shadow_mat3x3h"] + + [:case="shadow_mat3x4"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat3x4f"] + + [:case="shadow_mat3x4h"] + + [:case="shadow_mat4x2"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat4x2f"] + + [:case="shadow_mat4x2h"] + + [:case="shadow_mat4x3"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat4x3f"] + + [:case="shadow_mat4x3h"] + + [:case="shadow_mat4x4"] + expected: + if os == "linux" and not debug: FAIL + + [:case="shadow_mat4x4f"] + + [:case="shadow_mat4x4h"] + + [:case="trailing_comma"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:access_mode:*] + [:aspace="function";access="read";comma=""] + + [:aspace="function";access="read";comma=","] + + [:aspace="function";access="read_write";comma=""] + + [:aspace="function";access="read_write";comma=","] + + [:aspace="function";access="write";comma=""] + + [:aspace="function";access="write";comma=","] + + [:aspace="private";access="read";comma=""] + + [:aspace="private";access="read";comma=","] + + [:aspace="private";access="read_write";comma=""] + + [:aspace="private";access="read_write";comma=","] + + [:aspace="private";access="write";comma=""] + + [:aspace="private";access="write";comma=","] + + [:aspace="storage";access="read";comma=""] + + [:aspace="storage";access="read";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="storage";access="read_write";comma=""] + + [:aspace="storage";access="read_write";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="storage";access="write";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="storage";access="write";comma=","] + + [:aspace="uniform";access="read";comma=""] + + [:aspace="uniform";access="read";comma=","] + + [:aspace="uniform";access="read_write";comma=""] + + [:aspace="uniform";access="read_write";comma=","] + + [:aspace="uniform";access="write";comma=""] + + [:aspace="uniform";access="write";comma=","] + + [:aspace="workgroup";access="read";comma=""] + + [:aspace="workgroup";access="read";comma=","] + + [:aspace="workgroup";access="read_write";comma=""] + + [:aspace="workgroup";access="read_write";comma=","] + + [:aspace="workgroup";access="write";comma=""] + + [:aspace="workgroup";access="write";comma=","] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:address_space:*] + [:aspace="bad_aspace";comma=""] + + [:aspace="bad_aspace";comma=","] + + [:aspace="function";comma=""] + + [:aspace="function";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="handle";comma=""] + + [:aspace="handle";comma=","] + + [:aspace="private";comma=""] + + [:aspace="private";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="storage";comma=""] + + [:aspace="storage";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="uniform";comma=""] + + [:aspace="uniform";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:aspace="workgroup";comma=""] + + [:aspace="workgroup";comma=","] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_explicit_type_matches_var:*] + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";ptrStoreType="u32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";ptrStoreType="u32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";ptrStoreType="u32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";ptrStoreType="u32"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_reads:*] + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:let_ptr_writes:*] + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=false;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="function";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + expected: + if os == "linux" and not debug: FAIL + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="private";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="storage";explicitSpace=true;explicitAccess=true;accessMode="read_write";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="uniform";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=false;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=false;ptrStoreType="i32"] + + [:addressSpace="workgroup";explicitSpace=true;explicitAccess=true;accessMode="";stage="compute";inferPtrType=true;ptrStoreType="i32"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:missing_type:*] + [:aspace="function";comma=""] + + [:aspace="function";comma=","] + + [:aspace="private";comma=""] + + [:aspace="private";comma=","] + + [:aspace="storage";comma=""] + + [:aspace="storage";comma=","] + + [:aspace="uniform";comma=""] + + [:aspace="uniform";comma=","] + + [:aspace="workgroup";comma=""] + + [:aspace="workgroup";comma=","] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_address_space_never_uses_access_mode:*] + [:addressSpace="function";accessMode="read"] + + [:addressSpace="function";accessMode="read_write"] + + [:addressSpace="function";accessMode="write"] + + [:addressSpace="handle";accessMode="read"] + + [:addressSpace="handle";accessMode="read_write"] + + [:addressSpace="handle";accessMode="write"] + + [:addressSpace="private";accessMode="read"] + + [:addressSpace="private";accessMode="read_write"] + + [:addressSpace="private";accessMode="write"] + + [:addressSpace="uniform";accessMode="read"] + + [:addressSpace="uniform";accessMode="read_write"] + + [:addressSpace="uniform";accessMode="write"] + + [:addressSpace="workgroup";accessMode="read"] + + [:addressSpace="workgroup";accessMode="read_write"] + + [:addressSpace="workgroup";accessMode="write"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_bad_store_type:*] + [:storeType="1"] + + [:storeType="clamp"] + + [:storeType="undeclared"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_handle_space_invalid:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:ptr_not_instantiable:*] + [:case="RTArrayNotLast"] + + [:case="functionAtomic"] + expected: + if os == "linux" and not debug: FAIL + + [:case="functionRTArray"] + + [:case="nestedRTArray"] + + [:case="privateAtomic"] + expected: + if os == "linux" and not debug: FAIL + + [:case="privateRTArray"] + + [:case="ptr"] + + [:case="uniformAtomic"] + expected: + if os == "linux" and not debug: FAIL + + [:case="uniformRTArray"] + + [:case="workgroupRTArray"] + + +[cts.https.html?q=webgpu:shader,validation,types,pointer:type:*] + [:case="alias"] + + [:case="array_override_u32"] + expected: + if os == "linux" and not debug: FAIL + + [:case="array_runtime_S"] + + [:case="array_runtime_atomic_u32"] + + [:case="array_runtime_u32"] + + [:case="array_sized_S"] + + [:case="array_sized_u32"] + + [:case="array_sized_vec4f"] + + [:case="atomic_i32"] + + [:case="atomic_u32"] + + [:case="bool"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="mat2x2f"] + + [:case="mat3x4h"] + + [:case="ptr_function_u32"] + + [:case="ptr_workgroup_bool"] + + [:case="reference"] + + [:case="sampler"] + + [:case="struct_S"] + + [:case="struct_T"] + + [:case="texture_2d"] + + [:case="u32"] + + [:case="vec2_bool"] + + [:case="vec2u"] + + [:case="vec3h"] + + [:case="vec3i"] + + [:case="vec4f"] + + +[cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_alias:*] + [:type="S";view="ptr"] + + [:type="S";view="ref"] + + [:type="array%3Ci32,%204%3E";view="ptr"] + + [:type="array%3Ci32,%204%3E";view="ref"] + + [:type="bool";view="ptr"] + + [:type="bool";view="ref"] + + [:type="f32";view="ptr"] + + [:type="f32";view="ref"] + + [:type="i32";view="ptr"] + + [:type="i32";view="ref"] + + [:type="mat2x2f";view="ptr"] + + [:type="mat2x2f";view="ref"] + + [:type="vec2i";view="ptr"] + + [:type="vec2i";view="ref"] + + +[cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_let:*] + [:type="S";view="ptr"] + + [:type="S";view="ref"] + + [:type="array%3Ci32,%204%3E";view="ptr"] + + [:type="array%3Ci32,%204%3E";view="ref"] + + [:type="bool";view="ptr"] + + [:type="bool";view="ref"] + + [:type="f32";view="ptr"] + + [:type="f32";view="ref"] + + [:type="i32";view="ptr"] + + [:type="i32";view="ref"] + + [:type="mat2x2f";view="ptr"] + + [:type="mat2x2f";view="ref"] + + [:type="vec2i";view="ptr"] + + [:type="vec2i";view="ref"] + + +[cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_param:*] + [:type="S";view="ptr"] + + [:type="S";view="ref"] + + [:type="array%3Ci32,%204%3E";view="ptr"] + + [:type="array%3Ci32,%204%3E";view="ref"] + + [:type="bool";view="ptr"] + + [:type="bool";view="ref"] + + [:type="f32";view="ptr"] + + [:type="f32";view="ref"] + + [:type="i32";view="ptr"] + + [:type="i32";view="ref"] + + [:type="mat2x2f";view="ptr"] + + [:type="mat2x2f";view="ref"] + + [:type="vec2i";view="ptr"] + + [:type="vec2i";view="ref"] + + +[cts.https.html?q=webgpu:shader,validation,types,ref:not_typeable_var:*] + [:type="S";ref=false] + + [:type="S";ref=true] + + [:type="array%3Ci32,%204%3E";ref=false] + + [:type="array%3Ci32,%204%3E";ref=true] + + [:type="bool";ref=false] + + [:type="bool";ref=true] + + [:type="f32";ref=false] + + [:type="f32";ref=true] + + [:type="i32";ref=false] + + [:type="i32";ref=true] + + [:type="mat2x2f";ref=false] + + [:type="mat2x2f";ref=true] + + [:type="vec2i";ref=false] + + [:type="vec2i";ref=true] + + [cts.https.html?q=webgpu:shader,validation,types,struct:no_direct_recursion:*] [:target="S"] @@ -114549,6 +193122,1874 @@ [:target="i32"] +[cts.https.html?q=webgpu:shader,validation,types,struct:structures:*] + [:case="array_u32"] + + [:case="array_u32_4"] + + [:case="array_u32_not_last"] + + [:case="array_u32_override"] + + [:case="atomic_i32"] + + [:case="atomic_u32"] + + [:case="bad_delimiter"] + + [:case="bad_member_decl"] + + [:case="bad_name"] + + [:case="bool"] + + [:case="empty"] + + [:case="f16"] + + [:case="f32"] + + [:case="i32"] + + [:case="many_members"] + + [:case="mat2x2f"] + + [:case="mat3x4h"] + + [:case="member_collision"] + expected: + if os == "linux" and not debug: FAIL + + [:case="missing_delimiter"] + + [:case="missing_l_brace"] + + [:case="missing_r_brace"] + + [:case="name_collision1"] + + [:case="name_collision2"] + + [:case="name_collision3"] + + [:case="no_name"] + + [:case="pointer"] + + [:case="sampler"] + + [:case="sampler_comparison"] + + [:case="structure"] + + [:case="structure_structure_rta"] + + [:case="texture"] + + [:case="trailing_comma"] + + [:case="u32"] + + [:case="vec2u"] + + [:case="vec3i"] + + [:case="vec4f"] + + [:case="vec4h"] + + +[cts.https.html?q=webgpu:shader,validation,types,textures:depth_texture_types:*] + [:textureType="texture_depth_2d"] + + [:textureType="texture_depth_2d_array"] + + [:textureType="texture_depth_cube"] + + [:textureType="texture_depth_cube_array"] + + +[cts.https.html?q=webgpu:shader,validation,types,textures:external_sampled_texture_types:*] + [:] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,textures:sampled_texture_types:*] + [:textureType="texture_2d"] + expected: + if os == "linux" and not debug: FAIL + + [:textureType="texture_multisampled_2d"] + expected: + if os == "linux" and not debug: FAIL + + +[cts.https.html?q=webgpu:shader,validation,types,textures:sampler_types:*] + [:samplerType="sampler"] + + [:samplerType="sampler_comparison"] + + +[cts.https.html?q=webgpu:shader,validation,types,textures:storage_texture_types:*] + [:access="read";format="astc-10x10-unorm";comma=""] + + [:access="read";format="astc-10x10-unorm";comma=","] + + [:access="read";format="astc-10x10-unorm-srgb";comma=""] + + [:access="read";format="astc-10x10-unorm-srgb";comma=","] + + [:access="read";format="astc-10x5-unorm";comma=""] + + [:access="read";format="astc-10x5-unorm";comma=","] + + [:access="read";format="astc-10x5-unorm-srgb";comma=""] + + [:access="read";format="astc-10x5-unorm-srgb";comma=","] + + [:access="read";format="astc-10x6-unorm";comma=""] + + [:access="read";format="astc-10x6-unorm";comma=","] + + [:access="read";format="astc-10x6-unorm-srgb";comma=""] + + [:access="read";format="astc-10x6-unorm-srgb";comma=","] + + [:access="read";format="astc-10x8-unorm";comma=""] + + [:access="read";format="astc-10x8-unorm";comma=","] + + [:access="read";format="astc-10x8-unorm-srgb";comma=""] + + [:access="read";format="astc-10x8-unorm-srgb";comma=","] + + [:access="read";format="astc-12x10-unorm";comma=""] + + [:access="read";format="astc-12x10-unorm";comma=","] + + [:access="read";format="astc-12x10-unorm-srgb";comma=""] + + [:access="read";format="astc-12x10-unorm-srgb";comma=","] + + [:access="read";format="astc-12x12-unorm";comma=""] + + [:access="read";format="astc-12x12-unorm";comma=","] + + [:access="read";format="astc-12x12-unorm-srgb";comma=""] + + [:access="read";format="astc-12x12-unorm-srgb";comma=","] + + [:access="read";format="astc-4x4-unorm";comma=""] + + [:access="read";format="astc-4x4-unorm";comma=","] + + [:access="read";format="astc-4x4-unorm-srgb";comma=""] + + [:access="read";format="astc-4x4-unorm-srgb";comma=","] + + [:access="read";format="astc-5x4-unorm";comma=""] + + [:access="read";format="astc-5x4-unorm";comma=","] + + [:access="read";format="astc-5x4-unorm-srgb";comma=""] + + [:access="read";format="astc-5x4-unorm-srgb";comma=","] + + [:access="read";format="astc-5x5-unorm";comma=""] + + [:access="read";format="astc-5x5-unorm";comma=","] + + [:access="read";format="astc-5x5-unorm-srgb";comma=""] + + [:access="read";format="astc-5x5-unorm-srgb";comma=","] + + [:access="read";format="astc-6x5-unorm";comma=""] + + [:access="read";format="astc-6x5-unorm";comma=","] + + [:access="read";format="astc-6x5-unorm-srgb";comma=""] + + [:access="read";format="astc-6x5-unorm-srgb";comma=","] + + [:access="read";format="astc-6x6-unorm";comma=""] + + [:access="read";format="astc-6x6-unorm";comma=","] + + [:access="read";format="astc-6x6-unorm-srgb";comma=""] + + [:access="read";format="astc-6x6-unorm-srgb";comma=","] + + [:access="read";format="astc-8x5-unorm";comma=""] + + [:access="read";format="astc-8x5-unorm";comma=","] + + [:access="read";format="astc-8x5-unorm-srgb";comma=""] + + [:access="read";format="astc-8x5-unorm-srgb";comma=","] + + [:access="read";format="astc-8x6-unorm";comma=""] + + [:access="read";format="astc-8x6-unorm";comma=","] + + [:access="read";format="astc-8x6-unorm-srgb";comma=""] + + [:access="read";format="astc-8x6-unorm-srgb";comma=","] + + [:access="read";format="astc-8x8-unorm";comma=""] + + [:access="read";format="astc-8x8-unorm";comma=","] + + [:access="read";format="astc-8x8-unorm-srgb";comma=""] + + [:access="read";format="astc-8x8-unorm-srgb";comma=","] + + [:access="read";format="bc1-rgba-unorm";comma=""] + + [:access="read";format="bc1-rgba-unorm";comma=","] + + [:access="read";format="bc1-rgba-unorm-srgb";comma=""] + + [:access="read";format="bc1-rgba-unorm-srgb";comma=","] + + [:access="read";format="bc2-rgba-unorm";comma=""] + + [:access="read";format="bc2-rgba-unorm";comma=","] + + [:access="read";format="bc2-rgba-unorm-srgb";comma=""] + + [:access="read";format="bc2-rgba-unorm-srgb";comma=","] + + [:access="read";format="bc3-rgba-unorm";comma=""] + + [:access="read";format="bc3-rgba-unorm";comma=","] + + [:access="read";format="bc3-rgba-unorm-srgb";comma=""] + + [:access="read";format="bc3-rgba-unorm-srgb";comma=","] + + [:access="read";format="bc4-r-snorm";comma=""] + + [:access="read";format="bc4-r-snorm";comma=","] + + [:access="read";format="bc4-r-unorm";comma=""] + + [:access="read";format="bc4-r-unorm";comma=","] + + [:access="read";format="bc5-rg-snorm";comma=""] + + [:access="read";format="bc5-rg-snorm";comma=","] + + [:access="read";format="bc5-rg-unorm";comma=""] + + [:access="read";format="bc5-rg-unorm";comma=","] + + [:access="read";format="bc6h-rgb-float";comma=""] + + [:access="read";format="bc6h-rgb-float";comma=","] + + [:access="read";format="bc6h-rgb-ufloat";comma=""] + + [:access="read";format="bc6h-rgb-ufloat";comma=","] + + [:access="read";format="bc7-rgba-unorm";comma=""] + + [:access="read";format="bc7-rgba-unorm";comma=","] + + [:access="read";format="bc7-rgba-unorm-srgb";comma=""] + + [:access="read";format="bc7-rgba-unorm-srgb";comma=","] + + [:access="read";format="bgra8unorm";comma=""] + + [:access="read";format="bgra8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="bgra8unorm-srgb";comma=""] + + [:access="read";format="bgra8unorm-srgb";comma=","] + + [:access="read";format="depth16unorm";comma=""] + + [:access="read";format="depth16unorm";comma=","] + + [:access="read";format="depth24plus";comma=""] + + [:access="read";format="depth24plus";comma=","] + + [:access="read";format="depth24plus-stencil8";comma=""] + + [:access="read";format="depth24plus-stencil8";comma=","] + + [:access="read";format="depth32float";comma=""] + + [:access="read";format="depth32float";comma=","] + + [:access="read";format="depth32float-stencil8";comma=""] + + [:access="read";format="depth32float-stencil8";comma=","] + + [:access="read";format="eac-r11snorm";comma=""] + + [:access="read";format="eac-r11snorm";comma=","] + + [:access="read";format="eac-r11unorm";comma=""] + + [:access="read";format="eac-r11unorm";comma=","] + + [:access="read";format="eac-rg11snorm";comma=""] + + [:access="read";format="eac-rg11snorm";comma=","] + + [:access="read";format="eac-rg11unorm";comma=""] + + [:access="read";format="eac-rg11unorm";comma=","] + + [:access="read";format="etc2-rgb8a1unorm";comma=""] + + [:access="read";format="etc2-rgb8a1unorm";comma=","] + + [:access="read";format="etc2-rgb8a1unorm-srgb";comma=""] + + [:access="read";format="etc2-rgb8a1unorm-srgb";comma=","] + + [:access="read";format="etc2-rgb8unorm";comma=""] + + [:access="read";format="etc2-rgb8unorm";comma=","] + + [:access="read";format="etc2-rgb8unorm-srgb";comma=""] + + [:access="read";format="etc2-rgb8unorm-srgb";comma=","] + + [:access="read";format="etc2-rgba8unorm";comma=""] + + [:access="read";format="etc2-rgba8unorm";comma=","] + + [:access="read";format="etc2-rgba8unorm-srgb";comma=""] + + [:access="read";format="etc2-rgba8unorm-srgb";comma=","] + + [:access="read";format="r16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r16float";comma=","] + + [:access="read";format="r16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r16sint";comma=","] + + [:access="read";format="r16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r16uint";comma=","] + + [:access="read";format="r32float";comma=""] + + [:access="read";format="r32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r32sint";comma=""] + + [:access="read";format="r32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r32uint";comma=""] + + [:access="read";format="r32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r8sint";comma=","] + + [:access="read";format="r8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r8snorm";comma=","] + + [:access="read";format="r8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r8uint";comma=","] + + [:access="read";format="r8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="r8unorm";comma=","] + + [:access="read";format="rg11b10ufloat";comma=""] + + [:access="read";format="rg11b10ufloat";comma=","] + + [:access="read";format="rg16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg16float";comma=","] + + [:access="read";format="rg16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg16sint";comma=","] + + [:access="read";format="rg16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg16uint";comma=","] + + [:access="read";format="rg32float";comma=""] + + [:access="read";format="rg32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg32sint";comma=""] + + [:access="read";format="rg32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg32uint";comma=""] + + [:access="read";format="rg32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg8sint";comma=","] + + [:access="read";format="rg8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg8snorm";comma=","] + + [:access="read";format="rg8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg8uint";comma=","] + + [:access="read";format="rg8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rg8unorm";comma=","] + + [:access="read";format="rgb10a2uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgb10a2uint";comma=","] + + [:access="read";format="rgb10a2unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgb10a2unorm";comma=","] + + [:access="read";format="rgb9e5ufloat";comma=""] + + [:access="read";format="rgb9e5ufloat";comma=","] + + [:access="read";format="rgba16float";comma=""] + + [:access="read";format="rgba16float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba16sint";comma=""] + + [:access="read";format="rgba16sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba16uint";comma=""] + + [:access="read";format="rgba16uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba32float";comma=""] + + [:access="read";format="rgba32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba32sint";comma=""] + + [:access="read";format="rgba32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba32uint";comma=""] + + [:access="read";format="rgba32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba8sint";comma=""] + + [:access="read";format="rgba8sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba8snorm";comma=""] + + [:access="read";format="rgba8snorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba8uint";comma=""] + + [:access="read";format="rgba8uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba8unorm";comma=""] + + [:access="read";format="rgba8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read";format="rgba8unorm-srgb";comma=""] + + [:access="read";format="rgba8unorm-srgb";comma=","] + + [:access="read";format="stencil8";comma=""] + + [:access="read";format="stencil8";comma=","] + + [:access="read_write";format="astc-10x10-unorm";comma=""] + + [:access="read_write";format="astc-10x10-unorm";comma=","] + + [:access="read_write";format="astc-10x10-unorm-srgb";comma=""] + + [:access="read_write";format="astc-10x10-unorm-srgb";comma=","] + + [:access="read_write";format="astc-10x5-unorm";comma=""] + + [:access="read_write";format="astc-10x5-unorm";comma=","] + + [:access="read_write";format="astc-10x5-unorm-srgb";comma=""] + + [:access="read_write";format="astc-10x5-unorm-srgb";comma=","] + + [:access="read_write";format="astc-10x6-unorm";comma=""] + + [:access="read_write";format="astc-10x6-unorm";comma=","] + + [:access="read_write";format="astc-10x6-unorm-srgb";comma=""] + + [:access="read_write";format="astc-10x6-unorm-srgb";comma=","] + + [:access="read_write";format="astc-10x8-unorm";comma=""] + + [:access="read_write";format="astc-10x8-unorm";comma=","] + + [:access="read_write";format="astc-10x8-unorm-srgb";comma=""] + + [:access="read_write";format="astc-10x8-unorm-srgb";comma=","] + + [:access="read_write";format="astc-12x10-unorm";comma=""] + + [:access="read_write";format="astc-12x10-unorm";comma=","] + + [:access="read_write";format="astc-12x10-unorm-srgb";comma=""] + + [:access="read_write";format="astc-12x10-unorm-srgb";comma=","] + + [:access="read_write";format="astc-12x12-unorm";comma=""] + + [:access="read_write";format="astc-12x12-unorm";comma=","] + + [:access="read_write";format="astc-12x12-unorm-srgb";comma=""] + + [:access="read_write";format="astc-12x12-unorm-srgb";comma=","] + + [:access="read_write";format="astc-4x4-unorm";comma=""] + + [:access="read_write";format="astc-4x4-unorm";comma=","] + + [:access="read_write";format="astc-4x4-unorm-srgb";comma=""] + + [:access="read_write";format="astc-4x4-unorm-srgb";comma=","] + + [:access="read_write";format="astc-5x4-unorm";comma=""] + + [:access="read_write";format="astc-5x4-unorm";comma=","] + + [:access="read_write";format="astc-5x4-unorm-srgb";comma=""] + + [:access="read_write";format="astc-5x4-unorm-srgb";comma=","] + + [:access="read_write";format="astc-5x5-unorm";comma=""] + + [:access="read_write";format="astc-5x5-unorm";comma=","] + + [:access="read_write";format="astc-5x5-unorm-srgb";comma=""] + + [:access="read_write";format="astc-5x5-unorm-srgb";comma=","] + + [:access="read_write";format="astc-6x5-unorm";comma=""] + + [:access="read_write";format="astc-6x5-unorm";comma=","] + + [:access="read_write";format="astc-6x5-unorm-srgb";comma=""] + + [:access="read_write";format="astc-6x5-unorm-srgb";comma=","] + + [:access="read_write";format="astc-6x6-unorm";comma=""] + + [:access="read_write";format="astc-6x6-unorm";comma=","] + + [:access="read_write";format="astc-6x6-unorm-srgb";comma=""] + + [:access="read_write";format="astc-6x6-unorm-srgb";comma=","] + + [:access="read_write";format="astc-8x5-unorm";comma=""] + + [:access="read_write";format="astc-8x5-unorm";comma=","] + + [:access="read_write";format="astc-8x5-unorm-srgb";comma=""] + + [:access="read_write";format="astc-8x5-unorm-srgb";comma=","] + + [:access="read_write";format="astc-8x6-unorm";comma=""] + + [:access="read_write";format="astc-8x6-unorm";comma=","] + + [:access="read_write";format="astc-8x6-unorm-srgb";comma=""] + + [:access="read_write";format="astc-8x6-unorm-srgb";comma=","] + + [:access="read_write";format="astc-8x8-unorm";comma=""] + + [:access="read_write";format="astc-8x8-unorm";comma=","] + + [:access="read_write";format="astc-8x8-unorm-srgb";comma=""] + + [:access="read_write";format="astc-8x8-unorm-srgb";comma=","] + + [:access="read_write";format="bc1-rgba-unorm";comma=""] + + [:access="read_write";format="bc1-rgba-unorm";comma=","] + + [:access="read_write";format="bc1-rgba-unorm-srgb";comma=""] + + [:access="read_write";format="bc1-rgba-unorm-srgb";comma=","] + + [:access="read_write";format="bc2-rgba-unorm";comma=""] + + [:access="read_write";format="bc2-rgba-unorm";comma=","] + + [:access="read_write";format="bc2-rgba-unorm-srgb";comma=""] + + [:access="read_write";format="bc2-rgba-unorm-srgb";comma=","] + + [:access="read_write";format="bc3-rgba-unorm";comma=""] + + [:access="read_write";format="bc3-rgba-unorm";comma=","] + + [:access="read_write";format="bc3-rgba-unorm-srgb";comma=""] + + [:access="read_write";format="bc3-rgba-unorm-srgb";comma=","] + + [:access="read_write";format="bc4-r-snorm";comma=""] + + [:access="read_write";format="bc4-r-snorm";comma=","] + + [:access="read_write";format="bc4-r-unorm";comma=""] + + [:access="read_write";format="bc4-r-unorm";comma=","] + + [:access="read_write";format="bc5-rg-snorm";comma=""] + + [:access="read_write";format="bc5-rg-snorm";comma=","] + + [:access="read_write";format="bc5-rg-unorm";comma=""] + + [:access="read_write";format="bc5-rg-unorm";comma=","] + + [:access="read_write";format="bc6h-rgb-float";comma=""] + + [:access="read_write";format="bc6h-rgb-float";comma=","] + + [:access="read_write";format="bc6h-rgb-ufloat";comma=""] + + [:access="read_write";format="bc6h-rgb-ufloat";comma=","] + + [:access="read_write";format="bc7-rgba-unorm";comma=""] + + [:access="read_write";format="bc7-rgba-unorm";comma=","] + + [:access="read_write";format="bc7-rgba-unorm-srgb";comma=""] + + [:access="read_write";format="bc7-rgba-unorm-srgb";comma=","] + + [:access="read_write";format="bgra8unorm";comma=""] + + [:access="read_write";format="bgra8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="bgra8unorm-srgb";comma=""] + + [:access="read_write";format="bgra8unorm-srgb";comma=","] + + [:access="read_write";format="depth16unorm";comma=""] + + [:access="read_write";format="depth16unorm";comma=","] + + [:access="read_write";format="depth24plus";comma=""] + + [:access="read_write";format="depth24plus";comma=","] + + [:access="read_write";format="depth24plus-stencil8";comma=""] + + [:access="read_write";format="depth24plus-stencil8";comma=","] + + [:access="read_write";format="depth32float";comma=""] + + [:access="read_write";format="depth32float";comma=","] + + [:access="read_write";format="depth32float-stencil8";comma=""] + + [:access="read_write";format="depth32float-stencil8";comma=","] + + [:access="read_write";format="eac-r11snorm";comma=""] + + [:access="read_write";format="eac-r11snorm";comma=","] + + [:access="read_write";format="eac-r11unorm";comma=""] + + [:access="read_write";format="eac-r11unorm";comma=","] + + [:access="read_write";format="eac-rg11snorm";comma=""] + + [:access="read_write";format="eac-rg11snorm";comma=","] + + [:access="read_write";format="eac-rg11unorm";comma=""] + + [:access="read_write";format="eac-rg11unorm";comma=","] + + [:access="read_write";format="etc2-rgb8a1unorm";comma=""] + + [:access="read_write";format="etc2-rgb8a1unorm";comma=","] + + [:access="read_write";format="etc2-rgb8a1unorm-srgb";comma=""] + + [:access="read_write";format="etc2-rgb8a1unorm-srgb";comma=","] + + [:access="read_write";format="etc2-rgb8unorm";comma=""] + + [:access="read_write";format="etc2-rgb8unorm";comma=","] + + [:access="read_write";format="etc2-rgb8unorm-srgb";comma=""] + + [:access="read_write";format="etc2-rgb8unorm-srgb";comma=","] + + [:access="read_write";format="etc2-rgba8unorm";comma=""] + + [:access="read_write";format="etc2-rgba8unorm";comma=","] + + [:access="read_write";format="etc2-rgba8unorm-srgb";comma=""] + + [:access="read_write";format="etc2-rgba8unorm-srgb";comma=","] + + [:access="read_write";format="r16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r16float";comma=","] + + [:access="read_write";format="r16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r16sint";comma=","] + + [:access="read_write";format="r16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r16uint";comma=","] + + [:access="read_write";format="r32float";comma=""] + + [:access="read_write";format="r32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r32sint";comma=""] + + [:access="read_write";format="r32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r32uint";comma=""] + + [:access="read_write";format="r32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r8sint";comma=","] + + [:access="read_write";format="r8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r8snorm";comma=","] + + [:access="read_write";format="r8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r8uint";comma=","] + + [:access="read_write";format="r8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="r8unorm";comma=","] + + [:access="read_write";format="rg11b10ufloat";comma=""] + + [:access="read_write";format="rg11b10ufloat";comma=","] + + [:access="read_write";format="rg16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg16float";comma=","] + + [:access="read_write";format="rg16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg16sint";comma=","] + + [:access="read_write";format="rg16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg16uint";comma=","] + + [:access="read_write";format="rg32float";comma=""] + + [:access="read_write";format="rg32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg32sint";comma=""] + + [:access="read_write";format="rg32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg32uint";comma=""] + + [:access="read_write";format="rg32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg8sint";comma=","] + + [:access="read_write";format="rg8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg8snorm";comma=","] + + [:access="read_write";format="rg8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg8uint";comma=","] + + [:access="read_write";format="rg8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rg8unorm";comma=","] + + [:access="read_write";format="rgb10a2uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgb10a2uint";comma=","] + + [:access="read_write";format="rgb10a2unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgb10a2unorm";comma=","] + + [:access="read_write";format="rgb9e5ufloat";comma=""] + + [:access="read_write";format="rgb9e5ufloat";comma=","] + + [:access="read_write";format="rgba16float";comma=""] + + [:access="read_write";format="rgba16float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba16sint";comma=""] + + [:access="read_write";format="rgba16sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba16uint";comma=""] + + [:access="read_write";format="rgba16uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba32float";comma=""] + + [:access="read_write";format="rgba32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba32sint";comma=""] + + [:access="read_write";format="rgba32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba32uint";comma=""] + + [:access="read_write";format="rgba32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba8sint";comma=""] + + [:access="read_write";format="rgba8sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba8snorm";comma=""] + + [:access="read_write";format="rgba8snorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba8uint";comma=""] + + [:access="read_write";format="rgba8uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba8unorm";comma=""] + + [:access="read_write";format="rgba8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="read_write";format="rgba8unorm-srgb";comma=""] + + [:access="read_write";format="rgba8unorm-srgb";comma=","] + + [:access="read_write";format="stencil8";comma=""] + + [:access="read_write";format="stencil8";comma=","] + + [:access="storage";format="astc-10x10-unorm";comma=""] + + [:access="storage";format="astc-10x10-unorm";comma=","] + + [:access="storage";format="astc-10x10-unorm-srgb";comma=""] + + [:access="storage";format="astc-10x10-unorm-srgb";comma=","] + + [:access="storage";format="astc-10x5-unorm";comma=""] + + [:access="storage";format="astc-10x5-unorm";comma=","] + + [:access="storage";format="astc-10x5-unorm-srgb";comma=""] + + [:access="storage";format="astc-10x5-unorm-srgb";comma=","] + + [:access="storage";format="astc-10x6-unorm";comma=""] + + [:access="storage";format="astc-10x6-unorm";comma=","] + + [:access="storage";format="astc-10x6-unorm-srgb";comma=""] + + [:access="storage";format="astc-10x6-unorm-srgb";comma=","] + + [:access="storage";format="astc-10x8-unorm";comma=""] + + [:access="storage";format="astc-10x8-unorm";comma=","] + + [:access="storage";format="astc-10x8-unorm-srgb";comma=""] + + [:access="storage";format="astc-10x8-unorm-srgb";comma=","] + + [:access="storage";format="astc-12x10-unorm";comma=""] + + [:access="storage";format="astc-12x10-unorm";comma=","] + + [:access="storage";format="astc-12x10-unorm-srgb";comma=""] + + [:access="storage";format="astc-12x10-unorm-srgb";comma=","] + + [:access="storage";format="astc-12x12-unorm";comma=""] + + [:access="storage";format="astc-12x12-unorm";comma=","] + + [:access="storage";format="astc-12x12-unorm-srgb";comma=""] + + [:access="storage";format="astc-12x12-unorm-srgb";comma=","] + + [:access="storage";format="astc-4x4-unorm";comma=""] + + [:access="storage";format="astc-4x4-unorm";comma=","] + + [:access="storage";format="astc-4x4-unorm-srgb";comma=""] + + [:access="storage";format="astc-4x4-unorm-srgb";comma=","] + + [:access="storage";format="astc-5x4-unorm";comma=""] + + [:access="storage";format="astc-5x4-unorm";comma=","] + + [:access="storage";format="astc-5x4-unorm-srgb";comma=""] + + [:access="storage";format="astc-5x4-unorm-srgb";comma=","] + + [:access="storage";format="astc-5x5-unorm";comma=""] + + [:access="storage";format="astc-5x5-unorm";comma=","] + + [:access="storage";format="astc-5x5-unorm-srgb";comma=""] + + [:access="storage";format="astc-5x5-unorm-srgb";comma=","] + + [:access="storage";format="astc-6x5-unorm";comma=""] + + [:access="storage";format="astc-6x5-unorm";comma=","] + + [:access="storage";format="astc-6x5-unorm-srgb";comma=""] + + [:access="storage";format="astc-6x5-unorm-srgb";comma=","] + + [:access="storage";format="astc-6x6-unorm";comma=""] + + [:access="storage";format="astc-6x6-unorm";comma=","] + + [:access="storage";format="astc-6x6-unorm-srgb";comma=""] + + [:access="storage";format="astc-6x6-unorm-srgb";comma=","] + + [:access="storage";format="astc-8x5-unorm";comma=""] + + [:access="storage";format="astc-8x5-unorm";comma=","] + + [:access="storage";format="astc-8x5-unorm-srgb";comma=""] + + [:access="storage";format="astc-8x5-unorm-srgb";comma=","] + + [:access="storage";format="astc-8x6-unorm";comma=""] + + [:access="storage";format="astc-8x6-unorm";comma=","] + + [:access="storage";format="astc-8x6-unorm-srgb";comma=""] + + [:access="storage";format="astc-8x6-unorm-srgb";comma=","] + + [:access="storage";format="astc-8x8-unorm";comma=""] + + [:access="storage";format="astc-8x8-unorm";comma=","] + + [:access="storage";format="astc-8x8-unorm-srgb";comma=""] + + [:access="storage";format="astc-8x8-unorm-srgb";comma=","] + + [:access="storage";format="bc1-rgba-unorm";comma=""] + + [:access="storage";format="bc1-rgba-unorm";comma=","] + + [:access="storage";format="bc1-rgba-unorm-srgb";comma=""] + + [:access="storage";format="bc1-rgba-unorm-srgb";comma=","] + + [:access="storage";format="bc2-rgba-unorm";comma=""] + + [:access="storage";format="bc2-rgba-unorm";comma=","] + + [:access="storage";format="bc2-rgba-unorm-srgb";comma=""] + + [:access="storage";format="bc2-rgba-unorm-srgb";comma=","] + + [:access="storage";format="bc3-rgba-unorm";comma=""] + + [:access="storage";format="bc3-rgba-unorm";comma=","] + + [:access="storage";format="bc3-rgba-unorm-srgb";comma=""] + + [:access="storage";format="bc3-rgba-unorm-srgb";comma=","] + + [:access="storage";format="bc4-r-snorm";comma=""] + + [:access="storage";format="bc4-r-snorm";comma=","] + + [:access="storage";format="bc4-r-unorm";comma=""] + + [:access="storage";format="bc4-r-unorm";comma=","] + + [:access="storage";format="bc5-rg-snorm";comma=""] + + [:access="storage";format="bc5-rg-snorm";comma=","] + + [:access="storage";format="bc5-rg-unorm";comma=""] + + [:access="storage";format="bc5-rg-unorm";comma=","] + + [:access="storage";format="bc6h-rgb-float";comma=""] + + [:access="storage";format="bc6h-rgb-float";comma=","] + + [:access="storage";format="bc6h-rgb-ufloat";comma=""] + + [:access="storage";format="bc6h-rgb-ufloat";comma=","] + + [:access="storage";format="bc7-rgba-unorm";comma=""] + + [:access="storage";format="bc7-rgba-unorm";comma=","] + + [:access="storage";format="bc7-rgba-unorm-srgb";comma=""] + + [:access="storage";format="bc7-rgba-unorm-srgb";comma=","] + + [:access="storage";format="bgra8unorm";comma=""] + + [:access="storage";format="bgra8unorm";comma=","] + + [:access="storage";format="bgra8unorm-srgb";comma=""] + + [:access="storage";format="bgra8unorm-srgb";comma=","] + + [:access="storage";format="depth16unorm";comma=""] + + [:access="storage";format="depth16unorm";comma=","] + + [:access="storage";format="depth24plus";comma=""] + + [:access="storage";format="depth24plus";comma=","] + + [:access="storage";format="depth24plus-stencil8";comma=""] + + [:access="storage";format="depth24plus-stencil8";comma=","] + + [:access="storage";format="depth32float";comma=""] + + [:access="storage";format="depth32float";comma=","] + + [:access="storage";format="depth32float-stencil8";comma=""] + + [:access="storage";format="depth32float-stencil8";comma=","] + + [:access="storage";format="eac-r11snorm";comma=""] + + [:access="storage";format="eac-r11snorm";comma=","] + + [:access="storage";format="eac-r11unorm";comma=""] + + [:access="storage";format="eac-r11unorm";comma=","] + + [:access="storage";format="eac-rg11snorm";comma=""] + + [:access="storage";format="eac-rg11snorm";comma=","] + + [:access="storage";format="eac-rg11unorm";comma=""] + + [:access="storage";format="eac-rg11unorm";comma=","] + + [:access="storage";format="etc2-rgb8a1unorm";comma=""] + + [:access="storage";format="etc2-rgb8a1unorm";comma=","] + + [:access="storage";format="etc2-rgb8a1unorm-srgb";comma=""] + + [:access="storage";format="etc2-rgb8a1unorm-srgb";comma=","] + + [:access="storage";format="etc2-rgb8unorm";comma=""] + + [:access="storage";format="etc2-rgb8unorm";comma=","] + + [:access="storage";format="etc2-rgb8unorm-srgb";comma=""] + + [:access="storage";format="etc2-rgb8unorm-srgb";comma=","] + + [:access="storage";format="etc2-rgba8unorm";comma=""] + + [:access="storage";format="etc2-rgba8unorm";comma=","] + + [:access="storage";format="etc2-rgba8unorm-srgb";comma=""] + + [:access="storage";format="etc2-rgba8unorm-srgb";comma=","] + + [:access="storage";format="r16float";comma=""] + + [:access="storage";format="r16float";comma=","] + + [:access="storage";format="r16sint";comma=""] + + [:access="storage";format="r16sint";comma=","] + + [:access="storage";format="r16uint";comma=""] + + [:access="storage";format="r16uint";comma=","] + + [:access="storage";format="r32float";comma=""] + + [:access="storage";format="r32float";comma=","] + + [:access="storage";format="r32sint";comma=""] + + [:access="storage";format="r32sint";comma=","] + + [:access="storage";format="r32uint";comma=""] + + [:access="storage";format="r32uint";comma=","] + + [:access="storage";format="r8sint";comma=""] + + [:access="storage";format="r8sint";comma=","] + + [:access="storage";format="r8snorm";comma=""] + + [:access="storage";format="r8snorm";comma=","] + + [:access="storage";format="r8uint";comma=""] + + [:access="storage";format="r8uint";comma=","] + + [:access="storage";format="r8unorm";comma=""] + + [:access="storage";format="r8unorm";comma=","] + + [:access="storage";format="rg11b10ufloat";comma=""] + + [:access="storage";format="rg11b10ufloat";comma=","] + + [:access="storage";format="rg16float";comma=""] + + [:access="storage";format="rg16float";comma=","] + + [:access="storage";format="rg16sint";comma=""] + + [:access="storage";format="rg16sint";comma=","] + + [:access="storage";format="rg16uint";comma=""] + + [:access="storage";format="rg16uint";comma=","] + + [:access="storage";format="rg32float";comma=""] + + [:access="storage";format="rg32float";comma=","] + + [:access="storage";format="rg32sint";comma=""] + + [:access="storage";format="rg32sint";comma=","] + + [:access="storage";format="rg32uint";comma=""] + + [:access="storage";format="rg32uint";comma=","] + + [:access="storage";format="rg8sint";comma=""] + + [:access="storage";format="rg8sint";comma=","] + + [:access="storage";format="rg8snorm";comma=""] + + [:access="storage";format="rg8snorm";comma=","] + + [:access="storage";format="rg8uint";comma=""] + + [:access="storage";format="rg8uint";comma=","] + + [:access="storage";format="rg8unorm";comma=""] + + [:access="storage";format="rg8unorm";comma=","] + + [:access="storage";format="rgb10a2uint";comma=""] + + [:access="storage";format="rgb10a2uint";comma=","] + + [:access="storage";format="rgb10a2unorm";comma=""] + + [:access="storage";format="rgb10a2unorm";comma=","] + + [:access="storage";format="rgb9e5ufloat";comma=""] + + [:access="storage";format="rgb9e5ufloat";comma=","] + + [:access="storage";format="rgba16float";comma=""] + + [:access="storage";format="rgba16float";comma=","] + + [:access="storage";format="rgba16sint";comma=""] + + [:access="storage";format="rgba16sint";comma=","] + + [:access="storage";format="rgba16uint";comma=""] + + [:access="storage";format="rgba16uint";comma=","] + + [:access="storage";format="rgba32float";comma=""] + + [:access="storage";format="rgba32float";comma=","] + + [:access="storage";format="rgba32sint";comma=""] + + [:access="storage";format="rgba32sint";comma=","] + + [:access="storage";format="rgba32uint";comma=""] + + [:access="storage";format="rgba32uint";comma=","] + + [:access="storage";format="rgba8sint";comma=""] + + [:access="storage";format="rgba8sint";comma=","] + + [:access="storage";format="rgba8snorm";comma=""] + + [:access="storage";format="rgba8snorm";comma=","] + + [:access="storage";format="rgba8uint";comma=""] + + [:access="storage";format="rgba8uint";comma=","] + + [:access="storage";format="rgba8unorm";comma=""] + + [:access="storage";format="rgba8unorm";comma=","] + + [:access="storage";format="rgba8unorm-srgb";comma=""] + + [:access="storage";format="rgba8unorm-srgb";comma=","] + + [:access="storage";format="stencil8";comma=""] + + [:access="storage";format="stencil8";comma=","] + + [:access="write";format="astc-10x10-unorm";comma=""] + + [:access="write";format="astc-10x10-unorm";comma=","] + + [:access="write";format="astc-10x10-unorm-srgb";comma=""] + + [:access="write";format="astc-10x10-unorm-srgb";comma=","] + + [:access="write";format="astc-10x5-unorm";comma=""] + + [:access="write";format="astc-10x5-unorm";comma=","] + + [:access="write";format="astc-10x5-unorm-srgb";comma=""] + + [:access="write";format="astc-10x5-unorm-srgb";comma=","] + + [:access="write";format="astc-10x6-unorm";comma=""] + + [:access="write";format="astc-10x6-unorm";comma=","] + + [:access="write";format="astc-10x6-unorm-srgb";comma=""] + + [:access="write";format="astc-10x6-unorm-srgb";comma=","] + + [:access="write";format="astc-10x8-unorm";comma=""] + + [:access="write";format="astc-10x8-unorm";comma=","] + + [:access="write";format="astc-10x8-unorm-srgb";comma=""] + + [:access="write";format="astc-10x8-unorm-srgb";comma=","] + + [:access="write";format="astc-12x10-unorm";comma=""] + + [:access="write";format="astc-12x10-unorm";comma=","] + + [:access="write";format="astc-12x10-unorm-srgb";comma=""] + + [:access="write";format="astc-12x10-unorm-srgb";comma=","] + + [:access="write";format="astc-12x12-unorm";comma=""] + + [:access="write";format="astc-12x12-unorm";comma=","] + + [:access="write";format="astc-12x12-unorm-srgb";comma=""] + + [:access="write";format="astc-12x12-unorm-srgb";comma=","] + + [:access="write";format="astc-4x4-unorm";comma=""] + + [:access="write";format="astc-4x4-unorm";comma=","] + + [:access="write";format="astc-4x4-unorm-srgb";comma=""] + + [:access="write";format="astc-4x4-unorm-srgb";comma=","] + + [:access="write";format="astc-5x4-unorm";comma=""] + + [:access="write";format="astc-5x4-unorm";comma=","] + + [:access="write";format="astc-5x4-unorm-srgb";comma=""] + + [:access="write";format="astc-5x4-unorm-srgb";comma=","] + + [:access="write";format="astc-5x5-unorm";comma=""] + + [:access="write";format="astc-5x5-unorm";comma=","] + + [:access="write";format="astc-5x5-unorm-srgb";comma=""] + + [:access="write";format="astc-5x5-unorm-srgb";comma=","] + + [:access="write";format="astc-6x5-unorm";comma=""] + + [:access="write";format="astc-6x5-unorm";comma=","] + + [:access="write";format="astc-6x5-unorm-srgb";comma=""] + + [:access="write";format="astc-6x5-unorm-srgb";comma=","] + + [:access="write";format="astc-6x6-unorm";comma=""] + + [:access="write";format="astc-6x6-unorm";comma=","] + + [:access="write";format="astc-6x6-unorm-srgb";comma=""] + + [:access="write";format="astc-6x6-unorm-srgb";comma=","] + + [:access="write";format="astc-8x5-unorm";comma=""] + + [:access="write";format="astc-8x5-unorm";comma=","] + + [:access="write";format="astc-8x5-unorm-srgb";comma=""] + + [:access="write";format="astc-8x5-unorm-srgb";comma=","] + + [:access="write";format="astc-8x6-unorm";comma=""] + + [:access="write";format="astc-8x6-unorm";comma=","] + + [:access="write";format="astc-8x6-unorm-srgb";comma=""] + + [:access="write";format="astc-8x6-unorm-srgb";comma=","] + + [:access="write";format="astc-8x8-unorm";comma=""] + + [:access="write";format="astc-8x8-unorm";comma=","] + + [:access="write";format="astc-8x8-unorm-srgb";comma=""] + + [:access="write";format="astc-8x8-unorm-srgb";comma=","] + + [:access="write";format="bc1-rgba-unorm";comma=""] + + [:access="write";format="bc1-rgba-unorm";comma=","] + + [:access="write";format="bc1-rgba-unorm-srgb";comma=""] + + [:access="write";format="bc1-rgba-unorm-srgb";comma=","] + + [:access="write";format="bc2-rgba-unorm";comma=""] + + [:access="write";format="bc2-rgba-unorm";comma=","] + + [:access="write";format="bc2-rgba-unorm-srgb";comma=""] + + [:access="write";format="bc2-rgba-unorm-srgb";comma=","] + + [:access="write";format="bc3-rgba-unorm";comma=""] + + [:access="write";format="bc3-rgba-unorm";comma=","] + + [:access="write";format="bc3-rgba-unorm-srgb";comma=""] + + [:access="write";format="bc3-rgba-unorm-srgb";comma=","] + + [:access="write";format="bc4-r-snorm";comma=""] + + [:access="write";format="bc4-r-snorm";comma=","] + + [:access="write";format="bc4-r-unorm";comma=""] + + [:access="write";format="bc4-r-unorm";comma=","] + + [:access="write";format="bc5-rg-snorm";comma=""] + + [:access="write";format="bc5-rg-snorm";comma=","] + + [:access="write";format="bc5-rg-unorm";comma=""] + + [:access="write";format="bc5-rg-unorm";comma=","] + + [:access="write";format="bc6h-rgb-float";comma=""] + + [:access="write";format="bc6h-rgb-float";comma=","] + + [:access="write";format="bc6h-rgb-ufloat";comma=""] + + [:access="write";format="bc6h-rgb-ufloat";comma=","] + + [:access="write";format="bc7-rgba-unorm";comma=""] + + [:access="write";format="bc7-rgba-unorm";comma=","] + + [:access="write";format="bc7-rgba-unorm-srgb";comma=""] + + [:access="write";format="bc7-rgba-unorm-srgb";comma=","] + + [:access="write";format="bgra8unorm";comma=""] + + [:access="write";format="bgra8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="bgra8unorm-srgb";comma=""] + + [:access="write";format="bgra8unorm-srgb";comma=","] + + [:access="write";format="depth16unorm";comma=""] + + [:access="write";format="depth16unorm";comma=","] + + [:access="write";format="depth24plus";comma=""] + + [:access="write";format="depth24plus";comma=","] + + [:access="write";format="depth24plus-stencil8";comma=""] + + [:access="write";format="depth24plus-stencil8";comma=","] + + [:access="write";format="depth32float";comma=""] + + [:access="write";format="depth32float";comma=","] + + [:access="write";format="depth32float-stencil8";comma=""] + + [:access="write";format="depth32float-stencil8";comma=","] + + [:access="write";format="eac-r11snorm";comma=""] + + [:access="write";format="eac-r11snorm";comma=","] + + [:access="write";format="eac-r11unorm";comma=""] + + [:access="write";format="eac-r11unorm";comma=","] + + [:access="write";format="eac-rg11snorm";comma=""] + + [:access="write";format="eac-rg11snorm";comma=","] + + [:access="write";format="eac-rg11unorm";comma=""] + + [:access="write";format="eac-rg11unorm";comma=","] + + [:access="write";format="etc2-rgb8a1unorm";comma=""] + + [:access="write";format="etc2-rgb8a1unorm";comma=","] + + [:access="write";format="etc2-rgb8a1unorm-srgb";comma=""] + + [:access="write";format="etc2-rgb8a1unorm-srgb";comma=","] + + [:access="write";format="etc2-rgb8unorm";comma=""] + + [:access="write";format="etc2-rgb8unorm";comma=","] + + [:access="write";format="etc2-rgb8unorm-srgb";comma=""] + + [:access="write";format="etc2-rgb8unorm-srgb";comma=","] + + [:access="write";format="etc2-rgba8unorm";comma=""] + + [:access="write";format="etc2-rgba8unorm";comma=","] + + [:access="write";format="etc2-rgba8unorm-srgb";comma=""] + + [:access="write";format="etc2-rgba8unorm-srgb";comma=","] + + [:access="write";format="r16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r16float";comma=","] + + [:access="write";format="r16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r16sint";comma=","] + + [:access="write";format="r16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r16uint";comma=","] + + [:access="write";format="r32float";comma=""] + + [:access="write";format="r32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r32sint";comma=""] + + [:access="write";format="r32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r32uint";comma=""] + + [:access="write";format="r32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r8sint";comma=","] + + [:access="write";format="r8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r8snorm";comma=","] + + [:access="write";format="r8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r8uint";comma=","] + + [:access="write";format="r8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="r8unorm";comma=","] + + [:access="write";format="rg11b10ufloat";comma=""] + + [:access="write";format="rg11b10ufloat";comma=","] + + [:access="write";format="rg16float";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg16float";comma=","] + + [:access="write";format="rg16sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg16sint";comma=","] + + [:access="write";format="rg16uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg16uint";comma=","] + + [:access="write";format="rg32float";comma=""] + + [:access="write";format="rg32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg32sint";comma=""] + + [:access="write";format="rg32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg32uint";comma=""] + + [:access="write";format="rg32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg8sint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg8sint";comma=","] + + [:access="write";format="rg8snorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg8snorm";comma=","] + + [:access="write";format="rg8uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg8uint";comma=","] + + [:access="write";format="rg8unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rg8unorm";comma=","] + + [:access="write";format="rgb10a2uint";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgb10a2uint";comma=","] + + [:access="write";format="rgb10a2unorm";comma=""] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgb10a2unorm";comma=","] + + [:access="write";format="rgb9e5ufloat";comma=""] + + [:access="write";format="rgb9e5ufloat";comma=","] + + [:access="write";format="rgba16float";comma=""] + + [:access="write";format="rgba16float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba16sint";comma=""] + + [:access="write";format="rgba16sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba16uint";comma=""] + + [:access="write";format="rgba16uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba32float";comma=""] + + [:access="write";format="rgba32float";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba32sint";comma=""] + + [:access="write";format="rgba32sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba32uint";comma=""] + + [:access="write";format="rgba32uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba8sint";comma=""] + + [:access="write";format="rgba8sint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba8snorm";comma=""] + + [:access="write";format="rgba8snorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba8uint";comma=""] + + [:access="write";format="rgba8uint";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba8unorm";comma=""] + + [:access="write";format="rgba8unorm";comma=","] + expected: + if os == "linux" and not debug: FAIL + + [:access="write";format="rgba8unorm-srgb";comma=""] + + [:access="write";format="rgba8unorm-srgb";comma=","] + + [:access="write";format="stencil8";comma=""] + + [:access="write";format="stencil8";comma=","] + + +[cts.https.html?q=webgpu:shader,validation,types,textures:texel_formats,as_value:*] + [:] + + +[cts.https.html?q=webgpu:shader,validation,types,textures:texel_formats:*] + [:format="r32float"] + + [:format="r32sint"] + + [:format="r32uint"] + + [:format="rg32float"] + + [:format="rg32sint"] + + [:format="rg32uint"] + + [:format="rgba16float"] + + [:format="rgba16sint"] + + [:format="rgba16uint"] + + [:format="rgba32float"] + + [:format="rgba32sint"] + + [:format="rgba32uint"] + + [:format="rgba8sint"] + + [:format="rgba8snorm"] + + [:format="rgba8uint"] + + [:format="rgba8unorm"] + + [cts.https.html?q=webgpu:shader,validation,types,vector:vector:*] [:case="aliased_el_ty"] expected: @@ -117462,6 +197903,10 @@ [cts.https.html?q=webgpu:web_platform,canvas,readbackFromWebGPUCanvas:transferToImageBitmap_unconfigured_nonzero_size:*] [:] + [:readbackCanvasType="offscreen"] + + [:readbackCanvasType="onscreen"] + [cts.https.html?q=webgpu:web_platform,canvas,readbackFromWebGPUCanvas:transferToImageBitmap_zero_size:*] [:configure=false] @@ -119397,6 +199842,16 @@ if os == "linux" and not debug: FAIL +[cts.https.html?q=webgpu:web_platform,copyToTexture,image:from_fully_transparent_image:*] + [:dstPremultiplied=false] + expected: + if os == "linux" and not debug: FAIL + + [:dstPremultiplied=true] + expected: + if os == "linux" and not debug: FAIL + + [cts.https.html?q=webgpu:web_platform,copyToTexture,image:from_image:*] disabled: true expected: @@ -119427,9 +199882,27 @@ if os == "linux" and not debug: SKIP -[cts.https.html?q=webgpu:web_platform,worker,worker:worker:*] +[cts.https.html?q=webgpu:web_platform,external_texture,video:importExternalTexture,sample_non_YUV_video_frame:*] + [:videoFrameFormat="BGRA"] + + [:videoFrameFormat="BGRX"] + + [:videoFrameFormat="RGBA"] + + [:videoFrameFormat="RGBX"] + + +[cts.https.html?q=webgpu:web_platform,worker,worker:dedicated_worker:*] expected: if os == "linux" and not debug: ERROR [:] expected: if os == "linux" and not debug: TIMEOUT + + +[cts.https.html?q=webgpu:web_platform,worker,worker:service_worker:*] + [:] + + +[cts.https.html?q=webgpu:web_platform,worker,worker:shared_worker:*] + [:] diff --git a/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_complex_rgba8unorm_store.https.html.ini b/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_complex_rgba8unorm_store.https.html.ini index 3848337c5b5..f58c35f5777 100644 --- a/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_complex_rgba8unorm_store.https.html.ini +++ b/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_complex_rgba8unorm_store.https.html.ini @@ -1,3 +1,3 @@ [canvas_complex_rgba8unorm_store.https.html] expected: - if os == "linux" and not debug: PASS + if os == "linux" and not debug: [PASS, FAIL] diff --git a/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html.ini b/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html.ini new file mode 100644 index 00000000000..3ef12d5a3c6 --- /dev/null +++ b/tests/wpt/webgpu/meta/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html.ini @@ -0,0 +1,3 @@ +[canvas_display_after_device_lost.https.html] + expected: + if os == "linux" and not debug: TIMEOUT diff --git a/tests/wpt/webgpu/tests/checkout_commit.txt b/tests/wpt/webgpu/tests/checkout_commit.txt index 79dad5b98aa..ba9ce014f07 100644 --- a/tests/wpt/webgpu/tests/checkout_commit.txt +++ b/tests/wpt/webgpu/tests/checkout_commit.txt @@ -1 +1 @@ -ad066ef01b1060802b4a2329443faead9f345d87 +20425f60bb00676af386b5c31e7748c0e2cb1702 diff --git a/tests/wpt/webgpu/tests/webgpu/common/framework/fixture.js b/tests/wpt/webgpu/tests/webgpu/common/framework/fixture.js index d64245f5f89..1cd50c01ccd 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/framework/fixture.js +++ b/tests/wpt/webgpu/tests/webgpu/common/framework/fixture.js @@ -17,6 +17,8 @@ export { TestCaseRecorder } from '../internal/logging/test_case_recorder.js'; + + export class SubcaseBatchState { constructor( recorder, @@ -124,8 +126,14 @@ export class Fixture { if (WEBGL_lose_context) WEBGL_lose_context.loseContext(); } else if ('destroy' in o) { o.destroy(); - } else { + } else if ('destroyAsync' in o) { + await o.destroyAsync(); + } else if ('close' in o) { o.close(); + } else { + // HTMLVideoElement + o.src = ''; + o.srcObject = null; } } } @@ -133,11 +141,29 @@ export class Fixture { /** * Tracks an object to be cleaned up after the test finishes. * - * MAINTENANCE_TODO: Use this in more places. (Will be easier once .destroy() is allowed on - * invalid objects.) + * Usually when creating buffers/textures/query sets, you can use the helpers in GPUTest instead. */ trackForCleanup(o) { - this.objectsToCleanUp.push(o); + if (o instanceof Promise) { + this.eventualAsyncExpectation(() => + o.then( + (o) => this.trackForCleanup(o), + () => {} + ) + ); + return o; + } + + if (o instanceof GPUDevice) { + this.objectsToCleanUp.push({ + async destroyAsync() { + o.destroy(); + await o.lost; + } + }); + } else { + this.objectsToCleanUp.push(o); + } return o; } @@ -156,11 +182,25 @@ export class Fixture { return o; } + /** Call requestDevice() and track the device for cleanup. */ + requestDeviceTracked(adapter, desc = undefined) { + + return this.trackForCleanup(adapter.requestDevice(desc)); + } + /** Log a debug message. */ debug(msg) { this.rec.debug(new Error(msg)); } + /** + * Log an info message. + * **Use sparingly. Use `debug()` instead if logs are only needed with debug logging enabled.** + */ + info(msg) { + this.rec.info(new Error(msg)); + } + /** Throws an exception marking the subcase as skipped. */ skip(msg) { throw new SkipTestCase(msg); diff --git a/tests/wpt/webgpu/tests/webgpu/common/framework/metadata.js b/tests/wpt/webgpu/tests/webgpu/common/framework/metadata.js index 7742a9c1ae5..9df7235bb15 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/framework/metadata.js +++ b/tests/wpt/webgpu/tests/webgpu/common/framework/metadata.js @@ -16,6 +16,7 @@ export function loadMetadataForSuite(suiteDir) { assert(typeof require !== 'undefined', 'loadMetadataForSuite is only implemented on Node'); + const fs = require('fs'); const metadataFile = `${suiteDir}/listing_meta.json`; diff --git a/tests/wpt/webgpu/tests/webgpu/common/framework/test_config.js b/tests/wpt/webgpu/tests/webgpu/common/framework/test_config.js index 81984dbec5e..5d8a59217f7 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/framework/test_config.js +++ b/tests/wpt/webgpu/tests/webgpu/common/framework/test_config.js @@ -17,6 +17,21 @@ + + + + + + + + + + + + + + + @@ -24,9 +39,12 @@ export const globalTestConfig = { + enableDebugLogs: false, maxSubcasesInFlight: 500, testHeartbeatCallback: () => {}, noRaceWithRejectOnTimeout: false, unrollConstEvalLoops: false, - compatibility: false + compatibility: false, + forceFallbackAdapter: false, + logToWebSocket: false }; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/log_message.js b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/log_message.js index 234b7c2cc90..53d2cd4b9c6 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/log_message.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/log_message.js @@ -1,19 +1,36 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { extractImportantStackTrace } from '../stack.js'; + + export class LogMessageWithStack extends Error { stackHiddenMessage = undefined; - constructor(name, ex) { - super(ex.message); + /** + * Wrap an Error (which was created to capture the stack at that point) into a + * LogMessageWithStack (which has extra stuff for good log messages). + * + * The original `ex.name` is ignored. Inclued it in the `name` parameter if it + * needs to be preserved. + */ + static wrapError(name, ex) { + return new LogMessageWithStack({ + name, + message: ex.message, + stackHiddenMessage: undefined, + stack: ex.stack, + extra: 'extra' in ex ? ex.extra : undefined + }); + } - this.name = name; - this.stack = ex.stack; - if ('extra' in ex) { - this.extra = ex.extra; - } + constructor(o) { + super(o.message); + this.name = o.name; + this.stackHiddenMessage = o.stackHiddenMessage; + this.stack = o.stack; + this.extra = o.extra; } /** Set a flag so the stack is not printed in toJSON(). */ @@ -21,6 +38,11 @@ export class LogMessageWithStack extends Error { this.stackHiddenMessage ??= stackHiddenMessage; } + /** + * Print the message for display. + * + * Note: This is toJSON instead of toString to make it easy to save logs using JSON.stringify. + */ toJSON() { let m = this.name; if (this.message) m += ': ' + this.message; @@ -33,6 +55,21 @@ export class LogMessageWithStack extends Error { } return m; } + + /** + * Flatten the message for sending over a message channel. + * + * Note `extra` may get mangled by postMessage. + */ + toRawData() { + return { + name: this.name, + message: this.message, + stackHiddenMessage: this.stackHiddenMessage, + stack: this.stack, + extra: this.extra + }; + } } /** diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/logger.js b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/logger.js index 224af20ddc5..4ec505cb697 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/logger.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/logger.js @@ -1,13 +1,12 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { version } from '../version.js'; +**/import { globalTestConfig } from '../../framework/test_config.js';import { version } from '../version.js'; + import { TestCaseRecorder } from './test_case_recorder.js'; export class Logger { - static globalDebugMode = false; - results = new Map(); @@ -19,7 +18,7 @@ export class Logger { const result = { status: 'running', timems: -1 }; this.results.set(name, result); return [ - new TestCaseRecorder(result, this.overriddenDebugMode ?? Logger.globalDebugMode), + new TestCaseRecorder(result, this.overriddenDebugMode ?? globalTestConfig.enableDebugLogs), result]; } diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/result.js b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/result.js index a7eb281daf3..cd4d0e86f1c 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/result.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/result.js @@ -1,4 +1,34 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/ // MAINTENANCE_TODO: Add warn expectations -export {}; \ No newline at end of file + + + + + + + + + + + + + +/** + * Raw data for a test log message. + * + * This form is sendable over a message channel, except `extra` may get mangled. + */ + + + + + + + + +/** + * Test case results in a form sendable over a message channel. + * + * Note `extra` may get mangled by postMessage. + */export {}; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/test_case_recorder.js b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/test_case_recorder.js index 7b9a5302cec..5b2a4e8b8ef 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/logging/test_case_recorder.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/logging/test_case_recorder.js @@ -45,8 +45,6 @@ export class TestCaseRecorder { logs = []; logLinesAtCurrentSeverity = 0; debugging = false; - /** Used to dedup log messages which have identical stacks. */ - messagesForPreviouslySeenStacks = new Map(); constructor(result, debugging) { this.result = result; @@ -143,13 +141,15 @@ export class TestCaseRecorder { this.skipped(ex); return; } - this.logImpl(LogSeverity.ThrewException, 'EXCEPTION', ex); + // logImpl will discard the original error's ex.name. Preserve it here. + const name = ex instanceof Error ? `EXCEPTION: ${ex.name}` : 'EXCEPTION'; + this.logImpl(LogSeverity.ThrewException, name, ex); } logImpl(level, name, baseException) { assert(baseException instanceof Error, 'test threw a non-Error object'); globalTestConfig.testHeartbeatCallback(); - const logMessage = new LogMessageWithStack(name, baseException); + const logMessage = LogMessageWithStack.wrapError(name, baseException); // Final case status should be the "worst" of all log entries. if (this.inSubCase) { diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/query/compare.js b/tests/wpt/webgpu/tests/webgpu/common/internal/query/compare.js index 8af64919a2e..f2bb1b62f32 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/query/compare.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/query/compare.js @@ -58,7 +58,10 @@ function compareOneLevel(ordering, aIsBig, bIsBig) { return Ordering.Unordered; } -function comparePaths(a, b) { +/** + * Compare two file paths, or file-local test paths, returning an Ordering between the two. + */ +export function comparePaths(a, b) { const shorter = Math.min(a.length, b.length); for (let i = 0; i < shorter; ++i) { diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/query/query.js b/tests/wpt/webgpu/tests/webgpu/common/internal/query/query.js index e1db8750610..8fd443652af 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/query/query.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/query/query.js @@ -1,6 +1,6 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { optionEnabled } from '../../runtime/helper/options.js';import { assert, unreachable } from '../../util/util.js'; +**/import { optionWorkerMode } from '../../runtime/helper/options.js';import { assert, unreachable } from '../../util/util.js'; import { compareQueries, Ordering } from './compare.js'; @@ -188,12 +188,12 @@ wptURL) assert( expectationURL.pathname === wptURL.pathname, `Invalid expectation path ${expectationURL.pathname} -Expectation should be of the form path/to/cts.https.html?worker=0&q=suite:test_path:test_name:foo=1;bar=2;... +Expectation should be of the form path/to/cts.https.html?debug=0&q=suite:test_path:test_name:foo=1;bar=2;... ` ); const params = expectationURL.searchParams; - if (optionEnabled('worker', params) !== optionEnabled('worker', wptURL.searchParams)) { + if (optionWorkerMode('worker', params) !== optionWorkerMode('worker', wptURL.searchParams)) { continue; } diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/test_group.js b/tests/wpt/webgpu/tests/webgpu/common/internal/test_group.js index 3db409ffe76..27721946672 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/test_group.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/test_group.js @@ -34,7 +34,7 @@ import { validQueryPart } from '../internal/query/validQueryPart.js'; import { assert, unreachable } from '../util/util.js'; -import { logToWebsocket } from './websocket_logger.js'; +import { logToWebSocket } from './websocket_logger.js'; @@ -294,9 +294,11 @@ class TestBuilder { (this.description ? this.description + '\n\n' : '') + 'TODO: .unimplemented()'; this.isUnimplemented = true; - this.testFn = () => { + // Use the beforeFn to skip the test, so we don't have to iterate the subcases. + this.beforeFn = () => { throw new SkipTestCase('test unimplemented'); }; + this.testFn = () => {}; } /** Perform various validation/"lint" chenks. */ @@ -350,7 +352,7 @@ class TestBuilder { const testcaseStringUnique = stringifyPublicParamsUniquely(params); assert( !seen.has(testcaseStringUnique), - `Duplicate public test case+subcase params for test ${testPathString}: ${testcaseString}` + `Duplicate public test case+subcase params for test ${testPathString}: ${testcaseString} (${caseQuery})` ); seen.add(testcaseStringUnique); } @@ -737,7 +739,7 @@ class RunCaseSpecific { timems: rec.result.timems, nonskippedSubcaseCount: rec.nonskippedSubcaseCount }; - logToWebsocket(JSON.stringify(msg)); + logToWebSocket(JSON.stringify(msg)); } } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/test_suite_listing.js b/tests/wpt/webgpu/tests/webgpu/common/internal/test_suite_listing.js index 81a15cf7123..7ea1c066f53 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/test_suite_listing.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/test_suite_listing.js @@ -2,5 +2,5 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/ // A listing of all specs within a single suite. This is the (awaited) type of // `groups` in '{cts,unittests}/listing.ts' and `listing` in the auto-generated -// 'out/{cts,unittests}/listing.js' files (see tools/gen_listings). +// 'out/{cts,unittests}/listing.js' files (see tools/gen_listings_and_webworkers). export {}; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/version.js b/tests/wpt/webgpu/tests/webgpu/common/internal/version.js index 34933cc3cb2..1583378be33 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/version.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/version.js @@ -1,3 +1,3 @@ // AUTO-GENERATED - DO NOT EDIT. See tools/gen_version. -export const version = 'ad066ef01b1060802b4a2329443faead9f345d87'; +export const version = '20425f60bb00676af386b5c31e7748c0e2cb1702'; diff --git a/tests/wpt/webgpu/tests/webgpu/common/internal/websocket_logger.js b/tests/wpt/webgpu/tests/webgpu/common/internal/websocket_logger.js index 7a8f92b1a84..1790e5632d8 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/internal/websocket_logger.js +++ b/tests/wpt/webgpu/tests/webgpu/common/internal/websocket_logger.js @@ -1,19 +1,24 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/ /** +**/import { globalTestConfig } from '../framework/test_config.js'; /** * - 'uninitialized' means we haven't tried to connect yet * - Promise means it's pending * - 'failed' means it failed (this is the most common case, where the logger isn't running) * - WebSocket means it succeeded - */let connection = 'uninitialized'; + */ +let connection = +'uninitialized'; /** - * Log a string to a websocket at `localhost:59497`. See `tools/websocket-logger`. + * If the logToWebSocket option is enabled (?log_to_web_socket=1 in browser, + * --log-to-web-socket on command line, or enable it by default in options.ts), + * log a string to a websocket at `localhost:59497`. See `tools/websocket-logger`. * - * This does nothing if a connection couldn't be established on the first call. + * This does nothing if a logToWebSocket is not enabled, or if a connection + * couldn't be established on the first call. */ -export function logToWebsocket(msg) { - if (connection === 'failed') { +export function logToWebSocket(msg) { + if (!globalTestConfig.logToWebSocket || connection === 'failed') { return; } diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/options.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/options.js index 139c3bc29f2..01b7d958891 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/options.js +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/options.js @@ -1,11 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/let windowURL = undefined;function getWindowURL() {if (windowURL === undefined) { +**/import { unreachable } from '../../util/util.js';let windowURL = undefined; +function getWindowURL() { + if (windowURL === undefined) { windowURL = new URL(window.location.toString()); } return windowURL; } +/** Parse a runner option that is always boolean-typed. False if missing or '0'. */ export function optionEnabled( opt, searchParams = getWindowURL().searchParams) @@ -14,11 +17,32 @@ searchParams = getWindowURL().searchParams) return val !== null && val !== '0'; } +/** Parse a runner option that is string-typed. If the option is missing, returns `null`. */ export function optionString( opt, searchParams = getWindowURL().searchParams) { - return searchParams.get(opt) || ''; + return searchParams.get(opt); +} + +/** Runtime modes for running tests in different types of workers. */ + +/** Parse a runner option for different worker modes (as in `?worker=shared`). Null if no worker. */ +export function optionWorkerMode( +opt, +searchParams = getWindowURL().searchParams) +{ + const value = searchParams.get(opt); + if (value === null || value === '0') { + return null; + } else if (value === 'service') { + return 'service'; + } else if (value === 'shared') { + return 'shared'; + } else if (value === '' || value === '1' || value === 'dedicated') { + return 'dedicated'; + } + unreachable('invalid worker= option value'); } /** @@ -32,12 +56,16 @@ searchParams = getWindowURL().searchParams) + + export const kDefaultCTSOptions = { - worker: false, + worker: null, debug: true, compatibility: false, + forceFallbackAdapter: false, unrollConstEvalLoops: false, - powerPreference: '' + powerPreference: null, + logToWebSocket: false }; /** @@ -59,19 +87,30 @@ export const kDefaultCTSOptions = { * Options to the CTS. */ export const kCTSOptionsInfo = { - worker: { description: 'run in a worker' }, + worker: { + description: 'run in a worker', + parser: optionWorkerMode, + selectValueDescriptions: [ + { value: null, description: 'no worker' }, + { value: 'dedicated', description: 'dedicated worker' }, + { value: 'shared', description: 'shared worker' }, + { value: 'service', description: 'service worker' }] + + }, debug: { description: 'show more info' }, compatibility: { description: 'run in compatibility mode' }, + forceFallbackAdapter: { description: 'pass forceFallbackAdapter: true to requestAdapter' }, unrollConstEvalLoops: { description: 'unroll const eval loops in WGSL' }, powerPreference: { description: 'set default powerPreference for some tests', parser: optionString, selectValueDescriptions: [ - { value: '', description: 'default' }, + { value: null, description: 'default' }, { value: 'low-power', description: 'low-power' }, { value: 'high-performance', description: 'high-performance' }] - } + }, + logToWebSocket: { description: 'send some logs to ws://localhost:59497/' } }; /** diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker-worker.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker-worker.js index a0f13c54afe..c5df860d0bb 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker-worker.js +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker-worker.js @@ -1,15 +1,11 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { setBaseResourcePath } from '../../framework/resources.js';import { globalTestConfig } from '../../framework/test_config.js';import { DefaultTestFileLoader } from '../../internal/file_loader.js'; -import { Logger } from '../../internal/logging/logger.js'; -import { parseQuery } from '../../internal/query/parseQuery.js'; - -import { setDefaultRequestAdapterOptions } from '../../util/navigator_gpu.js'; +**/import { setBaseResourcePath } from '../../framework/resources.js';import { DefaultTestFileLoader } from '../../internal/file_loader.js';import { parseQuery } from '../../internal/query/parseQuery.js'; import { assert } from '../../util/util.js'; +import { setupWorkerEnvironment } from './utils_worker.js'; - -// Should be DedicatedWorkerGlobalScope, but importing lib "webworker" conflicts with lib "dom". +// Should be WorkerGlobalScope, but importing lib "webworker" conflicts with lib "dom". @@ -17,25 +13,10 @@ const loader = new DefaultTestFileLoader(); setBaseResourcePath('../../../resources'); -self.onmessage = async (ev) => { - const query = ev.data.query; - const expectations = ev.data.expectations; - const ctsOptions = ev.data.ctsOptions; +async function reportTestResults(ev) { + const { query, expectations, ctsOptions } = ev.data; - const { debug, unrollConstEvalLoops, powerPreference, compatibility } = ctsOptions; - globalTestConfig.unrollConstEvalLoops = unrollConstEvalLoops; - globalTestConfig.compatibility = compatibility; - - Logger.globalDebugMode = debug; - const log = new Logger(); - - if (powerPreference || compatibility) { - setDefaultRequestAdapterOptions({ - ...(powerPreference && { powerPreference }), - // MAINTENANCE_TODO: Change this to whatever the option ends up being - ...(compatibility && { compatibilityMode: true }) - }); - } + const log = setupWorkerEnvironment(ctsOptions); const testcases = Array.from(await loader.loadCases(parseQuery(query))); assert(testcases.length === 1, 'worker query resulted in != 1 cases'); @@ -44,5 +25,23 @@ self.onmessage = async (ev) => { const [rec, result] = log.record(testcase.query.toString()); await testcase.run(rec, expectations); - self.postMessage({ query, result }); + this.postMessage({ + query, + result: { + ...result, + logs: result.logs?.map((l) => l.toRawData()) + } + }); +} + +self.onmessage = (ev) => { + void reportTestResults.call(ev.source || self, ev); +}; + +self.onconnect = (event) => { + const port = event.ports[0]; + + port.onmessage = (ev) => { + void reportTestResults.call(port, ev); + }; }; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker.js index 1d653941802..13314163f45 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker.js +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/test_worker.js @@ -2,33 +2,73 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { LogMessageWithStack } from '../../internal/logging/log_message.js'; +import { timeout } from '../../util/timeout.js'; +import { assert } from '../../util/util.js'; import { kDefaultCTSOptions } from './options.js'; -export class TestWorker { +/** Query all currently-registered service workers, and unregister them. */ +function unregisterAllServiceWorkers() { + void navigator.serviceWorker.getRegistrations().then((registrations) => { + for (const registration of registrations) { + void registration.unregister(); + } + }); +} + +// Firefox has serviceWorkers disabled in private mode +// and Servo does not support serviceWorkers yet. +if ('serviceWorker' in navigator) { + // NOTE: This code runs on startup for any runtime with worker support. Here, we use that chance to + // delete any leaked service workers, and register to clean up after ourselves at shutdown. + unregisterAllServiceWorkers(); + window.addEventListener('beforeunload', () => { + unregisterAllServiceWorkers(); + }); +} + +class TestBaseWorker { resolvers = new Map(); - constructor(ctsOptions) { - this.ctsOptions = { ...(ctsOptions || kDefaultCTSOptions), ...{ worker: true } }; - const selfPath = import.meta.url; - const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); - const workerPath = selfPathDir + '/test_worker-worker.js'; - this.worker = new Worker(workerPath, { type: 'module' }); - this.worker.onmessage = (ev) => { - const query = ev.data.query; - const result = ev.data.result; - if (result.logs) { - for (const l of result.logs) { - Object.setPrototypeOf(l, LogMessageWithStack.prototype); - } - } - this.resolvers.get(query)(result); + constructor(worker, ctsOptions) { + this.ctsOptions = { ...(ctsOptions || kDefaultCTSOptions), ...{ worker } }; + } - // MAINTENANCE_TODO(kainino0x): update the Logger with this result (or don't have a logger and - // update the entire results JSON somehow at some point). + onmessage(ev) { + const query = ev.data.query; + const transferredResult = ev.data.result; + + const result = { + status: transferredResult.status, + timems: transferredResult.timems, + logs: transferredResult.logs?.map((l) => new LogMessageWithStack(l)) }; + + this.resolvers.get(query)(result); + this.resolvers.delete(query); + + // MAINTENANCE_TODO(kainino0x): update the Logger with this result (or don't have a logger and + // update the entire results JSON somehow at some point). + } + + makeRequestAndRecordResult( + target, + query, + expectations) + { + const request = { + query, + expectations, + ctsOptions: this.ctsOptions + }; + target.postMessage(request); + + return new Promise((resolve) => { + assert(!this.resolvers.has(query), "can't request same query twice simultaneously"); + this.resolvers.set(query, resolve); + }); } async run( @@ -36,14 +76,120 @@ export class TestWorker { query, expectations = []) { - this.worker.postMessage({ - query, - expectations, - ctsOptions: this.ctsOptions + try { + rec.injectResult(await this.runImpl(query, expectations)); + } catch (ex) { + rec.start(); + rec.threw(ex); + rec.finish(); + } + } + + + + + +} + +export class TestDedicatedWorker extends TestBaseWorker { + + + constructor(ctsOptions) { + super('dedicated', ctsOptions); + try { + if (typeof Worker === 'undefined') { + throw new Error('Dedicated Workers not available'); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const workerPath = selfPathDir + '/test_worker-worker.js'; + this.worker = new Worker(workerPath, { type: 'module' }); + this.worker.onmessage = (ev) => this.onmessage(ev); + } catch (ex) { + assert(ex instanceof Error); + // Save the exception to re-throw in runImpl(). + this.worker = ex; + } + } + + runImpl(query, expectations = []) { + if (this.worker instanceof Worker) { + return this.makeRequestAndRecordResult(this.worker, query, expectations); + } else { + throw this.worker; + } + } +} + +/** @deprecated Use TestDedicatedWorker instead. */ +export class TestWorker extends TestDedicatedWorker {} + +export class TestSharedWorker extends TestBaseWorker { + /** MessagePort to the SharedWorker, or an Error if it couldn't be initialized. */ + + + constructor(ctsOptions) { + super('shared', ctsOptions); + try { + if (typeof SharedWorker === 'undefined') { + throw new Error('Shared Workers not available'); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const workerPath = selfPathDir + '/test_worker-worker.js'; + const worker = new SharedWorker(workerPath, { type: 'module' }); + this.port = worker.port; + this.port.start(); + this.port.onmessage = (ev) => this.onmessage(ev); + } catch (ex) { + assert(ex instanceof Error); + // Save the exception to re-throw in runImpl(). + this.port = ex; + } + } + + runImpl(query, expectations = []) { + if (this.port instanceof MessagePort) { + return this.makeRequestAndRecordResult(this.port, query, expectations); + } else { + throw this.port; + } + } +} + +export class TestServiceWorker extends TestBaseWorker { + constructor(ctsOptions) { + super('service', ctsOptions); + } + + async runImpl(query, expectations = []) { + if (!('serviceWorker' in navigator)) { + throw new Error('Service Workers not available'); + } + const [suite, name] = query.split(':', 2); + const fileName = name.split(',').join('/'); + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + // Construct the path to the worker file, then use URL to resolve the `../` components. + const serviceWorkerURL = new URL( + `${selfPathDir}/../../../${suite}/webworker/${fileName}.as_worker.js` + ).toString(); + + // If a registration already exists for this path, it will be ignored. + const registration = await navigator.serviceWorker.register(serviceWorkerURL, { + type: 'module' }); - const workerResult = await new Promise((resolve) => { - this.resolvers.set(query, resolve); - }); - rec.injectResult(workerResult); + // Make sure the registration we just requested is active. (We don't worry about it being + // outdated from a previous page load, because we wipe all service workers on shutdown/startup.) + while (!registration.active || registration.active.scriptURL !== serviceWorkerURL) { + await new Promise((resolve) => timeout(resolve, 0)); + } + const serviceWorker = registration.active; + + navigator.serviceWorker.onmessage = (ev) => this.onmessage(ev); + return this.makeRequestAndRecordResult(serviceWorker, query, expectations); } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/utils_worker.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/utils_worker.js new file mode 100644 index 00000000000..5a34070e148 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/utils_worker.js @@ -0,0 +1,35 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { globalTestConfig } from '../../framework/test_config.js';import { Logger } from '../../internal/logging/logger.js'; +import { setDefaultRequestAdapterOptions } from '../../util/navigator_gpu.js'; + + + + + + + + + +/** + * Set config environment for workers with ctsOptions and return a Logger. + */ +export function setupWorkerEnvironment(ctsOptions) { + const { powerPreference, compatibility } = ctsOptions; + globalTestConfig.enableDebugLogs = ctsOptions.debug; + globalTestConfig.unrollConstEvalLoops = ctsOptions.unrollConstEvalLoops; + globalTestConfig.compatibility = compatibility; + globalTestConfig.logToWebSocket = ctsOptions.logToWebSocket; + + const log = new Logger(); + + if (powerPreference || compatibility) { + setDefaultRequestAdapterOptions({ + ...(powerPreference && { powerPreference }), + // MAINTENANCE_TODO: Change this to whatever the option ends up being + ...(compatibility && { compatibilityMode: true }) + }); + } + + return log; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/wrap_for_worker.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/wrap_for_worker.js new file mode 100644 index 00000000000..c3a94612af3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/helper/wrap_for_worker.js @@ -0,0 +1,54 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { LogMessageWithStack } from '../../internal/logging/log_message.js';import { comparePaths, comparePublicParamsPaths, Ordering } from '../../internal/query/compare.js'; +import { parseQuery } from '../../internal/query/parseQuery.js'; +import { TestQuerySingleCase } from '../../internal/query/query.js'; + +import { assert } from '../../util/util.js'; + +import { setupWorkerEnvironment } from './utils_worker.js'; + +/** + * Sets up the currently running Web Worker to wrap the TestGroup object `g`. + * `g` is the `g` exported from a `.spec.ts` file: a TestGroupBuilder interface, + * which underneath is actually a TestGroup object. + * + * This is used in the generated `.as_worker.js` files that are generated to use as service workers. + */ +export function wrapTestGroupForWorker(g) { + self.onmessage = async (ev) => { + const { query, expectations, ctsOptions } = ev.data; + try { + const log = setupWorkerEnvironment(ctsOptions); + + const testQuery = parseQuery(query); + assert(testQuery instanceof TestQuerySingleCase); + let testcase = null; + for (const t of g.iterate()) { + if (comparePaths(t.testPath, testQuery.testPathParts) !== Ordering.Equal) { + continue; + } + for (const c of t.iterate(testQuery.params)) { + if (comparePublicParamsPaths(c.id.params, testQuery.params) === Ordering.Equal) { + testcase = c; + } + } + } + assert(!!testcase, 'testcase not found'); + const [rec, result] = log.record(query); + await testcase.run(rec, testQuery, expectations); + + ev.source?.postMessage({ query, result }); + } catch (thrown) { + const ex = thrown instanceof Error ? thrown : new Error(`${thrown}`); + ev.source?.postMessage({ + query, + result: { + status: 'fail', + timems: 0, + logs: [LogMessageWithStack.wrapError('INTERNAL', ex)] + } + }); + } + }; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/common/runtime/wpt.js b/tests/wpt/webgpu/tests/webgpu/common/runtime/wpt.js index 97c6a3886ed..d1a025d1f82 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/runtime/wpt.js +++ b/tests/wpt/webgpu/tests/webgpu/common/runtime/wpt.js @@ -8,8 +8,8 @@ import { parseQuery } from '../internal/query/parseQuery.js'; import { parseExpectationsForTestQuery, relativeQueryString } from '../internal/query/query.js'; import { assert } from '../util/util.js'; -import { optionEnabled } from './helper/options.js'; -import { TestWorker } from './helper/test_worker.js'; +import { optionEnabled, optionWorkerMode } from './helper/options.js'; +import { TestDedicatedWorker, TestServiceWorker, TestSharedWorker } from './helper/test_worker.js'; // testharness.js API (https://web-platform-tests.org/writing-tests/testharness-api.html) @@ -31,8 +31,10 @@ setup({ }); void (async () => { - const workerEnabled = optionEnabled('worker'); - const worker = workerEnabled ? new TestWorker() : undefined; + const workerString = optionWorkerMode('worker'); + const dedicatedWorker = workerString === 'dedicated' ? new TestDedicatedWorker() : undefined; + const sharedWorker = workerString === 'shared' ? new TestSharedWorker() : undefined; + const serviceWorker = workerString === 'service' ? new TestServiceWorker() : undefined; globalTestConfig.unrollConstEvalLoops = optionEnabled('unroll_const_eval_loops'); @@ -63,8 +65,12 @@ void (async () => { const wpt_fn = async () => { const [rec, res] = log.record(name); - if (worker) { - await worker.run(rec, name, expectations); + if (dedicatedWorker) { + await dedicatedWorker.run(rec, name, expectations); + } else if (sharedWorker) { + await sharedWorker.run(rec, name, expectations); + } else if (serviceWorker) { + await serviceWorker.run(rec, name, expectations); } else { await testcase.run(rec, expectations); } diff --git a/tests/wpt/webgpu/tests/webgpu/common/util/navigator_gpu.js b/tests/wpt/webgpu/tests/webgpu/common/util/navigator_gpu.js index d5db9f936ef..a6cb742a18f 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/util/navigator_gpu.js +++ b/tests/wpt/webgpu/tests/webgpu/common/util/navigator_gpu.js @@ -1,8 +1,6 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/ /// - -import { ErrorWithExtra, assert, objectEquals } from './util.js'; +**/import { ErrorWithExtra, assert, objectEquals } from './util.js'; /** * Finds and returns the `navigator.gpu` object (or equivalent, for non-browser implementations). @@ -72,7 +70,8 @@ export function getGPU(recorder) { if (recorder) { void promise.then(async (adapter) => { if (adapter) { - const info = await adapter.requestAdapterInfo(); + // MAINTENANCE_TODO: Remove requestAdapterInfo when info is implemented. + const info = adapter.info || (await adapter.requestAdapterInfo()); const infoString = `Adapter: ${info.vendor} / ${info.architecture} / ${info.device}`; recorder.debug(new ErrorWithExtra(infoString, () => ({ adapterInfo: info }))); } diff --git a/tests/wpt/webgpu/tests/webgpu/common/util/util.js b/tests/wpt/webgpu/tests/webgpu/common/util/util.js index b10762390fc..56e09bff45e 100644 --- a/tests/wpt/webgpu/tests/webgpu/common/util/util.js +++ b/tests/wpt/webgpu/tests/webgpu/common/util/util.js @@ -1,7 +1,6 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { Float16Array } from '../../external/petamoriken/float16/float16.js';import { SkipTestCase } from '../framework/fixture.js';import { globalTestConfig } from '../framework/test_config.js'; -import { Logger } from '../internal/logging/logger.js'; import { keysOf } from './data_tables.js'; import { timeout } from './timeout.js'; @@ -24,7 +23,7 @@ export class ErrorWithExtra extends Error { super(message); const oldExtras = baseOrMessage instanceof ErrorWithExtra ? baseOrMessage.extra : {}; - this.extra = Logger.globalDebugMode ? + this.extra = globalTestConfig.enableDebugLogs ? { ...oldExtras, ...newExtra() } : { omitted: 'pass ?debug=1' }; } @@ -91,6 +90,7 @@ export function skipTestCase(msg) { * The `performance` interface. * It is available in all browsers, but it is not in scope by default in Node. */ + const perf = typeof performance !== 'undefined' ? performance : require('perf_hooks').performance; /** @@ -304,7 +304,8 @@ new Int32Array(), new Float16Array(), new Float32Array(), new Float64Array(), -new BigInt64Array()]; +new BigInt64Array(), +new BigUint64Array()]; diff --git a/tests/wpt/webgpu/tests/webgpu/cts.https.html b/tests/wpt/webgpu/tests/webgpu/cts.https.html index 52aa6715a1c..e516a3b3876 100644 --- a/tests/wpt/webgpu/tests/webgpu/cts.https.html +++ b/tests/wpt/webgpu/tests/webgpu/cts.https.html @@ -33,10 +33,9 @@ + - - @@ -47,6 +46,7 @@ + @@ -106,6 +106,7 @@ + @@ -173,6 +174,9 @@ + + + @@ -232,6 +236,7 @@ + @@ -241,7 +246,6 @@ - @@ -294,7 +298,7 @@ - + @@ -316,6 +320,8 @@ + + @@ -398,6 +404,7 @@ + @@ -573,6 +580,8 @@ + + @@ -676,6 +685,9 @@ + + + @@ -737,6 +749,7 @@ + @@ -756,8 +769,10 @@ + + @@ -773,6 +788,7 @@ + @@ -860,8 +876,6 @@ - - @@ -885,12 +899,12 @@ - - - - - + + + + + @@ -924,6 +938,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -939,7 +976,12 @@ + + + + + @@ -952,14 +994,37 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -1188,6 +1253,7 @@ + @@ -1220,8 +1286,8 @@ - - + + @@ -1253,6 +1319,9 @@ + + + @@ -1261,10 +1330,18 @@ - - - - + + + + + + + + + + + + @@ -1287,7 +1364,9 @@ - + + + @@ -1307,6 +1386,14 @@ + + + + + + + + @@ -1334,6 +1421,9 @@ + + + @@ -1396,7 +1486,9 @@ - + + + @@ -1419,14 +1511,18 @@ - + + + - + + + @@ -1471,10 +1567,10 @@ - - - - + + + + @@ -1494,6 +1590,7 @@ + @@ -1501,10 +1598,9 @@ - - + @@ -1512,14 +1608,10 @@ - - - - @@ -1545,6 +1637,10 @@ + + + + @@ -1560,20 +1656,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1584,18 +1711,24 @@ + + + + + + @@ -1603,9 +1736,8 @@ - - - + + @@ -1613,10 +1745,15 @@ + + + + + @@ -1665,6 +1802,8 @@ + + @@ -1673,6 +1812,8 @@ + + @@ -1686,11 +1827,28 @@ + + + + + + + + + + + + + + + + + @@ -1703,6 +1861,7 @@ + @@ -1725,9 +1884,11 @@ + + @@ -1739,6 +1900,13 @@ + + + + + + + @@ -1754,6 +1922,14 @@ + + + + + + + + @@ -1768,15 +1944,32 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + @@ -1788,35 +1981,88 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + @@ -1827,84 +2073,447 @@ + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1933,38 +2542,37 @@ - - - - + + + + + + + + + + + + + - - - - - - - - - - - + - + @@ -1987,16 +2595,6 @@ - - - - - - - - - - @@ -2040,13 +2638,22 @@ + + + + + + + + + - - - - + + + + @@ -2055,6 +2662,8 @@ + + @@ -2082,12 +2691,22 @@ + + + + + + + + + + @@ -2099,6 +2718,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2109,12 +2764,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2170,9 +2862,13 @@ + + - + + + diff --git a/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.d.js b/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.d.js index 138c3378a52..5a3e7f2f00a 100644 --- a/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.d.js +++ b/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.d.js @@ -390,6 +390,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -467,4 +487,11 @@ /** * Returns the nearest half-precision float representation of a number. * @param x A numeric expression. + */ + + +/** + * Returns the nearest half-precision float representation of a number. + * @alias f16round + * @param x A numeric expression. */export {}; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.js b/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.js index 42543cdea17..11db53a4fd7 100644 --- a/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.js +++ b/tests/wpt/webgpu/tests/webgpu/external/petamoriken/float16/float16.js @@ -1,6 +1,6 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/ /*! @petamoriken/float16 v3.6.6 | MIT License - https://github.com/petamoriken/float16 */const THIS_IS_NOT_AN_OBJECT = "This is not an object"; +**/ /*! @petamoriken/float16 v3.8.6 | MIT License - https://github.com/petamoriken/float16 */const THIS_IS_NOT_AN_OBJECT = "This is not an object"; const THIS_IS_NOT_A_FLOAT16ARRAY_OBJECT = "This is not a Float16Array object"; const THIS_CONSTRUCTOR_IS_NOT_A_SUBCLASS_OF_FLOAT16ARRAY = "This constructor is not a subclass of Float16Array"; @@ -19,6 +19,8 @@ const CANNOT_MIX_BIGINT_AND_OTHER_TYPES = const ITERATOR_PROPERTY_IS_NOT_CALLABLE = "@@iterator property is not callable"; const REDUCE_OF_EMPTY_ARRAY_WITH_NO_INITIAL_VALUE = "Reduce of empty array with no initial value"; +const THE_COMPARISON_FUNCTION_MUST_BE_EITHER_A_FUNCTION_OR_UNDEFINED = +"The comparison function must be either a function or undefined"; const OFFSET_IS_OUT_OF_BOUNDS = "Offset is out of bounds"; function uncurryThis(target) { @@ -48,7 +50,8 @@ const { } = Reflect; const NativeProxy = Proxy; const { - MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + EPSILON, + MAX_SAFE_INTEGER, isFinite: NumberIsFinite, isNaN: NumberIsNaN } = Number; @@ -97,7 +100,10 @@ const ArrayPrototypeToLocaleString = uncurryThis( ); const NativeArrayPrototypeSymbolIterator = ArrayPrototype[SymbolIterator]; const ArrayPrototypeSymbolIterator = uncurryThis(NativeArrayPrototypeSymbolIterator); -const MathTrunc = Math.trunc; +const { + abs: MathAbs, + trunc: MathTrunc +} = Math; const NativeArrayBuffer = ArrayBuffer; const ArrayBufferIsView = NativeArrayBuffer.isView; const ArrayBufferPrototype = NativeArrayBuffer.prototype; @@ -146,6 +152,7 @@ const TypedArrayPrototypeGetSymbolToStringTag = uncurryThisGetter( TypedArrayPrototype, SymbolToStringTag ); +const NativeUint8Array = Uint8Array; const NativeUint16Array = Uint16Array; const Uint16ArrayFrom = (...args) => { return ReflectApply(TypedArrayFrom, NativeUint16Array, args); @@ -190,7 +197,10 @@ const SafeIteratorPrototype = ObjectCreate(null, { } }); function safeIfNeeded(array) { - if (array[SymbolIterator] === NativeArrayPrototypeSymbolIterator) { + if ( + array[SymbolIterator] === NativeArrayPrototypeSymbolIterator && + ArrayIteratorPrototype.next === ArrayIteratorPrototypeNext) + { return array; } const safe = ObjectCreate(SafeIteratorPrototype); @@ -221,8 +231,10 @@ function wrap(generator) { } function isObject(value) { - return value !== null && typeof value === "object" || - typeof value === "function"; + return ( + value !== null && typeof value === "object" || + typeof value === "function"); + } function isObjectLike(value) { return value !== null && typeof value === "object"; @@ -232,11 +244,16 @@ function isNativeTypedArray(value) { } function isNativeBigIntTypedArray(value) { const typedArrayName = TypedArrayPrototypeGetSymbolToStringTag(value); - return typedArrayName === "BigInt64Array" || - typedArrayName === "BigUint64Array"; + return ( + typedArrayName === "BigInt64Array" || + typedArrayName === "BigUint64Array"); + } function isArrayBuffer(value) { try { + if (ArrayIsArray(value)) { + return false; + } ArrayBufferPrototypeGetByteLength(value); return true; } catch (e) { @@ -254,25 +271,26 @@ function isSharedArrayBuffer(value) { return false; } } +function isAnyArrayBuffer(value) { + return isArrayBuffer(value) || isSharedArrayBuffer(value); +} function isOrdinaryArray(value) { if (!ArrayIsArray(value)) { return false; } - if (value[SymbolIterator] === NativeArrayPrototypeSymbolIterator) { - return true; - } - const iterator = value[SymbolIterator](); - return iterator[SymbolToStringTag] === "Array Iterator"; + return ( + value[SymbolIterator] === NativeArrayPrototypeSymbolIterator && + ArrayIteratorPrototype.next === ArrayIteratorPrototypeNext); + } function isOrdinaryNativeTypedArray(value) { if (!isNativeTypedArray(value)) { return false; } - if (value[SymbolIterator] === NativeTypedArrayPrototypeSymbolIterator) { - return true; - } - const iterator = value[SymbolIterator](); - return iterator[SymbolToStringTag] === "Array Iterator"; + return ( + value[SymbolIterator] === NativeTypedArrayPrototypeSymbolIterator && + ArrayIteratorPrototype.next === ArrayIteratorPrototypeNext); + } function isCanonicalIntegerIndexString(value) { if (typeof value !== "string") { @@ -307,11 +325,37 @@ function hasFloat16ArrayBrand(target) { return ReflectHas(constructor, brand); } +const INVERSE_OF_EPSILON = 1 / EPSILON; +function roundTiesToEven(num) { + return num + INVERSE_OF_EPSILON - INVERSE_OF_EPSILON; +} +const FLOAT16_MIN_VALUE = 6.103515625e-05; +const FLOAT16_MAX_VALUE = 65504; +const FLOAT16_EPSILON = 0.0009765625; +const FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE = FLOAT16_EPSILON * FLOAT16_MIN_VALUE; +const FLOAT16_EPSILON_DEVIDED_BY_EPSILON = FLOAT16_EPSILON * INVERSE_OF_EPSILON; +function roundToFloat16(num) { + const number = +num; + if (!NumberIsFinite(number) || number === 0) { + return number; + } + const sign = number > 0 ? 1 : -1; + const absolute = MathAbs(number); + if (absolute < FLOAT16_MIN_VALUE) { + return sign * roundTiesToEven(absolute / FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE) * FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE; + } + const temp = (1 + FLOAT16_EPSILON_DEVIDED_BY_EPSILON) * absolute; + const result = temp - (temp - absolute); + if (result > FLOAT16_MAX_VALUE || NumberIsNaN(result)) { + return sign * Infinity; + } + return sign * result; +} const buffer = new NativeArrayBuffer(4); const floatView = new NativeFloat32Array(buffer); const uint32View = new NativeUint32Array(buffer); -const baseTable = new NativeUint32Array(512); -const shiftTable = new NativeUint32Array(512); +const baseTable = new NativeUint16Array(512); +const shiftTable = new NativeUint8Array(512); for (let i = 0; i < 256; ++i) { const e = i - 127; if (e < -27) { @@ -342,14 +386,12 @@ for (let i = 0; i < 256; ++i) { } } function roundToFloat16Bits(num) { - floatView[0] = num; + floatView[0] = roundToFloat16(num); const f = uint32View[0]; const e = f >> 23 & 0x1ff; return baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]); } const mantissaTable = new NativeUint32Array(2048); -const exponentTable = new NativeUint32Array(64); -const offsetTable = new NativeUint32Array(64); for (let i = 1; i < 1024; ++i) { let m = i << 13; let e = 0; @@ -364,6 +406,7 @@ for (let i = 1; i < 1024; ++i) { for (let i = 1024; i < 2048; ++i) { mantissaTable[i] = 0x38000000 + (i - 1024 << 13); } +const exponentTable = new NativeUint32Array(64); for (let i = 1; i < 31; ++i) { exponentTable[i] = i << 23; } @@ -373,14 +416,15 @@ for (let i = 33; i < 63; ++i) { exponentTable[i] = 0x80000000 + (i - 32 << 23); } exponentTable[63] = 0xc7800000; +const offsetTable = new NativeUint16Array(64); for (let i = 1; i < 64; ++i) { if (i !== 32) { offsetTable[i] = 1024; } } function convertToNumber(float16bits) { - const m = float16bits >> 10; - uint32View[0] = mantissaTable[offsetTable[m] + (float16bits & 0x3ff)] + exponentTable[m]; + const i = float16bits >> 10; + uint32View[0] = mantissaTable[offsetTable[i] + (float16bits & 0x3ff)] + exponentTable[i]; return floatView[0]; } @@ -572,26 +616,20 @@ class Float16Array { let float16bitsArray; if (isFloat16Array(input)) { float16bitsArray = ReflectConstruct(NativeUint16Array, [getFloat16BitsArray(input)], new.target); - } else if (isObject(input) && !isArrayBuffer(input)) { + } else if (isObject(input) && !isAnyArrayBuffer(input)) { let list; let length; if (isNativeTypedArray(input)) { list = input; length = TypedArrayPrototypeGetLength(input); const buffer = TypedArrayPrototypeGetBuffer(input); - const BufferConstructor = !isSharedArrayBuffer(buffer) ? - SpeciesConstructor( - buffer, - NativeArrayBuffer - ) : - NativeArrayBuffer; if (IsDetachedBuffer(buffer)) { throw NativeTypeError(ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER); } if (isNativeBigIntTypedArray(input)) { throw NativeTypeError(CANNOT_MIX_BIGINT_AND_OTHER_TYPES); } - const data = new BufferConstructor( + const data = new NativeArrayBuffer( length * BYTES_PER_ELEMENT ); float16bitsArray = ReflectConstruct(NativeUint16Array, [data], new.target); @@ -758,6 +796,30 @@ class Float16Array { } return convertToNumber(float16bitsArray[k]); } + with(index, value) { + assertFloat16Array(this); + const float16bitsArray = getFloat16BitsArray(this); + const length = TypedArrayPrototypeGetLength(float16bitsArray); + const relativeIndex = ToIntegerOrInfinity(index); + const k = relativeIndex >= 0 ? relativeIndex : length + relativeIndex; + const number = +value; + if (k < 0 || k >= length) { + throw NativeRangeError(OFFSET_IS_OUT_OF_BOUNDS); + } + const uint16 = new NativeUint16Array( + TypedArrayPrototypeGetBuffer(float16bitsArray), + TypedArrayPrototypeGetByteOffset(float16bitsArray), + TypedArrayPrototypeGetLength(float16bitsArray) + ); + const cloned = new Float16Array( + TypedArrayPrototypeGetBuffer( + TypedArrayPrototypeSlice(uint16) + ) + ); + const array = getFloat16BitsArray(cloned); + array[k] = roundToFloat16Bits(number); + return cloned; + } map(callback, ...opts) { assertFloat16Array(this); const float16bitsArray = getFloat16BitsArray(this); @@ -995,6 +1057,23 @@ class Float16Array { TypedArrayPrototypeReverse(float16bitsArray); return this; } + toReversed() { + assertFloat16Array(this); + const float16bitsArray = getFloat16BitsArray(this); + const uint16 = new NativeUint16Array( + TypedArrayPrototypeGetBuffer(float16bitsArray), + TypedArrayPrototypeGetByteOffset(float16bitsArray), + TypedArrayPrototypeGetLength(float16bitsArray) + ); + const cloned = new Float16Array( + TypedArrayPrototypeGetBuffer( + TypedArrayPrototypeSlice(uint16) + ) + ); + const clonedFloat16bitsArray = getFloat16BitsArray(cloned); + TypedArrayPrototypeReverse(clonedFloat16bitsArray); + return cloned; + } fill(value, ...opts) { assertFloat16Array(this); const float16bitsArray = getFloat16BitsArray(this); @@ -1020,6 +1099,29 @@ class Float16Array { }); return this; } + toSorted(compareFn) { + assertFloat16Array(this); + const float16bitsArray = getFloat16BitsArray(this); + if (compareFn !== undefined && typeof compareFn !== "function") { + throw new NativeTypeError(THE_COMPARISON_FUNCTION_MUST_BE_EITHER_A_FUNCTION_OR_UNDEFINED); + } + const sortCompare = compareFn !== undefined ? compareFn : defaultCompare; + const uint16 = new NativeUint16Array( + TypedArrayPrototypeGetBuffer(float16bitsArray), + TypedArrayPrototypeGetByteOffset(float16bitsArray), + TypedArrayPrototypeGetLength(float16bitsArray) + ); + const cloned = new Float16Array( + TypedArrayPrototypeGetBuffer( + TypedArrayPrototypeSlice(uint16) + ) + ); + const clonedFloat16bitsArray = getFloat16BitsArray(cloned); + TypedArrayPrototypeSort(clonedFloat16bitsArray, (x, y) => { + return sortCompare(convertToNumber(x), convertToNumber(y)); + }); + return cloned; + } slice(start, end) { assertFloat16Array(this); const float16bitsArray = getFloat16BitsArray(this); @@ -1216,13 +1318,8 @@ function setFloat16(dataView, byteOffset, value, ...opts) { ); } -function hfround(x) { - const number = +x; - if (!NumberIsFinite(number) || number === 0) { - return number; - } - const x16 = roundToFloat16Bits(number); - return convertToNumber(x16); +function f16round(x) { + return roundToFloat16(x); } -export { Float16Array, getFloat16, hfround, isFloat16Array, isTypedArray, setFloat16 }; \ No newline at end of file +export { Float16Array, f16round, getFloat16, f16round as hfround, isFloat16Array, isTypedArray, setFloat16 }; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/resources/README.md b/tests/wpt/webgpu/tests/webgpu/resources/README.md index 990b2b98e0a..a1ed0604170 100644 --- a/tests/wpt/webgpu/tests/webgpu/resources/README.md +++ b/tests/wpt/webgpu/tests/webgpu/resources/README.md @@ -44,17 +44,17 @@ rm temp.mp4 Vp9 rotated video files are generated by ffmpeg cmds below: ``` -// Generate four-colors-h264-bt601-rotate-90.mp4, mimeType: 'video/mp4; codecs=vp9' +// Generate four-colors-vp9-bt601-rotate-90.mp4, mimeType: 'video/mp4; codecs=vp9' ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2 temp.mp4 ffmpeg -display_rotation 270 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-90.mp4 rm temp.mp4 -// Generate four-colors-h264-bt601-rotate-180.mp4, mimeType: 'video/mp4; codecs=vp9' +// Generate four-colors-vp9-bt601-rotate-180.mp4, mimeType: 'video/mp4; codecs=vp9' ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2,transpose=2 temp.mp4 ffmpeg -display_rotation 180 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-180.mp4 rm temp.mp4 -// Generate four-colors-h264-bt601-rotate-270.mp4, mimeType: 'video/mp4; codecs=vp9' +// Generate four-colors-vp9-bt601-rotate-270.mp4, mimeType: 'video/mp4; codecs=vp9' ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=1 temp.mp4 ffmpeg -display_rotation 90 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-270.mp4 rm temp.mp4 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/hashes.json b/tests/wpt/webgpu/tests/webgpu/resources/cache/hashes.json index d908a0c69ca..e0459422560 100644 --- a/tests/wpt/webgpu/tests/webgpu/resources/cache/hashes.json +++ b/tests/wpt/webgpu/tests/webgpu/resources/cache/hashes.json @@ -1,107 +1,112 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "c7c51c39", - "webgpu/shader/execution/binary/af_logical.bin": "59188363", - "webgpu/shader/execution/binary/af_division.bin": "3dceb51d", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "7dce888f", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "1bf7797", - "webgpu/shader/execution/binary/af_multiplication.bin": "5bd9db91", - "webgpu/shader/execution/binary/af_remainder.bin": "9426ee9f", - "webgpu/shader/execution/binary/af_subtraction.bin": "823576a9", - "webgpu/shader/execution/binary/f16_addition.bin": "98228b04", - "webgpu/shader/execution/binary/f16_logical.bin": "7f4e05ab", - "webgpu/shader/execution/binary/f16_division.bin": "95e60c24", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "3503e24", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "5b0b6c54", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "7c2b67cc", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "3ab51e54", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "c509829e", - "webgpu/shader/execution/binary/f16_multiplication.bin": "2cb9031c", - "webgpu/shader/execution/binary/f16_remainder.bin": "36a93ab6", - "webgpu/shader/execution/binary/f16_subtraction.bin": "5e564fad", - "webgpu/shader/execution/binary/f32_addition.bin": "6a004a96", - "webgpu/shader/execution/binary/f32_logical.bin": "29b78ff7", - "webgpu/shader/execution/binary/f32_division.bin": "f3960bd", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "b7a7252c", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "223c03dc", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "9fa0adb0", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "48fb4b77", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "9a9a8e4f", - "webgpu/shader/execution/binary/f32_multiplication.bin": "6384c269", - "webgpu/shader/execution/binary/f32_remainder.bin": "668869cd", - "webgpu/shader/execution/binary/f32_subtraction.bin": "b720a489", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "794ff384", - "webgpu/shader/execution/binary/i32_comparison.bin": "5742ecc8", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "61c3eca", - "webgpu/shader/execution/binary/u32_comparison.bin": "8b463360", - "webgpu/shader/execution/abs.bin": "84759b96", - "webgpu/shader/execution/acos.bin": "d2fecf7e", - "webgpu/shader/execution/acosh.bin": "ae49ab4a", - "webgpu/shader/execution/asin.bin": "ef8d1ee0", - "webgpu/shader/execution/asinh.bin": "3fddcdc", - "webgpu/shader/execution/atan.bin": "fa01b779", - "webgpu/shader/execution/atan2.bin": "6544e27b", - "webgpu/shader/execution/atanh.bin": "dbfcf972", - "webgpu/shader/execution/bitcast.bin": "c871c53a", - "webgpu/shader/execution/ceil.bin": "a9259b43", - "webgpu/shader/execution/clamp.bin": "1c0cdd92", - "webgpu/shader/execution/cos.bin": "d32e388f", - "webgpu/shader/execution/cosh.bin": "353519fe", - "webgpu/shader/execution/cross.bin": "e1425e59", - "webgpu/shader/execution/degrees.bin": "303cb3", - "webgpu/shader/execution/determinant.bin": "b61bbfdb", - "webgpu/shader/execution/distance.bin": "9aee4ac6", - "webgpu/shader/execution/dot.bin": "2786d688", - "webgpu/shader/execution/exp.bin": "c791dee0", - "webgpu/shader/execution/exp2.bin": "7317dc87", - "webgpu/shader/execution/faceForward.bin": "2d7ecc3d", - "webgpu/shader/execution/floor.bin": "aad85712", - "webgpu/shader/execution/fma.bin": "cc8a275d", - "webgpu/shader/execution/fract.bin": "b651c53", - "webgpu/shader/execution/frexp.bin": "63c4d7b5", - "webgpu/shader/execution/inverseSqrt.bin": "8065a8af", - "webgpu/shader/execution/ldexp.bin": "e3d5da1e", - "webgpu/shader/execution/length.bin": "c4a77d", - "webgpu/shader/execution/log.bin": "19bd1b97", - "webgpu/shader/execution/log2.bin": "750e4aef", - "webgpu/shader/execution/max.bin": "1858ef6c", - "webgpu/shader/execution/min.bin": "27604a2a", - "webgpu/shader/execution/mix.bin": "e9174bda", - "webgpu/shader/execution/modf.bin": "faeb6938", - "webgpu/shader/execution/normalize.bin": "8325262b", - "webgpu/shader/execution/pack2x16float.bin": "3eab9d7e", - "webgpu/shader/execution/pow.bin": "a95ee5d5", - "webgpu/shader/execution/quantizeToF16.bin": "87ea1db0", - "webgpu/shader/execution/radians.bin": "8900171f", - "webgpu/shader/execution/reflect.bin": "34871ff1", - "webgpu/shader/execution/refract.bin": "8afd8086", - "webgpu/shader/execution/round.bin": "1f0d895", - "webgpu/shader/execution/saturate.bin": "208f6223", - "webgpu/shader/execution/sign.bin": "5d5eef01", - "webgpu/shader/execution/sin.bin": "88673d1b", - "webgpu/shader/execution/sinh.bin": "912004c4", - "webgpu/shader/execution/smoothstep.bin": "58521adc", - "webgpu/shader/execution/sqrt.bin": "6efab59a", - "webgpu/shader/execution/step.bin": "5d6a0269", - "webgpu/shader/execution/tan.bin": "1c2ed170", - "webgpu/shader/execution/tanh.bin": "69c199a6", - "webgpu/shader/execution/transpose.bin": "298a08a6", - "webgpu/shader/execution/trunc.bin": "b7f8c151", - "webgpu/shader/execution/unpack2x16float.bin": "ea2edfa", - "webgpu/shader/execution/unpack2x16snorm.bin": "982a4f26", - "webgpu/shader/execution/unpack2x16unorm.bin": "938aa3f3", - "webgpu/shader/execution/unpack4x8snorm.bin": "38d66fd9", - "webgpu/shader/execution/unpack4x8unorm.bin": "ea69a50e", - "webgpu/shader/execution/unary/af_arithmetic.bin": "ff253208", - "webgpu/shader/execution/unary/af_assignment.bin": "9b7be51c", - "webgpu/shader/execution/unary/bool_conversion.bin": "cc9afc72", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "9d141077", - "webgpu/shader/execution/unary/f16_conversion.bin": "411d49cb", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "cfbaceaf", - "webgpu/shader/execution/unary/f32_conversion.bin": "1e5cb1a7", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "a10a7f07", - "webgpu/shader/execution/unary/i32_complement.bin": "4a7fabe2", - "webgpu/shader/execution/unary/i32_conversion.bin": "46a36b14", - "webgpu/shader/execution/unary/u32_complement.bin": "efe3fec7", - "webgpu/shader/execution/unary/u32_conversion.bin": "afebfab2", - "webgpu/shader/execution/unary/ai_assignment.bin": "dd599f63" + "webgpu/shader/execution/binary/af_addition.bin": "338b5b67", + "webgpu/shader/execution/binary/af_logical.bin": "3b2aceb8", + "webgpu/shader/execution/binary/af_division.bin": "a77dc4c0", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "136a7fbb", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "90f2c731", + "webgpu/shader/execution/binary/af_multiplication.bin": "35ba40b9", + "webgpu/shader/execution/binary/af_remainder.bin": "41582f85", + "webgpu/shader/execution/binary/af_subtraction.bin": "a41420b2", + "webgpu/shader/execution/binary/f16_addition.bin": "ef10ca66", + "webgpu/shader/execution/binary/f16_logical.bin": "4bf24ca5", + "webgpu/shader/execution/binary/f16_division.bin": "f826b6ba", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "a910ddb0", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "9458671c", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "36be05d3", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "8aa6a88a", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "38282a11", + "webgpu/shader/execution/binary/f16_multiplication.bin": "62f91819", + "webgpu/shader/execution/binary/f16_remainder.bin": "f829bb65", + "webgpu/shader/execution/binary/f16_subtraction.bin": "82d4e231", + "webgpu/shader/execution/binary/f32_addition.bin": "9b0a0c50", + "webgpu/shader/execution/binary/f32_logical.bin": "b75af25a", + "webgpu/shader/execution/binary/f32_division.bin": "f6d7832f", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "3317c75b", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "c6f990c8", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "b091a702", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "2d12a16b", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "e1217524", + "webgpu/shader/execution/binary/f32_multiplication.bin": "19774fb3", + "webgpu/shader/execution/binary/f32_remainder.bin": "fd94bb9a", + "webgpu/shader/execution/binary/f32_subtraction.bin": "dba7cd7a", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "e3b317e1", + "webgpu/shader/execution/binary/i32_comparison.bin": "63fa9be8", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "e8b4008c", + "webgpu/shader/execution/binary/u32_comparison.bin": "d472fd61", + "webgpu/shader/execution/abs.bin": "631d932d", + "webgpu/shader/execution/acos.bin": "afcafcb1", + "webgpu/shader/execution/acosh.bin": "4b30eb95", + "webgpu/shader/execution/asin.bin": "c850c13d", + "webgpu/shader/execution/asinh.bin": "66a6acc0", + "webgpu/shader/execution/atan.bin": "2aabbb53", + "webgpu/shader/execution/atan2.bin": "82dd926a", + "webgpu/shader/execution/atanh.bin": "b98c937c", + "webgpu/shader/execution/bitcast.bin": "5daaee1b", + "webgpu/shader/execution/ceil.bin": "d0c32cf4", + "webgpu/shader/execution/clamp.bin": "4d1fc26a", + "webgpu/shader/execution/cos.bin": "dc837ae2", + "webgpu/shader/execution/cosh.bin": "d9e90580", + "webgpu/shader/execution/cross.bin": "ce7979f", + "webgpu/shader/execution/degrees.bin": "1436a196", + "webgpu/shader/execution/determinant.bin": "f36f1fa1", + "webgpu/shader/execution/distance.bin": "5103f8bd", + "webgpu/shader/execution/dot.bin": "4514172c", + "webgpu/shader/execution/exp.bin": "f41150bd", + "webgpu/shader/execution/exp2.bin": "19c494e", + "webgpu/shader/execution/faceForward.bin": "27b6e4a7", + "webgpu/shader/execution/floor.bin": "5bb5098b", + "webgpu/shader/execution/fma.bin": "daace9a4", + "webgpu/shader/execution/fract.bin": "be5f0334", + "webgpu/shader/execution/frexp.bin": "c9efaf7c", + "webgpu/shader/execution/inverseSqrt.bin": "8a50b907", + "webgpu/shader/execution/ldexp.bin": "cb4cea21", + "webgpu/shader/execution/length.bin": "a1b9fbeb", + "webgpu/shader/execution/log.bin": "9f2eb7c3", + "webgpu/shader/execution/log2.bin": "9ee7d861", + "webgpu/shader/execution/max.bin": "11e4608e", + "webgpu/shader/execution/min.bin": "7a084c44", + "webgpu/shader/execution/mix.bin": "7b892a4f", + "webgpu/shader/execution/modf.bin": "b3bf26d7", + "webgpu/shader/execution/normalize.bin": "18eba01d", + "webgpu/shader/execution/pack2x16float.bin": "82df446e", + "webgpu/shader/execution/pow.bin": "d3a05344", + "webgpu/shader/execution/quantizeToF16.bin": "7793770e", + "webgpu/shader/execution/radians.bin": "582c1f6b", + "webgpu/shader/execution/reflect.bin": "9161d6e5", + "webgpu/shader/execution/refract.bin": "817b59aa", + "webgpu/shader/execution/round.bin": "cb881aa2", + "webgpu/shader/execution/saturate.bin": "3716605e", + "webgpu/shader/execution/sign.bin": "549ac92f", + "webgpu/shader/execution/sin.bin": "5ec5bcb7", + "webgpu/shader/execution/sinh.bin": "62f6b736", + "webgpu/shader/execution/smoothstep.bin": "aa97768", + "webgpu/shader/execution/sqrt.bin": "d0a134ce", + "webgpu/shader/execution/step.bin": "b8035bb9", + "webgpu/shader/execution/tan.bin": "b34366cd", + "webgpu/shader/execution/tanh.bin": "8f5edddc", + "webgpu/shader/execution/transpose.bin": "1aa2de65", + "webgpu/shader/execution/trunc.bin": "cf43e3f7", + "webgpu/shader/execution/unpack2x16float.bin": "57ea7c02", + "webgpu/shader/execution/unpack2x16snorm.bin": "17fd3f86", + "webgpu/shader/execution/unpack2x16unorm.bin": "fc68bc4b", + "webgpu/shader/execution/unpack4x8snorm.bin": "fef504c1", + "webgpu/shader/execution/unpack4x8unorm.bin": "e8d8de93", + "webgpu/shader/execution/unary/af_arithmetic.bin": "14c0612a", + "webgpu/shader/execution/unary/af_assignment.bin": "3ad4afc", + "webgpu/shader/execution/unary/bool_conversion.bin": "15f7f3fb", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "4a20db6d", + "webgpu/shader/execution/unary/f16_conversion.bin": "31f72f5a", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "f1c311cb", + "webgpu/shader/execution/unary/f32_conversion.bin": "7539cdb3", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "de945eec", + "webgpu/shader/execution/unary/i32_conversion.bin": "1728a03e", + "webgpu/shader/execution/unary/u32_conversion.bin": "9e6ca0ce", + "webgpu/shader/execution/unary/ai_assignment.bin": "1fd685a2", + "webgpu/shader/execution/binary/ai_arithmetic.bin": "90e651f4", + "webgpu/shader/execution/unary/ai_arithmetic.bin": "ba31d178", + "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "bc8b52ef", + "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "54edf6a2", + "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "43b036b1", + "webgpu/shader/execution/derivatives.bin": "65c15fc3", + "webgpu/shader/execution/fwidth.bin": "cc91c875" } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/abs.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/abs.bin index 16111ac66a32c2290a9d7f22be4b0e7d3ef23aab..4cba9b72dff4e34c6a8b77120479331d2a28ab39 100644 GIT binary patch delta 3347 zcmZ|ReKgf~90%~<6&2Fh@=(O2v|6^xL#HP;hf``T<)M@iT^UMUmxTJ2NS=C9-54P% zq4cPx<4kKh4b`%>MOb0SLud3vMcD89{@&lU@7Dd}-uwE#KfmAip5MLa_r7hitH~0H z>Ul}7@x;*_$F1djxlm5d$%J=)!mBsu&joWKg5+GJkf%ZaoRY3)c;O@!)+8M zr9#GWnnTax(~kE!eDAs37(*?ZCvINqxvk|nkNKb5mQMDP+R%Ku{<#M^=|AywATXVe zRNEU#2aZU0#Px2Dqxq4Bjg#!=*U>z1!hyQ-A12XU649CEQ02N48xF?n_*}Cp+z$8W zTFC1E=%D#9&zcmok9l1>ki2$U#_*_&7#tu!_KV+}SifzsNBFhFZ(j!Nf=?wl1P;?w zM8n@1X|%?6JIBHcn!636G>W6(0#}3mS<$X>uzO)^h!4N3Q20K`C9Z2O8M(Vjwi`A# za(cCOe9BfhLshqS;7(CIysodqTr$HY0)ARDQ=(z7k^pNv-5%&J>ko%x%OAadlqySv zqwP#a@Fu}2VOYpt{q@2{!2?O~%DnSeE~iT5u=k#*F2|}9DR9n~SnX1)RWjIZ)NFq( z^?-eF;ftGT&wCV`;0DtYtM#`X55Q)PPJGqTnWY=Ckhk|nP4Xt&RM>O#Jd4nM*Ms4= z$@_0Pq%S`VtA>Wmx+Xmn2)7!I*W0%!Mgfm)Zff6jd0POitvbi@L~V5%{Irj+s9t4m z>5m2DD~{90C@eGJriG<UnSn->w#_Kj3uN%HCp_*I1!&*FL4@jD>G!H&?D!*tgXLIKeqS3H+KrwMt>{tneMj$31t1-Dk8M zwVs$=CYt98?ijAGeCTbDfsE7v_3ZW~*Wq=+k{)lp3$}1r{DYbdYyAp1DPppPUuD}I zIJw3?Nb1vf3zl1y9ZJtqodsJL2d^&I>8mCdZXZ?7sd;vts+JfqZZb<>FRV)a||3+uXo+q^UhPHmHTsXX6?4cxidb%K<{66CrhT>=!S=XSnlEU z+dK_;P1TB^ut~r6!ns!YhZ5^PRf7k`2P{!;GW7UYmk2AGL;H)N@`Vhr2e95k%7)If zzDLT2=B$HA*9bXJHvDISSV78$o`AIqDI4K)k$Khwq-`F z4q zHc@sBudp=2z|g`w9!JW?7&+@Vq-;!)v(_hNGZ8s!xzIJdP&V|=q+EE{C8TVo-~_B^ zk+PYFob@YGHlHJBEp!d9EE{_370ZX3CuL)U6R delta 38 tcmdnd!}y|zk$EHIVmUz$1_p*ih9rh!h7yJ%AS-$DK{?^gH{=#b0RYe*3itp3 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acos.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acos.bin index 3765fcd2bef86bea9a6acd30f366dd0317d055b7..2ecaaa389a4e2ceca0d22803faed5a7bcb4c6ecf 100644 GIT binary patch delta 4264 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 OHC6|5va$dx0|o#cy}<#Huyj9pIQeWTFbK~ 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 L`lTSyC-wgTh?sb` delta 3166 zcmeH}+e;Kt7{GVDY=)Lu(lTpBniiondzqd4cw5j13oDHRNs@v>(Fm(Gw_GZ_y%`_a zLn1vIYlVn}X$evIkWiG?L)2qIL`Xrmm+hRd;OzG|v=77Y;rE+w&J442cI>k>G$%

R5R>&dJEvaP@zNVLI88n(Pxq;Z( zNS?;+bR-Ynn2NiH*eb0LZI#xqiTl}4nxonzHb=B6h*~X)PGZ;S?K+>&DJGmC%`W{W zHcgD8=_AdczK9K{XcDA(sOK7zmtE|Eo(m;*i#tqo*l08OQaHtkQPMOUF>IQRK1kY% ze2>_x#speM_-4oCSH%7@N=-hW5iUAP#|L7A<^i+;Msf9J((E)(VZ$k!-=sNa4q?Lx z>s-Yxbklzg61Q$?Dew%5U>{II>yTdVk*h%R3#nb|C|Gn++bv-tNPF0)yrf5!jE K&Enj_Xx1M}@0G;> diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asin.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asin.bin index 439de48fb3f165594370eefc6b01e1c676a1ada2..b199953eaf4b047cd64d437e40c0de18a1d935bb 100644 GIT binary patch literal 26440 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 dzV^8484Pi1%d{=5J;3Lxn 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 O*!tk_v-d;G6Xjob(*Oei diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asinh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asinh.bin index eda7179e75974c25204038952373bbf36152b4cc..b370c53b01790680ef0699cdb15d91ffd91e6147 100644 GIT binary patch literal 11664 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 Bm<|8{ delta 259 zcmbOb{lc7)X(OYhFk}5>Yhg*t=EV&P{}~t<7=f69nQIm+l+DQWpMh!delbIlLbE{}36Qk|q_u}1*7dKZ+WHPgWJP82V5jtrA diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan.bin index d15ee8b6b7f20b5e312b205668c7d67fb7f32b12..6ab0ba106a9efbaf739a2351bbf72f8fc08b5ceb 100644 GIT binary patch delta 1773 zcmbu9Ur5tY6vyw+n&zgPm?Eq>4TUr{DV;W}4Y492_OcA4veJk2LCYzmkthpO@?Y~8 zNM$ym7@1_ll%$bJqJ|*$5=8`34#Gfu*^3eD-21!d=anA&akt<7{O&pTo_p^(-%hvW zeJn|lerYOQT9@CZ`=s^pM|tg<2+}LB?Kjew%~~MM%g3^ul55Ogr#(4^ z5kxO{9|1G{`1KsO=D(-7pxGTy2)RNkNdsvlF6dQ}Mo(;#l@R^E1LP76Un6zQxD3X_ z@RQ(2pOMq$KW|R{_7s}6$_M!0@SHd2z&knb-U(mx_h}9Esl6nHiENCV_H1gV#W@J^ z45f+g^X5Za?sm}~Tgu-}${XHND?$&@?iHkZp&*4|TY1-?Dt z+;C|fGvc&gQa((74litr>Q?orp(o^jC)(8n`X;Up_DzV(->_lQRKF${SGmLD@|I{(JdHD%4+i!4o z5Sa}xXFNoP(+DO6x(ARmo2bXeePp^?Y5$piWEO7An?7V3eM_~e2RSh?=pJyk-9?UL zH@w<`tYZgosvS9!1u*KSyp>gPa%(ip(J*@qh`m1!L(?Og=If!wAifx(j~3C&tal+U zP+LwLzCB~I1$|2sxqg_d`XpA z^rk44dB7_3{iw{Qua8lgpN7i(uvBK@k~o$5Sw~=e{4O-e{H~&q`CV#}`CZ2%^IR|> z^IVBX=DC!Bd_c*yBxDOs)#VH$auKb~;H(MRuH7lu##FyJSy6O z;G}}^q>6TI`H1>qHD~(IJGsXisEl`Wfo>Bk#YV)ivM>Mv0C?~>@Bjb+ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan2.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan2.bin index 2966b4ea155cc9f5621ee0c26802df131374bbe3..0109ddbc375f6eb6e38da3d82ba7981991d7b1a2 100644 GIT binary patch delta 4245 zcmb7GQAk`@5WVlMT7zhy$}Zim($Z}TZK;xc$Wmd2fUQX&`LX$sR@y?6_9L2Atah#L zx+X}aTeG*ZLRBRBXlq-uW+C}#S{L$Bq|gebp(vEp4d`zSasMEd1EQwP6*Z6nxyB z!b({7TxhWprTz;iZQ_b8;6~&x!_CAMTRc~6A-8D+xi5^IwylIrkG3ny?EuPcq}&@t z%0Hv0z3qy$-Pv((yJ7&hh}`vYaqMTq{G|wyY|zmEpNo2KPOaMQ%FlaRqWC^7EV*a{yNm_ihfk z4|5f+Ag+7S;|hLXA#mTGOUUiNREZh6VR?Smi#dR65%=aSa(|umxNeBJ_dfO7Da7yV zhH&3QbI5&t?j*Lv+=kZ@H9SSsAm#7RkP^yQWbL3dKbrT_>dJUMSqUIO9qNaHdZW=w@UBn7KT&$eY zCvW`HS6<`CROA1)-0}=IevE5;xwG635x=r>JervH$0fEzC^0Qh4TgERsNkjWVUF$Q z5cYeuAezK#rtm*O$fKd2|)K zui@J9Xo?v&sAVccTCy-`i7?cNgHcP)j#{QNs3nk5OIT1#SWrt?P)k@)OU?mm$=X3n z&W>7wyP!BxOOA$G0u8m~VAPVeLvbNJ(2_$@OU{m3YMD=kqbX(zlORF~!oesAz$gd< zlOT+p1Q8^NP=W|0h){wEC5TXhFb+r%&W?gGb`m5wP7;Knks$O_#imDsFf{D;6#jIv zEE0raks#H~w^t*j&Tqc+PMAd}?D4nW39|xDn1v^-XAMtS{~An7+y6b9mbRLf9E{Tv zV4Ok>Ow*FFqo4_!rlqZ>rA>l@E1H%z2?}pCEg1(iEjc?*OU6#qGB{3}mJE%irLCqV z1JktR>>wzlhtrZlX<9ONnwGnnPlZe2AHG+D#=JYsx)L-NaEFP(9VQ}Qy55X;nCnk| zhq>|JfqIb_jV|1=<%vSnyN>v5>SmGs>G|r-0-o(?qpbgUt(3p@mfid`cz9R5Cx*p{ zNWs(lV&rmTpZuU+&SvaG?zVMT><5f+2 zv;2;1cug1AsJ=tdX}w|Ma^UQ~t@Cxe?%mJ^yhCog-p$}0>FRVd_IUT+(wU_Py#BCO i8?*F)4}GBHMtFda?N@rhpZiebo8be#eWaxZ`{jRu7}Vmc# zjfQ}^AW5MHji(1%7)7vz$1Yc<(`HY;CCJr#^9MAu zYLVECd2?nhvuaUh)gst6XTfefdsqiKQ|RC3kc9+f0m!F*Am95B`|WDH-SGjxT`hsF zft?=!`+6W|hnd|m=-J@}b{Oo?AXqbK11C|LC7K^DVA* zc74&w8$>c2MA-LO5p1F8Sp_y@u9tny39MrFV;SsHIc62J_L66nysuK&ch6<8y_e&f z!KTg05npox8!-EH1nk=p&)SgLPgngoh4Q{O#J*duf!%p69;X!7e0S8>oRV3U0{d+g zY&gc_)I09SsUrdD0P=F25c7Wgv$mt=>5ZDU&E`a93jeJ%o7_ZqaS3~kFQF?TUl;O? z8RVNayOHRtnF?CXrJIlG_l{dt`u*Y7W|y;@b7m%d&hCVq-N<=l0y)o2><(J%&nBMx z0W7enW0PLgf}Ft?km2Jbgjt%5Mg8}|uiy5ApLK)(uG-Ry!Ou#AZqTzZN; zF7q>PTzZO)m10Y}tz#}@e$K3={;i(f*OnIy2K~!N+&?i){i87YCxy{J3ZsAd2>p|8 z;#W+>{iA!)Kf2&pbV2__hWdvv^-l_;e-x&&I;AlBC#|D@grR>@82uC1NlZE(^-qeT zf6_YoN1M5WQvcfWg3q%2%E>QRm#aPF_53a zkY5P1{9IP26lVDajOFKdkBG7S0)|&h>f% z;qfu;b8x-hIdVPS7-!eh&h?})Tu*b`B${1MbK7#7T~EqEr=}e2dfK_3=C;uyyPm|r z^(YM26T<9zTvn$PX4exic0DQ=t|x@q^`vz^0K1+LW!Dqd+4cCK^pdj=UOUIj`mc_8 z=XlwKuZ}Ezb!5!eM`U>QosZ%d{LBme*a diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atanh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atanh.bin index d919b4bcb782602eb2184803c4a1c3b30408dbff..e6a190b35df52250397c14343e8ef4a651cb1b93 100644 GIT binary patch literal 21104 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 CaTqKB delta 1303 zcmeycgz-ZoBO}X3MqbtWKf75O7#J8qnCU;mr$es}{fF`yn17eP~`d#wjs&ALXop&I%qn%UsYZ37K-qO1Is5LS5>b+h9c^8!0G_Pl3gfrLI*gJ zT}-D-=0XCP&-J{1(8#L=j%$ zuwgQ{hI;BT6j3V&CkKQjyHMmf9R!i&)}qMmwLfl;&^I4NF5A9z@^lS#!Fm+YYj*c1 vp9hLYqlgCE#cXER4Cfh5fYeHW!sgYZ36P`&IGJ73d2^d(8aoTH$YTHi#n2G= diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_addition.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_addition.bin index ebd757c1b6b194e93c9beb5b0057cbc5bf43a888..03e1f4a57bfb4c689b1f647c816914fd946b4b34 100644 GIT binary patch literal 237960 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 T*7VHDv*`2padbA0y!^XoKvvis delta 1133 zcmZXTO=uHA6vvZnnl@ie%t|pvq0mJNvjc^KdJtOZ!3sSHJ=lX_p_d#y2mvYRAy5zx z1)KgsdMc)|wZ%#n0vZab(Uu-Ws<1^w{5U8oA~q5b4?>)om$ut%An@buo0;FdH?RD` z|M#1J=7P`DfcApt(n(3B0?W;(B#kby+#5wb4>{sq^?BnF$1vf9#gQe{N*q;hK>l;* zqG3uW^hMPE|PO2TH`@D^1T5O4DnE(sY?nUuO8&*3{!T z7EsIV1&)h^^*qC^0A1xi!#bfZqJIc8s~mmpYMEZ-NE6yC4D;=3nbY)gz-5YfN77N~ zEJn%(hFfAk*9>G^V$&4^I1 zI&^x(HZT}EZ1k^aV6r9l-ZEf?)alL(UJbf0*d11BnN<^)!b-z-P8Mea8cl0@* zji^+JN}rCXU_CF|Mp1i#VTq#lx`|H_x|--+OEsQnV7l~B18zd6Pd$*zMr iw;GMz0WtHv9#0K768(60^dyRBqEkDGCp!u6m(+hA>~~WD diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_logical.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_logical.bin index e386de36b7e828c02101d4889ff1f5fd443d9fef..e3594458f2569d32c2506acc9381deec17cda8d4 100644 GIT binary patch delta 639 zcmb_ay-LGS7)@fJPzYpj=nzOkhC+uXN)#nZuHp~XLaT^NA|m7g+&g$j!Nqc3Awx%Z zC+9v)9-xDsdka=ai$l2I`S|jkd(OGD4|DeLx@iZ7Vc^Z}PV)qQSYmG0Xe^05^)NZ9 z(AX09XA*vw_?);!JRt57Ul6y6hZ0YB5{<)pRALc}>7|2?+c5)dxwl-*;Uj@XC@?t| zm|FtxQHtD2NW>p)55-PJBA&Yy$=GYL-eYgTbDzB)du`TPh5SGfvOW}eu~NkSA+nJ` z7V{gc{SJ~~#m?z#PfsdFKT`7kgY}VeJ+kt4$?3P1T9zOFCT*+|#f?CbDo=U!wd9hh zuRLCo=3+&<%um@|Q7rR`nB_+Ohx|%y(5IuUtSQJ-89t8#o#8f$t6DE!|8bN*7JmWj Cy6XG@ delta 2008 zcmdUwy=z)w6o=Iqtxe_LL=&|{YeeFWtsiN!33BOBI+TvxOeu7hj6y-^R>)F0`<;Y;2f&2pnyLP%=1BFY^*Y$nVE@`)H`f%=f@B4Uu$NAg&*W{;S+D{}BaN(3@Js-|9 zx!I%-U!3f$=fcmu-fa8MR z-#YfoYh6eC?c@8c>-%-JAF^&nSj3D($eAZCy5|vuEj-haUQ1>jxX#w$BIlwl;bHb! z(uc!)ulY7V>MM^8$Q$* zMK;(H7Hr8Sy@H6Ox-eCRLE#-AKSxe7i3bI}d@~Q11$n+!)Sk!&MeWHf2i~^G&avif>9u%%AiG!<0B9m*Fb-*j5Os6IHt+%1?mW@nn zCh3_)SAs84%1hw5`;4QHS} z$JTJhK0|9b1Is4`uU1m$>XTT&41YuQNoA5td)4PI!)r^)p;}VbVd&B zv`4GeY0_?1r%8LHtJ6+b#pGNu2x#{fEfkJ-N-6 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_addition.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_addition.bin index d387abcd7f208df8c11ad5470307a737ffe8b81d..abd3cdde0211dfcaa507c9f6ce28e18bcc1a6d99 100644 GIT binary patch literal 194032 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

1Q6%QXNEmzp8EI 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 CZ;a;v diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin new file mode 100644 index 0000000000000000000000000000000000000000..58d0d40cb97dff8d220bfb44ba92db53232b1e0e GIT binary patch literal 82608 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 z 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 OJ&#z=Hh;leuKqtsU`Sg4 literal 0 HcmV?d00001 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin new file mode 100644 index 0000000000000000000000000000000000000000..61401e54700314318da070d1e00dcb0c29a23fed GIT binary patch literal 302920 zcmeHw&5q={l3u#IeR0RQgF5gt6l}mYW{h)=XLao=pz9@iH5klxW-~L3vnxG9KhOm- z-{3q-*P^!@zbv-$gB{yw_|5>hk`E%tZ zIWA9{|MK;-r!22eyOYZqdQ9c#Hm6!A>^>0hH zw=%vY@2S|{IG^`lpT@1M;%p z&gSRk{b?XvG)h-br&51`d}bt{;5(l`S6%|>L5;uYPaqlOy_Y{%UXtUj5Pu{4B>2wf z&y|<(E&1<5^Z5nadC(~A3%hFVP2?N-@7!^P#20dC6mk$P%`eL17x*>GE$J~=-oDz~ zX<&Ud%JUq3`~bW>P1>91j{L-5QSwWCIsZ_ge7Q7!;B1yC_20_BPu^a}4`qKK93aKug}^AzWVxumlG!|%UkL%Af~5{l|a;@0-BQF|>MkIyB1dA)4Zzs=>(m6!0< z$G^~t^8Nm2+3(KfOL<{ujiz$w}y zum4KJ^%#ijn@ zJIiZmBJX^DUfwsZN28FpwEpmRrksW*^3LbqCvPd9MRrN#ozKt98||ZU0Le7)Ev-j= zxlm3+6M5(JZ87nDlggL!$u#9EKhOGprksW*^3Lbal^63GEk4}4j|BS3a-_V}A$@z* zD3C45OZWf&7vx9%_wwh;OZArf3!dLTLte-~m!Iyj{AIMq@*hkEkxm~OcOsenmGU~| zWBro(=|^+%4>p6XfRDL)#AVo`=9UxdYRi%Ol+yN|_=wv}PG6rl!oc(FNn?IpebfFT z)|YTQ6ZuhZKLPNWT7F%9)92-5eZ&6aRL(fHWepp^FW$zp#5T%a#ZycEBd zz7!wR@kQ*q0PsjRFj`{OY$bWA+b@fg6KaTbN`b6>?YAg1~a{OBQmf{tu_F?cUCi*VN zuca^Pkv?A<+jlv=QvV6{=Jk#Ce>z1pWvOv;+AczT zsiiOC&R+Co`))2i!%kBv{FG>EeIxjl=5MX}(x0d5iF~QP>GQKVUM)SZ2X3-nsV~bv z+(>yHH+|nf);Gn)q-@2xqcOjhz9f2Syb&qbST7CFy87z=9BE3Yed#+AZyKXC|BXs{ z7y6dwzwbw1j@N4c8)-_X8@F$1ywR(^u+vnU>Yd!;ru1obhz(LkqOJ6E?>U^-?eq^Z^$)T5@*Ef2O=L#sLfnsTX z6g^k875ig3eqDX_@g%9%Uw=e$mFy|6`*En+A91@Kyh+)riiA z-?t~S!&Ex8KMMN_AP@B;%kgXJOZe#HXI%HxR_u>xKVM^hUf;)O5@jld;3a*(TqviZ ziC)X`ZME_Im*knMC-Tu<=D!-Rd=8u>`hsa_V}31tG0rVLFQa^)M|v&Auca?psI-5h zzx}ZsFJGt9$P>+}KL4fi&P4j#@BK=G>F<%?daCdC+As8&N}(_1FVBzWzGorh*xYi` z_g8)$y}$DJMxm&Ue_|YnOn84q<_A7R)A_|G!~CPYU@GMMUO}NR(xAQZW2~GiPS7x( zV!4S-z|WRp4~)Cx{vgJSasfAey%Ko!lD`#Rq+dGTkMSY{oY@ZRy-x#sOqECCMS4c# zSI4+D4R6r#q8#7Po?1ct(Jw!bSF}If>2PZritF)YmdMcc;WtD`4TVK zcP@p#MD_U)%J=!LAm-?uFYzL&Ps5#*Z=V|PO?JkMZw#a}ep|fK_0U{<^uTn6i)O#J zc%}P^4!qQM%WhK|-+S-cdV7o%x#zUBo)eY5?e-Wca?fdbJmE{>{i}Dr6_fYdSo7bEkHpvO z&nNFaeo6grO{aL3;}^=8b%d)^On zL4L^BJHHiPgoD0*Pk65XeiiIARi0LOaXV9=r{TKvuip8s@M8aZF7=OW*U@~tSH8rH z^ql%$l$H-(Q|=!r=jNXevBDZ2CBAVNcj)7Ly8iGCn#PfS`Fa16@2lLJhJTgTCq4|w z3A`xXFTWLDh}&BH!gYyP@BCJH5e}vCYUH<85P$T`&*K&CS93btn)dNa9j|hHBVzW& zqCNJ`Z-p1RioQO9>z=0mb?%kl7Ozr!jQlpit6zRwyh_i9@cxyd310p3Tj9lV=vC_< zaUB$RAr0CaKaW>rUl&MjP5X66b^a*7QwLmn=eNR({3Cr|C|=K@c#eK_z4!fKr>XL^ z!i(xJ#jh{Vl+RErh(G$}OS}*_=2EXRpJ?$*=1cL4t|mCH&u@j-)b=>{y*r8TQsspA z{eC(9cKUhrzTf{eCJmT={J?%kqqxo>JRpUselSRzk&h}q(NKrV_ltS zuHxzM>ye)LAFpR+^(D1_toOc|)R!cm`@UGbzLM%o<-Ra5hT4k#u^hjyzHxt()A!4T zR5UcvcR9YTmY)B9w1khj@3+OzOLF=~sXpS;-rBZxe&Tmuy3H8>}ciZjv zcKfovCoNt95AVY4&r9=b*_ZSvwcq99QtHp4Ua2p~*bVm4~_cYrTEgmQ}sl?R9}65gnWG8NZ+OSb@km|e+0WtrLY^(_<2Oy zeo>y!Z-F+)(tK%Ol49=va{Kiqv%Wr!lg9kI`j-6}YNh>!=Z@O7zfuVYsW1B%{H#d5 zJnlr-cWJ)`p0eJ$`o_OsoVMQ-7n7=FuUpHhrSG))ppQ=@ec@M9{@VOn`jY+P?+xbd zTU-8H@u{n?-XFoAd(#(wIh6`MqUVpPeOb=|`C*r(`O>~q^+Y}|Kc8sxL75NwF3qo{ zFXF?_Q%UWr-nA>*V32mv$=RhI7@#mrRlEIX?y+eefpN3A1(J>OtcF&$ctl-pC3j0 zRb9?f8ul%<-|uJ2X=u_;m*eN#Z%IFS9s26?Bgzrh2~&NS^K$&WKbPz&uamZ?Q>j0C ze5Ra+Ci*VN&+8l2?*uHRp>Juu{rj168k*?49KWu<+gravoSjNxS*GgvS>!Vlsu716 zjrr2PQ}skXNR7B#iqCZ4df$Uj_Z$8)+Hd#|Mxh9kkE|z=3HuGT{J@E5`W)5%F5lnS z3#MYe{}mK|fi&n=_%W8GyZwLb{yr@~N=)Nuj3?#z{^Y3@$RFF|x5hKqj$=G~e;)$v zVyc|2@g!GE=Oro$DU z!xPUJ;(mMVpJD!m_6120FSf#OjVI%hjQetU0zZk{*7(cdS&E-gdq~^$nea5%H^R^3 zdF%dhEx#XMM(@3UJjMP=!i=Swp_fjB)@xIpHx7v>*{z&;{ zd%qV)+z&jF*6@`1Am>*3t??vW%IzJvA9xaCzylQiMKs+9m+Oy~dcR!St9HH8KQW)V zm!^2?&x;XXeSYqbw#r`y&vajT?4RtqcA9z~C#_b+B5uWLLFmZo`e0cv=;<+`x z^iR?+df&q_=BDxdCw;Fs#*_W`0t!5l2Hgt3HJ)Uj^u5CvPrCjxcxnam$IC#chHiwv z44&onx~=s)seQwK%RHXZ`-;v%=BB5%_cJx?ce_7iE`IVp;Q3G(e{S!&aO$5y{?`6U z@vrp!{p%CuGt>&?kL~f7!Lzhp7x{I9=l1x^;8|L)`~E~OX=sAy_V{@`qxUMDqI1)T zpQZ6<_#Qs+qz-C({MLAq-|6e0xbA7lTqoSjf5vUA{MLA4 zoW9rf5N=;jbtt^9G+x?XKaO@p8V31W`zQA+(eJF~-k16IihPh0Y0$0k^LRc!6Ylp? z_-Cm<+TMGwurK3u0bK@9{dpY8@iKU71@gzsK&OUogx?xZYOnhIovwdo+zfh*+gACl z@#Owp9WPCNPainC&T=cy@qdwLkt^_L@4L$Mdzc z{|fud_Qqe!Ufgn$btD~Fvb}uTotW!8%Fii?54$sz44{JfKw~#@pmWX zcv$;;39v8Z*joAP+AIC;V6OiHt`g_H^4GH05f9nptO3k{ct$DnU*WH7uk=0axP6g5 ze?OjAIv@fL(q3%ep)uv+_5C)SArSVrz~Hl;@z=Fi>G^VGot@bQ@i0Qbovv%IW4xi+ zMdPn!FYaH}`Iq!7P5!;{*RmJcqqN=|S?!32tHwhb|LNny$WnBA*z20TMsU?;u)UJs ziHgVbqxueet!gjWqqN?Oe0%GsG<}u+%fr<6~-{C+!Ah#^U_`zXSbqh zdoArh^y_MVJq`CmKIw<=oiFW0en0;HVl6)KCR$qG2;ZGb?Xq9~TK3|0pzdeGb#Gse z8++%kWiPgaYA%pTxcW^7HnZ`@O%Z_o00q?|;em<&jDJ({o*R^H$F3!|9_9 zM|@1heQrK8opOi1-izy?&)!8fmF|aMl;&UG&y>^9#NYPIU)Ns8^X1eJ z;m3w1{u%gd*$d;o()#??_H#;{Ys_*3;lR28d|nHJJvT6 zKa9{(`0LtBfBr@Oa()Fx`$8IYZ~S%brO%hi9`ENnxT#;w*DHK)@7L3Br=LgP+xuUp zi3Xc~vQss4JYF1`P3dm)eq|I7Kbbk;>GVf?$;X22^;2W4tU|T$isMlZukFoq+Ts<* zgB)IwUA)f;dv(UoQUCTj51Gl*X%(zb5|D zFTWLD)W5~g@3Q?PW!up2g68qM_xna+ob=w?BN=@D_lA5tawqZkGgALTKB{j!`bPwV`x@FG0o{nF`pg7+m1 zzzur#&X;(x{Lo`AJ=CGyO)noTH(dT7vsH`#|n}=I^(y+ ztF%550n`~TH~Lqk$h=c-kLvo@sMMX~MR>&f+0y>;z2JrM+FY9A5buXh@xu7b=V$-w zoiF3pT%2$p^e^>~z2k!TCFN{|7vWagZ?gUM3HZre3jZQn?jKPP?1}q(v zn}6MkkIc{Bbt;Wlqx+Kh)h|CEze?{Hm#zb^()z@^d0*j~G%n$yT?bzJ^A5`Kh3hdi z@vnaQ(!Xe29^SvXH4UVQ>i$LLK0Jd0FQh?xJ zwb=J^;`xEC{7?3h_r-qwFvw^HUQW)jt!(|Z?IX)GCUM6@GJYJ}3;DLQA1k$EefjhD zn){y6)cc@E`u;*}FS2Kdo4{f3{I%?5Td{oqE4CM3fAZ7{>W_ZMgYYX7wZ5Ed+3U7= zxSjo$sl5dC*Zz0&=7ar@%9N94!1AHZSn{Jg!Q_Z?iruAPS8mHMya`w!%w0f)8h zMe#j-9v-(Zy8iXaQ!A)H_RC+_Ug`Sg*k0a1ra?yM@#)U^>)I<_pBUTg!{AMm*k!-` zb?uctpBmfi>zV9jXkxGZ^7Hn(_x-!l{l3){*Ef95#9p4eyEwV7z4Un4`#u7+_od}r z*IuP~xZi#X{y>o=;2`Zq<9+@8vwN>ck<6Ty#`DPiL5X|&{CnrGYp-;FXuN*7ce@}SN*tuU z*q?{Sl#4IzXX9*^aQlilbh+ADouG`3f2SCcy8VYYo?9MFmiI~?=n z8~sqWuU2+Kxv&@F?XeyOM2G?x8Bf4p%U-bGVXrOOOW%(TE%L|T^6!nm zuD#Ot>&Nr2?R}3R^`H9k=k0at_iS#>k5+!nms9%&Tr~c=_A19i(qMo44DCczRqLCk1LH)5`e%@YhPXtXX3gAo6 zmme>b)6m3T`{l1?FO1W#$HTCXE49~t`D@vW+D&P^5v{8v?Q6gMyuBWuISw_VRQiPP zM_nlA7ZDFl+8z7juWK*;`7+t#W$@Gr>W`O!P7U1|e=U3Qdae3?3fbet>%yPS2{=UQ z{{8XSvKOIVT8~=pJ9Vi)^jmNGeZ*f!-$(qj0XDMfC-UoWM9g=BmQJUwEZqRRFCj-{Up>Kal$7^GM z+1~eXQ@`Gx{GIztGG5I1%dtPe1(N0VNl1U8@k6v8=om|2&ZZ!qmp0SAQXG)AhEozkIn+K0~b{{y6vqMSUDB%pcs}Cu9>yWkAqK8 z)W@OM_(J-o`~SxN67`pfzZ`tV@9b$MeERm6(s(yoM@;ZI_~a+`amf2i6vte}OQ%WO z^7?Mr2c3>P4n84RABSH3W$JjBa4{pWB)-7k4t{NXdi9s7>vhx(UG6y%|O)rPvUYJpI-fi^eN4!zn&?dp^4rH-{ay=>fzJ3zm(?F z(KtNumxIskjoXvKqY^%Oe<}SQRO{=ct^I$!KMMI$JPv+@0G%fO5?#HK-?zV{@2AD% z7mSC!=B)R@Cq!D|(6_&o#xLdZSsHha{NzpZap>D$O6$8X1LV+Ap==?_{L??{YZw z>Mt1Im*&%)Ppnfehu>OuTdUsA{Y71Wfj{|v$tq%wgWnbh=`X;0ElS$r|Ir_<6-Tss zd-WI0&yM~GZ6}EvtM$K~`^(WEb=J@J>Mzuq^z~izm%jCNhAZOvdy}(of6<>$zc)K< z#lNJ#aC;qArd)k_eU~$i`tyVD5ug)}zk+)+Zhia9)b(A1LM1$oa@eC3Jp1;SQ}KO! z-(D2`4*OrX|E>7+>MuM#QRheAPjGVh3n9@M2gP4th1F?k{lyE|7^hp?;d{;Bx4)G3 zzj$vs#xH=Pal7f&UubD6E02c`Ie zeDD{a#)(xhcN}~|9h%-?szD!zs!xR(!Y*!$nqr|di58QUVlDK z*YW?@?@dUw$Dwb3DXqV}u)`Rd#MOgOz|_Yf?=R8szq*Q-PO}@F^xr?C9LIb0OXJYD zzv$~Pgwyfej-_$v+h0oiz30CNoc3QwIplX`96I-x;{1s96yq1-x-XYo1xH8wabfC@ z5McZD=KZDB@3c=X7xwQ%7qxNd)n7>4()w<+E|l~~2Os!( zS_z-LzdSxuJ!?^_{Zw49d%Uommo&Z{e2e>uMN z7wYf6y{<(g&CRJkKjMD*`2A@I#B#qs{kO&{|9<-C(?6a5#r*x-=^s!3YUqEQem?zX z{!XX=ZvNm?<`nx3h7YF?A42*YneWG#hWU-T!`$%6-DLmK@mJFKS+=9O{8(1hVQ4jZ zeVLWox0Dz2mV5CfgZ%y%Det{}DKC}(_EbmS;6LyOl6O8oFYn_8@{;^f|LhncecgY* zJk$M#CjKy=pO-h_d!M{PuTJ$j+>-a|NwF$oS`FVLSmE^5IZ_3O2 zlaFWQ4*^e^zK(CSPc6ZBK0hz7Y;VzXeKDq9^2+|0 z@CowCv?ec?Gf;l>pYgqyFXg53Wq)zIyi`tfAIp0$KQHg&bJ|}-^|}f}TEmy*dKo-T z@OZS{Ni zk;djUv^Pyo@HKgH-IvSw-pg0;_3aJiYgCh$aUG<*_wuE@CVJhFDO^74Iy z_aBb4_ww`d%J>lGBUFD#Yw~(Ial-N<>FJGpDKGF$`?nw;)f3VsdEqzGALjC}!g5!LCUfwXCyieYsS1Rv(eqP=X&+e0V{yI*oUnob)%YHSa z{u`|)It4;n^9Phe`kMdj5BKt=ywu*p_?PMn^2xL&FUkRhyhwxI%FoLy$CLWL22Ebz zN^;fveWGj6yM8g1{+;=Yb)xzotiOD;GBHj>GS9o@^;kb!z#m*8_8%Q{pL4-Z_m&gu zin2~87cZT@#EYH}IEJ3SuJ8QkBB{Rf%gO8O*3%p4TmOB(6o+#8d41h_Py>B~2c>c@ z$5-^V^Tl20i*ZwJeeYe@fj`_^j>a$?NOJmksp&av^yQwH5ngIlis-gRd9<<;G8uzHevBQl?t}%k5U)g?Z={rBpr2a6!oV-H^=_foy;=a>2-ex&0KT|cS+b$!==&q?Z=A79487pbu*+1c=}S2F7q2+p z`uWjRJ&{k-7uTV8E&sf=92u{qKSR!`RMYp~c`Nj~x17Ab?s-==N+*>=Tyt`Hma{5UvZpLpRdd7n!bc% z{rygeV^hn|w_mq^(%Dz)Q%Y<4@_mDM3XV%l^QFG1UyL{IwlB)`4}-TV+n4WKjGwn}7*9fvsZ`U~>xmQL&tOYGug%Zv8^)7U^+djszQ`x_T8c0A zrF!LfGTQ&-0N2x+zEtk{6%_g+4ceM7^(Ft2`x)Mzh+n3fz9`pITd_Z)_0Pt9sW0Ii z_UDjDWj&Ek(--A>6|cyY)V@DiOer0{=W%N~Ztu3hKe|HgKRVXNNBU1mo)|0WV5#w+Mey=GKZUMZO`;JwL%lvxtc)9uV0(gbEnCjCnU*aX(Bl(;D zzCh`^7VqzUjtYF2E=S@e+hYlj(sd0ly6HBL5hmc?MFRo{x{N_LVQSW?-7wh|k@fWAhbE$^cs6582cfQ1n z#vyL~EozU`_xF;%A^&x}D7RZNN$~2IpU2DXr;PB5)=!-()6*JWY?o(Hv`3^td*kQv za_>Vl#jE!?1v^POC0^7L-19q!7u$K5OEv#Oi{o;AyziZ#$II?waH&}c_dzRUx;6Gal(Bi zyg1*eJ@(4a;}zl;^qx!ifmc{xor@FhE8&H9AlpT+{JejK^+M=9muh&SJc{5)Rn z`EAp9zx28l{P*5^6}&F!AKCuHT&nq(_bZ%OL2^fDe2Evv+Xr4b<54$mM$!I|<5j*e z%%$($zW|)@FR*W>?;S7hpZxRMn*kCxym!1v-7uaI>ffB)30`);P&}TPyx$)F398}M z`#1~Z4=JbYAK^f)@j^YGb~bJRUS2*vk$B1R1pH(!)%*)`pj;_muY8FY=@FhkLhiYA zA9#)CL)GIK{EO!&qxGC#`O?4Scy+E{;l7f8QGNRQoNT9S=a+bq-5>q@5%Fv;)$pS7 z)_-3M_LwS<#0!3b{&6l&xKG0i?Gg1s?%w$lFVb`Lyq47n-?=76Ij!NvcwRt(7t)}; z@$-1e{QzZLH2gHY*slgQgpc>V^CezrA83yn4paFWUcd?U!H;_9OT0+lF#ei~i%Tt= zJ57~G;>G%()A%+0{Y$z(*J)S21750xoAD_>inCmO$&*K&Llari5|69}7@rue# z^zWCS$16PFCVceY6DVE3j@S1y-EU}uSHFCT7sfwnd#sPwz0U!G@6zQ+yvW|}`wwn? zwd6mg>(~8@YqKQruYUOoUgCL2egBFOq0^1x#q+ks@S^%YkNm4wzVt7~%Rld+^z`?^ zWqz$a-n-8a?RV*NBwm=$A>K>p*>Q0TVF2>^T%89k@+>eDBt$R_uBj2znp$M z{cN1z|Cm4NgXZ^d&G`SL+jhbD5V`61kv^Ij8Gav0;*9pTG+*i(##eRq?WKK5eMv6+ zyuPl!WXJjM>8AcLznr|jj~D1m`afQ#(hv_)f2RBA|85oZy|@jWZ$WJBHwj= z*I)O^>ubmRE%YT++<#kf?r6+c^!4qRM5^V_k%Eo&O8r07EAWxY~g zj-%D>OXaTryi@8+mbc@#y7r}V*I(z!>ucBVTj=}cLV6o&EB427d|Ry>IQqKniCyoD z^$qWzQ#L()y+4Z9@e_TQ<4b+zc(SCQynbEZUVo25_P@G4Z`GIboBxS@J-0bu+Lz@Q z@v4@-Q8|ge%kibYn4i^dzg#X6Gp~ewm*z`-$-c5bik?Tg40`%{`~7;R@(oSwyBt5S zuYGl?N8rSjH${*c#Ku3z16U$hg#)BNZ5yEH$q zZ|INe+V{gC^`-Q3{Jg$lepE|e_T!PhOY`&khWQcvZ7MCrD=x?TGwi(-U+N2cB0f*m z6Zy8LFX0{H74(=&HGOeE?AcemlJmh6+Fg-q`g%QaVjU}YH0DcxCK2TL`Tgok?bq(7 zjOPpQS6{ZTm@niUFVEYkKYM*S&P;y4OVhXScooJQwe*EI@OuBK|6Piok5^&5!Ts@R zD%I>u`YtzaM1LpimHNu@##B9#Pt&(=e-7gf=rNUQ`of>lK2rRbTL;M7*S^mc_ears zixXT=Yx*)?tG~Y`^@ZQn))(c%&am&&e5o(wsjV-{_0(3JI~w!z`iA*FiKP3lysr6k zs+xI1m({C1Kd-MGKiASXDksr*Ilk1F;))zUN6#yrq4cz7Un+O~{fUacB0j%8kw2E{ zb$!?W9R;Z`+F2T}%6bA1O<$DjsjWD7H0I~^mF>5dzEL@eUd!>NzWMeW$>VIIr#1Vc zTu{Vkq(NKrrM~21qy2=>#4o=mqUlTbzYLxx_FaxI^(CC``|k00vaBcR@%XIiOXc>r z{|e*z+WHb6r_)mNT(k>Wue2{+AMI~{Mf)nz>-O!nKML))q@TQgUElfpv|%r*Z+ z`^x$6^!JSl`aZL~&qDsi_}AX&_{BK)|1f_sCYZmO_WjZNKHHbbg!ehL{4q|p;JecO4j2=c(mw4v=b3Tr+!*x92hYyN>Zig@Nl;cm}aW5_5iE&zL z_b`6j3SZ($xXJb&?WcAbZckswb9?G2NdLq<1@SW!aNpTp{Zq!z`%nyb?-fr%AhdV* z>%CONlb;t49(is@Tjk64&UpIq{Jl8hehp9Hxb|~+IZm4^kHnMOd+6WM{_mw4o=blp z61cUhSK>+j5}qI3izDvW@Z{?Q{1p0bm7m9RG(Y0!@DH=8hNs67Csv@`u@Sz+6Y&n? zCHU99w1g+>g?|Flt??zEq=(xtA;)whAjb|7y0pEM+bv$1ND&NqgU2l)C_~(H3 zPI^ZB_Z{Q*w1y|Q=Yi@m{~6D%@+F?sKErs4^wi%sn0j5qlj=JY`EeHCdDv+Blbf2L~d*2>k z`X|;O(*CG5p6kEYmD+K>JQ7dx6Zii8g8muyr=@yrkDtd=u76H{AB)DXedYUJ5hsua-5X!p3hQ*HKU~#b)@=45yKKMRz^_QF`Fbh#visduwHMpz-MnWB zd)=#-v=^24u)4ikJr4(NTPAx3sYksZ&O5?_76F|TrN`AFJzO)yi z;nu$+d%c~(uT8JpD_S>7?6qIMv=_%i(Z1HQ7y9Mxyf2uK1NG#W_M-OV=A#|7FGyo( z(!Tb~m-dS0yQ|s@^9pYnw%6YI(q4p*TR&UXUM$DiQ?{2+yA$&qcW3;(z1;WvI#9IgN2dHXXc z?1ePw-uTj9gsWVS8sn_te=A?J7neiiWcFz#?Q47cwra^Q?UkP|FK@5C&x>JSiG#Ek z#~J@T<<|CcYksYLNjWw7_r{m@BE02zWBK+)a=Z+lCh>5;d}%LgU+(uddKhn9xV>M{ zj*tf38$WL^_r8L&7vnOtqFOwpcD23l1;T$?$uI52_4wyst?YzyOZI}^5{JF=^Y(J@ zTddl?j`0S0q{Ja_uQ2~Y{#LZqzPMg7|JrYyl=ecL!hV}pc0##_y?kVMCnf)s_QKt; z7pI3-v}7;HbM#+?MBZL^q(r~WDFWHOg+24DwGM)g3yuD6h{uS-_b8b*C zU9y+=J}YSM*co5ii|iQ28w623`^fS%dvW_c_V+p<9y|`xUWBJyKfM3@pj_^gq?)}b z-`BIJR#1QJm!G$njE8I4%NuC4AHZKp?C81gHovqN#wQrh69Vhm3-ZYRcdvYDFYY(| zdeqwXqWX{b^?-x47wpqV``Yh&uW399IOOdm_iwBf52Jdmp#In|U$NIYZC`Is1XX={ zeSEmz?*OFjE8vi~mmJU6w-fAt-Cp~BPdT+$z(LxJ#~WgOV|jZ)4j%%opyt>+U)qbu z$*bE7a*&m*q3CSyd}%M>(?|aWX@b2X4xO?c_rjOi`{n2DCCBsk|Go#=eO%7<@%;BQ-DhZGul@4# z_LATG8sn_te=GmGyr zJYF*1hv(5`;pyq?{uRyZQoNq29&^1jejYFTdl<2QO~*&#c^$9toH@m%U%tc(^NrSc zaXm!L?|1^Q-uV(Q_(zIYWN(*Ydb;3WPgI}TA7uscN5A`}@_59xuC|y#!uxC^NH6@amVZ;B{ICuMY!|N%88JpT|q~kD+~$e$&&1_IRf9 zzKZ8pChd;?_!6&t|2Q2ViKm7a)pI7Yq4iRU7wap=U-Q4$t>H!W^xN*V_>jlTz8@RM z`&M|p41}AZRuF%@40LK}XMBlQzCG5*i|To}fC3k!L3`s%yySWg%RS7c*W2UvzDq0d zqIMA0bLQfN`$~9meaiUDTus`e&%GKykC)xwMDYuH&!rk(@MDhvzK@+Dr-^S}!&fGF%I@#0*5z7725(vp99sjMKm zqcgt5i`%1*_j7T=eHvc4?jd4adgqt$Vtt0WRKv^Tgpo^Ky`0ib+)wBILB@Iv;R=|0+{eBN<0O#X)Vj+Y$Yd&Os- zym!0+%h4WzL`w7VE38kXxo=PH!@uPIoZE529q%149#8y0d*u1aX)e|9qI!P+3vk7F zx_5rQJ%;fF$A5hH;AVOquZJOzSHFCT7x009Aw8FBcmXH)E&Qu@zQl{<4gN*x=>1m5 zn4Z3lSM=P;3gVA``FXtLcy&5Hq;klA9k1;_uf_Tk+N0F}*0hEf>hUhc{?$7_?_Vds zUU(}$GQWnG#|bA%dj!+a&iE29#P!zx1w^(U?+LGOe*8sxMf)QiV|rTiFRJHEWb^xT zWdArFABnGq7w0>BnzXxU|5Rsu*&ZQ(+8$fs)$hKzG;Rht^LUN+uRck?nVP=tU)vu~ zP(XPQ{bMWtBGhefoZ7Qre%`<2^Nv<{eP_Ql)C%H{e))O4WW0Z4y>6%1+vD4rATl(; zt6zQ|FB!jX$BA)xx{g=B^TgDCK~9Mm<|AqUSRXIcQJ& ztKat=Q~wHb=JAs8{&t*z?{&QTeXl*mE6AD0E5v&mU(ElWh=v!J%k!bFzt0!ezuMw; zX1vZnU{7N7%a{Izc#HT&^0)G@_wu|Wtbet_i{e}K-x@A=bjFwdMfimIP;0#Y>MD46 zMtcNgz4EVpkLVX8{C_il64TSk#kY@EH^!5Qc@MjGI_@uQg@1CDqTcf>)pvdc-bjP) zjW2CQIJocCtZFZ7Hhc8i4&Wyw<#KXLd!c^QA9i6c$RqLDD?e{9w;#yai*O0^kJ@Q1 z9#TCogQr$df4mHIYUs}Rd3(9}UkCR3av{4In%HH(d<%nFP4)-%U+#HaWUpxb&*iL_ z*4h`#@d^riAq~1WzO+{~pIg;la3Ge)3>d*7x>vrm7oj2huX^o?$`9pf?Th6YJWcEs z){9d+zJGq+UT!@uYG2XwZwFw#^mThh&&d*d?Uyg@m5+z@>_hD(ly}`;+xwnE+TQES zFYQHmy6-h~(7sq2OOp1rUw+)?WML=k4X*kL$o* zQ9DlTwO@YTUT!~^vlp%VJk0+7S?T^#JlyL#hKwh`LD~!WqW?m=6+P^QzL+TNGSyym zS9rdR`Ex6J*y}!f!7gZDNVlSgz3#IY#Xa}E8rOfdvJ=YH>_u{HZ$B2|SS$Hu|3%gg z;|;d{(28pI;`#zf#)p9od?F5=zSI19d&&9N{O>_Aj)O)IdoePSDE=nx#c|5MFBQ$d z4tq&B*J{_&UL=>?zj4^BZ+nID{7BBqj3XW@fKH5ueD@&Yp;GAm?89CPhBw(Ov@i5$ zt*B-%jQ71ZEdSp5`Ti?B|7v9?l&jebc0xYczwebV?ZxwD`#q3&z4zwticvWa#rrgS z@xJ*B>;`-7oiFW0_=NpYQ*oc0PqP=7H%NQ!ou9W?*l#n}4pZ;b?B(r*6Dw%$*cm@> zuQ1*qh{E^UYNxN;Yrp$y5dR79fJ5G1p?%f1k1X%Hy(qW)zq59f+AH87?L~1ctj|k) zYo|4PaXftnh5Sf^?u{?)#r6>Mi;Z&bq zx7U{o)oZ8~)F1ohTNvW^zX*~r-k`WM|N9W7`!##feP<#+w)4FW_*E}5{&xeWmK)pK3gkwzNn5m1nj^J$(xwIBvSk5O;*&OgZBp}vB@oY_Cb`%TgN zaH+o>`KcYv#=*j=%wMAT65%iFYn;CBFJGTr^(RBEBK|n|1Vw!uq`&0HyZ!kK%Q<)# zVShRJgh(qKq`y#YZa>@x;>-6l$!jS4i%+|ggYWUEgiqdI+oB+$EulGmw zzxR;(-BCXITfiajFK$2kCj15ZNIM^Vj{uz{@g=%;BR}sivOiibo{%P?zU%SjWuW|q zCVC%ykBd90hfm&L-23k?zVQ0puol()1@aIs=0E$(!6!so;UN8m>T%zLbpC>I_F7c) z7x)Ru`}?2aF9#n8#C}r`AL%bti`x&n34dWf_VER19ehHfHV%1z3FFEww-CFO)ybr%}#YRP&cs`#XT&Q9gNs#6kLtoFB2j4Qo-&Us#?%tRlJN z;1ep9aFG5&g}eRG(faObU{fqk4}W3gC8=b8#8X+k#?SkUe13HJi-zCc_|jkGc$fWd zSc@LOK6WZ+{`_M&lPn==SWxUlfcxi7zDGX#AoG-JX5; zi-K_{{-TUu6rtO*4}VcG?#f@>`}^^HS`oTE`|uY9<4*hq(qX*I>$<14=;1H0h@f5h zOW4nV{%I|$`3uW4coZ4GgHMRG!ok8Ezkh^!5MMZ5{0?2Ke44-Dd6x8-gHMRG!a@2A z`kmhW1%3i~EPdsL*8HH_k!wu-;?B>Ufy+o z`Ff`E3{Cvy;Co!$Nj-e>{^GvB96b-1Zr@w|p_Ko+ztG+8f8s9(KSF>`E8(N~i+?|W zDm(lojbD*9D%oKxplVAL%drTw%cT z0N8CUs`(4#B)QCg#^c}^dalxW7ZBk8+Y%_aE=!I4?P`HrVsLdR&iyzu(=e#BpKs6OUtq zJs$_Fe<6URSBc{d+w+pgvB9q6u+~*%mvPv6o8%QF*S&t{7Kl+{Zn?q|+^*w*meTyK^*V8|_64uj z+jSfof2~s-h}_MR)8k`(U6SJ|wWH(E_-nmR9P4qHain&199I1yyNUzT@hGf(P&@Gm zs#X>|EXPxZ{o>PyN(0WhBPrt9$_mU6ox7O$4(D}gQZ)@%O ze57><Y;t_ zK-^fr3+*}%z@_xM=<+zA{qJw!x?2~bzgz7(4jONkBwnE(h~#5DRz9FzTGysHw%TErFJ6@=x+AD0lN+rGLv*G9~eh$U-`S*o{yt+d?detU`e;)!2RB% z^bW+0U6)*F*Kt6Tk9;S)aj^Oq989{5gI(VU`z3ukjxYDH`^8Ct`+9pm zA1uG2!=%@V*Qm-zcPQR z9UTYeBVJd~`d;Dyew5a$bY2O^C4HJ#scuMo*V}bIz@Jnl}f?|@MH6MFxa{^j1WU5Vy|ato*-Ep7iyOz z@r87ft?hYS*7Bu%9-AIV?EFCRrJr5nQd)0mKgpMG7Z)u3w^Dg5T*~XG#D!f~55U^` z^f+Sui*eM?uE!DZqIkd* zFpl0Wdu?1E`tc6NjrrBsu5rP9T}x$cTy(#R7tycQb^{l1Z^1aC^>3-%+c+wXi}oYF zkX|Y+T-5P!k=2c(-u66S9>1Ro1bVdB#wC`L@W!oIL>-||+uJoR&@-!V!C>oz3wnGj zl@?#%c-Ei5rJr5nf^~0keL*~mg@udmpZL<-u5p3D?CY}nbH$gU}BpEkB@T(Is_{hyVsa3Mb=U*f#

*ZxuW^Blu=^3gVC!vg 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 NGgSY&&fdqt{{t4%?fC!z literal 921752 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 z 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 Vi#L|f;nn&Ec(r{U@9ppJ{C}bIYkvR$ literal 207864 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

kbPh+Gkr~0AV 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 b1Ww4cxGeiVyzBWSa6($~Jw30N`uP6=7)Zs! diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/ai_arithmetic.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/ai_arithmetic.bin new file mode 100644 index 0000000000000000000000000000000000000000..658eb46d3949a3187f3ad615d3b089ea106f5ffb GIT binary patch literal 831992 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 DX8y^= literal 0 HcmV?d00001 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_division.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_division.bin index c05b627fa121b60fa8315e191c90c0d4e9bf27f6..22e60bef813cdae2e30d06c197e513f08b89c216 100644 GIT binary patch literal 120856 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%0DJt>>TcJnQ*K*NNBjkLs-F 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 QZCyRAAG_msyw3Ok0qFtk literal 120856 zcmeHw-P2}Ob?14WZZF14O`IyHN^cZD&`Ct?h+zbq*f2oTFdv~K(ic-@#jZGX6@u|2 z$qdz1Z?)X?T!0tgl@}OIm?&r`nkd>B;waJ(MI-8;Fj|FTOj2=1o;tHW_CEV#{npw0 zc{IH5(~uPXKAyAI-utZe`|Y#O-fOS@uZLlH5&if6;rQ^o!!7jR`-XQ8w+^?_fA6Gg z{P+FC2ZmuW3?s=c>Azv$_;dd61@x0H4~yk6>htP>tz4oTx$O~yzADRZ%zJTKa}@ZZ(SVB z?vp>t`^VpK;tkn-@=JC9l_y@A-6#K)_lMIL|EqML{WN!<{Z-!|GJW>j?0xdn+?mMg8R0+56<*^8SfGKK{q)`3LfIb^p`HKb_qtf0y?cXIEcJ_u22|{hNRM zt{-Rj+5cyg|8xH3*T-RX?ea*{8`$re9^Ef-!G16Azj1LO(`UaI_o+wNpYDs_%loIt z7pD8-_v(IOclP_-efI0jeewIueerv7fBc_C{p|PR{_>8z-y7KP#r?&Z)o0T4iQmin zgKD@ds zJ)iiyykGj0d0yUsboKR2pZ#6jUw(J>WV$c@&h8ifzQgf1y3V}Lt`iR4zxY6^XJ9{< z_y61C=IlQExx8QCK>S?XCqHNJ6Y+C(fAQk1eCBm^zwiV5dFH<_P#{o!@8KfF%%N7tnv1NE}~k-UsUfjoZ$A$jSifV}ii;5yqMl_UKTk|+B^ zdG3FJyu4q~b+-S2@ei-F{gFJ|A6;krgX>~{a9!*Vu8aNAb+$jaF7^l4#s1*B*dJXd z{G;+^e23)O{@}XUA6@7E2VCdxHh7)v53iH`;dQbs8{+Qa9#Qzbe;Pda9#Qz za9#Qza9#Qzbe-&v%4hq->)iiqw8#cbe-*wuCx8&b+SLaPWFe_$^Pg%+aF%%{%1e7KfF%%&##Zeq8xvbAFBK1 z_>KFctUl5&#_`fG75B^WBm1Y)FUFtJPnG(`cZj?%X6{SBRo&0W&(eQY_w(_$^kc>S z>bsu&S+;*wj{nK8)&27Of%~_t{9=5IuCsp+IR4G9k3;!AB;TvW{YCjb#eOdD7k(Vr z&*lB%drtgZ+%LZe#m~k4@_SPJT->Mcp!_?7_*d3n-WNYt`uX>;__?~De@}~_i~FnM zdtAm1<^AG2PTpVT{c=8l{aoHJ<`d+7mffFl!2Uky_&d8!{x0S_#NWmJl9%$`THY_` zTiD;l{c^rW{9W8H=X=E8#r@J>;_tcp?C+WT;_sRJ;_vEyK3^vOF7FrfZQ}3Z{;Hg> zV_ui{OFXc@%lpNAq4+zyU-kx%Kdq9|3o=I$~-Ucm-DOa_u_sz ze=B~Uxi5Y%?gPKi-Dkhg+!w#k+!w!B_w)I4@%!9;?$3++$IJP7_Ir81oZn}^7x&Be zh4{U=U#>66`p@mj{}C6m{)4WQzejYP{0y&?f6;aJE4t49MAv2fgz6>#A$j&2y3YPW z*V#|-I{61)C%?e!qWUBrLo z{b%>vo#$kZU%)g~F`Dwg7$q%mVG`8xHy#ut@X+w$=$jSxJme#H3 z<mZ5^^xKQzgX+#7kmPjexYJfSeh zAI)Ub_#(w1&&wg4@{Hqh%*Q;8Q!O{e=uPF0JcCK{+5BiGZ?QV^XolpoZ?;U{;&tTF zDSXBc0c--4kfY*_u*^q4jUdI)E1uw^ZteM%} zVpb49^4ZuXlLxrvNa>}Z0pM|(t8<_6?C@|GZbc5^R_j0hrW0=}>Q{N&zlP^qy=`#_ z$OGJ}{Z`j6{v(hFxE0@wt3O=)k(F=vwKR)C_UOQ_K3^NVD%b35L%p4H?Y>saL)aBw zkBgtJ{@L0G;aB^O#ow+T2l4>F+Al30Ui~$Y2l&-~@5Emm{|hVM(eGZ#YjPd^uE-($ zKJmG8pIeUkdWG;!LU)-EZCv> z%PUDfTi4CX2lzer<|p2~9P_#KB;SGGJBF`z;aB7ketD-0;rEggmlXU_d4ONuAwl^1 z4~wgSJisr1<&*q>S^PGT2l(X?O!aQmXKarfM6Lt7`fP3Ns$3hBT5qRZ2X?hyfL-Yu z%dwKm9W9b@ji2Jisll9uaQ;>iAz-`3~G(Eo-06@3KMU z5N;P=Sbd(y+i9Iyc%$+Fx67}szRL0`9wCzlxLtmG^(`6CPiq93yv414_f7NFNw%ZU zl{R%gtnYjMlA$@VWK+ra+zx0g4Ne73J8lLxq6UA4S=Ip%9! znLNPl>fbNkvK;fZ&m`Z*?P6zmq^G}CIfPrDNm!2O-txp-a^3`afLoPcUA?>p$OGIC zr}tC&s~eU_fxN{nF=FxJvcC<_*z9jru8rI9Y)#w-xh5V%y`6Gx+=hBBZb#mggKUFv z%aL{T-Su~?Zv(pn+^S!fkF351lw< z3vZ-cG{3O?`sxu^9^iKQoz>sD@)oyXo-I6M6SpeY#%-`g6SqOGiN{cHr(7Gip zu5A!*)$WTYSKk442e=LLS^Rb8SAbiUKk>!mU$o`7al3P^#NIW>w`P9P@Z^wnr%6;+Fc9e2;39ZR1wUY~wc6-NbE>YvM7~ z+bP$^ZK&7cR{GntzaiNM;r8U)PraS}l;Y$wd4SuK*Pf#JUk3*Ow+G&O$y+`7Hg0JZ zxN99kOOQSA0(vP?4;I!+d1ioQX&$FuhY0cjxBR7T*CB#D zz^%?h<#F}Q3zcu_T?&LXoKAJTt`e$iJildv> zO~zB-J^5YgL$m!m!h4msxaIyf+Y6Lr+ql&>w{aVut%=(p*TiF}w^Oc-+fc8?E!n2- zUxF;a?a3QY-AM9TENHT2+AEU$bn?ilBZT%Wwk4AXxIKRG#6f09IS-}nY2%inZXfHx zt;#{%(oPbZPdNBQIrk*xqVF=EnI?N2SzedpHk1$gTV0P?-MD-Qkhi#%nf0>24bRyA zE|WI5aU0s&#BGpk;!))~)_v7i`%K?huOqANEpBC12H6IU6J#EITz+r$U0`?6-|~tQ z^+%7b&H;IZTiRi>9G^IQ?yQw><96pdS_SXvZ$%E__L7GVJVf)y**+=ZnaZR7_OX+X zfj&{?0d7xy@8tJLz8ddqyHgzU#Cz^w4sgLP@dS@(7FM-?6+2$lLz5?tAq4 z+I_9awJ{s)(8O$zYhqUA+L%?jHfBS;2(!hwEXaZJ0e?wQzxn;u_kg_tUinLf z2IK)=wIBcJLmzp_%D3^lbG_`DYtJKy9K!4J%PZ<<^H^Eoi^`*Z_VJUCm+vTT102(S z|K#_fY!j#9xtcgtxi(Hi8=E){a!s6udOPLXI1TkSaT??RPEX!+>LzGwfYFoJpSm8( zB79!H{H>)#x#sxPc3^z|8~QHvVsg{&&0+YjB$t<|vA77MvoW@y%{bOF!~>o)<1-m$ z*mq2j2OJ1v-fB)F$b&w6HZ~IYa+hNIG?on5XPaX1wm2qDV}^kJw<(4U*?&u7sx(#x z*nd}Jpg{kyOR+l|zX9yCtFbn~KC4}c5eabuz&<=XziTlaz&^VZixAeMfqiy0b^zFC zm)5*>-4obH@v}>7)WAO4o@aY)HLR}z`|RpkD6r4&tl@>V6JVcRU2_BW*`2kb9bHQS z_Sx079bli`S(6C!;mAI_xrPAjvpaL&VU7~mXIJN{fqiyojy24o0sHLgoG7r*?#$_h zxf@`g**Ul)cD`aY&B>(w&lhj7|9PM8f95P;G=mt|^C`72%^LInQ~pBwz1WxJcy^|c z%l1FVs1lZ8%A@f`L_#}&w0zJ=%5{uZ92Tno>WTmz?3u7&3) z*TQp@Gk6aBrD+CNRv~Nq@G4~Kw=};>I76bCbnZ68h!O-#}>9@y`6GRY{&N1eRZ%7@258Wk2)6L;sxGQ zZTgs~WAQEC=6%(qBavkjR-=x^x1fsmR+~OE=rr+tX86i*We2{4oW(cqtfsj&*(J;K zxdu80-@MD3kS#lkdEd3wY2rIPLlfWe zSzGvyaxL7(dOPKs_>T1&eDh9gS})gK>0~KuBin!L_e9wFPW!Kcj={IawT0dFv+O_l;yTt_vm%rq8|9sRXV z6VF!$LDJYj)SP`{yWU@vJi$ykDE%6tep^wqepScvc!tL@lb!R%_6E=DWA-lT$nJcjWALmxjH0+&TO!t*58z;l#q;W^5+@Eqj~o@Z=h@toGT37fRP8`$39IqmBv9opj!bPS%;-tOhd zzpYLa&)3qv?T-2BA;?)g^A24a?a=;idADct&6AGlpF_MJ&0@GZ2G6`2PL`p4-mZ?t zbMRVbm-xJmIqKNK_(Vc7C{d1JFc-D7>?&9URhxDwIj={6)=uTnY2M%-$ zp7oulkqo>S9O%?|4*5`ucWQjz2A*TvTX>Fgt^RqEYv4J`weTF}TK#jBGk8X0v0xjE zXC3S54t(|iu)XP@)yKNapFIt944zd-qh}aVR;PvM;Rr>Y(8&8lh6n zJ4PLYXWcWSJHs`T=`n>%ZQ{$O?Ao}9T@jN|m1J6;eh36>O!t*58 zz;l#q;W^5+@Eqj~p0#(D-QmWL2da0C?8cY3BJB{@o%u$`;92+4=q_>H{cm&(o^_5^ z=gRnZ!gG9%7M^#G?3{}`#pmWXqMXIE#uDkS-}0Mu(lL0}z2dsFSa*!aXPtBmo^`*t zMhfY!aie4LOkOKF7RzsqpQBt0&rz<0=Si-C=P1|0bChf0Im!V%lWj`OOtJ>gYIXI1 z?i@F^H+WX>s;71LxY03qRun0s%DJ-Gwiccxrt7+n{+ahAlN`YF6#Er-1IKp9vhDX^ z+Cxs?cCzEx=omcfdw}lo z4rtP$ednY@d(hLfPC6FP#oTk0YhgLcwXhuJT3DXs8d#2UEi6a57M7zNz%sOp#c{B< zT3#|*89x~u2d}D!WrwQKF*sKAD3Z!CP<)0Kj>p?~9^bjX-7iNui(}ohtC6i751a5c z>D2u)^$D_*c|1jX(t&)9VV37z(&H)Gmk#6`_>Jvo;Wx^)@Ehe?_?_e$_>FQc{6@JJ zexqCqzmwd7>bsBZ&6ZZH1AEulWqHmnAYKLX2DiE|T%)HMIaUYbb{NtgbsIPB?@|8+ z`@GXUymQ@QH)xDw}3|)lJM*)Tw#$FBPX+`#U>}hTarq3}9?q?ekxDTxE<^ zvv%9+I7q|6ZH)_zabU(j+a1Se{j;TUZ81j4_-7Brq1k?C_v5Ex+>Ei?9*TFecH8wh zohd%U*iF|a_C#EbvD@y)gG_M%#%_Bke#6*p55yhBb#7y~JrpNk?Y8Ud+ta$Hv77RA zPpn59yY2ouYFu}+afY0k{xtz#baNIfT1&w~v^ z$_w!34e|o)k9h%hbVfJj`rkk02H=%N&J)1-0djdpLM3l<1jN}cs86$3l|Ic2>L?@q z>(qVb7tp2I-%ab~8DXOvA}rA}^33o$@;pPlmORZAuOrVh#_P!Q%<($%JUe3Kdwojm z-B_1q8#mS^mQ}hYPr)3HdFHv&7eti2347YZ4)1m35zp!z264xC!eFY8R|Tv3%ses8 z;ud+giTyf{OYJT5{Yt-JavQ{1U|7H9Tao90bc>wgdEI?{OKt7rTaxeNTPEMdpCsSM zw38x@*9qt>_VP>^X)ogGBoBF4tt}Amiu3BJ)TEDiSLItEFVSxN!aqshzT-yS z>7Q~hkbZHVeNjK+U6qG{^o#TDbNx>4P3`UE-X!12y(Hhqy-B{4dy{-8_a=GBJ;`v9 zayStF$>NTG5&x=u4x~@H9UOi8&I_45Qf>#*C&W4Wh<{a{2jU+g9_x4V?@GzdaHgAo zlRV;I+MyqJ>+@<-(Y~Y)_?NN*P;3k3gCP9VX(^6A;9tr_K>Cy$g7oY6W~v|XFJ(U< zea(bGnImxho&1~X>*U`g-^sru-^ag6zLS5Gd?)`VdC0#h0|$9Ve)H-awl7EF)Z?O* z^@H>&-voGnrTP*7DBr|{Ecwk5vQGVge<{03%yh!DIat4wf1K<3D*CVY{Wr-Y{%OR$ zW*5+PLd`Cay`Pgl;2+8DC(BAk1I|~Wzl-Nf`hb6$wIXCu&^#8jBIxJ?{>k{ne6LZq zhG?U%@4F=5$+@ZgPR=FyKF&?@ot&HGJ2^MWBhJbE_KZyt&r)7%%c~uIz_XCiK~H-8_Uc=tPbKk}!bLYEllJDf% zB;U!iB;UugNxqY3lYA%7CV9X!wyEq<^K6QE7P6w~NvTr|fa6ENGtI;jPG%(p(YuY% zqFGn3=mKs z@r?3&5Vt7P1ncjo%uoEguurNV@l2S;xj(Q@C(oujI(at9ck(RB_wj6!@8sDe-^sH{ z9`cOeEO+Z}Q0PZAZWIr4wiZ1}n|LCbTcAGT*_0tB;z+Z_Kz+co6g?C5HA4;3@8sFx z;p-B6(mQUPNEjB#(0N8j>HSBmVn#8hV|&nEd!o=x(dJWKL@Je%Y@c{a&+@@$d^JZst%@l5@g zXSylRfGKbUcoy_&?SOjSDgTOt1Hd!Y&m;BtH`edt8J{V$bL~zy&yqaiSvrS?_Lfp^ z7TOgkSvAu8Hq!?@)9fAklzAo(s1JCi8ACKWHP0Rb^)1h)5l%U7Ol|JtS(5MLS(5ML zStj4bvn1cgvn1cgvm_6AChxMCg%A1xj2kuUj*k5GH+wV3c~&RjnP&P?9OYSmVEuq+ z8qKNtd1NQj@8cQmaXm+wV$OBH&n9`qvydx5RuaQkWIf-W^a0PpnagrgZ}^HW&hn&w zEa?NDg)^AtWMIuGqghRoeKLK-Ge$+oEQ56Vc$Vtu<5`mL<5?!(#j_;e$Fn5g$Fn34 zd8VUA$w-52ir#1892hxKo6t_tuDY`s>I0sIvz}#LJIt!dZfd9xc&6*(ie{Zd=ifQc z(=+$+jN@i^Tk_xlb$cr2RzI3+URedq0OH!(+51ubKK}}&2$6n z$2{YAT4mEzXCKd!d>_w}d>_v;`7WL%`97W{`97W{d533Y(|Ua~(?RdE8&A<0>bW;H zYYy}y;8~tKM}L#%eg{W@XL%kS{jJ$_Q2l*83vt$ub-&LvFAd2e(^Vs@0&zEmHK z+oIJ(@(E>Op&pF#?db2^KAAq?S$LmLxpzokvcSOlEzhPrJmt7C)!E0hB;UugB;Uug zOuma}NxqL~NxqL~NgnWQ%HQMJ6u!@7M3nOQ5E>+t67(bBS)J2I(d6I=@vO@46L%V* z`uljMarrylJWKM3XLT%p%-WLLm+7PTS(OKfG8IUs7^n|;R_6pFeaTJ(^)1i%T_*W~ zN=&3S_wg*r_wg*r_wg)~@8VgK@8emL@8emL2R!3IeR@4KLPn`C%`egr(L za}ANcWR-&YfM<2yp_s`E>G$z0?BjU6`+cVQh)5pstls;f`H6~tB{ptT$@LxJRLZoa`I%f@z^9bei+bYe>{^UhpHC@glikzi z=WP0=?o9*FR_AcimG=DEvb`1OY;5UP?b!jC(si6LBZ}8_(w-rJE1d%iGqUpiQqR|9 z_5=3s*c*~!^O60ZLwh$sA7b)I(Kp8Vwl^WgW&{5}m-Y@o|DXS{@hMIj_khZ zbDrt%y|%WWt+OKgZ`0a4uz#38na*yZ8R0#)=9{g*0sC*&nk=yY-d_vM)@FeHw`#2p z*njV@6=ies!2WBkh)nH`^+B> ze`I8@EZ3i;-0`M=y5XPF+QZZan&W}x(&L$OX+FZpjyM1GT|c$uE@)4wk)@b{8-D+$ z-#6vb`PfEwy!$72{=}9`rhL@MQn}CEHoUhkm&eaWc6`~>FL~OQ%Q4nQmdfP}fu>xF z6E(8qcYgGZAK7yG9cpCR4)3|?J*Hebqsz#SKYr>5Pl0le43Aq`T~oR9mb-5;Wz!m} zmA~exLq*xcxjy`=9K`RKRwPmzf;__TsIkELetM3L;C2iU#}9nvzOT?~n4IdPaT}Ao zgXPts z17~kNYs>YpoX4Iy7Ei5T!>|f{9catUG~6brp*w~zy8Hn)4Ae$dRF<2 z^t}Zzt>0Onz4Spk1-+E#xB%PsV-FsEuxR_)PE3m&#5i0FOU8uVOmapnVwPQ5vDcrYFu5sc(Z8_#5HG~vNrK>ee^eu{e~$Q;`*L5cb&22 zdVO@B8!FlZFdFf|txgM^OUoftpeBhf8Xe^+4KGaW#yo^U*f9&?l0_erW4yD=U`i6p!2+6)Mk~(*rp6$gw@wA z@;0kH#`d2b{WFp$Mr6;Z@)+Bc!HeWyyZCoT9%K7YkN>H)iHq$Ek6mcW#n}GDU7xV! zy4Zfz;?;Gz4z@r3(vRD6U2JFh*rHz?Y=7*VA0zB#`MIJz?zgp1JNk-auQ2V#*uM9N z_fq*;{;jEe*l%mz^t&#&=K@nc#`e8e+*{b?j!tZg9LBchHOluaP@7dAVw?J2%BMv$ z!!OL*tnv`spQ5Y@gwM+aF%t#eRI9Z8yaBYo+{rkJaQCh;7|F zIh?-GmJhN0%E~U|hx)Lsav0mX|FX1UkjL0QJ-)EUc94hI{-oH1clRZm2YHBXlBE2! zCANcn7q(Tl58I*KE^G%`XRKXfTV?yOt+IXC4&}nJ_8ZjBw5!$F8Dd-a&6d~><LT|?abMqj2|JkH3I`{)$(|}t>q(mJl^)@@wcSN zXMP+yv8{6b*begD*befu*v@Sj+JySmHw+*)GJQ5mfHs`Ks%A4or(A>53kaa&9R%@_pDA*-mV0xqaAH**}gM2r(gZvD(`3;zC9^@gmC8uINCQ%!9VOz`Y!**y#7q)|J7q(Tl z58Eo+hwV`AEVdUfHg+bZW^Tjumi8wPpUZ-+U<0^32}!S<)<8T0%)GxYO~5iZ1e0rVfFsir&2#0O=he1cuisvL zV)gO5T#W6PzUt+#vgLZ%Mt;Hl_BUVgGnEgq&8vaS@t%9{y4REsv3a(VNjBP&qDW5x%vR!Qd`O!Z&HoDztNWKVjK9y!S?H)d_7?=JCks-Gsd>;g+BJc(FbaK;CYfCUi9=u z=DnbP#Mq`N4#M{RcinHw$JoB;@I{4Pj&x#M={)aVVmO7mVdK)*vLX$^9g&_9v-eA`0{;UHswNGfA;bRFSq4-xL!WA zI$M{EaeeE-4`jJ5quo4QBcEVgU-{N+-wN7`F)bNSANb;ZQ_khs4vgtnU-s*l5vH@; zs!@J`nATYK2Os?GgT^Kh(?>5oc4^-B@%BDUs~p5MVThv-Q~f~};hAKIpFK03<450` zQa_IOyWxX3ebBZQj;*=ee|+X2OdBAM-}Szm-)GD9aD3C>-|+XQT!`a4-+T9aZMhzf zho3z2bX_jS@k?%d*=@F5568$C7{}ju&v)Kq%Y`u`WZ#>9biQb7L#w1<%abe`{j<9Q$uWOq;}HVf=4T{28|Y zHpE?NYznsj_QXhG`)@;R(D@O^gY7@i%r$-U@9FrJ5EB5$C)$4gH;sRSJQ|nd_4^%p zzrgRznex$h=1lo>_J{3<;~&30_&dv&AK*9@%IlhIzx`Fd-~KA!Z-15Vx4+1*VSg>Z z-~L)Y{6?6uXSe;s+G@A`gM7FBgZzyBe;I4`^Y-7%Yt>=>&$0iutSfu=-}~#Sy5@w( zKf0e`8`eHO`)|RTpRR{N{BO_t9Jc>ftV`)!KeqqYtRXq}--fl5y}8Z-$0wTe=-Hiz z4|CgaJd@@lK)EN3{F&h^!8fT#> z+O9b$#yF#&%kzBxa7`u8?V&srG@C86`nkNE(R{d)54k9o^0#U~pEXn|4N72B(we_ z=d6fz@Z5Y4?o|%reoS-tF)M*SZ_t7G=apDmpSx;#bzG$@bPxw5V+G|&kd;}^VNpKA z0C~Wxvg~JFoh|BsJdpeqV_c!ln4&*JexR&htpcQMsLYcXAX5IM{TvFVty!$*Sr=?}sce2H8m>b&7i6J0j)ASdRR=st59dqjZ)d=f^i5HYx13iz+3y#tp4^y6vsSaAZ?Ba#UVP2#)P8z4k zDYfC5RR{87py+xU-BX?o`d1>Z3mwc0%Cf;a9Bt2eH_B(gyx5WT8;vU9-<1yJ#k)mk zIITNM@^*Q=;Jh2lQFoQ(@|YKzdt*8B->N;37l%T74$01lynK%r!)e-GGIB1Cs(i=` zo*iUf=qzDgKIVn42@j`vX08}_slPEVrhFW6w@FbCd|#xT9Lte^SI+|97rfJiF>)dO zYoEvC#c-N-os68LBi6xd%00YLIn0Z+_Pmt+Qf1jgn-`R?qtb!AAQlNPc!w3|?5K3$ zI7)dznv}7Fe^)x)ywKPf4Rt_Xcz6x< z!1u+x4*tHF*I9!X6#LP|3z1us7pk)!FH~neUZ~D`yilEfUWoh}ywLLdd7<+CywLXa z^Fqt-=Y`0x$qTJxJzi)%>+wSCS?hhlxkw1-&bmcnQ|vc6rl^M(Dz_dlg3emJ2s)4# z?z>p+G{cKLLrHk&t4=pBv|atY2+z^Yiy+_4i_o5KUWD?yd7<(>yx@qi!ln){oH4NY zVa;)r`fe>===1dRf@8^gc%gD0FJjCYk8iSXXeoQ}c)>GKGAqSjR?)Vh9>@#*c8ggu zKUwQIyx8GyANo4vw(Zn94ligXYLr>2>H9+4*0mUIlP$ipiuksIaevW&5L4g zS9KsS^juZVjLfsO(YB#&GrZ81$D9{Ir<)fl-_MIsem5_Id^aybd%AfM%J1fd%6q)v z8CspKE!Je!caRq;XG+P7P>(Z?5?%3-Ur%^u`k* zD}FBT@q$o2>leJDw;VawN>x7O zh2$!s_l2HdkhdT6LRa*jl+``WxRUGOI1pVy;uSrzlVr@#b@2NlDx1L&@bGUPxXR;syP! zo&obh&e4!)kZByn`Dgq%5IGfPM2l7Jq^6P0=95q-zgTsqM%PZLDEBaf>LrzGf;22N6%G=~| zf+GbficwC!%H=U9G^Yziwoz`Esy&z!94Rrx?=6o1@1o`*`@5(+nkgyec2! zU-lc2ee_hr{CP3{C1QL!*)W%f?*sN1<%iMe@v=P_`WaE!5-jhZve_i_a5u;9PE!R?SkU?H|@J zb>J90YZa`=nZu7yk96?3*L@ycCtlA#stnk>jQvOO><0;P13eP61JM^7Gnf~KSPxYLX@1J91 zY`r)C^j$yY^&$By`GQQFuNfX$P|hH$n^u0f1kN91bPo?-=XFr4d-qT7{E4mtX$~P^ zXF7L__j4Itsw-O+lHYZ`d|trLwL4Z<@(FQk^HrkCR!4?&^%(+UXI<5cxCkpor7rh* zb>1@7&GHRRt4F1-e!C8jq32DxhvG_7sjJ^eJ65;ILljq)N?rX{8Xhiaydb122gh*IC@a-B~}b1Ru=ce$J*B`7kD@+%d- zrnSbkxGeHMm(@op-;(i@>bqR7*EdO@qVTe3RehJsDe^8x;jJjD%jkPt4%wJOM4skn zqUb!M@A6qA@uh<|7QGC?eJesd+v&(16?WDQ6s059KD|P*Ma=zBAzct%asqem*P0ptn@mK2moUZdf z#pu6M-{*9l3rh1s)mYhaInDW?G#XHILlyp}HSM)HE%Gy*uGYbcljYfqs_%2U${R)c zltU_eR@L`8Jw=%lr{#Cm_p83oX~`rNqR%zA6h)$&`h8AI^f_^Q$}weheNIo&=)!4< zN}n*I?e;m%Ij1BtUGq*^AJ1}{b5Cicy5ym%+dRW*j#y_-XOZhwn|)4mUMh)R=MprE zz0{rIbQYhW5$&3(s??w1bd|4)I4#lbrTz@3tK3yF(!JE5;j~1$r#x2VJIZNg?Cx{= z-Wd6=d94b6Qyj!voECYX({=0weSyj@s_9u(-{o|%P9Jv54B0u_gX+7SPCKeJ{}uHK zlo2blmFoMPmbo?FU8OmHc%_ebAXe>nIjuVo!%jrfeYe$hIh}SSGRAdhVpXrpX~_#j zIIk|FwbL`AI zoK|_C({+w6ZfkM2z0{|1H*gLt&tpfLte#mr&G=_*3UT|>X*4|G&k1bbg18bPtS3hV}RD-w95OOuH!3&Q(6BL^!@jA z6%XX-yPQV#@3-~Oa5`om)0&<7T~15=@|KM;J*n>w&+c+MYkMfc=(?QFbh#Il>;Mtp zq25_e$JXNK^*P<~ye_A+HapMjzo#=@eO_=*9LRpS|^%<#iWAEW~nHLZHdGq&lc=nAs9iHF)o;L6KZ0ybPxqE#+=8UY4O`G=+AMw$gM}VmJEB9{tTyMW_$J$|K{0{#OYAK%W2KFw-dhVcf#zq z(VyWop9H~m$2@#ScZSpPWC$)nPl%|Vdxq1~j5pQIIr>b!Gn_sYp7&6g{jPQAI8CQV z$n&OCB&s&gaGG~6mM2P-x^v&t`Cb6oF-WtUb-VrVY2pN(gYdfW+^?f{@b6lGj?-m+ zzj*3I+5WlrbeYpk^ZuFoXE+^CpyUa~kb2>cx%zJvC)1m&&IDKGEPK&(H>3VMq zaY{}pn>eldE~o39hNMqXC>bYJ-{o{Vv5cY!D8C`;Q*?pR_c<+D4#P=in)i?*PmI3H zX+6n|A}C&S;x!t1Vsu?jbM8Zml;Ow|dh_WCXO-PtPD?&SIpr)wp5*LrA$4 z$=-5OTB+~9r|Z0m@zk_Z-+xcnITk5Wh@w!8-Ca&|p2ZMtA~_d}_w>OvIW6)toEBSY z)SpE0)|^s(pVL)7M&jfbR-ezFRrP&NPp5Mdr{(v8vNalgpVN||F`U||IU6ZL)ad)1 zmQy>4(^Kw7qw8~eI>l2sEvI=-7}4kUInB8ov(IVH_b8`+3a3AP{L^)tXE>ehQ`3_`H3MW-w>wA15yQk|Itf&xLiM+) z-+fPW9!QF3613}YJt4HJ-+fQ(385)JB>9d`4mI`roSse$4H2SwA5Qz>)*5?@{0yh7 z{E;;FKDT-_Ypd$}oUU?7l0KbAZS-AErxU0tDql{c=8RuP-{Ul)Q%E? zlc~wmv}=RDR&wCk!~pUYJa%a{eO)c4=dbw0~@3U;aQ zzn|;embBZ3PRBMjce$KS#iqW9a$V-W9x31DI$TzHm&@cA&3$R>@MFgE9GLX=`?F{M zIXzpb&*kn7AH3;n?nc2Cyz`n-L~Z7;ixTPuHM_hhX*xV)7dn-LfCx7PJ} zo8{Xa<+puakGE{wDfg!SHubvi-#icJQg%_+x;|g)z0I`4^{G3bs`dT#sYAD1b4%DU zDLFcqZjMgg8$F++b8a22&eK`%?>tZTTzdG}`+M@va^LLswI=tcju#Wo2Gw`RP1~_g z&hHz}`~6#I8vcJy?5UdZ|M|YxNB6IIIV$9Ad0s8x6{fJ}a31cz@%?|k?+Xbr=&t{t z8+$c;|DW%B2%eAY=l7rQe_G$Bo-hAbGq%R>>R>;2{I}QR%|mRh%m4hz)9-BjwtDzJTuQC)ue+o==bqo6*Xh&uzZ0AK8V9+#|5bl; z|EvDy{#X6Y{V)2zfd93Am;ZhC{{{T7^}BQQt@=aE+{XS7`WyQ{=&#}be~H-A_56Q6 z#XLSAhuC`mpWpFuAr{By|8pW{ZI1uvc`TL2%DDc2Zp1hF{y*>IZZsyt_y2Pu7G}o( i=X;EXuEYEO-;THmcl=%FC*Eu8>R~d7bdQg1a^wXzD_2Yg3-@W2P<8n8E@2;P( z*~IypO+Vjc9p{^@`}t@9A4T|h4Tk5J`r9`dz&8o-HPd+enrVOgILzYxJqhrg58yiw z@Xa0HQw&KwsW^(p<%Q!zaU^^f{q1XR<9y96;ydG3Se;CL{I?%a>Z95N?Rrmr-1&oU zTv8u_&p2p({K)z!&T+-g(dy)2KUvv7jGsg}?Q+{3O7&{$Be@fSY*#2XMk?^b+9)@EJde_`Lr^I2k|f{{XJ=lK|KD zH^5iuWrff9Nrdx$65*u3+D{^!_mc=GeA-VU+?;Vb-cTF~pT;3R??;i)f7s^d?eFTm8{twX_vibv4pJw#W24qp>Lgw-sguQe`9C`O zfpzVg9p$pEO|IxW*D0ksS-MK6Tl@5~bCs!+!Ms7%LFV6u?iS}cX8pN1 zTB~|G!lkb~E?-&EwNd$Zg%9iGC!>>n70aX1OcbM8vxG64HOrk3?X>^sy(NmHgZ7s1 zDw=tO{u0e`YGrDrcv_D2%)`sQf#w79uQBI46+ifV{_-=o;v3y?f?sj< za>jVIe~!Ili8RUAE^A{n=1jcCH>P%3VPpY;G-aV8FM?b+K#<-7n_ z)Gh(8)exOSBi!1>6v9b=BYZw5ukq908x zM>t=*M7kmCMb|C?-{`X*!}p#)Va@Cu=8SQvm67}RrhaM0x*I=At%UbCQ!968Bx=3* z`$K45iFW97afI{thY(Kq^!*`(n=?-PMuZc-2<}B{W@KiALq<*wYA z&EBpr>?)i6-(^#_U)ql^@OydLT$5ed!gkrN;_a60%1*;8k9vINQSb{qF+K^;?nBL= z?AOOILyBcpq29_fd!scxrqC-u^+4Z~w3yU&RyS zQ}C|t_4uytm*cB=Vtfi-SrK0m;;VRKd=j3`fpY(r<@{MY==CSyU9E`kO2rfNr{L{3 zdj9sC<@{AVF+K&)mNk8RUo6L0@x=Iwf_J?lzH1>q;HmK`c-t<%(^`ae$*o6g?9}+S z!u`JP;$!O(;(IOPsqqPT`wx12`wz?URXj01j`zy4)bhmShyU{7$~VRQCO!H^ZiCxeWiCxeWnO(0ZGCMpkcs-HX^?D++ z+lhFv+q&lfhKKn4I>+pQ=k3_@k!lBir^e^?KNerl7nvR6Q}B8{k>MeKUjJiuy`ISI z5TAe-^hAbd@ilyr*af~w>}r2_eUjK+fj^1k+vtBIJYRpr4)G~?K~H3O7+=rtm|f2o znH|Pg!Rz@V!$W+YFETseiTP9Tf}Y6yT6~TEN9-z|7@vX{^hDyf?niBw=gGhq8J>-A z!#|l_uO~7)jIY=Km>uxM{7HD=ciZK>Ab$;CWbyTUk=a@PBs}=_@v-%2jh&i5@0Z<2 zuO~7)#OL)tW(PbqJ^?T2iOjFX*XV!5F6fEGuC5x^JWnHnsvtJJT(_!D4 z*d#O~sJk@@X)MP`Tby`-+l{Puj2*&#kbr#xF%Bz}XgNbKtP3h|w- zD-yp!S0r||KLq|6&MA)853egSzrC)=>@dC_kNG{9FEYQtQ|D*Dug&7y8s66Fp3LtW zJ2gJ798IH*6*>q!2pPN}R5nEyN;TL)41etlzp*Vw7?dA}^a;P8^wtyE}d9R z&S*X0YnIg_dg?iF#!-CAeI#e3J(Zl%)~C7#Sdk@Xv>f>L8b42Ysb|KLGseBK{vBvG zUm2%J&UmaZS6BZvZE-NZ4YwTG`E?6Dce-3&u>K}zjQxgps>S?q&iIXGoN>m~7msUU zcpsY8baKV{9tQUmYxSbFUb3PU?%t+)R1N zeQ3--$7{+9_R0U3`_Oia?EP1X+o6xt^&`3Bg}CC6RiyR+YQVR+V4%~?oRi;q@gVtkDrIKoqF*6WK54|9VWpZ7b$^LB&$ zNxj$WiwqCFteiFMIpgR)JRb84j;H2N*h4NoXB@@n@ko5(ooHfL`{Ti#VIY3P*+pVk z&t`c%;Hn%SZLJRbAgpIu~j=u3~s{9+GT%wNM9 zncsd-n%N;fL9YyF7ukJS{*-r^!`a0_d<`D)8#p7etNpQY^+NoHJ!xVW&Mq>)IBTem zuX5H9c)R8M2%M3{*XxVS4*j9*Ap=j1&*P2!s`*px)c6#(bzTYrk>MI4O)bW@iB(_MVa}9-j?6Zj4$;t{9$gN^-?{ zJpsM$xgD7kk}Hyav-~yOj^rfdPV`y`__0w?0pA5a{ic6;$Z|rZTx=7wQKR)#t@j39u(YmPgA9$YH&t4N` zev>!O_H$~Cq>rEps`cl29;?697-{`Anjpzv@lUl&&YYF%SKQv2j7?UFCjern!%u@0Jjt~>Yt z{*ih~opC&!WO(x zlk?LPCiDAnOrG5kG5LK4P%INDmIYLk?J}94OJ?%>Y_PWVIS}2sij#GCWN2@RkAx1; zl7%V|pLnYR9hU@g(E4Nu&F_;i`8*K!`zB2G_XB#uAL0>j?TE?!0YI@pAU_DGCJ5~E z{$PkU{}8D5P{qkLDk`+MWQhT?PpS=puJZy0Gr7J1dMpI!F`(2E(F42h_m;thZdUAkzazXB+ io@t7c_f(o-F_G;22Xm(4SslV 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„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

{1Q&ST`%*#uH=`mh-~U2 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�R^#!Rui{6%eBL}>^&`H;+a{m4 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_comparison.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_comparison.bin index 4bc8882dea9233a3473218f17e95cabb734ff5c9..d5a745e85cb7bd7f650b775a08a17f8846a9910d 100644 GIT binary patch literal 3872 zcmeH|%T7Zv3`7l!A}ZMOJN=ZZ3j~X*2ny@|HQO>axlKHp`)C1)S5Y6to;bG8b!KKZ z!~51A?ZsBMwyoXZ|2^L4c-w`4;DztA_%TnmJzfVN%eIqsWzWHQ?nCijC+Nb5bdW_3 zL-E4L<{tFJb%{8&o@vjav&_AqRVVupK9pZHZbbLq+}uB$Wib{nd?+5)b`x|v@1LJ{ zV-NOh%VQXnHS_Xd&t!|GntQT!wGJQF!Pw-Wb?!qtVo>S|gVI(Ql(sl8)%w)@h(XDc zItwu<&si8uHexW@4t_?GT5hc2KSdJ;u`dA@wWtt_n3nltc}b; zxu;~w7r&Ol)W0JbOuDWQs_&gGzP}fPGKUEaN?njSDl6<9LoHo zC&RO1x(>}~W~kP=58VSa3#D$teJpjs$0y}S9Ljiw!(<~4CBKEkq&wn1PCDe=&O#Y4 xe5fv1YiD7f&S#-r3l8f<9KDzMyur;MVKLP;a;`IRa$ShUv}Z8iv*&MQ@eKnR$O`}f literal 7568 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 RRLfB#NA1SL`%jn?{2wXj@YVnT delta 199 zcmWN=I|{-u00v-FwNc}vR_m+vT{<`vtVeL^MH~uVK?pdcE+Ta31)K$Oh*RjUcX03m zJ%RXt@bPa<;+G&~bti{Fd;bz1_{nW;JXE0DM;-|t5!A4VB`l*Zc|`YH;VOz1tV&na zKBrXf94mb)Y6>r8SjPr7u_e9GIA2A^+Gt`2yJ%q#`#8WMj?k7Fb2dv-5V`N*7$-Qz L8O~+yFD}|26&p#k diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ceil.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ceil.bin index 5ec60b6e150d5694fda5f5933f6accd39d76bf2d..9b93ed416f64cab3ab59dd75114fb225c8abef95 100644 GIT binary patch literal 16016 zcmb7L4RBS(6~1smFiOHOFiapN)n+QR6x5&%m4?JP{0tM!5F$Z^31keZPO3a`!jBoA zSd3#6tr=?+W0_bRD$qhYPShcVL^Plgeg1(GrJ*4+OejN2gG#JT&$(|8=iGhl+jpNF z4tu`uySsPqy?b}hU0ugYuuhBS84pf*U>&ndhkCg*${=2^}CyWi3$ALBx{H#7Wi-h-AA0hFQwv{?YqvujF7EO>*)|zyGJ?U>Qwvn!4}nmK-djNzT zNe-6LBqvh5<8#TuGMeOM9vgK`a?@u#6@-84Jg~D>*-eGMeO6cWmmA9Ovy#9cYr%m)CR1$8mZNIbf2L-@d5b z&&g?r;ip}4nzLU!;OE4SE#q6$T5X)l+1uWv+jD$#%XLm&}`$3n0doq z8>f8F(|c^3&S~GiYU9kWO8>e^toZs6x3+rB~vvKyMjQO37lT!O|t&I~(I{BoHbF6ya6E@E5k$bnQwvV4YbmIao%M99Xa3FF9C7lN?z0R!9z( z(If}f&ksrtmeC{!*5M(^!7`fUzL$ zSVof^cn@xo94wR$p({WpM5!M%P?t)@5_9Bu3X+Yt|M2){ON&Va7s_n=$7%W^Cv&4dZpRTN?+P z90%LA)qKpXIN0Gw&AOsE*y*rY7m9-oi-Udi z{EcR;`erjW$m{T!KCAe-S=Y_$?igL+9G}iNPwvPzV_CUA>~`mNex`Tl`LH{jI~bcX z&xg%-<}>!p0w1=};We~7Vv)qci^9Bib}RFJSbjL4kJ)#p#GC?$*UIjSB@!!HQnG|~ zk);xgER8H>EN_{_3YHZtW2|Ml#NJr`#&X7{-7B%__fEf;u@_fLtYKxtO2(2`Ni2C) z@+!t2EtS~T(ygV84e(kRuKU1!1H2A)*OW`$n({Tg{&i3A+81;u?mxlnUN^r&>hde{ zdA;kl@md#jZ4b8bI@iq%NnK_rlh?Oy(|U%bc<3Cxov_~me*X)sQ~h%A%I);Ny<&Y~y*|}1fpvH= z$LTld`VSJW*Qfd=uuk<$U|qBw-8|m;u3vW^;d(n^!wCG&59$3$@yi|#;H~$g2XZb& ziqj{ZE&N{BQJlP9-#}w?_N-&C59&IKlh<|ULrE(aw@?07*HN6juItMytt#KM<)W^m zIC)*yJHEAHYkkiJT}N^9x~|&;=J)G5ij&uMT`d*xXZJZ>M{)AH?pSrlV5B(ZtgfRt zd0ppSzPxp3bREUX>$=Wq8)lE3d7N`1>OP}5d0mICOrLaHk6s_e$?Ljy?|?hHbsfdY z>$?4L^$PokpVV~}C$H@3~R^LUHoCZcj?>#m43tybnj| zC{AA2HF-Bu9q-LiI*OCmb>8Dw{dGh?KZ=vrbzXOd?&du_sy>R7*L83a;K@DEsnb%oy%;j8If;t?nQ)>Uj`;!vX!OHUi$CJM zO$q9}X3oBa_d6x1!>6Gxb%>t_w9zDIvhO*BU3pK zm|(xa!vJsGn);yid9SgZ{m%x~dBalO(z>8J?>4J?PVqzzgX&v)t!!Bhrl{@-2>~q z$02Q0V4b?J1MAdt6j(n?ASf|FNz`E$=A8XK=^F(Ug=g6#6kL3L_gFfOQ0%|pfq)y;^`dnN|e-4dN=@i&hI zulp}>+0pxUTG0CDdK0^n^q@L5Z@n(4PR)}ug6h<~ocBZ~*e_}w!22W<)M54v)*ZZe zGC|#n=sIU+(DPdzU03lQ%LMEDm6w3XofWjcUq{!CycaXU`qp8ZuX7`RCrVI%;64tnYKLRNp#?$;j~UW30`sdiGF zysmpDnn&S%p-M+_^1AN1Xx@gubtxUi$?Lk8ypFk>_m3(a#mVcsm%Rkp*9CfiQk=Z5 z^M=8OI^Jih>Z3S$U8nMDy!TY;C{AA2sXQLeiSFK>r|eSzsafk zC{AA2wMFx$C3<}nC$H$>-%d13y}r`kzz^1ALLZy;R9-vE`4;^cLm z%4(qA;-pi?U6eq9i)OVLn`uS0uyslH diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/clamp.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/clamp.bin index 1ceb3f19a10d30cb69ffd5cf37415f5a8e4ab84f..492be017aab39c196448e7d4b681af0b35eda5fc 100644 GIT binary patch delta 40025 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 delta 996 zcmZ{jJ4nM&6o&IqI*3ScC?vMfR*fjWz(*bq6^h`Z9aIVyoYc`lS5XJ)Bw7z0I&`)m zRwbxSGgv!_Ac#2B$Do3s2;wRZQg1-$IfFyE@O|h0xw$##I>X=1^THuN>JvOAI8bGn z^EFB5XSE#1@$Ms3xGQH5z^6*X4~vYh z5h~l?u*+ze(2;zL_2Pfyg+~W^n&qjugOe__cdhbwVorQ0VArXS=~WjaZbQ!@SGJ)T zlJyB2Z#Rr-qq_Yjk6psZA{T|tfFfj0Aj(40$G9+J&YIPb)Dd<|W(v6^R9J{&!E;bv zX*|S*W%COadUM#ln&MFP1r1s3K1~mHZT~xO7k01hB($*?OL`auo`Q;y?As2?da57S z(XUGnU`KBy1LGk@h-$DEko6l47t(v4(6OWcrwpedWin>q3i^{Dh@;IBH}O8&RF777 z^A|6L!?=WXB@DK*4kpy?-~~oYgu30n!>Bln6WqyoVl+aiJ4IfVO&p=_#Emn0PN+Mb b3037i*1kF|vZb!$vX(8kJwHMXn+fh0EltcQ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cosh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cosh.bin index 693b2d3230e74e38b599933a7606f15e8245e0f5..5b30d2786c5ec095c30bfc2370bf51ba0da3a9e7 100644 GIT binary patch delta 1217 zcmZY9Pe>F|90%|>*`|IW8vd^l_htQ*NOS8!S$`~VOWstTOq9Zfs{h%& z5js~d{U{OWUf+$C-G?>oOz__IFFziCf+v4($ZKZ<=I-9WM>v(IH)}pjz2h^dKEQWd znh&m~CQI<}A{w=%gt{-hiUcs38w(Z$}4lr!?RD}NTKTa$^8Ymo|+qb9$j4L$! z;z{EyPhhd@FufBF+xoIaWWtdGuy_0a}lee|bc9U5U+hfX7` zLn{h*snBbJdnt0aJDTBs%Dl>!17A_0-2&^-KM(8FXoGd?w8J{J;_w}ndY$lyO3iL~ qT&3F&zm{kX9mPMxAyu&e delta 15 Vcmdl{vLcp|Wh3KaJr)Ka001f^1HJ$N diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cross.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cross.bin index 64041c731193542451c281ca31fcdc2764cca2c7..c8ee9d3e1aa6aad5709c190135be0cd237ca8bc6 100644 GIT binary patch literal 829096 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≪|u;JVuoeSajE6ka;AL<+4Jvdbv)ej@i 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

te1y= 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 R_51n!6@6O!us(P1{tu?GvOoX; literal 3690080 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%0A{!xF5<nqO~jMEab# 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ℑNu%hwi3UmHus?83r>U^*}d4oYz5+;ciyiP>W=)o@V~b&F|F~$ za^A7>!`NPOBHYOC#ZG3MIcds|<{dXD0av^_!HwtU9ZvM)^M==)MD63)d4+w z_I`Zt^%E~AKZF0bHKmbfb>ivEk=Uv~=jZqPG9=`h%9!Uow0q_6=C$7E*0I9X{s0@D z7$;7h%+}ut?9ztZZ)(B^yJBi?i?rnBqZRL%$C54caQ;p`CC{zg zR_`8n%S8v@+|b^SzstAzOr7oX?dgN9JYWjERXL&js4tBZ!}9qJ8k>_7aE%kEPTKqN z_xdtx+t0}-{r6e=Zx`G6W<37k;Y4<3do^mp&NJwZ>nE}Io}FL)w*0)t67|TbjeK!T zyjPz=KWhWWgPOA(m*9D^;olV@MlYG)`9eVvZRnPV7UR zn9m0|q3yB8Dma-cCrNF;@@KBW`&{hc#4s}7(t727OD7gnoH}Xw#!0qPPmk{tZwLA7 z(|7A@;Ji@zp}f>d?q7~O`|^eOc^Ki=QBF_g3J2ZXDgmqdz>0P#EJQQ zfD`zuI@x;`nXX4Z8&6uzZ0SV!lT#;HB8{Ty{Nk$r3}boShyJj55`FrP37k~0gU)Ts zs^){eU`1?=b079Bo&;cKV|0NHuC>Rhlj(M?2VC3aH|vThoHe%kBjWyiF*f_`=OkcS^_{3^GoJ8XZ8gT~#g)C8FU@BTc{vG~dUYb$kvakYkWS)3olHJ``{x}w zJXj~HAo={he+NP*X>;hr%SrI+gc!&+PA3`PrxP6cA#Zv*!N=v;$=a5Ex%R7=!}j2M zRZImtU>Dl*l>>EL7EUh0@?lRayo}vnpA=49*!UD{9v6RX6Smek!fE}+H2chPpWiWX zPURtSTII*eEq3O1oK8yL1&`n5JDRcdA8y|@Bd%J%Y2S&rxt@4?zWv_XK5yI(a%)QBBp!7PjJj&PDV80i9&L z2k}Ije^MvyoWG?L zwU@DzWSh&~XE>Y~HyQ&@PPVXvX=cF**fuWhUU7W7$d@fnG~VxHK9BR#22NXkPBTsn z&)1hRQGem#&Nt7u|E_)EH@L=$t1pGy$DYLNuQj%`bpOr*HgDp@V$2D=SNk#m5f*-f zYyI~sHf;~xcp`jXU*5+e=g6xIyr-} zdd8G+`7H1%cJ~=m=Ckmfe7B!T>~qMrPK=Wa*e~iNfDtZNfIiq8KgG$5*xhH5na^Mk z;3UR8zFzIi?$|kj4gRaxITkGV23s-yo{Q%7gBZK~JRhfRofs#^dDFKKus7og7`^X> z87D95B+qXPPRwU7C(O}5;H+Ht$=7}{QRIl;jn^0N3H@wb+Bc#&@ys}rh= z?7_)Nz`SsrV@PR30%Kzx>(dG6-}2mLJnwNbOeeS!*@x*w_#VC$W6jnyZJ)ItaU#c0cjOCO^7*|LtG45bz&+SSCsi8{=VD?M z+c=$M{Bb%FzK0WQCZ=URh}U+hb1tvm0i&KI$_b>ihjI zc+PpK6UG)UkJCxUAEy)Hdv#L3uelgU>a*EgTsRq~lfua`op?DB5A3%XYv-Yvx~W*l z4jSRrIGtqtaXJycQzy6Ye{;Q>M)P_4F(<=xQaBl=lLMU4_r4g59oL-Rp_6c88FE@^ zkYn@wJg<{<+s|dhfG?r+Uy^MucYiZc*x285(XxMlt#;1tYv0z%IzPXIoxm=>nop$- z=L^>!d)L`?o$p1Rbbniu`fM$C%g^uleSi~b#2@>%=%Q z&V8|JYpod)QeJ*e1K0R|Q73`6uks}3^B7Jn7fpY@IyZEG(-~aLMF%I}w7nNkrtkRo z{mP#Y_JU=46`M`|)kQ zdc=wOY~w3`FKh?<6CHn+ak+v?-VdEcpmJGbzCRA*z~3O?$k-7jkk3bW%}vLUu$dkyP!e%KEKb{o+~E_&_~$t zojLbmgT|J9-Q{F3wshjeVH&W{OFve23Ps{9cRQRGc{D$rt{8)$g1H z&MR$r6i>XI{GR;JB8#!|dwlG~Z=74M6Q851V#!uCxGFC=0oOS3Vg~@L-%a_EPTZU%d`ZRchuExnBDSZ=-cq=Q^6G>b#rB*|l(S=NbTZFh3OD1A z(~0okt&_sZQ##??AGmajC(OsI^-0DbrxW2jIZ0lfu;u~vIh}B#wud^&_~UdUd?zP? zcGmS^!tWAq*RiT_@{~?EcczmoV@ac_`3$IaEJw!a$%7HE3Zuxm!dDNEy+fX?6tdXBy$L{%!PRviI zPNLda{iaMmUHNP4?DcmOc_Rtmr@=F}=hA=T@)5Rj#n1NT`4{#4%6;O)fV=GrY8<#uSZU42J>CQV~ z3I8@Ocd%Pca~50f%dIglUv9bR9qfp0Ed3YoDO5css#)-DoLqFg@V|rI#*j9)h}WJ5 zjT0yKAx_Na1Dw$Im@>zc`l)gfC@*wk{Y!hiec9@y<$g;iHa5d?zVV1Hx1r0o`Aj=& zeqMc|Q@Z1l_k#9}7ZPTbAIeLewuOhxanVem?F*f(^7A`< zw>oLpv|Bov<>z;>WBWM-SF28JoxSzkt(u?T!wz?y>^)=3IH5nE(a9I*)z3a%eG8X% zda)02Vm=Gsr|+2VI@x;`S&Z18!1j*$V76EOa*p;g=J9d0js;ivUhLUtcuu?Nv-7JZa~NTvl@$Y=E8~^9iWg7+qkCC-A*G!IG_v^Hq6`ZSlm*Ny3-n zYulH(++wpfirAiTV2DmKz7HGQANcWO%?a0#*VhNlXW_qFCxw#>z9b*^T6bma;NyCI zQaJHq<3_!9tYX!SX>Gdly3x1!e1MbW)d>SNj?_uU_vr-NO`UY|4fFxHIPdGr7%(ld zZ{4pg-`VGJ@g(E>G&s*i(PFlu!KiZUH|;Z>9N;8zjw_x}Rpejh{1(qSL?84%r|G!% zGUl7IeC*9T!uRO}yC2$n@kDMeI5D5Gf4feEskZRHcg!cVm4lq4{ZTyO{b)8mzUlU@ zc(VH5jQK2l=h#V@dUYaLqLrJa-w6jr>hg;J2?qpgo2#_tnt>$R}Orz3#)K4OecjCw@$EM>4bHCq&>0qo7d*^ z0ZwSUciy48q4SRL-8zx&hE7&%wv%x2{p~stCi^g*WPIt_I_J4 zw*~Cr!)|rLS!_9$Z|UUeHL?TS;z`X#AJ9qmwVi{m)b^pa+}AqBdGlKSY<&hyyjS>c zx!=->apKg;A-;=FZu$8=PVl?xBm|mQ#!;?w&WYus!Fxt0?LDMhI~(V%n_r;Y1AH*B3_=QV8*&Er+>8ZV7b zVpE>a#TsNIb&~PN=|uQmonUM6q~;j5bW%7Orjx?SFr6IW3e#+&oc}JYTI;TCFcif!(z>hNj%B6=o(fh;Z z9l*5(C*KKQ3dil7_Go=V=ijbH%5L*I1jEd&6HJHd1pJ{o@p9tUiO3tNlZ-!3C)W86 zoy@;qrFep9uKJrd6+hUexx&fFc}JBdpT1+De>$;hJDzws!R`ls+~SG8d$+|2YaUF; z#gmLbPA9_m@l7*l@nl;kg_B`ADVz+`iI)@XW;$Vgzo`>60)69jlJUpsMED1EGUH)u z>=aIh>7;NnOecO$B07mBo>&+y>o*Ol`R5&8k}H0PP6E7!-gP$RqJyt5W5SnI`Y+gd zSN=}j-%LE|efB07{b+p>xwbaH*MD0l#>pFWa>mDV=lY58U!8ZlzpZILkKsfbd52Ci z&J`!?JfCq#Vw*0S{QM)GzSn@5S#I$9(rUoloSXz<)KKOuxYRb>+`ogVIHtpMRv2GZ^Pzxi94t z=LxWEb8O?}!dox)W%swg!8J}^#16D4EIBcs$8f^;mdKyOiB~7Ld&PB*op)s}BUf%a z2b#XT6l@nK00^)4U!rW|as&Is`$6xOvBS&!S+pM7?oL7#D+!Nz62kMQW( z`N|c~V(de|dDFJ6>9y8rPRlo(2>;fX6t_9y`Sy&Le^kDMohLv$r~4g0Y;O7aVmGB8 z-+F$7{}~R($pyfwlO1f{W^-}^u5seTZturm$6L|U>YJCz&q=~ImAS@){j5%Qu}?)8 zb>gt_e19UKIR|mKlCv7aK2jdq2KcC%61O)jZPR&*Xo` zlyQPqo{1;x&nF8`gey**@#G8pFYmL+%xB^I^nK)6WV*)pbUeYOsu?Rz3r!ff(f4ch;(>z`{_Xouvg%j4v-RFWvY=-IN04Kq# zlW!P4tCL>tVKH`k&$l=J`)kd1oVVrecq0Gbt&_sZQ##??A86pFlg@qrmyAD7C&G7f z;?@amdRix(i%aud=29mae_T8fzLS%LsdL^jPM*>U{>*eDdKa7sH?j|lC&G7f5-@em zJ7BUsJ@0sQq6&h~?>2_CO>v=icUD+)+hD5 zR*SLId%nGm(>KmLUQQD2bj6dxiTUZ%ppiJ0&&8|nS}i!yyrXTHPK59CI|i>#So47T zd_3WN(+TUf2u@sZa?1GQ;)(E`oFuPK3MWtN1VXE3D6Qw6!pSh59N;A2pL5=cYRic~ z!N)h2Y-K%m>X9^t>bA8=b5^1F9`D z8Kx8A`})!!PwPR#xvkzk?v{&oVz>9>@A7RvQ)m7CdAxcwE>nPp$_eF1bDD8tocrQ8 zXlzbSz%@>sI%)66_r?=1C!h4+XX(FPY~!1?&mSI6WM{Tl=H2~g&>Pp!U~>&`@7ej) z@0y>duBh(X$QRF^L4Rul_CY(%nLgOtaf#n9Y}W9?Fuq%UIF_`}u`L&EzTfMLm~Hvp z_Ft=+Zae|ka?y2MULJFDZpOJ>s9N6|^Wy53pWnfbiMmUC3e*#-9>G}hZJdC2i{Crg zxzF;rY-5Y!#A+SOG2^6;%N^`PoPeeNadQ&zuf{4k$(qR+OPyF-PQ2&r%T^~X_ggx# znCivG?;2Mrv1RVNe4Eee2cN!MUqhgp$`9qGPI7%5clKqg6V76L;J0*P{ps`jD7N~? z%}KcHB)2*Ho%{GoJ3iDFTSHhb+BkRmjURR0(5`8>bYi(^r%qzK=BAp;w_$8OcdO>2 z#lKG3ir#mF)Fvzn4bl0G12Yfd+rZ;V@%4=+mwHTe8By5XLW@8kLRXmBdn9m0|3E0-Sn!v04Sh>Y!{SvV~VdEV0tv1@SX=0_5jPJ%) z+oujE99>->G@ph4Zk-fPjB_9MF`X1nyc)dS_b+a=i67RWQF@@*j!X0T04Kq#6N#07 zC#oBwlZ@}iUgQ{B&GdC5d|zM2glQcw@Pkhxng6x7d>2lPb079GofJ;oI>CMwPd4&W z*=Ii|v^`cH5->=Hr<^&(#{&-S28K#rMiAyK*@7}4e>RhaN!a9Zh zgZ<6{`kTFuyxP)t3|^hE<^g70JjwVzonX7E6V`1@PE04lzjG96%O)p@cGmefU{~X< zm0P|GCl_p7eJL#M?RqDd^EHVU8y_x(6E8N#u}oXclLfW z(KrFm-IoE|!gqTwPd}butM)kK$stb6XW={f4tJgG{kCTAU$C8h+3JL|*h-Au(8<%W z%7Jb1jPz}n{z-?*GTgP!GO{w;bSgZ2fs`R&KPKPO(e4R!*1<+t8fop--A4z`{vcgGf% zcJ*tmXX$srZu;^O_MH=OgZ6D~%SE5e=JuKU5q1Qx_T}Ago^Q|C`LFK_zrnR!w3m|& z>|mN%W2w7PgI*0i0Ma`VBfcgK=Kv)8JaU=ofX;ea4jeEPN;5?Pn7E9I~wwY{fPI;N z*Rg!T$tmN%ioLB9;rslig*P6opJtkA{Vtr)pJQ}VI2ooBFDKajppE7FU{ub3lM_S~ zN9rWwkJE|pJvy1^8y@SVa579Mg_B`A@p6LQk5(tjMQz0s?1t(jyMnod}+MaD+l(n;ZDm`(~O!*p_h zlOJ?`qm6Byz!#Py=N;jX(~11|=_E4DV*T7Fe#$yu?k%s!Mvjb}cZ5H3-tlrGH(H&{ z%Y@$PL+|JNV7TV=4xNM(a_C)W(>1N&?8|^Jb^cA9m-3kJ{$?We*;=m2MQa_ib^Ro& zowIxWx8e!7vVB85IfHTTU1t*~FUFJZZ)=**^54n#0Zycmcj!dCuI@D)j4hqCx#&ka zF-;W>W?#2;Vw@P~PQDX<6iv7F1dgxr4dMx2Ue!sU?W;VA`8xd+9s#S@^!bJcDump0%Mo9Qi{5mTiu0oLqS8#WCOg?Qd|6lNYfA z?Fmax%;zzj@LjI?^X*Gr{rJrqFu-5oTjLilua@WjLpT)MzPuD{FDF~i&hKHLs7l`} zxMrQ$Tw%w0*X_+WeFwpOz5c(n8?eDy=65U?O`UaIKK2_s+p@3! zi8lVTaQ_#y{+C}@-kpyf%S8tdCw%7wjDM8z@`bPUJAV1QZEI}B%9@|w^ZOHDKZ~z_ zOVjkX5^sBa8z{~4XM-%b2G*neNHeZUpI7dxi=eA(*c@8JBsx7MVc zH9x<{_Zi!B;iUa;VoxW=iTrlWegVKqYli#uZz3}kg z@bKTIFMB$Pk^aTT+m~3f6>a>Lb7!B~uDsW90cdHZm$9jY}=h#yazHd&8 zvJIs#6Huj|0QOQR#>vHO7N5a;YY6OYE1aN#_|H-g{H(sW4z6+HjVA$&;&-c)D4Y$Q zxH(B+6duH7t!J$h);tkgxN`R;rhc7dd^dIiy7=wWiSXa8lfua`ofJ-n>Er+>@a@yd zHw;JWB;$|MiSXa8lfua`ofJ-n>Er+>Zk;fGhw3EbkJE|p->s9v$uON1PKN2^04E9h zT=Nc?Y~$vgj6YN-(*T`_laV?REhBZ}EYHm;x4T=cyi{c9ZUZzldX z8u;(>+l&G1<@FQ8!p6OZXnD|i1v}dHr7H&-PV~Mwaq6VK=KXcLU$_4caQZmsql8j@xU>-FySM#)(rWF<@W({=%=Xa?P}xCo!M>oSYN6jFkOupYht$iRGfH z-#g~9WXst9^A|azw+LP-p}`Pf@`^GXFO@|$8R;bnG*=Y_r{ioKdewSY z-{!OM?=fJT6YlK~+KV>OV<>v;@ok)3sJ@JyJ-^!+(#Do?!#<`5oJuca;WMGhJ0j z&ef}UpNlOQjmYUp1W1=6<1xG@tag<(4O(y z?{V~WVw}jAC;GDO*Y4*X;ffO{HkNGJ?{)dgp?hCu{c*_0$@E8>*jsJ1j=*+~ z`8J+tJae7^ZH%n)#o)$hHjeocTll->wgp=GQU7n~q~@Zn4cj_l?G1MERb!5RGQWE| zk{oEYam>|;79oD9>+0Z!aH`389-b&~PN=|uRxzVyeF z!pSh56i$Ze;lEoag_B`ADVz+`$pKE1S0}7_hUz5akJE|p z->s9v$uON1PKN2^04Hvppr@fa$@t@RBK&vjq;N7!Cxw$?Iyu0}0iEdD)U)%>*Xe!@ zzk6Q>@8@e@zP`kot#hrwj$irPT!#>LV6XRz-|Fh+GPs_E?H}cHalU4>01kyRNUFWQ{zl z6M0?z{=~=6<@X9`<4A1jq~_A)|Nqg<8n{QCv z;Cr##Yu@s=^8I&kR`)TQ&wfsRru+9eLSWd{afE-%{LV5zzsL6%7`N{d{KD6gJBo@+ zool9Tetr+Ty~kCIR8G40yW)p*QuFhB*uP=>Tj62)&bi;Wbz+ZHBbIQQ|D z%0A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 WN)301<(viOR{qKEW#RkPQ*H1dw={M7FuFfxh z|Kj&6o~xGYVH3}srRk^Yx4iG{Ak`B;Ae+F9Ia`*v+ZZ4$co#97-8#^f@i#aUg$afc!>S|glOk{NIz8! zSH0KsnRVur54-$uhb!h>>R=@!!P`|{qUUtz^Xc~|@;T*0QX`eml!tjPi6�qN5bJc7e>?!dq{kCJ}W!PoI=adg|MRtUH^p2fBE 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%0A)VAdH(YG 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�gZsBK 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 F_5bVHKEMC~ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/degrees.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/degrees.bin index 715e6b656f748a0fce3c5b242b30ef9da996ed4d..662558d78aca547f5fcbb4e948bdf1006ff3d49a 100644 GIT binary patch delta 1201 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/derivatives.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/derivatives.bin new file mode 100644 index 0000000000000000000000000000000000000000..d6d078877597b6473e8782c26038e6f056a0aae2 GIT binary patch literal 11264 zcmb7~(QzC%42F4`NuFJSN23Z4DDI& zcOXE1g4VvfwATK>__zJl{%n6^{L|W{wHxMs!;n92x9_*{_wSg(?RL2cvAtHdwY!gq zMU3w{@Rkv`wSKL$?Y++SUS*L}nMK`Y7G-{hZPk2b@2f0oE3=YrH7+uEth4>8&fYy& zS#im;?Ka%PeRWoRT%DD99osf)&BIw{f#}Qny*caIFVC%gdA984tY^Q1{YvcStY@(& z?ar{szf0{E7QU2O1pEy9YwyA@va!9uC<5GJr=g`{A zlMITxyTfs@m)OshMGa;4f;VrjpT|YMpJ7`yE^;WdsIAOOy44(z!R{~b!z=dp)$FhA zcO18UL!58xS-?f@xpg+jYxf0^xi%jSzIZ5HS3^w+Z&EV;&={(2U_I1MZ5#yK=u z^0LOo_2|EJ#+ax6fVjKAE{7+%XX6fknZ>++?%Vyf?2*56)>VI*J@VJHxxb#x{q-!o z#%tX(VdUJHm1_*c4u6@Id1kRp7+2;4R^8#anyb$tWo1dKEoJ{p{Pj5?reimMJ)8UM zS^q32jz(vp^NGJ47uV_YgPc>Ri_BF0}D(A+m&SP?AWv?Pu=ZTeg5sP_!t#NfC$YDo0 z2lWj1%vlJFJPeB(QdaKS9D2fH9;H}z^H*-H{S4Qszn;zg^=$4hv#2ZWzhK*%FIfC) z!N9z3zy7iPpD(i~{+hVhma7aK_m{uK9{Nk{p}&SjU0rHeb6ET}?1{gIMM#O;*SNSI z?l7yjR#qI{e=Zz*;ICs*pQ%mL+J1(J?N~7Nm)Jvpi9Pg}*h7B}i@H*OWq+#vGJE8& zXLEl&oBPWweh=a>;{MC5a46TDF_lw>(Qpy?^6XW@T*|h)qxVgWc&HZKe$X}^>tqs>{|7G^bU(e?LdN%i$StQ$W z7JWSnFzOkz`1cK1>jU;GWF;oExDHuekK)RE#WT(!V&%LtR_;-4DJyHOtfU*omF47~ zWjB90Ux2B)G62&*uIzd+cv}tov(O z{QvWZ40~?yRL_{%*DF59$)0~r4#@vq2F2Z-F+r^{XJ)K>g62NkZ>P-zSH0H z98lZti$|5pZ~$% zhs0lI+fVGoPwOQ1QEOv1aveP`WPM+s{&HN;PJho?F+r^{jIRW zUuIvf{&UmeFSA-Txjy`5)_)&n`fJ%^fA5~_{#v%RH~9OO_{(hM`tX<8u&?j#FzY`9 zoc^A()8BJ;`dec6-gnMUf6v+J?>RgDt+2yiX2b6Y?ERP7==(6kUuM1Q(_hOT`78IP zzw`TP`fQ8-VejAM8jq0}SYF%9)?@UUp~h~`*4VA*R#-6VcZD6!R@mWek=0G9u*2C3 h3#J@*I9rK}+Vq*B#%?{g#%|75SYbpYW;eTA`yU)!=YIeI literal 0 HcmV?d00001 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/determinant.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/determinant.bin index cef09cd67bd1e75a9778c97c4687d60e5b2c7c2a..0475a6e6a6cb48c5f454ef4f0899c3fe3456a88b 100644 GIT binary patch literal 21296 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 U-7aCHo{;{WLe)E_65!!~1DvUCg#Z8m literal 6872 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 z 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 z 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 RcstYN2*kuNygzaK{{dxl*^mGL delta 90929 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%0DNcRuVG;F=#zgc^ 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 z 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

%pS61xXcdDm7hLt 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 literal 832472 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ånePhI9^e`tgJtA-14_5jGoF9 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

gcEXA9cu={0AMm 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 QIe&A9+2T(=bDF{ZKULpLj{pDw diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp.bin index 0c4ed5bfea0a6a59f5bbcf72edbe9c39b4bd55f1..29361a2b27340806f4b35422d3d20231dfbf0c28 100644 GIT binary patch literal 34592 zcmeI5d017|zs3(92S7!|Sy6F7P*FrcrUQpT#Q_l&5imzoau(--9E#EstyC&4%`j)p z1~Z35qEfR#94a+SO;h_hWmnTu-r#0;FUM$`U z7K_CVG13xb>0lXb$+S$cjJHg-Ou@Fph*E?L!ctEAm&H;6q5Z#$OR42y>0Em`%RD*Ii5qn{x(7lsIA>zkzFrdj4ni_tS6f8P8^v3rHy|W~>mp|F zb9vE+5R!3^C?;n5q9M__2+82uiCGccK6)cUG7r1E6v=D<;z*_FlL*P+{ty%P*4I(p z5RxgW(UO>iORq(xAtZx)NX+SegQKn^Br_+w7cr-Ty`!!nB!l}*%(0^Lw#x{~R2cmf zF;7IiVVjJQ44wrsvxlbGmLnvyq);QVVVo^BBr%7raKNG9uk05K(Td7;+$yim!Y9uiZ#d#%v!2+2fm=|s%#2P-=Mj*txMDlun0 z8g*=Fphjpc-RygCv7?LCm6szjru^kj%g-FB3DaWk!dO5t2dMA?D2PqQHPX zMS+qzx@9#nzBb>$IS9$1eG!wja7p_jgk*+H+e*yFf*S!9*4_w^4B8+u?K*Y}co88P z_Y-@FnKpHGyB`q5L=+RVV%Yt**>wrSP3B{ACu|4PiQpzPLTgR@)9a?mFbv;5GORyDua z(n>O)yZuE>w|>9*eS?q;`VD#~N%i*eJByG^&e{sZJoVEcU-z?vd?kavg_sw2FKg+& zXIV?htXrs&y{|eoS@!wgc;X{Nh2mLBBF`hLV)U8>gfn0)RheSXJTgl;aX?pUDrC2`L$pSF^g)s)Sgq@rM6_y zhZFPipEqj0@Yju+l6h_PbYjkQIpz67!YNP5pr0qEpKEcA47cJMlDWEXJ~1cSZ?1ke zaC3FZR4BiKr-<&D9Htd3n2Qg){HER*($FFJe}I{h9UV zH=kK0^ZT8R#B}ppRIZ@aqH>bK7{^SHSeK27vB(T%&iF1d7E4g>nP-B``JhF<*ZrG( z&?cGZeCOL2BjmBruSQ8G;+~jdo;2sjQVAs;vl?cgTEFi}3 z`LALl5t6}uCdS^fMqCO)GUzjjSyI?LZXH50coxK*>$WoPPlRO9w-A%t;Bwq5gk|g44ykNjg~Iy z6oZfq-u;Mq?d0`N`w)^r-H4TSBkN(e&Px!I!8;o<2iCpQ`6fa#s6WKiDy-kdj*txA zwTSun@bg`+A|!)4M$EG5R$>W1Tl4726RtH zNCtJDm{~h7b^ioGOi3;=D<@CyaRDJ2vF#7;8$Onn}sN%BzohmKsFUvvSLd=GefoWk!2c}5|`5-Zc8LiX% z4rrY&8T3EI)C;bV@c}|I$OnmeuJ(xxpE@UqK_5lTv|qLisDEk809g+5L1MyAEq>xW zLNe&bh{;GFKd@59_<@o^K1j@a=XwkpcD~0T$)K+z#&2=p;IjzHARi+#c3`;%#D(4-)g-PggSgpS_YP z%R#?N%-x^P5C7)u`Qeg5K1j@yRnLxy_c%L3GU$7Wc{=Xg$jtb2BPD};keH+wf5{4Y z>6a|YpnoQ&PV~(ut@fKwN(T8LG0jdt998>=hodBeKAe~xjoij;YwR{gGROysse7c( z*g7S3#!3eLJTdO){Ki!~?>9~|$Onl@TNpDw^ZA(Zl0iO5Oql)BX^=?FkTSz{`u9}M}A(NEg9s4#9UibJgHhi@g&J$Od-Z+-|v%?3V)w08RUb+ zyx`Sf>fS~Trb-6m4l%=R3DaJWN|+`Y6a;3m&Zmkh=xVs7l%J|k%7_8F2v zK1j^=-8X0cwddwc$zc2obeN4`S8DnxJgE5YnbGe(IvOl-! zDalwY?-FBu`re$;&)l0+6*;404s!fIbC5h2`7LxV=l^Cdvb1z=sTvC`rE0FzIY;T3 z=XK6eI_D@I?E-yik!mlc7UvwLbB@wcH=J{n>UU$DbCk|GN=LhJ&QYp%;hdv%&QUtr zg>#NlwF~DQrE`wb(JqjWJLf2k-!XR1Q99=+9qqz7N2$gO=NzSTj?&RCoO6__T{!0` zopY3qcHx|(RPDk!N9mlSbhHcS9HnX(|C2dNo_~B_%wwu~!zC9Q#jE)dwcYFBu*Yui z_wBOBZud&q`Pl6jcb$Cf_ARaNKX!ZgHy)iHdp?!CAG_TW6DYSEYeNGq9W6W`OKU@| zVlK8^siid1VtaJ2td_%%jt?#7l`iV{)UB3Wsr?=4BKAAATxt&@OVzqF>!vrPb|>8j$XWg0liJr2B|`IjUuvr&)(EZg2T~gyF-~eb zq!t_zF0>V-{T*%zl1r znV!Y+c;2l8gqB2FcB^@<)P8xS9rgR!Picoqi}y5d!f01CXY9>MP3WFUt7{nG{4+jY00D=Yj(Mr(x#AhwW&pDD@beH zG^nZCuaLB{-t)bcc9FCVO$wVR&HZzE4X-wSN3E^129ma+QK4E>XH6sRq}MGkRpva> zntR!VwvjZih9M2ren&~G(!jTY((aSyT|ctE(tHlcYv^BZQaz<5lQy_+PFsbl zU1@tsYgR43n$oV4cB!hHhtfO_$@4r@rL>CDd`Y`o*;{CK($>3w>8|!mBW`F>oPuh(Nbt@{Zh_vJ7ACyEHCu(qC#lY)L{p z)>djmY?(r9A0V|Ew%I~UZ!fjwwpWGbA1Jl=Z66BFvxC%5*uEE9XXho#i?6GPcq18WJ?zhIiPH3x0s~A&Rt--T;M#%l*V!8<}kF;lF@`UCd zDfc@P^PSKZlja@ktJc_A-EDHeS+Vnl)|<4mv6qClg0!A-DRJsvUnK2d+&4lCRP(Xr zN-at8{neT`>papf#$OlOG15A9>Z#VRS$)*HPn7vqr_DmkA+2)fTAkH-o*->*=Y>KG zu*>`6(xr-8duGieZF!eBg?5#+u!MNE*39Y~Bg?#v@yMM)cP)~d%Qee`{dYUb)G#)D^5Nx zw8f;2?)_A6wO80S zzZImlPPL~ht&lYD{vrL9c9FD3X~AhqbMGv#;b7WNLJK5qY5JygwO<-(b247dP})4w zRt$K5fYLUSHui~UpHSLS(mD+6IZ$c$NozXDHb`kcUF0=H4o+2Tq^!xL#S9rZMD3SD zTD776LzT9Xv8~xH~rTLO}e9S$yhRJFt?Y*(zjaB=l zk+y5xkK>d!iL~+)+NgC%);!WWPaHc@?YEw^=9hysi$%D&oOBqsj+s(&pdts>HEUx$#H`FrhABUYu_^(Vj?a=R1 zLzh2~_H}uT-;M)}NiC9G8P6RDXQ{4!*Y)3&S8sFmNux5K-Y?5523F3O0{dmAl&fPRE-0uu= zW&YmPqx1WjxH7&x;JVbsU(M`%nK;dxCsBIyfYYzz8gT_?e;#m$i;i#mbLcJNR+>F} z!0Gq-HgS8*K0V;_Ei1!f6YdeGdG$Oiy?Vgu_vHa`nqSW*>DL2p?z)(5gIigs{v9-X z_JGstOF7~+-=0M2+XJqAiFRko6W7V?-2+a)&y|SN{CjRm{~mCs=bm~m;D#GEQ!Te;!qcJ7V_n(asNx^JBJEBQC@2jQ3Wf33ti#A)6>mW9IG2b^9H>Jg{;`$S5AA8>8=Tq#)8t^si|W{)3m zdVTRCPV@QcAbozoWez^`LHFRs#A#kXUefCaoL;ZIiQ8)S`vLb>^TZFojBQGs=K1rE z^!x#**S}`OX}&-Er0);73t>y}Pjlktn!SI(>GiY)asABxKj3Cf*l}@esSj}n%^pDD z^!hA*w;cVm<^$AM`T&8;I#{?XE8maG)4YHlNG~98dcAK&oaP7ALiz!L`=|LPw;@jR z1ZpikfxzkQ!=JeC&Ave3!hg^jTsz`4Z=f9M4FpbaM*+ljHv0pCd$~u$WtNrgiPJoS zno5r#aC&DE+~_Y({r%;V5aKlNpytv$2%O%|I})e)2W^o4LEtKke%O6}MksN^ z%pOAE^!^}>IL$|>sq_&7_s`=93ny-a*-HqV-fytK+DWsY5V)uxS2n5BDw4|6JcU+D zPa$x6|6(If^A(DgzCz$mZm+fRPMav=j+woM!0G)^G;x~0ke~Dy0#_fkFD%whoaQlf zO?nK0)BCF!;{44%L*Sl`-;OSUIn8S*PI?W2)BCkpDo^tp>MZ?+z#Z+Zy>Ku$6`n(p z(sKx$-v7l>d7AIgIq5qDZgO(i?agHR5lf6g@d5P{pN4ZnjsQ+dyty@6A?B5?Zn!Cb1@w+P&{e=2lODo^t+S}nbc!0F>m5^}v$>?pDvm+Yd4qZ1y$+r;meusJy=)nEZ{vWnbxcbMY(8 z+07nD;Pmm5InC#&uk<+rSNop}?n}qrbJ^r|1Wq4UnbZ7^MoYgVa2KxLimM%$Lgn=| zdme$)$6w|m&AvzAw71j3#{H-~&HLzz^gaTokJBa&{zq;-h5r#a{l}c2n>>&ln5DY< z-TePLKex;Lyo?tT$}{qF;>!3Tfz$8H4&usqB0VaPJ$=gfB7xJ}`Bzk48E>RV$2~!u z=8yEf^hW|``tztloaU>PDt(o-^V9Ql z;xuoijnZ2QoROasr}-=WE&Y|i8TmPJIcAR~aQgGDMV#idv{m{nfiv=R;(j%IErHYP zK|SKCn*El*8TmPJn&(on^jrdG>TK&xw1%?9T+w$j^y$H+wXJ)7ytXahgw4mh@=?XXNL^xthJ2 zz!~{DahhM#5$V?i&dAS+n{D=N0%zps#A&`wOQmlUI3qtNPV;V>E4`b*8TmPJ@0tCZ zz!~{DaXw}bCvbZE4JJ?5C^mhVhXXNL^9XIz!~{Dar@1_QQ(aHoVY-?Z}z$j^z>Jf&>X zQwp4spA)C~N<~OtDR4%9PTbuECT}TlMt)A*-dQGpDR4%9PMqd3)l+&*fiv=R;xwPB zCKrUy6gVS4Cr$kK8w<}Va7KPkoQv6a3Y?Lj z6Q_AkO_knL;Eep7xL3{oQ{asJoH)&cYSLceK?P19e^ZFle5ejeA1ZK0eokClvlkUO WBR?l@k=c(5oc@zaoWqk!)BY0x&+~x* literal 26480 zcmeI4cT`l@zQ+fSND&aQBPbG@Nbk%H%uoasL{y}TsHmt|zy=1zMr?>)3yB(3E;fuB zO=65)B=%Q!s?kbwcbH9i-Hc_ z&vCq;yVe$(hZJ;{c_^6^KJH~`3)NHPT-`V5(KYe+`O_Y`yra|bZzrk`ENcNBE!b7sz!s(SS!3OWYkXESH0 zvP?adf)0Hb%qbX=pk6~kXJ7M2%z1gvOl@)Aj5+juG3UfT5324^@H|&meZibNizcgn zp`b(GDRVk6>ZA&!pp!nWmN`-Vk0`S!=+O7h9HVbWD|=DUNv!yhIsZIqtn7Tsm^oB8 zPGH^GA6yZ9mxAXRW^TfqnVVF>6%=%+{xGM={(8_J3OZ+UZJ4wC(!`*n6m+PLF(*Av zKWI4xovbEL=G25Q3zQ<31)@XskU1UtwGZq^K__%)By$e_x-Q^31s$rZ%&9ZC4X|!& z%bb{bsmy6e+~9AQw80W*7NdPAKw4huQ^miWfikxj{iEecDRqOms^1IYL2)+75H>9IW#8JXGb4PVLT( z%yCvbdlypBq4vd`ti{W{swn6TpRtQMl@(7t4K_dZM2FfSb36hfJy%fBF}Ze#IWwkj z^ter7jqa)Y>t{B(qf>M89CMD}ig0(m9l;!G%gkx4D|Jh~U+RYE`K-@P=Cp~e z?^Q@ahuS-HJ|E=NtLI=R=IqXR!kiy{b6qF+<+|c|s83+dnzK85wmY}8CpxE$Uo)rg zkRMzwQP81&gZ(B+v~zT+qo6ZuvjKBv-y7y^Qa8*Q9qL<{v*O@tC%Z$dozU4_Y|fnN zDOHXpsa1~XQ2)am!4pyVhs^O?{m}LW1)VQ4HO$#?|FzAi`qwt-P@l=1LuRdQJ}__195;i0 z%yHXq+O?U2=b?U;Ia(`A>rU+~twpgR;mle2%hPsCUq5Y! z&f4*L%()YF)9QBgO)GS$pJ&bxqiV}k<7!KE8jsFn&NZ)3Eb6>Ju|UV5rieKKn^v`r zE??Cao%qH@%yDqYH&;34o1;VT3+Aj+$C>R3i8DiIR>*SZEJ<@Q-8Iz36dih}FekjZ zb(`!rt=ph8dEXl5?AUnC_|~Rt#^}&{hdJkGY%$Wy-(rML&-jm-6Zm+h;j||+4bh=@ z6LZeaQnofLRJKOv6N?JwtlVQ{aA&WP0Xp>lV$Q~kC#7eXPDlmX?MFbXVL5KQG=FHD+r7fnQL-)*_sP?wnffRJ8?Jy@{SBN%) zf(|_wb6h;eY5gha(Aa@Fp-)$8V<_m*voq((&j+=yDCp3;TZ_*=ChAA+bP783`7oz4 zwR_k>3Oe+TW6tyeiD3&V=+I}#oJ9v#g{`NcL+=9SxGcF4rlO!jpEGkbPL|;b6m+Q1 zWX|$q1H-pc(4p^wIrsan5C4UN4)ra}DYAYPzJY=ceP7He4)luHMnQ*ui!$f?3yUL6 zE-q#ceW%Q6ue}lBOTqKdZ%F2R+{z>J2n8Mb-kD>&YI&rVf)4%mW6s(e-$x#$phI;d z4C_W#bKl;}Dd^B|Hs+k(`f2ZH6m+QmFsJ>oE>Ri^I`mtMIY-VfiE5;vLv@Tf-{v(% zb;xgG4*f=APTj_F(N>$rMdNv>9x|u#)tzX&U+yr6e%mnT*ncGSc}c|&&S2@pfE>S%^Y=# z{=lsibZ9)toXK(92i~HfLv5KkeJWB1eMLcs#)Hgp&$S#}PCgIQAQ>a!x09%{|Q= z8V@q(tJbTNA`Mq3;d!WUVb1oN^yHx0^kj5sJjk45sjex5(_B-~q5g+Co&5|_zo4K) z<3Z*u>~JmBvEw!7P#?vd84q@*b$Pfm4bMa4LFNSAEE!r)L5KP==A@=fN;gcMl#ULK z2buHP{g`1R>tlwYLwy}{TuQt%>L}>Yc#t`P6K#k8L_vr8L*{I?F&{C;)_epyG#+G5 zVVVBO-W&8sqC zWX@Q#y3rBlb)(UtzLz=k!|#vDjJQ7r9U2cZCvL@qEdRee$U=wuXXbPaeKuCoJR6G+ zjR%=yf2(<1huh8L(4jt@Is0slvv+qh&PIpEgUso4x#NV6H616QL;XB+Ozyi(Y+LU# z5gi&2GADVlc2edN?Id()Jjk401sRjovoa>5L*qf_{A5~`)5g3g2OWA}Fz567jk%Zq zzA+aa8V@q(yYlKOZ7Zs$phNEz<~SaGJ~i&x^Qq|2c#t_uZLFsswzZy)4!w7nGfEvj zkU1}H7v%YMUyz3my_=Zxbl;wQ-~D^?(V_7mbM_p3HuLqNXEV{E_ZM^Q z=QtHio$FM94vhzyvpFw&*01^5v(TY;9CPj$?U=1uxMMat3dLULNb_G6j$iPq(2T~6 zx;4m2|Fs6m*CMYI=jZwNtVOo8%xMwt0!52h>y+0hb?dzH8l}8OscRS1msW}P(xQ;p zDCIRuUEPq^D8=8#$ZM4H8l|pX$ZM3MUC3*c@*1VCUC3*cqFu;ql=2#-u3gZ0TwbI6 z<8O@RHA;DnQr9lzHA?Zmkk=^XHA-E(kk=?hyO7r?s)_`s#Ncw~5~W&g0)6xbe>8J6)UJ zc|7=%dE`6q$I$Mb#}!&{JpRYtP;W(mg0IK2y`d7U#p<^xT2u=4pP!YaIREGMiD^HK z5`U*IDT!h<#^LWf`)cRIh;f{uS91)%U>4wjjHyx(m!_JF-)%bHLnp zAls$d3(RyUvcIU-09&^US&nKNuq(Tf#i#}V^W1~XLFEE0c`vfp$~R(`kyfFt0DM-09%+Vh^5F%UDV9N?-;1vE1O` zBw(IjA?p%s3#^f`dqIB}`|zaX16Zyis1jHeV`GCR0dqTu<=lgOft4}#UEp)EUr(|; zgyjkX=K(8b%rwvnn8{%*S01n}K(wP0#sUJ=z)ZwmX=-CN{x`&4Jt>~CiT=}pt!2#I zzay{)#=h`7EcWe5USdx*T`$cq6WAQajQlKs)iO5Sceby1KF4GD?Du>gi@keN0b>Jv zQh;4!?40*iZ*fkK<9Nuc-DA&l!jq%C>2K$PsT#IKLV98=_oLFzq zfu7==ux?IljYqkMV8>axAKZU+7wiRN$?l_o^*VvichT*(n<$sbSbw)PU}cOQ=yh7` z&6B=itikn1S8-0uYP_Dks}Ha^#&UYj?J3H^ejIxCt1b;Lf}LmOB3uRoGx-{?SM0pO zS(J-mY>U%=C&5Y>yYBeNQLq}uY#lv;nViJynL z*4U$^hhS?Nv+ofE>?mV7b_?x9xdz7ebU)QyFymAB3>&(ADfZS$UX1OsJt_9oNlA>| zwRs`-$w_k85bPFX3Pp!jg1unOzjQ2ow-)E{ zbBQl~A6PHOvP(;VMKiXjv;tTrW1CA40-MWNRcS3SMJv3QH!6MjoqVG`vKEyDtkMRV zzPdFq-yX<})TY479FSS4+XM4)M%Go`9hiGhWG-qqV5Ys01*%oR*0~|;r;Y=5#T{9O zIun?uC$cnPKyQ#WQv%>|0=K8S585C|rEj4UC-%zX;4rtjE&tm)M8|vFA;i!&pN^Bd}V= zA|hkN{x!)_?E9p1mPdX9tbj42-d4TEeO_a%u=iqM9vb{yT6!Ccy=M~a>!j#Xmf?6km;OQhMY%Y}YWvp% zgZ&2d?91aeioIacc~&laK!MobC7DFv^*rOl;>Go17&{Sv6<7&l;|I zNHCK~yq@`Bd$A`=a%apip=*LD7tdIE!aiWr7)uy3c8DmqmNEOpphUrrGS)fCBT29Z z#=0bXCJScV8=v7s@=ah~j4eyqk|N3_F_xFQB2}4G&e)?=7zm|%`k_zcR7M6pLoif2qaeCTjdu7EL<5l$ln+s@dV5jG_d`@8B^tC=7@4z z8S~2>nk(3G#zsw9Hbt;oj6IoZJWa3{jNO{nYPw(+eerYAo8dk~uwIPi|F-U@M|DD;PyVw`usLISK3Vs<$n(j%wj$3b>*|C&pRB7B@_e$cPRR4g zx;i1xC+q5jJfEzq6Y_kru1?7F$+|ir&nN5Zggl?Ds}u5kvaU|Z^U1n8AV!O> ztg93M-{+IXT(hFz+jG7j4SD-mV9MLaD$?FQW|;o=G4-&wk4?#V`&h#8w~sx0$FZd& Hz*GDuu^!7K diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp2.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp2.bin index 7ffbb062f1b2ef67ee6f77844daee1f688a58354..367b5a8e903e15039a8fe28a5742566ba8a3ed6a 100644 GIT binary patch literal 34592 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 W&%ymu-A6_4?>{AJ;PjnTQuc4+=$+UA literal 26480 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/faceForward.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/faceForward.bin index 13436dde01b1008e59c6d6b8d8e8a87db54d7ac4..8f065bb97cb49e82c3eba440b471cd51fd4a8f05 100644 GIT binary patch delta 5534 zcmbVQO>7%Q6rPu4Ti4Bxoj9@c({^#(G!1D;(m$Z2UIP+EYSkbiRRW0ysz@AAiJ(H9 zYUl7yARt&}B!r*>2`C(zOM3t*UJgjTB}g2&fGYKZ=mDRRP?*`7-SNzNVuw-Ivpe(V zd*Az+H@m4nsC3-?VzmSMR{??jbs%&ibRjqhdl2>_BoOu?BoX!_bR+a2^dj^jq!7{w z{RjgH8H7QEA%rYK4q+H!1Ys0m4B-I6L4-pHF2W-Sd4zF<0>WX034|jElL$u>3U|*+;b5Um#^2vDiW;%F;Ed*E*cllAzHz&u3yO0>!-7Q zI$*}z4q9JDrX>Xy@YP7C>jClsVeNOtFtD}1NA)-_oDz)8|yzje~(w!#$GCbd^&?>p>X@}V_>wXGM5(iQ<_TcUD6S3Ty@tx`5qT}&h+@92oTB_|Q- z()Z3`J$mu{+&Ox}BA%K&db9dwo$^B8=?1Aqw(;uH*K^NmPKy&0C5L~)n)mWpWw3ndd{^7A)~0LiAt-WV$iGKIin$ByHs{U97r&f3R7FDuJ0QRk=ZkA@tBHno0pYs zqPlI2_BT7g>F>`c-CO|G`Z`(Nq?J$$27^>3tm=^q!94S8U9 ziw#PrQV8FQrF8|5y5;mZ-TW~3gsW{@natmyJK;|Cp?G14{TiSdjtPxgvVARgCPSqA4#$wF?bApzTWXMFeTR>b4kt~WNAI>D(w6nlAJYK;QVmos}PGjVr^q=Y%g-gwH<9)JC}pPs~sFviC%9GH!#( z`MYjOcSjQs2Izdd{2vlINsj-UB4`!S<&-=Ad^+1pKR=Z{t}_YEZ{-g4F(QyvMbR0D zITO#Ja0}4;CC22_Vb@?{w?Ws?u3X-ez7T{--V--@<&)fX_XrTW^^G&Ed!^kpwCm70 z+wmf=y#CNFbTY>D&@E>~XJb#XcD1xC7qPi_$4ps!V0G|z!(-oH5s7!_a>l-qp=4k2 g;?DJCZb%7 delta 211 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 aZXrF|eCm%ZH(Ujkl)?b1@8py0zyA;AJI7}L literal 1031288 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
w@fShyoI`lv9xzPMPwsp{eVti!zf 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 delta 59 zcmZ4Ccff^(iGhJ(^9z<;!h!`htUxv+2s8a>V9;lnyjfzpV8I?_Q3Y#-&C!x4c>$56 B4HEzW diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/frexp.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/frexp.bin index 2e20d4ce033d25c1a12f314eb12b8d1ae7067723..6811dfa295076b1561a3d730c434b9b229849de9 100644 GIT binary patch literal 47072 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fwidth.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fwidth.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfe00bfaa9759abeb79c4ec7ff12db2caf58718a GIT binary patch literal 5917352 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
M(j< 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 z℘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

@Rz~Fqs<6%CZ$7_Wd4mkdf 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�N2=WBfOycWOoZD>5cgdE#-itmZk_~dyLUwk*@ z?!57NnSWUq{rs1l6o2`=im$SGuPzN@O&9R$E(F3J`j(0@7XO^z z(7)O99lp`YU`EfA8)%EZ7`#7UdgkEIHI+Qi=M-R{T>Gf>lHt^@jN5^#r3yho_hITS(jxXe!S#nzD^-KaXzo} zr^i?Hyw0EXL-M@NpYt2~GkU(upY%L(->w-WlRV#LZt%R$pY2DwZ_~+1jDNZgW3Ki1 zPrPJmzBkA}X6LKJ{7DZF^D!o-J+J3KzGpP^F+PucJ&En;d3fgk-y^hnl)vKnf&8GU z^PboF)8i|8UgyvHA$eZsuX(=9H#!+L^O0*N)=sr1jZESBHgk{X75;2LUY=L@({*^N zIZxLSboG+wmH3xEuksf?ukwTQ$~pWY=Ju(NLOLJk^C7vRAF4GU^S|tQmA~kDmA~kD zjlb%7g+D#M$ny$+)(@BG75=j4+kB&w$@4S^sn)!aNuKXAH+Wv>&-UYW-=>}CXJ^8@_Z@fAI<^Jo2#Jg@WDJm2LTolKsm+Nsv0kx8EKGGm?3w zd!C0W9-i&TG?+V*Z_ZO98n+Y{NVZZb<^p52)6i~appP#&R~A#-j9G!bwk^D zK0I5*Kl%9uacSG+&*Vq+>j2;0zajl&;|s4_@Vsb8BR|vQD|%k%&-x*GUgyvG4csqk z{*6us^CK`t-Hv zzE>IB(cv%6=k@q!{g6Db^VdAz82CUFJLbqQ7o>yC3E62C@{3n~h)dh{_>%R1Hk_Zvg{*(XALsKr|K|(;#$5iUM()@6 zLziXafH@%vZ7=MZ_#XP@mdYg}Wz1EGE*DTc6<^M82 z%){~BI-KLP=Y9BSTlTygKYP-LkNmju(Z8;I_PkGiLhXjSBp-9V7Vj5C{U0|Ra7$zD z6wZIcYaacR;G}IUqhk}3ugCQKJ@fjU)xczT*O_OG zEBvijTXbxSlYLFk%Q*4eb|yJ`XPoG%?Qw?g&w1RIPqckI6M5XuB+qW{Bf7_6$fsKK zFZMpt#^&WVL!5nwh&+xlF$lvk;SuIowf%>2`jPVxw=~93ZFl!^YMc?i@ah;J*MM+M zq3a5rSH_GQ`)-OkGPSZ%6%MR_% zZPT1xGKodoDl;4q-Va>!{nk2*H9p-}PV?R|{`|V>WBfnRmOm=@8>;a~zu594KZ{^5 zP!47O(WkC_&W9!c~T;mUw7siiQ{*fP7KKj>{Prmlb53)n|8{+#`t|#G~=!f)P zJh&^|YpCCEsE)7baXtPUm~=mKe%gTYkcy&#!ttlI{Az^YwPLO_}BLVmG~w92lziK-xI0v&okx868}%| z=hjVc=U>J@&S#!a{HP+={Dd;~%s=wu%4g4e<^ObzAKA&C*W!Oe&A%Zj(q8^�N2=WBfOyv9$*rt3&(4`PYuJ;mqPH9mRX#24QU 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�N2 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 #ZoGx;^-PdXXQ?0I#M)_C-MUTS*un0mg$WRHD* zvuhFF?S8$*SIg zfmu9X@y+w)ICno9g2!nwRo^n~uA<=*AfgE=p{yyRosCf|9!ik}1Fc@)L(^OJZt zi@%Jk#V_&p>$}FM1J36Mxi9&r<6g&ao{#cFIZ+P1uiW}Bk&Kbb{(;*$ALqZzxu5h5 z=Qj6Gcm2p$&xi4^&adqGh`;Iw^?bx%^P73T!|!{ZYvFUQo_B80TBlOekSQwtD19QH z?=rbhM)Ppyi|1qhXdTad@qEl5_57JH^^5t3`A*r*&P=FdQh#Fo$XBi|Ny~Y@T1`3s zH23xM(eye^J+OEA^dRv@_!je#fAst@e(W>Mx0sK7%8B`>;&VPm;$Pt-KZAVQP-}Wv z=bB!{kGO~V$NH99clp{cbNNXafX{gu7az+z2OH{pt6XP29+v0+9Q6FTzBs2F>d#d_ zi09+{toaRGKA-RMx9&BTD(7JF`8*!D&iN#B%kO`5nQ!oX%wMgecs}Oe^L)&|=lPhQ zZh3x$Z@-BJp`pd}e0#+6BYa~X`A6rRJpj|d15fe69puwynv=si5Z;-`_%UaP`G`cH z?TAm-^-|~FSU-g4{KIY%^e3w7zWc56HAW`pYjj>Gh=Lc^6 z>+?IpIriaJ-skQxhdtlo>vfxmKT^jQU$5Il{1MN$_$lW);>*5vUZ-;>Q48cbTl4Ka zAmV$^(|YTCzUEv1#eDM^c>p)A`|hsK*L-e5?!}l-{VL4FyD8s1+2pe)?Ks$1df$4U zh)R)iayZo-_n@m2R2UBC!rS<$I zb2HB?OP9uckLQ)E%M*XKj>YrJ)#Zu5+=pr7{^;a9`*17seRK0DVSUK+8n-Ub@w@YR z?*ZzQYd$?V7C&v)^4PHFHEvy2@tbE7lBvg{_;C!EL+@d1n0dNPZ{_3QgM5gw#EjU> zI#xUJJI`y}x;*9Qw&#_r%M%}YJH))X*9*EXwK(NpJ+E9{p7{gk^DVwyx1lm@T@SDN zp?E&v-}d}9f6~e58NF_^%%s=g$2!XOdF%J2>{A`b@=){Td_Lxn)v@N6>oyvH1~ zdA{bSMEw`X?|q1QgI&a339G4i?94|^2l=Q=@d)xBuuQc0z)ki& zdY2x*JDYokA9Hz`Ix^vzxaGU=CAreJRkGd{D%7S`Fxj;tkZUM zqx}1I?wym9@i==POYIe1TF(Sb)S638{U!ZY-iK9|E{(}OJeG%=U*3mRt}ajfu{zd# z@q9NY9RFA!*8G$xPch&7mWuGb>G?As+YRy)#h^^L?vE?$G+eDO`fr$zZ3}-pxl8;| z^KqzQzFljgvFQ7Z#DrhCMos=UmVaXEwXAWz&d<2M+Xa8?#;;smQo3k7SSDIfon-85 zeC3VsXo|Vm9N`W$2rBnJiplUjd7g#t9}sA$NV+F zk-x+I)6~86e4TS_n>}CU-g44qVn5XFIFI!6^BpF8e(ie%$nTfrA>yxo4?;a3@qb|K zOW)&2WAWqo$ZhtOyH+W6%r2_(kDA`(@9dThAo-{x<9{&qM19v}I+ z$=`q|&ad)=`aa4xe?|R&)t?l9dH$;6$76bZ{_Oj7dY^dOqTRz81fiourNtUt-I>jj>?zbKbn?WgDM=^ZY8`d%otI=hyk>`I?V$-pmih zubyo3bzZ)59rW*X^o;CV=fBS<$z|>$f9u9?o?p#>pKqSO!&lEY^RND$$d7mO;rRt~ z@cg^@CGH8n#Oa;j*Zut3^6%)w=|j!N32*7IE^_QSYOdC0#X z)M3&NZ~EPI*OwME^LNCizbWCLQ+!QZ@vG;f_5qsn`wIUP z$C~~fv;6(+Mol?CSN#1KA`#P!@Qmt%-bdAmR)?oWOvQR z*<)ht3rsYBCr-rocBXoEZtN7Nxb-5R?AA$Uxo*;C%K7FTGn$*?wmD|sAK4 zpBL$Ix_Q4{t$UwfpP!q|DPE!u`g-Lp{LQ>N#%HhEIjD}y$BeOmO~uU2&zD}mXfumf zC*u5p9+PX|ZD#T61T%q|_LS`nLV?8{Irpy=lt^)9ou98#BFzx7YD4zP^9hiMitY*AwQ`cKqdf z1D{uGuN`ty@%`(eAH}V0zPNQRKcC1+x!zDb+v1~E?60Tz@Xn)r^JjzFX zALUc}$%9Yj2VlM4FfqTbuIK%+;U76aj^qCm_We`7UU+pqvc(st$Nc{Q|35PS>UYy? zKDjo`|D=<_%+D3-POZVH=l}BBw!gecdmq#qhyLg=*^~c-Jp5D6!16YKaZl}>E>m)T%(HsF!=xQH|60tC-RGpmSI0jiK61Yg^nmmHFC!jPt}gw&qSAiQgyj4m`J*0C z&p*XSc!_%OK|XuzDLx5rC4MT)V11YP_In1Y`#hqapUY1|`1?@&*pMAF$3OJykmqCm zJd)b%jt>=J*pf7J7H`AKv_Kjry3{$VZ*c|PXf z^L)&|=lL#w(#h(1om*JG?R>t=e1qp>{yopf{2#YGAM+2rjk1r;BX=IazQlfYO{??y zg!AXI*Y&RdruY*cR<16G;wL|ioDU-(8=Y_C-y?h~)CzwzKkE6}_($ujp8x-}oiVcP z$c?UfHD>`@fkM&IA!`g7V?3*ir!ARUf_8Fq3GGchM{z>V#CW}ezIS#ab3C;?S?|6d z$OIE)CKEuC)I<$=>l8mC0pv#(tBM`t&s?{OG<9UOB+4BbfvgZx{uD54AAK*`UKE(HWO!aq&KjHaD_{#GkzBfP0^CA9( z=L7sH&qw%;+x4|a(#hNA8@WDj`RB6djrcEn{+u6lvYgMW-n`B8L*@;hxB1sRZ}YEt z-sbN;kJr227t8s4jE{3+Cm*j%biNwp*ZZa?%-Q@qE6hZmzx#PQ$M;_MARWxa@8wHg zWXWUX_Ydk?DEGgvFQpVU;OEEr5zj~Yh{M%CRNk5VARZ?l;|}+a&Q-g<@1N{>J3rSv zZ}YEte#oEny!1}DCxc8mpC2;0pD%w7%l+7mnfcc|Z^!=?j*{fURgKlC9@YWkef zh+i|Q2y*Y+H1s51H^Ha#c^@DBH^pE4pVLk8{hu?UW5W5T{K$RT$N87}8LO|KFI-uk z_rLBRKVLi_JS5E4A(ROpqy_A2Qj) z*F10YuX*0)f4$^+o3HyhkzQTrOQj`{m{`8^cYx8FwT^`774cT(l}D*HLc|5y0!uf=crJM(%yHGI_f zb3SehSC)z&baM6lF*jc3PsqvXeGd-#R?KfyyZ=TW{=4L1#k%}1SbM(57tar3X8xbn zW%*O_{EBt?UGoQG{wVeB@x}8N|7UQ1E*$;d;j8j|k1w9L_<7sX=ZGICd_1n)8+pCu zSIn~+~{fc$DuL!o^ z&h6X&Ctv&G*L-Z#^?Z*HPv`efM*RN?r~Rkl`IcWjFXPzqm1wtbc+lO;=ymiU59syr zeGeq|DDyjv<-2$6iua$#FX!_ECT+0%6Wji?teLj>p+K{wGX`Qs+nbXpE=% z#beLpANhHdk2(D)pVI$ueam^UmH*$N=YLn`m%av~J>Q*Q#lI20zR#g{evdC)S$3Ss ze$(;ewcY!sw|sK8ng5~ZyUcIItn5zA3mrZ7#|$}s&~V;rU;mHE(j2B%r}vrJ>BIOM zX7zZVnLQq3R(JQADaFU0_&uA>tNPL%)lIH{%X&ZqeI&as1adz|9g zJL5z)<+IP?ko<4#D{be9%{;AkKX4qsPQ^w=HO{W3SgHdi{wwU-3AxjnAurINe@7XFAUvk%z*NYXlvK!fTQ*?I2oTmOsLGe|*FasbhwMzu5$Iy|6Z znM3AJuk-JT44CYBegAkpcAb+RU&e3o_5JU4?N(LO9$&b!>>T?z{=98Drfk>XmPPku zk1w8&@Y8k;8f8KJ`MSx;XTrsk&+x0~pW$O{kH!yv@%%IKSIp3uITaMDw5-N-}Ey-=>Pst{rrp^Up?RQtLF#t z2c29!FYf8YJY?pakoM@9kjKBB&zJeyVX`OndnG+~?fD*GJU@t;`P%21lbzf?zmI>* zuMz*ptM&$Zw|v&J_k1^g;mWc-wsQPBW=ih)`xG5NYARe=I{68e=H0CL|EqoTTzqxaw|YLp zUuf8$ocS-;Z9;rCzqIGu{2>0VUrL>~f0LfyD9~np>0WKub^o)c354s!W4^vtto^3f z+xV;J2YifxUPliai(cpPBL_NW{QVonisgCCK_>FR*WHFp&hs_T+x&H1w(B#xcJ1>z zCn%tN-g%xAj{oCz#q)OjI%euC-#ikoEOp;gd-nUBdcfxa@%&SKgvfb+kiVEc&-LBs zKaig(exSZn{CdBEWyQW$?Ye#crwKl`0W#wGV12`$kMVV_+x2~Z;Au=Gn}5yoLw?Z7 zV6o?A?slCJWQym9OrA&AJa6+`pXWYopWoLpd*0@MysmiO=IegLGzxk?$`5!fQJ+Wo z-t$$A^JzYN?5X&{o#NN~Z!IebryjA=0EKD7+=q|c75-M z?0K7i&GSQk(8=O?^gyDyd#C4zOiJ8x&GRG8%j&gONYsQc-iv?|FY)|{s;O&KD*IX9hF-Zy<&G1u2TmOMskhc`TmU#9rp>mIb5nfSeY$%`zJu69mw|LgkF zkWmAEew-iie3Xw-yZT2wALZlqPJZ@$j34)WjK8Y|=Cyr3Z}YEte#j3xSv)Vj)9uM1 zQ#?Opaz9@?pSStfJa6+q&=2$H^EO}i9u-0EYi@dgJsIQE`Mi&h{+r^H+C3hFkEZzk z&l$7l@l*QgI2h#z>dWWzF@D_hG5#)BF3;Qi zYn~tSgH8sEKZljtc6%ns6weQtH+bIWU-P`pzvg+Hzw15HtILz9DSI-;U)_B1e3W1B zn?ClWcs|Mxc!oXp6kj|aiPU$3hXxLLuUIu|LXYxlRdBRr>lQQu)d?`-}AX&k1yY!xA=cr>-}`K zlePbQeEI&o#s3-oAotV#iawOzap>#wJ$@=4w)lD5a(x5*^h0|--14jEpW#=}Kf|w{ ze~e%J^$fpy{uzGt{4@OOm#6r`m1V~{?1#T#e*L9<9*Wm)zfbuU&%1snRXzvs@bQ|% zwVHGPY@fp#{HyoV9poqIKiMlM%?i{~wV-nMmn`@GJ7_53sZ z>iK8*RJhznkMT>NKEtn`e}-Q@{|ukf|8V|~emwER-{IcB7td?A>-FyZ65ern@DDl- z|I70Wx$Jtr#~06A`Tq%i`>FU1+idqb(CaN9_5Ez-A5qim=t1%8bqr~x$H58TGP8+2 z{RS^)Cl8tJeR!(p2TTfL`4`6iuabvfvHokv`8~dP-s1lm%s&^V{w!c!k%r>@9$!3f z@&5z-|0sNYpC#@29$!3f@$=VSFuf1(QAAXJ(JbnAP2VW_EXsnUA~rc&x_`R-zo-$^29tdM6W=x;;)R{{v&c zoryf&&J@qyTqAaCj9Gn3+wlWsQFD`h8e>+6_LX4b}-L8Am`19-^a%>fXzwrX z!j+}uegFPJ?rop1%hvZfd(Zdy;`s=_zBk)@zQ@n!(3nqOif`JSbAIx+IsSTWLXI8z z`IcWj{|vu+{uw?zP(1$_zj*Q)e)aq_{Ob8<_|@}I@x}8Ie!bqeEZXyJ|0Diao>vk6 zx-Q#iP1^H4{^py&{9WNX`R^F6+BW!cFI$Dg+?9#-F1(&rvMzIZ;u zPwM-C9~hT>me}&E=bzz!+C2OWzk2>Le)0S>eB|d*e)aq_@mJ43#TU;<_+Qcg@_k$F z`L_S7=Og@&7v@y?PKx$?k1sxm@b&kdwd-1b_56SzbaM5)xJSmI&W(r69CP3E115V? z`&^H`eSXgu&s+QzK9pnVndf`)OMWfBt{r+82bJu6?fD*GxU$4+_&SctIp-&DTaF`S z4^)Ew|A+E?%deh~@{@~SJ^u_J1C;amvh?I9@n)X<;DyD*k@yofa_47?U+>Fe)_01J zFOa$FTRk7i&q9Z{PtN?8>oy_2nqS)UZU0x#NBG(g+Veer?Z-TC>%X^i<7WP5PR>ue zuKiX$KZrl*Wbu4;Lnr1Sb7}6I-eGbcTA$}Uw9o52ppN{0X&5u}*Grza`PV#e^L0O9 z7CGmUaAk>lxQ-)U4~XZV;$xib_Xqjx$*1@vJevPeexSZn{Q7(S56laBKbU*$Fux}F z3E|7{P%VBwpAY6I?D-f!?)ex$=Q-l}AwTG3u)a}G%G~WbA;=WZ51BW3-sZ39=lSz_ zn}5yoHedG!rcu!IQGV3(QNH(l72`~1Pjdh4^Aq5+$DWEG+$ny&|JKL*$itYkQ+#j# zQ2OKfPvnr$`Ft?{Vb90-anHy2x>wtEeVj#oKb!dvI$1oA9!SK#)AK{-4W768>-%!S z^EUsQ=WV|32bxB{d4!slS`KR3crxMq)Azo<_IHdQ@bFap)WXi|2JEp|{u964!>2;! zx%5na#Pb}`*_^#lU-5j5@9$4=%XOPbe)M%w?{%99KkoThe)L>!*L$8H^5;EYdJ{2l z@2G3VK_-qB|5N(>oOzGu4gPx7^9KL2=MBE@2md@$o)7S+JRjmucs|6R@cbiu<@pfb zn;+%*5Z`+oSDp{>{r#ytAK{13=dqsvf6DU#zMjkN`ibYy`9UY6XXLugZA|fe?RSjp zcwzi0|8qtd567u^e&oL62bZtU5BWhSgT?3bQd=1V{+;L) z{Ebcmf=n>Vb(?%%&}DKTw%@DC=QHi|IuD5L3(eDE%*EJS z?8z8^b@S;rO8Ee1A$30)i;o-;6=VN?5mUdnH4fSQu5BWhSSIt6WjjtJ-b~yQ+vM07tar3X8w=h|5*4RFPsCHcbB{0IpSSpb0RIn# z{}tB{<#!zV`|~}1DxS3XdE1 z2YS8bSI-alK_^$wOKxNg-t+lCBK|+V>*Eo|Bj@ua-yJ4<_+Qvo?x(wAUA_aUJ>TPt z=Laz}|Ic8`{dCtA{53mMd%njP&s%(bKVAL1Z0-3TUp#N|^R_wW1@YsAkH__aaf#DzWB@H>-*{I`-*7KxBXu|Z}ESN zc_jDK#cR9QZF>C8XNKQ2AKP?2-}0;H2k{R*-(`Nw$3BT&mR`?)ApVaN&kIYIipjqE z{f`*?kJ(+nf+P1j(Ca3l1Gsh$_EEbrleA`$TUyl`cC4rGS`PK6h zw=D08pVI$ueGl*R&*J|p=GR}#{L*gM>mPW{(LYB&p7DRewm%iV{tc{N@9~9qTpsgJ zjezUk*>%|0@5{ch-L~HHtLF#&q363y_I%4$F)y?CO_w+o3uC5z(IZo<)8%>XEcDzL z>bYTj4YPW@&&(c=F{``#%*1YrF>^hr4|+^IcRTY_ap;|KqLputlP5^H?&Ex7?Ch^Q z#}3x*O!4fUabo21+2`lI!$)(o`jlef2S9HnkBIXXpPSX8eP(t>Z0y*kc(cb8mMrPD zIR__WSMyQNO}&nnY#kJ`HQb7+6cE1~U>m#O{H@Mhw~=)?h`IMqB4Znw?l(00hn zXV>`jJjIL>FUdSo^NM*GN20eU^t#=54%FQ2&C4N2$3PpCTgXMH% z%G}eE7t8pt2H?H&gGr~k&=~}IdS&tXJ^ou#(CeCtw`IIUCjKsOD zh-E#C6ZtD%x{q1?c^?yFxIIoVi$m^d*U_$jj|< zf>|7LU!2vS_c2kU+vBYMyf02cl%EI6LG#wZ#47$qldsV)FeLRR14p zG{yY(4fjquVbU1lV+Rhcbj}oiM)GO)eDP<5Y0XXXXM{O+i1wMcmuMS$XlLs6Ll3Y& z@%r;#Rkc2^(RR(^oYVCDcL!OSp?8ci|zH?C?<>G>%BjMXS1%+>T~jA{1#E1pkl zZf1YR;v72!Ebhk$leVFUcBWp}^}_4EQ6ALXYWrW++Vba+GwIJ5)2dPSXN+m~61yYF zM9-g}Gf2IoOv52lagNTxFoq|X?4{_~M{$BR#pL_KsQy39ohjz1?&8nb*b~iP)1NV> z+4Jnr7}J`Y*`G0{&z}+Ij6Y=_(6;1L)G^WG4G-;1y{>y{snh{-j{av967+ zVOllH{){orUgG$IOqBGz=f$5fX0pz~CgP;INe|pwrW}{|bu36;&CFCgI>bl2O`C`V_Fs&MG{tU!v_7e9HY7}7(dmeR|V7mPo zh|}%Q5Yy?;+nCCqA*R!xA*R!x0jArZ5vKK-srWO%wC3jK&j54mkm@u4+@x*jp`EGM zd;XOEs{5Ps=aAF5ZajAJXN+mpXnX%2sFBZ~u{i16(?0)@ulM{Zy&(I;R7*4O--n#0KgVMif5wG zw=t{){orUP=>jlFm-&JL)&VT!&2YXKd^%Vx&j^ z9E^(-t`WsKWU@P=agLbS;RF+>o`X1LPR8OKGleBfn#ZNL(sn-6^gJ<_QH{#=&%`-! zGM(?=BTQ>k?(p)R*GG0ARcV%|Q%T<*?i_2;cM zx;;)x=iOsRjfy`bW5;X9zZrQ=#EH3SpMOfcT^BWT)9X+F*ysF-W5X@}9B`VkukXv? zw^zt@@n?v+f{7EH)AOZYa@`|L^S5lpAra<+IB{}w5+`bSJG1)pzBn<4+v5bYIOM)K zt3U5!qDHsJS^armoXBSJXM}0~X1Vw?!o+J`{){la{`52F{E0Yj@#lck_;dW*|LV^O z)4E52oPS1`=Die(Ln6!%96Mb14>_+(lg}};`t!axF*k1?JLxkYd!lw;?D@vyk}1FXM}0p+b6S@@;i9)SUJ~8P}A~;hkhST>-^fmJ%}p9ALooeWk0e+ z9c#=B&XVwd6fTXS^fv$AU0yFsd%Jv2DX*8Mz1{Y?59idsUE=vIua~8@KfG>gJ8_ik zN0!$9kkzUEQ8}m{vL9Jm`xBqY>t$(ehu2N*kA^oBCq}os&f<*|`{Vg7ua~7YKAw*g z`4s+fx!WJlcPd!x0oslpG|Oa;;osj%&W_8ZeUgbjCdMc8_MFMH{W#yZc^lkro43L3 zws{-c4mp!~6xvSB+t7B%{nY-rX1UKo`&08av>oyy^Dnd=4bSYsZoh2vHoCvp-2S%X zV`zUg=VtaNbF(v_c5{>X^f(^(d(ZcduMs|8`%aIuYZ|EK7aD7fX`S0GH`l0K&uNaOgPu3v zgR}Qyaaz|3;DhjdA79fTZ<$PWP4&!0;C#!R=DgxGhdpO%ulD`v=Ogz{e@2+rH8=5R zglS$IEDnh!6{=AbZ*K;CF^E060 z&j@o}(ekG~&pu#(hL~_j=zfOmLDa5#FXYeW{Z-{ah?X;LfBN};e@2*Ie@2+-zwu|& z#UT-9@_rwKKmSBs+PWX=g}FCmR)5|XC-QRp*ugBWyD!e_&-<9wpZ77VKksCUKO@Yq z=%vv83?2RX@fv?uO3ptcagM*!MLt{D$pdD{pNae3GaqT+^w7@K>nG=*Zoc22{+Q8! zsL|*)8)@7bL2W<$rAN7dw{evI#1?5 z;&^;Blf85&6Ratw=YBHLI7dzvf5w=JMmIR8&Hjur&7Nm}#+cUJ%>Ilqef}IW1O7yw zd9Hir&Wt}Je6K%aOshun{@tGk?B8|%8I05A&lq!jt|&beWqSM>Wumv>+|%E@u(7b;=ySqlTzc_Q;OUR=5GctCs zKLbo_Zf^bzFvku-jXsU zzcbr8c9%b6W4GpJ_GgUg^XHHm@Tb(=lS8~FeEl=R_xdx&v}%<78DskV8Dr8p!}+}j z@i+ETj7jI8=S=j_6w~-@;t8hAb6J|ldUD+;PBnjSW2)NR#+36<#lAdtq=wHwgG`q{ zV@zvqW`D+*K7S6G0e`Ccn03KE!~Tr$z5a|bts2Su_Y~=QtCv!Kj}T$5q_fj=2IPK% zNsVCpGnP*}1zu0%#N3>U(_nIK?u=9X8DpZJgR#q;ypt&`Sz;gNJf+u;&uQiTd!#?j zbB0&E=dHP!{TUm(&!0nP$e-J>$gB%$H{nk|pZ+`EqyLsS#{4DMD8l@}HR{oSb6orx zVSa@_huyh)KeZ=X1=g{=9GOU>1Mg$E^Omk6HbBACpS-K#k=3 zr<{j6dI@8~dF$EdDTwnm5hv#6=)2kC&qzMK{v0qv{>E|!_-4#6sH7foL zF;_5ga(DXK?k~CS5vKWDw&JA-b3vRqxjBgwxxbxR{dr%U7{l#xf>|7LU!2vS_c5zK z?_*Yf-pS1F5a)U3{<4_ASuXyJ#EI9s{25_-{W)N&IXIY)e9T$sH|MxE@5v!vGjaau z=c7jO=dTWbMwr$;3grAV!Zh!tP#h9reqijb`-iyeMZ6Ic4!J$f>d*VeUj2C=6Jsw< zzK>b`c^|X-^G>GtGr~0QnN$23VOsb0$*hQ@__c$35Rt?3`O+ZHfIo$YCHoZ11f4E# zc)-0Nv0Jk@)xFgar`!jK<2l_P3?P`7+cJj6+PD94r1{=`Yq z{UJqD`@?qZf$09kAJOgb`lnaYdJoJ_NT@*+76c`%Q;Bf zZ{JG1yhI!_ztT1z^;~qU@8{jd^YMA+BNyZ%wXZ#Mo67-aapoy=o96*$ar-HAb3lOk zfwAL!=7fnl%6z?zsoZfJ6Z7ZxI7vC7UgcgI=TrIUwy~o|x5ueGc3YgtrZ_IZEa&hi z{i*yHV3zk9r_9Zb0cLqmbi!2LJZHj{dLHU^V3)U(e(X9Fq|L!9CSuC_4b2qBaY^%E zdzrST|7A|~Cbrug+ULt>64}qPpO*gZ=fbZZUlzUIpi}VKf*ure2*_&S$1;L#E;%Z|K>Vs&-eJ^d5fR7&CHa)C&c^Jo^Scp^Uv@< zZ61Dxk36Q_N00GKpFYD!ejepl&p#7CrT^jl7tdSq{{epZL-E5`^gq7O$NjH8-}XP^ zFP^vfKZ5^b;eWhv?Vy|oYR~uh;(3ezPw@X)_}^pw`?9V*-}0;H2mGLutLMc%9j6VM z*~ygtx2?a$^8+T=OZ$AhzUPbQBm6VZ_u`lQM)+r*@9~8z%TCUl{7`ZeDnZK+^h~}! zzLfVqIzQF(QU3DD!~aBq&>N?6-&MrW{k%kC%S?K`k5Aw@KSlV(W0Cy$`N+={AKSU| zUp*gdVXoocjuR!&zC+r>(3Q@Imgz1(4Oz{@tiAu z?eomZbD@3yFn{HI{yhGmlg0DZ4V|0>nR?#md~}$N$8;Xrb)5(F;TPf#V{Z7mj{3Sy z-q)U=Js;!iKGf&)J${~_L4N-I43Fyr{b_qX%IEv~Irx~++<#B;VaccYOT2%|eP?|6 znd0L^Fz<1El8^hJI^q}4$LdSJ@AC4q=WYHq&)fX+^``hy0+E!TLr$FLPHr znhsfSc+e-hc-?1uP@H-luSc$a|4!{guhm{3GP&RKwt4L1^*uj(KE{uGKE{uGKFAMy zKFW`JKFTM56Qo4>v<7tZHx{x#1J`9UY6XV~+oQPPga^XaPRhsX`Y=lf#RG|~B9jE~vp~a-9O%)*KN*wvgschZwh%nnjbG;xU!V_Ky}&PBVUMLJRjwI-w(?9e3b9)AG}Vk z+Zgq|=6O5*Yo53H*E~PuPkLT@r`wZ3reYX%9G}DM>-ID)-tfrpSGUh$1N^w>hdF8I z>B;vh^B52DCmKhLPv=Xxe`A7M2<@%&T0e4jJQ{EXGt z&lj#N)qEQsN4)Wi=bz(e&)fWKp11keJa6-_d49+bIvK2TeLivTcY7wt6o&MR{2Tik z^x@d~2Ty*Xc^c!#Js;!8&*x+OmGm0&e2h;;_8mvW^HKid|K1&Y{y~1}^+C_`@lN;T zf?@lq#w>iK8lhwvWF5BSCN&%|Fn{|vu+{uzGt%Ts*e%F^QpymtE? zqW=DTcYeL{d7#Dr0q*+YJ^M$W2kP(7_xSJ=pJ!V9e}Mmw!q-mI{%`rH?`M-AbaM4P z#>ugFaz14K5o0;M@4-2fJ)F1AdDh2Pos%A4JU@uJ<*&>3yJr3U`5s?9AK~lYWoys( z_~Q8pe?j~>;p1_AAm{S^`Ie8G7EeCI|Fn7d89v7OX#C(8&p#7C^7AOadj6UCtLLBM ziytF=eP0pn`L_QNfANkiJ5Fo-fY)yKMbVz`@!_X@J;CtX|6-p0ui^QYUp+sFKj`G@ zd5OJ~lOZ!Zhtl@8^>=10^xgWiV@KnwUy&2J=L5FGw%TcXzIZ;u*R|80@5L{kkMMQx zY0vlg;`sO|R<$dk>n;!#w?F8+L9{=~kmF53XzG&W&?%wdwb2G1Fo6Tw3 zbuAy9&u0FEP6qQ^iBZ^X%!}{dml%g^d(J{ZXdLv&)H;57{!p_oW_%5^)~wIme(xHH zv-Vk^nb=MAw^Ad?MbfpGZS&Z3jj0dhc|CSKcRN!YeP^6#>)Yc5lU;LXoZ{a*nPA-> zr+D_xIFU_uYm8ZaO55=RAo5u5@$AzWvpTfTgb%Va1M{eQv&WS9WT`yWpPOnv>ba@c z5A*a}iJ6zE--)4mbMtB-&Sga`>!4oZ ztJ|2$tG6*RhTG!=Q+#z>oXV@WG0_XR$Emz}Tb#(Ics0PR*Zxj={uQ4`>xz~??Rhvv zyc&peeFu}@Z};M)=gc@4-?<}LB`&!}&~YeyA#v!rP3v?``TV-_fXUnb7TaFApKgR- z&rQ*fFM6EEzg=(Ob4k4ROUZZA=ah6W-FiRWdY+2wCgA@%;AgkW@#UPKbDQJ*z`o@D zT=i@(|ELxF>nZ*x1WfsOiVyJ9e0JPZ@gqNv@=@PM`IP>L>nqnAjQOSSr(4g7m!*2V z*Z+wB<%|E%m{W2;-Fkk!z~}Th_d|BN-9P^VU+$;-E7s+DYV~_BesZlDf6&Qb7SGGI z+K$tP%lJ#PyU3l|J1p@jy!JHV0!$0tmk|RNUrf{x9jyDUp&9x5Bc*q z;L$j95BwcI|9kPdcDr8h@l(oqviN!1ysz=P&OgQZB>xi<{v;pieVV^K89(y#C?EBG zluzk@GC#;p@x0alzg=-2SbVG9uGhQst9ahxC-76@uUHqi>-8RAJa6%ThR1#`e$#H( z>n$JkEuJ6ngH8sscz*9Ta>Z{@kT*Q&odNBe9^@Ro4o|~%KfSbP>Tzzsqz#t;L>~Ur z@O+Oipi}3WtsQ4%L&J?`RHBrZ+5cwe2 zKK`wKM*Ny{=J{^?!j=Pw9{62d9H>KIRHF`gY&_Ge3O1 zs(bbP(w=YoAKaIZzpjY6cs_G-f40xlw0onFId1X1)&KfhkapVoj{UxCFKIsN``L^? z=wvXz5mULLol`-koX-!LG_Z@FxB0qu<8_^91on%W6OLaqbszrvs@Lc9YxexyAF=qU zMslCUWkrm;{?vTo$`XCw*0ha(srP3Z^D&{*M1I_SjO}SY&({a@GsO?ocaksn8yMG@ z(jTvHLVtSs+4FY(KQNEv99z#XpXY7oykun&<8OT=TrmzvlTNf8O(@ww?F*L8hF~ zBhGW?J)SrC+B4&I3g>N$ck_IJKjrxV-#?GwfmG&cfIsE=5Z~)Dlwm6V3D1Y(_wtqJ zLws+3l;=bI3C{=k{{BRL#q$RLvgZx{WzQS@%bq{y2c3+bk?S_MF~#$>-#f>S8$56G z$8NXI=VSc1=VN?a^KiZ|MoklWKE|hmobP=%xKsRk-}LeO1;jDM_g?qlkxt~t%a^>% z62ozQKH}wz=c9b@`$0+`wayE$p+(aHDc^M3dI#2$;qzmi^EpL3z66MQPN?>Hi!kHt@KFTCID z%g2!i`K8XG`nu!C3n%!9#hD*9|7Aap_X~c$%6o|Kf4`7Dul92i|25Cs{A-@K`PV!@ z3Rr22OR`ujFLetsW}iBYceoxLy4+ve*t zx@WZWd;IPCe1QK|{f^_;SN&dPk1w8&#GhtjJMH-%Upyb->)!iSdA`RN&qw%rEbY3^KWbV$`3xT(dz6oUdYWH6 z|5$z=p7+8T6ca4SC(JMZ8R^iSl;l+PSAXeb^9IVx-#L}p6v0(^AY|BawW&a+#7jZEuZ?? ztSRST=f}_gL?Ylmd?tQs@Q3-u!_UNz{5;A>eIMmh`XA1Jc^??bzrIhP_I%s_)sGRr z{w>eCE}Q3jeBsKnb8g(sFT8g9z5j}JIiGL&)$;@X(DPj;d%m(eG2_xIIfY(B54}#q zdBdah1>b*e$kH69*6|B}&)nkqocFQ)JCSN=-#VTgY4v!YnLQqhv%0&_Oo`%)F_#tL zuR4A`cCc<|ilgt06JxkNPB6Kr?u=9XdnXgD+vB8k-rY;cCc8B@_UcpGjvoNgoTK;< z=PMrPx}xPzdtT0!V{uk*_Tm(lED?8mE~~xdSU=2DaVRg5m|sd>5~YdqrRTV3UGtF> z@v4u{dvkj=z;t^xz^vEfdbLBXQpsh2nYL@(Jtm&JovFNfTbyW{+v5b2=Pq(^Tb#

ohr(+T$I+qm-&{Wb?=BCRB--V7*!Fjw>+98_eSSWUh@S!KdVkN??efC#yVd6B+)~czT0_0wP(9n@qgL#%r}*&BqkIhZX+Hbt!TdbRM|~gVi?5%` z59-VAw)uZR&;OzLL0`|S9`E(Pc--dy2>y?Sudhc|r}z2U={EnL;QzDmf5p1oH@*73 z$0yg4--rC5lff*!Wk zKBj1X_53sOBi={jrNEU+X~bw$D-ZdXF!jxA?!JPvpNlhuWk5#a(K>$CvzC{Jd>B-&SsKpQquz z(U2*r^?uRkIj0S1K5Xv`=${Fd;3b|H|F`i|p7;C7<7xAM(GUd9`kjcKf z=6Rcc&GR;2_uhDY-zT|#K|a2NBKKKLF3(5#_5Ms_zIgsAJ}k+-_#mG>_7q<{ALR$? zI~9Mu-@v%O;`vzo3H>SeO}F?9d*0@Mz2teDf6enY|C;BA{GgM;V$aLm#T;wj;|H1I z`62TL&)fWKp11kv*LuD^T<>{4$Pary%8z=D`AIZt=lg~1d7FRD^EUsQ=WYHq&ky-QCyVD%qjdNA{E&Hr=WYHq&)fWK zo{#bAd?|K5ALHx$>5e_4`tQ7FxW2pma5xdqN8=~|Ir;3#r})Uv6yJLs6wgQF_a4W^ z^D(}^Kf#sj^G5%Cy>vcr$A8W9HvgLEhx~cZOK;wGK94xhnfG|!;9vHr2<{rBh+#&UlBUwJ;n_j(L@nTmhH^P%{?eC7EN-1lWzK^#+j?{yCz=|ucqzT`!g*k3!RI`4P9eDQpg z?|nZ=>7S`D#u>eCQ|7~2ey(}m&d)W^+x%;uAMz(XFTK<4$skj%&kvb5c;4n;^SsR; zyFFh+$gk;nKE|i>CAr`2*pql2dosq?_e~%3(SK9?z~^*N^Vu)a{CMM+`S}!IxU%fd z+0Jpq8^3t|IX>nDj!tH~n}5yoHvgLEhy0+E!Q#(hrMBIk2{Og=L*@;hxB1sR zZ}ZWw7e0rL@mJET>wF0{WlzTVRAk?AL_8nmFaGb{O~oJJv*(|RUpybnhu$X--GYZSLOTj z115X^TlficV&D0+!xsPJSWV|+h+dPlXH(A zKNXKf_f7dAf99+6Up@a!eo)^><5zxp zBtOW$aAo<6^erif`dH^SuVb6-oa(EZYpLTO%zelX;(3dox6OU1&ka!jttWeY@qC28>q+kIyx*2zJ^u{9dj1(ca#uY6 z7{7S(8GiNrGyLlLXZY3gPw~Z%5&p06jQr;DtMYu?|A@bMN0w*j^Lg8HOaWhhNBM#E zkMf(!9v^;Uzgv9$-~Z80)1Ghn)$;>>(8<;F5_=~nL*{qz^LOv0RXPsm@yq%AfJqxH z|G>8Yc+Yv(_xaH|>G8$$7XJtEe<*x?pCaUMt7(rfp11gU+Z?}skET7}Gw|0aD8=t{PCkPp5{xRJ`z9j^C-W1{+aqx`X8=uIS-D+ zuYXgiJ>T{}&Fy&n`aXvr@Pl~1$CtQe>FIyGcKf}*_I%5)o*(doP8QEsb|>a#_P*&I z7Unza?_!~cZ%yf?R3 zeK9lB?bQI&?bQeq8Be>M>wKaPQlB6*f1gb1sF}*Ew=sDT*?|FO!e-}j(jVi!lxQpd z?C@mlQ%vOSl!^UJF_-cgXD?3biTK!Y@-t*^UJca9?Dx^5{doBL{Y0&q?03)4 z$EjHS`u$Mtvpzq^8{>Z<&vLzi@|8W?QL=dC+Ab{$<5( z*Ss&RLA5#t9Y4ic@_vCYo@wL9Bz~07gX4KLo1a7pDxPWMr$1iHPa?u8ANje=2ji5F z`d;Q!E1mTZmG@eHwCB6|FP^vR`++$n*LTl8pYQSUoU4D<6?rIgO0Q?;d49z6R{Z+d zv8rQ=c3m4k>igM@AG4ocM-PfqucLm*TYBN?gy;KWJw4{D4UtT)v;K#n>q;JGbNc5g%@I z<$rp970;Xfxnk^V$;k_2>HT*V@RDPG#Pb&av9-jfCsJ6yB}mioEoIg>VUdcNgn&kti}{<2~xt5wIApFMB$eSO&SbNy^S zcfhTv&dVeP3FEW4mHJVS8o95|LeC*rFPbcxGVf^$*U;J}? zV1OdP0EJ!=3(g@>gnwjalypuycOXKiD~Y-tM32 z`Nf{M`Llk=p11iv&mZ#-E_;5+4>}nv_B<7gdLIj3(mv>)Z+IBjZ8~+#*XM^!YTS#S zxB0Vm%$~RT(|yP}w)vE!w7EU%c@JMRqn`Kh>pi9RW5K_ae~#w~xfg9da-;H7bCqak zBR+fVDL%Mv{=cdC>sV-9=ka51y7@<+%W>rRygrUl9?1oEe%4Q)w&Ml1sWD?y{Eg>$ zK0n#>v*&I8^!#Ga+x%HSWY63DYn~tSCq0iEC8{kJyu8EnLnimYTpkePmmKRL=Gl$4gO`%TYN6H zxMjlg20zb1@nrOT9>JOXi=H?52?2;3X)HbuQ`p7xkMNb}P5wpCoBWHOH~5!5Z}6w* z7oX49I(M9QkLQi}=lrHTf6fm&8O(3g^R+iSIWd^XC#&LZn?KuioAWq1&%Qjg{OtK* z%z-+#{O!7p5x=hwTYk>59X}klh{tHXotfGHaUigH1K_e4Sn{^+gacl_G(^*kW~w4U-Q{j?uDetOBCQ)7NBVPL7E@u3lJ&z^Vw%d~ilX{6#C4IQm z&tcD*w1NBj{E@$X4r}mzb!_9$o*(9fdiav_n$BOkAG z^7FP_JaGQsj$b`<wuAVEE6eVj&Hc%}Avv%4r~FhuAL~oy_4Vi8^OfH|f5^Xl4$J!)#P7Ur)A)fs zZ|7&$55H&6+kBtrkNF3eJwN0JoeUOxUTWLT`H-1=W?#qccTz?jJ$dNy<+@Go$8OBr z=bk$D_;TIG;(I*b<7dwgbDrZTWfV8Aq*vuhxPV{N@=?=7^VH_&ZHotRf}oEhvfq|Z zfq41KS6HoXL2zX(Egye#^2sN{(QYB8JWuN@5Altj<-Eu;m4D}YP~Paz^g782t=9Eb z#VpT*ao|%>c|Z7Du0x__%TE-vVpjg~c|E_t5w0vx`4n4@AF&M9HDC3O!PoiU9di-> ze!qME!k$Gka;wSThb?fB>XhWfJShy0+E z!7QHNa^L2B$i#N%zmt-BwoK0L-0ui5{x39dXuo-RHcw}N2O*xf_+K&hso!yMKJ55& zZcFd!p2wze1m`fnhE}By$tS-2jQHZ8mXAsND4z%Cs_$9+35fIf>5td)lZYVxZ~7nk zxy-MgZ}VS0kH2xA&ia3pAMtR@r}AFQk3Q!1_!74)J@IFb?s>hg`ycVYeDTlzj#4~t z#jo#$f^D|@Eb8?Ha`n9Arjzp_GamYqX zn3=z>%hd0h#q$>bE#0t&D{Cvx=p2y#Y z9vJb(V=cdW{uw?GF2_9?f1(7*c`RzQ{|z|(vE=0ue)arpeo)&%{MGaGd}^h${-NHw zmLKi;wttX)IX(sQubphpFX75E(RgTHP+Ps>p~vo7C!NrCIWOXQEB|x%bwQk;&HM+Q z4Cc2(>}^hl%zSJ*eM9oz^*2YhNG<%-= z^DO^~2&a7H=Q1CRQ-1Y4;u{{vNAa(xd`kbd{Aka2^Itq4iC>=^oAayqJ;K*c&c~)a z?|ShISC)zUwLOmHZ8hg?UHh|oe!vepSv+6aotRNJijQ7H552DAgSXi4Lzd<+wdO+j zduDcej9Kf{XJ(Jbn6(w|eY&tuTVj>$+F5-M5klS>DQ5UiI-~ zUJWp<+HGD9FwGv5Tt=9vW&VDK)bvoVDW-hyyvI~t4aGTPqAhQa6U-<K3WVw>Kwa zpJEy{nq=nh`t;&dUJcYJp_fL?&8q>X+4HY>jjXx3c{LEH+pFhH=eZ;5#SG;->HX?x z^rF=D=xA*BP7giLg(XXD+cIf`vMn*K^*w*P-XQ0_4u0hQ#CE+Qzz@A2;&@~E`9PlQ z^#+;4k~f_n$@dk$__4-+e{^H%(t6Z(9Eb8P2F z^OqF~TXXzWANjs>evOV_@^OV=@Cx_>DBG+(ha=I>d5YR~uh;(3ezf!L-#pD&)b`0I)(Rpyjl*W>ENFP^vfbKj4^ z{4Jgz@PkeU^INXzc1?ii*v^?lW`2*f?-Ti+$bd;3+;rb`@!BqC=4+&NdlP*=-|{hki{}UYpp(HYp3m+PN6?Z=@rK9jeHPI#JYTy^_T<#?@Yr`LP@oL@Wsq}_Ywc|P|(#9usS#*gq5DvAaFudXW( zG$}dXjjUU4ZnKcj$g+KZ24}&n2*;v^Fuz_-q%prUVibU75^N+dfw*a zwIycMc3a=qg~q7+2lWlaFTdGJNYA?EM|r-fFQwl%zgB7mVPakQlsCC9l*gjuMw-{<+3-`20sryPj~+PN=&KJs+?hA4W768 zvvtg#xB1h3$R4x#B#e2_d-x-_Tb}pu$r-}Y>&N{bJP^pw6rVl$RQ%w&`ThHE?T_i5 zIqT-{-CmF5`uQVYJnzU4UQ*BDYp?n|Z}X?;7kl33&-x*I-sWHP{E#1XGL9MSdDMvK zmOh4D_56@|gXeAjY#rsg%^)Wn|8yU6uI=~}ULu~SxufT4T|drKsiDo^Uq3mzSNweB zOaFQJ+U_`Qg2#r zbC&y){Te2v-Xc{~2;`Nf{M`Llk=p11keJU`^md!B3C?U^7` z&gT*5Ig|TvE)SRwUrL`F{MkBgo;Uc@eVBalC(7V<{kF~{n!hg38}VQEyvf(@((8tY zo%vzMUGcmbKRLC!v96EeSDrWd7d>zCk3O$s+57**^A`WA=MDb!{1VR_{8>M2o;Ub& zenZcFHvJHEGML|pDZM%4d2-IaPxAHoAv56lmY+Ru^L=$}`P+3HqmI5lZ22jfIp_S~ z{7!kkuJ1j6M>>S|05qvX ze?H&x7rs7k=Vy9;vFC06tRJ%HZNAU*$NZqa?D-+z@O+2Ko|oRCUZfh+a_dQxnZK4! z{Y%>}^>_RH?=F-3+?$6ZfBPKP;Ct(MN74Ld*6 zT&8d&|0>@GpXyxayZ+2>@5wzM{pXDTcs$bk(jMFMF%&od7^k@L_`J>!_>vb{%KmE4 zbA6A;J74^2ewuumj}o)4#qoI^zv@c|zs9`h@1NIv@x0p4Nq!O%DgCK?Ded~|*q_)) zK8H2ppPparc{~1DKV;9_{5ijY%bp+dgH8sEJ+Erp)^y0sHQo1#e19H&0PkZTEtBVw zCl5WoT(`0Ko;vpUa^1$_d-|})&z>LVobyAcoHCDA(rd@_Eno6&^YgaFGwQn&+HWmi zJn!LSPD{*cEMq>l;ePS(l@B9)?#rk62*k;!7fOB-R;AX9I*zybm-%nUPaN_2kzb#0 zJ&f04-r9VMO^#E?^$|aN-obZ#ud>Y#xa@hGKkJ9=d7D4yH`JFsKja6U3}*5Cc8ujY zMy{Yzzu{qgf1bZL-uL`~$sU{g9RbGwCHJAlpZy(#c;4cF#n`8Q$H6&9YURA9&3X1b z=Qevd>7G~f3k+~{{;77p{N!zWe04tD@T=$N;~()co=4*ce|b1Rm-*G7-TL0Z7Z105 z@e8sv*`L|H<@}-PAK}VU`gP}=rvG!CnyJ@y|0Dk5c`N?e-%*O^Exx`N3bw(0UUJNO zJ&#Mrk31C55BNjRcbUcWIXB&$51IKlM>0zg^6sn_-VB47LX`kq?a?Rve9ANBog@`FwW^IK--*lDiPziGM6*&#E>e8@xb z{D8?G(D(My>pBlTzIfi^uQ-Oz+^0x9Z}Gne|N4E?yE*6l|`@p`!_c7ysoZ(kb z<`{H+tLLr!oX0=nlYq^hH1cEci^racANje=ubyx7k9yv~7tgo+>iOCHXwUcf;`s<) zpBrn>_xR%Z2wyu{JHN-zT=Bhceq~Oc%k8?JU*Hwb=lyi~K_`R3o)`8B6I6EpXL_Ap z*YU}D{E($NOs!+4?f8LdBIl;)xi96o!(+$a*#WfNjzbNz)~V0T9;d$*wu4!FtItfr zh%mSF@*We?~t)opPquZEcN z{X&|b{MgT_sW?ZjR$dLnnJA(B8FMdA{7tTH2bgBhzd}CYx?6K|^J*YYw^z@ZOa3pf zNbb&h9e-zroI`ed9pmhAh{@;N#(mSfOtr1%oULo`qo2M|orW?Ro=WH}S!d}jg!Dq)k6+iNGnJ|!y?pVnm{T*?BQYkIfAlp}y`FQTU8nOyt~L2V zCs)sBcgh^b^JzO*9y0TBPRA+rL%*<(yG+{Pru(L!^XoAfvApP!bK9=(;}_3c@oP@# z^Np127~wA~61L{}>DtfsJuDuVj-P6Gm0vxd$Ef*|Z@a!aKl}KxExL+&pykt(SK~MM z#bfjNAMuf&%lzv3Hb1EEW&WstXl&Q=kL@?lxAEg|e2$L&7=HM8O@2OKJa6&W6;rCr zDZQR!KJQQQyv3jUegx`UJU`$Eoebu;T+{3}nZx9Y-=H9GRInj4zemy@sGc7%d5-II z;Px0-oYwh1Q64`+`-Nif#>{-}-nMq&g@e3~xHHuq`1bk67bI~+Ry!j)yWrkwx1 z&nZsfAJ;Ws^AMF-^~~80lnU-shh9eJ6hKska&;FUi{QUJ@*--XOBGG{Q;xB0Vv$ey?P*E~Pu2c3+$ z$(~2sASWFEbRTlA?f4U3Qs<7In|l2?PpNiv9Krw2 zYs&FoJD>OPCq3+rA9G7lIzp40j%pT8UQ?tIuKIu9C*gu4I z#=rA?-50js`u5!Oc#RSN^!#Ga+x%HSWY63DYn~tSgHBeS=i16KzCt9$pg zK0Z%FeB1Jpy!pB6c_aSm`6Zq=__Kc4Ja6zXd;Xk1>3Qi*EECOvi07$i_I;A?%Q9pJ zJm2!S?;D-xA*I(%2R8VNH$O9cm3P?>k7qZha(^y5KRSNBe(WDQ z-gx7uZFQc{)+wAfJcvuV^YKwb)ic;|>(#oRdu-2N{E#1Xa`k-9eYd7VCbq-p=Y7u)nC#)X-w|N^ zUob)FfAap1gn~X(-w|T|?C&7N^A`Ur#y<5s4vyE3AN$|Flb>|Yt2vclqw`OB@a5;6 zug>S2`bv*niJyA79A6qfxR>KM_{-J&jQG{_$S?X*^40d|dH$07nzj!|H=RE(jzoQh-Tl~4-fuc`}=Lh_tlfnF!bDne4 z&B>6NuY2$Fyq(W;zPn8J@Z9f$QO7T4%*NnE&y@dy@R7YthFP-JiYu zq~bA)pSLZ&jj`Z_jQ2~&wC&spF{Bqg{e}nSrFwpzUp?Q(FZGo9B>!$bb{;>rEuL@r z7{%rM82sX~`TUId$j4=V^?aKj70*ZVubphpFZK?` zVfaVKKVH}KYdPFE{k;G6J+*Lb=>GRH@_scR_5Ez-Kj>sIzh!1VMs;HzGIRVoPK<}| zpC$R|GHHWF-`hv8w>jDK#q)!hnZF{pGxsSH&s+TO!M}dr^z;1aJbYkZbN5Z3;aAV+ z7>U{_4q=kH$!5PjY>y`Nd<{et5n;$47oH^Q-6E{8Z1+$6r0)@~h`(`H3=6 zt}*ub;`s<)pBrn>_xRcGvHsLf*3R$obKEh0=H&CVc3sb}>iN7MnQwSL(c7RmN^a1} z;(1}8F!|hzUPBLxRn~QU7&rTU$Wq(pJ8IT3_nF!0F=nk(pP4-#W7gj4GZVWh$lT7$ zdrUkx#S};Pn5w>f&Y=EXd#I@qP1}6_-DC0}^ZST9ne0m1-^j%hPwu60oEYmAQ=BXN z(mjvorkLW{9#cF^fAfz$(dgK%eP(uRjA{1#i{gtht+|=q7GsVbA}m>&J+J%!Wc|>EG0A0snY>;NFzfe{ zsgL-9Lenvq@~C<$#H3a^ulv?VAtquQF~wK6F_l+C%+c6s4DtRP*NFBPXO4Rb)#qyy zh&M9!?eiG!BkCuBq?ZuqYa-4UZFk;Fn^yyIjvYd=n{o0PX+2*&i?8NSt`Tg#pEif0 zt0iBWL+fzlJ3aP!6qYPIOtr1%oUQNq+x3QWUBknVyr0;vHw5^h_d|*5hr9*&AIP&@ zZ>V#lmw(jiBEQb(9$%b0A3u#f`?tsEKVHfY_dUD#gwH;@5zR;g9k|`@Ysc zkDi~pp2r@y^S^>Wb3GEybM>dbhN{=IGqvlq-^jHlKj>sI z%kf9t*>UEOna@FWoHf4#CT(!jebWJAuVE}{J2o-Do*&~SFM8zMw(I-&#q(DDniKkb zgX2X!UvfP?@h>aJxt931^Jy8Ej-T?7xwCxjfjmadub!XhBktnKmM`_3&yV(emtQp5oa3f=$k zTk*VA-?{HcpuV5Y_|bjzI(kr?dL8vc-kR?ee9KI6TgN#=X1*?P$b+1x{!-ZN9mJCM z9@gi;?J+LrxyRq~Yw)#u+uEJ;w_F(f9Gm8xt?%=bI3Ms?fS=U&0rfm;^Fw(yYf1sp zc@-WxX3f{0Z~4{pv+>ie#q%wn|45B8ogeM_F28teK7Qo5c)sOV&(HHm`JsJ3Szp@s zHU79iQP&@Q{IBTGsqfns&s+J|-|f=J6zz((zSZ*yw@zV=^`AK+ToL@a}<%fn@`Pj~t9~zrC{`xyz8q2!z ze4YwO|KsJ(nHT&9PVxL8 z{-Be=WY1HKr!gB$>KPi=8;zL9ojpHf2J+DIv*&HTuZ}H0d*0^z`mp8a`Z@TN(QR&$ z56f|i=cf4i$QQ0G!8qx|z0ZlGnR;E<7ZZBpo%RgZm%`x4iJ#WW9J-^uVHhVV=MH zKFOXRGHClv;u>tge;c9&j1@`dN&<27AAV%eVW@Hw!j_!N_`zRT(Tw?_G)v3dFW*rC^twcgL) z&Ddo&V|i#h$nMvwp~)xB1sRKjcq(9yLnTJF?u(*&q|wujKmtIr9e3 zORTco#hg8};%{r|y%&bqy>8R-K)G%+$O-eO`*4?+LHsCnZ|;oe5#>SGa=_>RhLZOA z**XoEj`=;mjQG@2!qo24>z(|&PyXwzclbOGiCdPP{vmvqsrPl{Q_;NnpUDsH z+smieBqyVFU0fLK#lPx#lRx7zWZfMJxtqp^FuF<@|EXhKRh0)3+3ZYF=z5a0j zJ{E*3g=*dHmpFMB$J$3By<+{xvCmg@04}1K? zIkw|pmFHmu^CkWnzIfh_pU$BqKQtCOrejq-f1F=+{$rbA{0ru$oDbl&ieEk7%fE1CiD0lF z>MPpa8y=F|eVlb)dcVi`v3a>}WAYu}Tkgiso_FMbMJ#I>%L}j1BEwRx_xvWmlQQx@ z=Qre;JwJ>e6`44+Q z|5^N0d+}QvKmRfNYcfCF_r*nB{&F>bUBN8P~UPsKj05NpZ9fOvga$i6Z4YqN=>h!2gN7rnuU4E zejl>bwwYST-)C;0xt6ha;%k_-PJL$fcr4D^TYY9qG&f?*Iv;vWJU79tj_xtV(Xlv5 zT-nP#CjT)!cFq;M_=L%>iN=Z7pEAY2QRZmuw7+=W$2Ahq#^N0J5^BWPNMcO0=U?%$ zTXQqJEf(k4A;OZS>er;t@9FRK(0)5x*WSZ6;!s|KFFkP!UwPHX=NT~033}{Hsa=3+ z)o$}@fNA!aI55B*&jr+Lf;pbE%Bz7msZm^B4KXpkQwP!><8>dqT6r}T=Vnl?wH ztEH|-FT;`V^w`&1ShDOeX@jyYF|GAIUp_yK@FVXhw(AXiUQN-JeAk>bF^Ap{u?I2c z0RIDd4qtDW#miUtqx{gmuf{LF z?&l|6KaGtAw^u5ycdUmGvo}ORiT9Y4iGML5l z;?6t=@O<)lJ|E|FoHf4#CT(!vebc!wcQG@+9)mG&Ui8ShZP)kli|4KQH7E4>M#^=J z@Rt<{TTA@j&kw)k{a{NJbDST|*PhQ~)cL8NpN${!Y@ToV{6}iO`hB2q{1|KTe3#F> zr})+L&*X>3cCCNL^`+We<7>}%^IyInV&&%pbM~XmS^b@_dcKZW@tXZT!udH@|E%jW z_5A|zycPf4_aji>;`sr8==nA$U>47d+c3S5BRrodRd0A0zwc?jFIGK2V3If%eGc3n z-ipki`(GqejBeJ;!h>+06)!qA8?YdJ<#T- zdVb4O+cTVhof92D6;jUUTR#7h=jl8jy-+;g<(EEshF?8D&mZN7#&)fL#`UFrU*l`f zck};)kN*`tf6IN-Px@0IJM=L{yP_Arc;2e--1nVP-{ScJf9Ux(W-yEAQ!2S{b24V~ zx#iwtay??eWDk72*J}}{p6~GGIA`&f70y^&x9{rM;Y)rkep2quxz)#}vfkkfSC)wK zcx>hTV7@Jz57qi^9yNT_wA9k#)A9V9_z?Wq@AVPedCzeCbdI3ouY5f&iecYB*oZxE z@zX9RI(~BDdH(Ur2l>_WcKr4CPso$X|0q8+HgEj&JCD-;7eaepF^;(0Sav-9ia%g?MI#Pe4CbACg8i{}UYpp(I5&tqBUR-Oa&Z<-2kco^sN z%{{%A`hAgeCVRk_2kOZ~AAX@a4r6A%uZ}H0d*0^zJm2zj{TzH`zq+wHc|VVieBsKH zAd;`Gra3>m-*Xd3+<08q`NxFjx_bE9SDJZzUh@&Hn~xZ}F(02l@V9(qADrjs$dUXU zpVxfk$IaKr!CGGe!21Nn|2p+`^Q-4+zKHX8=kpDp_AUKlf^d?wN6a;&tqK zJ3rI&i#>1iXZ?^pZ}aE;hWfJShy0+E!DP=P_lauD|HBf`C;I0b9<%53*z}xvgXeAj zY#rsgjTQfNA4*73=y~AgoC;k~e70sJ}nq$43=v*D+r*V4uw5{+*>pjmSv{d%P`@5?@!IkUt z27h{fvF9D}uXxRx^P{ij>h<>h6wYJI_ie2FT=V=eepD6p_)HIqU$0}k<~yw@Dg2#1kL7vJO=kXzYweTl`5}`U%lY3yI^G)+ zefXu!oAa2N@AdpK{_J@>es3Qh`6)T$N2yokcDb+laUSjYh}+9YKgefibPgc={dxW| z{|L&>-@CW&ixA?RBOi_7=2ML{r>^gxr*?RwmLsv!|FUvfxC%p*@8dVINVWAQz8?D6Hgjm7u$ zVUM2@<#?ELns{(LJ@VYA^`x9H=i4nGHFfgyw#6+tLFjqD<%{R-_$iFdV`?mU?0LT} zpA+NCPvVzK{54k#o!=B!clo6+u|4kx7%VAo^v^duBsLmjl#hWr`Pk3KPuNImO#s<% z8$XRL$Bk`<@za=UpJ;yde9NzOwfOk^F3!3yz2DXk+4FTj!1VL)_+Di*zso>UG-g7&HD}JTJNL@wMk$e)arp{0MgQe9PxQvghad$U*UZm(Ts8d~nh~ zdE0!P)%oZ1r&E6Q{CxbQ{Lt8*tS{~R8ee<9oB!hXNPe`Fwex#?;mQ&ng?^%WL2X6z zq?|jc`IR|m&+GYx>lNkuHWpvsQw!T*yUf??dB2*EIE&{8{GgM;ES{IxJ2@FLbIdwU zjHi6xX27Hk?z?aLNgY?@cIG}s;(06n@4=tC&r-_s$l~MgTW@?|J$xTC`To~Qe$M#X z^Z7NpzMn`0>|y+kmz|#B`kwQv$67vUm-*yEJ*Ra1)OlCqAMuf&%luJ(Xx~@kujli< z{HKe2?fD*G&QtL>cmL>fW9|7KU;G&1YbR&-p7)P%Wtr=Zx}^PaB*&&XXY0B@!6}{} z@PkeUlRaPAotT$=hjV%jJt$UL*YSzphb*;irq*2ancHWsW$c~!8fL9ipP4-#i?jAt zpP3T%Y>ZjwLyw8)CYaUHJ*GH17AJBJ^`6%~dpXL)>qks>&7Dl~ZGA ze{trxmry`HhYpUNuX&xepI^T>Jb2o}dBu2VggHb)1~ZG|PvE|Vq)U7y+BPmkC4b4flw%-1!1{K)%>?Ro=W zH}Ua9?}ylfvHW}>SM_=WV&b_WIn?<;DT{<7bP`42j|dOo{TdX!w@^L#$e={O}mIj8M1X@i^Yn|{u($6&eC+#T{G_SG?~0@rhx}jWR}Z)O z;nDFtozKsRFa3zIeIXynzjt%0=^tHR+U7hz;7|hbzj=Q3d@n!gG9SU6_9y-(pC20e z`FKr!K3_a<p3Ud75n}a&s+R^?wj82pP}d5nxbdE<(|oIi!<|efkPhn zJQ(%-W!&fb9JoEkbU$u7TmY(76DzRV$v%jo|cTdAq4FOomV zPxbsfzk0rxpL97t7<=)2kB{g0IAz8E6*-yuzHRZm#h?AYuz23$&wbw+_5Ez-XXyDh z=hgFx=dSc9xq?dZMg9sk&{C*5NIA`)4|9G$0B2GQu;fv=j{<31@walXz z;^~~v6aE-~uAd!$(sPr2rQKE5JNz8CgRkd1I4K88OT>J}r`qK@nEBz@H0Nwxdl>t6 z^Oetc`#L_a`8-hefE7RGq2>hJZ8@pW({7vkmOg!kFLTIK-u)LmS|{h8~3znO|}~Z}4aRAfC7S zXU=cPL-G88kCvv_(S!1%*C})OAE)h&)=*3Q{aaa{=fq%A&+O}%JrDLdlk4cqL(9*e zxB0$0w*2gQoA2wxmY?hA;P2)>adOY^op9s}SC;4Vi0UuQ`rQR;4g7EC1YKY7xUL?) z_U-?t?d*{yM~-xh;^YFj0vfHYjnW7dMi{9tZc7xo1n#6_39XHdLQA7U8?9H+b-5FY z)L7Igy?UQ}gd-doKOP=H^jHp1c@qa7?j8q7WG0xugGQ}~F>nvW7&IUI9_G_ag`@d; zzpwe>(Z$|3`jcMi=j(ja+|vKXKeq=S67y@Et><-qkatQT&0RD8?0I^#EieQ=Vk6zd(z279^~^&qYvlufVuaD^4yJ?Yqw3-@pwOG#6R7K!j= z^I!d`E@ z{9@1B{8>Ll&)fVtzmc;|zd4;Oo=5IOVsnkj6^C=2O!0h|NsTpp|E<^e3v%726EpK? z>nPW4EdF#Ka<1+Cz_rKRq4On~vwD72kKLnu#q^)g55&J|k7*B&cz%SB{3wroKGu7l z#3tP1`2U>eA2uJaLwe-gLo@U9 zHGcFwUSs5cdVaCzZT_quqUUY?HP3hXPA4nRb8V$ZZ}NPbd5`A}{%jo&&l~*dJ`8Cd z8T`whxA<2*Z}KmC-sI1C81sj@vaI%eJWsglc{Bcto;Ug0?Rs51nbv8zk0UQ(Fh6+R zHP0LIPtPy$yuqLK!{K>@f7$bG{-o!n*JbJPJk|Q#C&zW0cAO5+m;B?pjlmzQW63|R z+Zg<@J}mhmkmn`WvOMKHdggRKkJlaNPI(>lm;4iFkk8x7`6_W*>$<+!_b{K_AxwP^ zuh-=z*)!vO?MZzOuh%R5Q(Zgx=fknYubF!Nl`p*4Wu?ATd~k;2@3~#Z^%}pN&yU1U z+iFg0UH1>Rk?S_6ag_O)o?mj^#^BHTA$s1<&zR?5^N&2pb(?nlhUY8HZ`5qBy>rUB z!F;`Uqg=P?GTCEec_{hE=dkTOFn_F$B|m!Jj(@BVOMVDu&SU&&rTuU_;yKpwhhu)d z@~L)%eAGREHmC2KuIKM7ANwBWYoF_Vy*~fqfnh#{B5u)q?cvw>F}7_qKQnxp|91aS zApZD;D@(P%K*zlY9+H!@=X0&k=kxJvXtW*Wg<=}d&$$m}zkoFR6MvJ>VR=98_^0O= zdww84J7U>m%)QTHU-J_^Z}aE;1}=NP%Xc~%EcU$Awwm)UGaRYPeR6!S(x~G|9%_8K zK99elFRL*Rd%nh(>oyjDqz`NS5cGU%#}CIJp5O7ZQ1N`pM@v4o$6Pe+34GLb$vOO1@?{QT9H;9ORF@Y| zHtO5wgL66l?D;Z&O8?dT^!i8gB1_3vKR>z_<+|>F#GgEG<$v~fl;U}dKleLO!9%*@~SZR&T;;(06n=iB7(vXjRwKK_3E zw(E56p*$a7L&JSgN+A-OFL9pE@(CoKFZsy#Wq$U2$;ZAg^RtJme9jZ)mh#l@pSW%G zyw1P&aLE_mDn9CaIsWYVGJZ<`%Kkxp`S|C{k9IP)&*wipM|A%SSC&!_ninYdM)M>c zyLsD@^)p{QZ}pG9rxv!U-pi}ZKjKWD@9>>Y1~Yj+#$L@yml@-K$wRvDL5E2j+;rdc zYRt^vk=vR36p81p_`e7L`hC;e@yFc8K73+d?)#YW?>YQ@s*QL)#-Qs9Uh=S&pH}>& zk&xzE$;ZAg^Rwrx{N%Cu_*_O&z`U4CtT+D`UihY zp7-QOpBrn>SL5g7w=e(N$16S|up3OClk^&T zP<*nk~lK?GCRx;vDv>gBhq6BVKhd>Gwr#rt+$bDc>ET-sA@+ z>H`m|4gL%M8c`p{?^`sO(wn!%spivdOvHYBoRrQ5`4q2u#y;v*2h*CHhgTiUzC)x7X7dLM|-}O|FASasIPo}XvF`-oPDM_tH1M=-=o(0 zpPwUnnfcjwOsO=d^m@!m+YjP-EC2W0H(ly|#mU$(nbd&}CzI@b8&d5f?6t-pTGPe>l~@B`k9=I;Yy%;|i-jGt;3 zJwMCWo-g^?^Yi@d;gU}i^lJPDpL^WypBP)3?<)V=lV$wb^K0@W{k|%GO8?^gC(m2? z`9RL6zHj?B7Qa4r=wpg@MOk0?EuGI>@y~tV8TI{a#@{`kFJlHXc|N*FdI-xvhr|aS zbOng^O%LjMy^cTQ-|>)3uZ{7=_mk)sp09X4KaXW*vWK7V`C3HN^A)~$-r{dNB9e39 zH^fsppRdIq>u1Lw^xVg~d`COxIUPr8@pE1V_}EtNxdr+bP>HxiF2(Z&pYj~*VCILn zl{i5@m~yS0_V!xe?0K87nR;D$xZvY;gYgG!EBOi7EXQx~xgUM`ALnP!TlvvU)OIj_ znNMT!$IlWdr8E_!*8Tk8wKVz7`AZ=mOuc^UtJnSkSkC9U&N3eA+rv4r&u8aX^1PM* zSwD#9E&iO}kcZ^?4&UiyFxm5zW2!BdTx0t8k#i>#$2+-h*k*Da=kkF5`;uZc__K99 zj?)JJn&-PYPd?xBJUTfI+n(kuz5GE_GuBYzmgVvMQB&qehs)g8zwI9Jyd6LB#l!R- zA+Ps6vq{{tY{svddfnh3yp*rw->>=6OugRYi|4)h(YfmJ!9C)&;(z5xtzVzl{lmwE za~~c1JLe~$;l%TF%#~xxxv%K?Ge3IX&d>DxV$a+BZRY{-T+rw6dOeQi9Dnq@&7bod zxa|2Z-|1wq*z@Sk(Cir}Q#{{ga&G7HAfC7RvvrJ~xB1h3$hjWit9hiINps5fyv;w) zNA0l@&yVos`*|1${=+#d*ZsWTiU$Vsb7ngD?5&abHB+y@I!${3++n`Xk6!QbQTt*3 z`PeafoDG9~{T>9{489-1>-c=$&j0lMV$a+BSwBS2+x$7dp}y?-F5l^7@jP-L?)H3_ zd4uO|{%jrPx=kl19RGA5a;^vBN2&GslFZXF&kyiV=U`sXkMOm-Mm;H9S&G-N48OvY z4?Obm;&WsDd~T^djLq3&`2X#m=las|$j?X7hWR=tdVR$6Bk`YWD*a;}XTxCpc-`T4 z>d8@l^gOmT@;^Pl*z-1j)(_G1HvgLEyZm|2b8V}0%E^@TdBoXf-s5?LKU>Gc^9Fyq z4+9-j`9CbHIgg&X>Uksn^L#%$q5XbA&NBw$#|2!R^Cf4FdJNpr{7iXR;+AD6|5JSB zc{BeyCwhI*^CtgX(@_rx=Gyte>#lj;h<|#1iRTUetRD`~8~n?jZ}Xi_Mvs3Z=SXi> zd)~ews8eEI!n+%!91@0Zp!AFmzeYd7j+iout0@Uq(TG5;Kj9H&P4(wDNln=iZ( zzV`h1`F3#RM|zSfoY#%~%XJ$g|I_n}JwK429Wn2*zWSQHUXSNO=l+bIxB1sR-{m`< zjGkf7OYf*ZGGQ{uI0YuK|Y5y>Nu8%l7D;-Yw*WBU-F~pRW4*dIVbFau|6#M zA&@U^J{41ZuHCNJqmy<1vCSy|_zfyb-Cfsw^xrTa*wg35;!N#yJqadzzEazq^DZ+wM|(id=etbyoQPV(uV)HdeA5*mR%lO6fBYeD8Jb=|**46un zlFxw;$A4Ul@bI~BM&eiJz{7mJaFD+t4-$XCMq~LAzu585@r5f(*&p>4mF0nl9OLLU zxesM5v|l;qR_iO@t2E~C^!#Ga55&K7(%BXI9R9Rk%rE#YeSba}@z41Ud1lXd<99k4 z%;fp)^%$FL+GS!pe15JylRe*Ia&G5-M}YBv+1LXXfA)6};(3ezfw52hjw6i4kNqFt z$q(wg#BuJVxmM(#=HoTK_I!*%*B2hU%+DSu`55zR{&qD#z4)`|F*fum>cRV?y1aO@ zQD5!JGC#tj-dMpGzpUfOxPAPX2i@~}UH2#APoB5(Gy6MA@w~;K`yD9in>^p)JDm(> z@_fvV^bnT0C%epe>^tZA_?;BzyUL^uZn|%Jo4@bd)bEw2us&z>y#6!_Kn4L*DKN`89$ z?D;kMk$SF*pVGfL|8hR>=pXH5?fhE*#Jv0R6FGWL>2*E7)cL#-|J;3DP~XpH{+&(+ z^IK%bW0dp|mf<+}=rXb0%YCl$`Fw}Tp49jD(d&^J^IYT0`Mky75!=jtip294fBHU4 z$zv8De@AX(9-dft-^YyKUsh|%`ET*H=i_U1pMN3|@Noox>w3P;&z>y#+4IZz$zyBy z$j?%~)Kh#T|31xGqrUz8i|5zm2iZxU_we<(vGzO|g@45J9=>+6c7BZ?xxV~Ij&_<} z*YgW?OrGz=?{qSl?0I2h$vujt_B^Qk{_``vPOt0uFmCz$mE)|kG>55q{KV!58sULQ zbjk6VtAm;ARA)wy)8BfYl5OLiKXY%%^XIXLkXR08zW!2U;<*WCc65y?j;6mk#(rFH ztuaxlsW`{SPIC(ZF^ zfwjKHbK)xplMbx$J25q;@~VrurO)JQOy$)(nc|k)n98dTCLGrpJMu9RXP>F&r7KSP z47E`s@v4Jq_WYa6Cp_P+xp{ci5$CX1+stk5zUit~*`YKA(>bDcC9T7e@ARm76VLN` zX_cwA)tuJ)nSWewaPU3vCywh44!-OC5PQ&8arAut`+S+NSNP&?FpB=c;N*IPF~6p- z=ds7__;n0CtYTIk978=oX2;VoM(Lw-12;lFZs3j+P!7%VjXLI;mR`h{V69Lf817c zTI=Whgb?SEhac4U0k!AL_$kh7eC_#?pFKYtzxHIw->9)^LZsqCtq#HZ(?ZvMZWfY$*0;;ym-AVTk+#Hhfin& z+1GKcoacN>;e%cQZuY#*$7_Xo;^+MaJReIWd^{m>%d!!_&JS^pePOpUE_%M;GtbV? z9G{A|4dy@RC(zDPu42roZ;SX*-(mi19yC+0Q#-^Aq&bd0DFXG1&ay}o@ zet3T;=Ukg#$@5l!Zu=2j`~Cj$lAIs$yv3jM8}g7m-{Hdq^g4P_9rb!`&f@Rvc`VyG zH<$yXaS+x%;uxA}T*o;``aXdXv|E6Zxn#JPj%5YjOP&6L-%Y1?D` zLNwn9U*8kU!Dmmd;)6TLr2h}6@UABtJ_MSW#^et>_; z^EQ9h57F~B|C;B!e5aGe^Qcik)A53qcs|fSA9(cdzg0V4%XOO$^9Ijzu&tPxzwLO< zp3X7eFvNIbbbgOkoUdY=Ut%t-_^)~1j(0~2ua|M1&sTF^Y`$Vr&yMohlX*XZ|9$Ft?jJm#V;<&XaD#lBTSrdRz5>>D z-Ou@aJEDt3=dOpvm!23BJo0vaV$C7_sw=v=$^L)tbwrGPv_X=|9n3G%BMVx@sYQKPsI~H6+EBMzw&A4qx}CkJV2=o0LT60{RTX- z^V1Ld6Y_%phWYw@Sgj*OD^;z6&7_2ujHHh+44@%g;X-*!Y4 zo8$Z*{|)1k_x{IAa{STrHh<1vgW*OV8u)?0GCx4MN$I1{2%9 z%+up@*fx_2kKg@_eBY+zAD_b-{INQg{OI{^PB{LtJ}mhmqIjq5-o?q8 z=s1_(FcxvUUa!O-J#X{p{01(2zRPzy87%g^)K->wKG30;+|j>2Pdj|Aqg^)Ly#qHYjC7(EB{J3p8A5(5GpQmuB z7l=zijq>r@irWbx9xLPL#0=$!I8%HchvZ$BW&Y>*6x3jT=#?oy0jrV|yRROvl?3r;k$=kbSbkdk*eA*V1)p|)m7kp!W1w=$aRjTY`P<6)v*%~)8;}BVewiQC z_hS5gKBfO!e)Rc#89xS>JTJ?*ztRtJTiu7P^>hE=JCb~!VDV>vM=74S_;bGlMIMsp zJA9{;!Azc)+*ESjWybHFp7VU1&!>D>n6$x7_f40+Ec;~NF<sn0#M=i_U1{FH~-=d*n6`I4VKKhH;9L=FY}4&lKP1ESI#f|{kYbl`%`;9zUHOAaz5|iYbR^}*Z4== z4!#~sxqgmcJb&z`k)OHyx**S=Q{LP0JDm*Xx5zwVFJta9vE9pkuJG@4f1(bP61VAl z`{?z^jDD{1<$T`a?}%;YK1Jeri~l|N-@nH=^?MWDht>FlnRCuh+&1!`*q8f0X6b%Q znAgAB=sIJ-Vx#kBo!gSHJzvKEi9|r4^m`Hdr-yCDdX7T*8#zdv2;xw3C|2yLp|N58#!)uQn ztcf`LO!2HYPWkMUw&MpP&+`cV8(r$D`*Gc{&Wz`?&N$yNKK{J3&WvvJG5Zb?mMm3% z107~4N913LXJlRb1lxT}x#cBrlIvUe%By319!)+6m2v5qk%KR;n3?%R?Vg?59bR?B z`GFpb*S;HZid!7a0A}Fp-8CkjyPc`LdRv_6qub*IQ+#z>oXV@WF;S!2Dcz_=xzJ% zogQb$2}_n0CT)=8&TrFu_v}!4&6$5(Z%EfQM)>;uMD}T&e_U^H@b&wlkHf8X zeqg^~ybk^o`H|}l;qYvYk6JC|!#hj)Xol7Njpq5P{3Ab0`Ka$wKBa$Uevlox-r(r} z*7dyaFfU&H6FqL%_XlkILvoJ3_bs+Ru9w&NaMe)%{1g0tCVuOBYRM<2HuyaVO4?N=h6wh~2X6B#V zsA{J@U*jKf8~nI!bT48!dhY}4@;$*CUp#;8N8XzTI!&NFmOj_}D%W-Xv**|Fv**|F zG5qBDW&G5qYxvpoYxvpoYxtD@G_M@}U-qQ#VcnmoFZVl^4*rLlQ`r8PYjMA4zIfi^ zYd@Tvpj=Voi{~x=6K*Ye4@#oa1C}`THWtHx(uo=A!4jF*E;~=WYJS zCC}UZ*aNAbaU77}#)a-Y6|O9KE)N_>@_p0$eDVA$KH}xRS;%LPt>TO4y?jS~r{Y(? zr|oWt`M&mZUQ{dIcz1CQi)_PibcHP74pYo71& zolXXeJuh>Y@+vhra_(e`=ex`sJa6-_dEVxKpbzExjPAqo`IkOqkJ)_9r1O2B=e>Nd z=e>OLM?7W)%L7ySaq!s(tKtWDil6Vr)z1&+>=b{rf5h{?`~({H(EA;{jveFUpXNg0 z|Cjm2p11keJa6-_dA`ecI$1oA-1FR$8ql%is^`1R8$56GuX*0)e_Zms&DXt6=Sx1% z`}n8(YIi-X`mfzHTwfhOqH%iO8$bDP@HoPrT*XIzrud`z5zl+$A3ctX=Y9O~{sfmj z@8h3(X~^?7|C;A*{x#2c`SYHa-n{L69&xsr_jummU-rDg|G4UTgRgsgd>+v;I=vru z@TWZQ;*WYv^|y;Z;rS(e<#`u>G(XDoF8+k)9sKeBM195c4!)iX<$CRWp7fLELFqL1 z&t=aW{L7wi^Cvy8db7-llc}!TwBx+N^WB)4f6enY|KpP9ZNBbj*XMMB`rF6nSuym! z8{8>=zHfTyzF$BjQ~c5E9z4>C{EYG?@3O@H$~ndTsq0JiLXG+PetyLBUjFF&K}!G1 z{*in*<1fzP)8|(FJf-b{NA!C99M16bbd=8s(ROv}4Q#>#ID0RiZ z!*MN$`}x}UZEXHE&)fWuOP;s++5>dH^m)j`cpZDv$Jh5w?|TOQH^p~+PPdxRz3$D= zX#6riSMh}_%l7=z{j)hfCk;#UqvGZLsDHos;S|5y^LBo&dEVw<^L&@@bTU}%c{zqx zbM9n{=ex`sJa6-_dEVxKT=Kll*L}W|UR|E|@u|pT#}VbXN>*l)F=AA!-w*GjW3?J_;K6R+lU`0d_1n$8*#nlQyyZUtl`6BOZgb* zYJT$kvivONqrOY|l>U|dgZj$(yy1sGVSfE7&9ARmm-~uf`@{KV|C6uB;@5m^Q}uj} z4^PMUBS!rH1E>9u;rWt}`hGU~UC&pU-y&0Dk2N?sv&;MrWBKm=8xsG(BeBx`i8@T$ zVEY%g{a4C^zR!>Le2p)jxA;GT|6}6o`xHG<(`V|R8ecqb@qY*Y?-E~s*6^V`U*m^h z=A82rw~ao3Vqfwb>cHn1@%fUUJ#WQ7$Nxkk;67i&M`Nt!OP`+3%T7IiA^*tFQa<8b z%BS=%u5a?Z)jz*M&;KUPFMSO}d%o;{#Gm}@;p_VxYUkJZ!j)ykncP1*e!TX$PorKh z`KWL5e24FJGMMc7%&x?|eFBv}$NBu39(tXI^T>V8e($n0hpE}=!ap;k(|yeB@j5el z+{gSl++AmeKy$;#42Q34OgwixQyhI~oGAb8aZ*d&olo)aonr^<_Bh3}cgBfq%C(o| zkmKKh4%sw^^}LQV9!Ao|o9=Nrby=U8=SbeoTvy;)-lOO`aI)LZqj zYezNK@igZwam1m#r19O!$MHeDI>zTp?l`W*>m#+CAjU5`b~EP4+`-&+pXfXwCBOKY z`8r4=PH~H4>>J{Y*FI`YJa;=&dG)q9F^1dY1XFxR=9gwapwncSOvI5nZQp5RT&$93*4Y4x;sK`#pU3 z`}ebtgeA+mmu1_?$zz5>4u{HX&ivzgL%Oap!q@L7_8t3RpVs-u^#%uDzaPqOt@8u> zMUF4koU7c%{5+8px!#cHMvaeJE#<>IOZjN3)%=Zov?~9|&r&|>yOdAqUzs0dhu!VV zzrLQAJznd7nNL2xz8;yKUgyJAL;dp)%-MfbuBU3(mHs5xntZ2|!IWdgm&mR-v&)Rm zIeYl3`r6-59rx>$-OP4u0}{e9bw2@w|tx zdry15#t(twML!z(iQATADWBKzQyy0Gv**{uPl;I>KV^O;KYM;neo)_~@l*O&<_FnN zp7-QO&nZ3Es`HC|;G19jz8y}`uBh?hs$XFg=KR%u(@w+o$2I1XkNSQ#`A#Q;`7JUJ zw{ech6*LrfW|#TXTl;$=9VUqh_m0o^kJn?@IjQlbKP z_~W+8!^btaZPPtjweV6hn{VV$i`A?qrzFBD z@_X(L;}Xx8{OoxvKd*ebPhOv&J->#}1N{~L|8d`R#EE~?xajEz9x=~4{(xu4;-?o9 zZxtW;nc`!+PwAXt2VvJ^)cuJ(Oz{ah!lyp-=VwFsqkQqatAEt|(w;B-AMta)IO~hK z96#6O?O)b){^?wNEI;~MvG$u@FXKmjKbw4~lfnE(OqxT9UCt>dQ?843nUuJTp11k? zzFqLV&3~dd^HU3o^8+|tjulr07a*kf-*JGQPJp7FqT_$aC(epNc-=V`@pBKgT z^7(W8@qFIqKi{r+-sbDxqrCe(@8x?v@8zRc&`DJH4RvWBr|>uS{6ao^Y!x5eDSp2H zRzE+Oe^dO?{-N}b&0pQ0*k16Z_dmgzD zR9hM!E%AJye?IV-^*q6vOrGyouiIGsecvv4-j4r?ewaU>xA~{ub9>&$*Z0%ikhivn zbN^ZS*YSghmwP6Yhd2jrq$8m}y&Rb7?>3n|d zJOpve^?Ab&r~0}*@5_(gSGi8@_P`_NMXuXe`MKu#Zv69}Ph-FsF}H5=e4BZX=MDa4 z&l~*bRnHszQ@;(*BdT4Rrw;y<=Ux0!kLCWBc~$Ajdpz%ofAlz_Jn!O<=0|zn#h>uJ zgFoeY2VY+o9lbv9>7UbF!@Rc7=Rr5(zwG%of70{0H!E|>$&~B!UFHp*xB1sRZ}Xp* zJa6+)y+_xlhXB6j7-2b}1l+UsEJK}jSfBbwquwT4<|q~Y-#5MQVf5b=-|;!!YCikLo1fA6Wqz*W3s;uaIa_)X{WJPGY4rR$e)PPP@AkZp zf0}EU*Y^3m&A;aPF5l^7u-Nl7b>n+|j2GuRcs^jUJ@A;nKHp*9;Q4OM%)jP&n}5yo zHedJNPI`5D-p8lL89R=M=e_(5r|^T<&)M?}`O@pMEPKB6B!)c}zj)pkKjz9HU(J6< z{NsETw~IgienGC!TYk{}KXcv2!`J&N*Qp)Ig&RpRf3MQW&o$4hI+Xo6?fE13PGtB=Lel3g$lL3&gXfXHpRWEL!Tye(e~(V6@#XvT7XJ@>zMt;%EuVX9|JV5P{dtT3 zGnjHe-4C2^$nQAx_vdT;5MsYr{J3qpz5#xa`$l72a^0ik(=mD_KYM;n{21HP_`y%} zb4~o&^K1Co^K1CoFRS>%m1WBhf5QCwQ@S52UJIYZx$qUw5B*Nc@Q>yrhL>~rwttS# zVGaJ(`{{P_)AfAS3E!d_hcmGv55Ja6&!|Ne${yI!yH#q$6~_d3w)B_H+uZ05h~`6}~Ua`Re>ip11hF2LIQIudlIa=hyhcm1XpO={L>CYpb3w`QRkaclce; zSDEbj%&x?|#k(leYv@7Vk#*9=Blk7`KB~)7+eYe+@yBa4b!K$Blevq>>&)nJA2YkV z&J64(A2S|zTloa*cIKz#&^zNq`EQStT8dnAXPg-O?M%dXJ5xM+=h!iFcB_w>eM;N$ z1E4(L4_72F9sdq=8bGhpy&dN}UX#w7>&)mjU!2*YHKwp+N&8Q|RgY6UsDkcL&c07d`UTQF!Q-`oq2fG!OZ8!b>`t!2lI)s z$8+Ku6VHjSZeuF1-o`|^ZjTd8@zrf{DzDzgM2&8blhWz$`F<}Uo8nc+*z-AStv?ax zn?KHco?2%fUUkGd?A11N@Z1qG3xi!(b!hk8Hr7ddS-h#1{Jt0aI(eB~A->@K9_QoP zq4JtD|G3`Jj+r(%@pGNd_X()Qe_U^H@N;i%TXw6&@De}!#g`wQt8!iQDbLi$tN7yF zReS`#G=9p=;`}V-qrOY|;_HR=mFo?T`K9NSo@=%F8$IreKc8c5n|4Kw|6BH%kFTAE z?GM+LeAM@|*`H1)gPA;kxRb{~t~lN^beZKfj6D7hlRf+oj92a-ug9))QsWC(mNDH57M`&T?KpC#7#GJcEy12{hbsOr>0eym z$wtM?CyMiTN~=A9`Wz z(=~kLXNr&QhT_kj_r@>3PwLkJ-@W)%l^-v_r$OLpgmvX<2iTy zkrVr~T-Scfp6|r(bTXLi`Rs-`2KqM*<$(u%zDxV22gRw^HyoGfq2t8A|3-NrM$AWr z$-XLm9`jH>f96Ne+x#7|&3oSFU-P`pkGYLGp?u1H?4B5xoX^MC===y*mRzG$kE5oX z|1&?|pQ+Esgyy=g;-lqO^V!3z;zxd__>THc^5ysX{rXb+$L6o@pMd@xDizmU%!Tg3-=il6Vl)z1&+>=b|WI3k|+GAK&kJA79Vqa=qsHF5l^7@jP-Ln&;k5rg*-~yutG}e}BK?d7FRD^EO}i z1D!AV&gXr6eLvkN^45O8ko&LGGhAOCKcaDZ-WxypZ}2$6o?OL8ex~@N`4P{1;~zba zi|2j(@%{u?uFtofQ}&PheBK%V8^&F^J|BCS!g=7K9qHrixlpcaKI+To^Ig8v$;$Jm zG2r=dyvKJkmFL?`uH&`yc}ly^`zdDT?^iu<@GpDb;Ol-EpGTC3m=`NQnm^@vNBmSQ z-}yXk(Xa10evI4e`6Ybic^7{)KQzvj^`$uc{PF%oRmJn3{LFaX!S|ofQ+tm0r|#8q zz2W&b-|1xZj9j<5jVYeb{f==}uMc1Iyv^S)dEVw<^SsU1{QyS}zAqNf`}o|oL!SeJ z8>pUMe!g$|^S$?e0g+7cN3VPENGIYS+C;j}0=e_*V_k-ej zFCTdw>L0vLuG_So!+AL6$L)Dv{C>~-_4){-o!ncd9+aS+kD**JLz@kdJsfk))%`Q`V#kFWPtuGc)@u_w<CT+kd^s zoNH%l|JV5P{dtT3Bltfi{__pz!0B@q{Tt^RU%o$Y@qY*Y?-Kt5eJH=<82+79x=vZi zIp-(F7V{Ip52??e*sq+=m+@0S$N6c+Kga(>4aoC<4Ik5RH9z@lP5j8uQhxUQn)tI{ zR`G=^%U1vY27UgUG{5lLs^`o8NBnPN{i*pa&)4`dUWzB~XC!{S2FK&__)_vw-_K_J zPA6y2OKvJLcbUIO{J(E_zQbgX{TtiL{d9M%?!nm1HE43i{~x= z&tU$Xjvd;>T@Ex0laTIv>d|+4F1opU~j(d}9qC z!&uEv9$pha^0SnmJ-;S?O8?^ep3Z~Gf3!d9TP(PbW6%E?^Xt!PerdPs^(S8Q>YuY8 z+x(xf?N5oXe*>%6Yy5NG+k9$-+BG6lJ7BM<3({=A=4ewZ!Ul6-|{(6e@#L^t5W~URIAIOb33qAKG^?-w!Jzi%$#8ZzNI|KlIIql z565v!dwKh`>Ft#_d)s5H*X<5BI=4Ig=iDxYfpHdbQXXcuQ?7ExdHBe?oyK9BRdM!O@W{8*YZ{DApSHf$}$8W-^ z&C4!F$3Pp?IV-tH&G$3&c#nEISHk{tYy~qpv&lT(mpYiq?M-H!>%Or+F?L*MY%pnz zRM$J1;)pw$2=MkeY19kGemfI2x}7P$y17R3UeVF>=^Vb%pNR9#U!(M1qsfd8^o>2e zCu%UsRo*yh8+v%oXONFCv>(|YmZ5PzWB9YfDO@+|PY)AyrE9f~d}3z)67%U{rt8a1 zrufst+;+sWx8kJy`{V30vp?^P6JxkNPB4>~?u!#+znzI1-Oi+R-d%T$Jo(d;&-9sP zyXTWXJ{`4@PZ+OquIkypidYI`ul#MvagWkDG+t9=3&*%Wz zAC{B;>~N<2>0yrg)59F~r;CZU#&15`bx&UMGPh4HX7=ZOOdbRsXwxyI+CN3z18vZZ zll~Zc-VXB6K#aIGOfBJFLM6LJvCM%v*+df)4{an zrufq{c5Kr*2a~aS`jfVyhsU3IeLD|oj<;)ce4g9p6!WM*c8vK8&7*E?1=Fh0acpzM zY4(z^WXZ=oiu*W+FXE(e;T~ryw|L3+APbzw>|*kLuNq8DGGWPbD9#=e(F#kJcQCh? z99(8%>{CpmMw3k33%F4uN~eG90lm~?Mt}O|k=gTa6LG#_eCGM5FV4P0z&d&-#e4j_ zH8*J+dU*V)=2pp9wQkov`m@U^9MT^|>7k)5kP>Dfr_Y^QSY;t>-#n$x`=L ztCvVSG^g8jkN&)w$qu=b3Dy*o?+c^)|K%7r#q2p*{OKEepwV@l9R2BInmzyK?|Ex( z!Uyj8-gk)fxM%D${zU%S0kS_V!!f5+|Fq{(^kerCUy z5T9KC^u%dh^Jjnh#%|5c=uaPW%%2`6)sY^a^H1=(Zq*)8^KrnRZBEfk{jsB$`24dQ zTfwwybokQ|=deE=%zn?K4k67W2eUsnl|Nm~osd5r4Yk>@k%;UCiFtX@7Uu zi1z1a_In965`TKeKI%^g)0&%yKOM}zLr|m7-h9$F^ziso`b+kQWtcht>~ad%^~a80 zVt@LWR*j-Reata``k3^dxc#1s@=ta5G5JW-d>;qa6qE1$s*a&3XiRC4)xf<;2e0Fz4smBPcIWWYt|iqV}ClCL;mzJt+^Tf z>0|aCB6apKX&ZWY{3*R4`@?d|pIuJTpZ&3mKYdKAM#twz-22t>7IBXG(-|jyF4pXM z{Ec1bW2XD7Hs(8eXo_ikHnD;!wUH&CLr_kRV|rPm?q?`!{@lh?wYiNc{#5MCV;6rq znM3~cF|D~7{pn-&9Ril*Z@5OZ4Lv;mRCSa6Oh>zIA?kgKNOi5lG= zC#BQhpZ#7!Hq+-vp0S(1S(fupURJ$P%y;a6$e*4#NBud@q_NP$=g;W=Y97=aZ_W4Z zc>mtv6#4A`_CNd6!?f;EApZ0)&3h>%hj^Gz96N^YAHv^>tJbB+XP=q!;>`ZMkBOSx9%uIFeQ_e2$)6skdC#2WPY=_&w@+ljC61oQYlnV+G|r^CMh}la z)%^TS$3Of#(AzS4KM7~@|6#iFzvJ;So^SfMi|3U7?V|Vm+XbHA-tF-EsqMs3-u)r9 zQ~SeqJcqse6Q6ju!|SK^CtmRG52Jg1A3NBe#rekIcEvm!+O9ILayyzp>A%+8tlb+8 z>~CpK@{)S&n43-}T=O^0684E%o$trIZO2mG?wGgE?T&ft+79E9dF0wo&0E)YDCgAv zxDBFbUHen>*0mk-BJ)H-^`8+cpWZt~ar_(&b+$26d zn)6+~hNkj^8iOWxem`=WuRT7td8bGFJ&s(@IXj@ww9a{s_alxt&2uxJQ<4M8bwAE0 z#y<3Z#1UtoN%81f-4Q1Wzk+${sXOAt*l%YduG^X7uRD7QBbWChj$Sg~gTMKE$+}h$ zo#-2T|C$DB#J=n@2d=kB528L_w10bZoc2wRmP_mY9Oq+9aL9;1Jxm~?u#?~^FAhObbFlHpZCRyY|8cU;kmzU z=4U|3pPo4P9WCGNdG-OHi@BI^$lg2$BY%J3TbapA_c60S?_*|v-p8bL zF34x{rzg%2^k?@wNXefb<`d^Oz3)oN`KO2ZJ^cCofImA-mp|iNNA15+o$mMNIDg!q z9_FY&JZ%(5IBd+)ws zl$$iqZ)1u-y<<0OG!g{Dxd0R|j$rAe*nMZu;(qh7NQ)8#o zp$?NBa%Y@iO)>wY6DRUF#q8Cc(n$&TjXhwKcHJ=qKL7MF&7Oaoh!gMM?cY=Q;vDm5 zm#OApt0!fyAeWTvp>ud_B4wGJ9hee}c?8kU2(qrtKbhyuNqCQ}{1* z#vUf(Bwmjh{mDBXocnm~(D|p2Y0b@e{^?_m`LoOP`IGB2Qfs_s#-GFdZQP#@rd6ZE zpAM$kOCilo2eaSv$o&KpUDBCHG_U<}@{l_7eU9049gSip&K{HgHp3kBC$mT96ot{N z5&g{{XTO)QL;3v36X&Qu9ZYL(9{zMNhyB@RI{YbpG*asse|q?%{`4`e8XfQ7+xeWl z{^^W!`;U(6#GgJU4XJ$|0#=~8>194J0bB2DSOyc!-uq%Oxi;Q7drV=;a-{z$j2;t= zsW|)RieZY`t2>4v@86j{IQAib`toVb&FD`bbIhMzro*37^N}3lHSY6I4}a93KBiTp z=uaPW?EKTm#60PIW(rmy*ZG+A`u67t=%Fbl0_}WWJjeXj`Rok)lX))7q3g6grkX#u zF;#7DW6JrbVh@eos1f_q$sF>hk7>=#=uaPW%%5GR!=I`?W?isPw?94nQGfcFR*mHS zd+_wU)k}d~=ZllRZ_@tG335Ndq*Kc_Q~c?RliW#<`sZ9cX!qDnCfDZ9IK`hnW}t*N z$1Zd7PNuMAiG7&!lwR9EroBUPY?40{_K92IJwTl3}A-lck+?@+nI2|?ab`Y z`^FAt^5=cb?9cm{sL}0l$~;E~hUY2uQLmSTB};Ju^#dLH9(Ytf=d#Wjl0RK>Vs6@> zzx(1G^=Btemp^d~i0=y*`E#7V;dfW`XgMFbPX2T;cQE%hQ~c>+n!jaBUh*(E#EFwd zRl9F^f_iz2^|_sy{dr%Ui1zk4DFu`RnrkT+X0PJKJ3U(Y%>KNOnf-YmlhS$j*pU}@ zu`i$IZJ|^-sDn~C$!asIaTfBTPIe~G>1 zVOsYn5Py1@=Die>Lp;nUjvYhy4;ii(@p{bc&->!U+`N74U?zv$7iae8ea!67`3e`XQAxqaIn zxtHbMEgVmCdoc8QlsM4bZ?RqUoPWE(^Vz!{UO%;+ILW&|q;+b4RE~7~bJaoo;f)io zpW2^zz`H+;PTse=#)tjA&E$pWUp$|1?N5!Xx7{~-9X&9!PV)lKeM|B35^?bSqJE-N zZ<=?fxv1x5WBoku&i5=c`Mfvyi(I7mXXg379%Ibp%qH`g=VN)`IFs9(%)Z`9XH%y{Iw2{(|}S zmo&e!ySGiRSLYXdT)ZI5a(?{`{?Cb@J-%&vy~h9T`&fQ{`y=-KW1O?u>BluMnzZS9 z&CC2{zf0V*JjL&HGI}O?{_M_i=I@cK-@ofPB`);K7oCq2lgIdLZ2Rk!XXGxOAJa0g z*Z9JfW&Qk~*qM)GI9;FR{c7je_~Lns|DWLhXNo^vQ)a&Qe2p)jxA<|}81uHHDfYM? zdoQk+{OtKP{7;96*YGjU5c_5sKY45oANg6z&z@fsKc#%Y?cN}p5m z{L-E;`=93dSp0tk|Bs2k@0ea`ereCw_~Lmh{(po2Z{cGdp9gdNU$Oo*t(Sb%H+jCp z?|QzovZN z-@|WtzQz}>EGs$Tdg=Iaj)L=)I4m zhj_lj{6GN>#ZNEv#~)~`AwKdm#m9C-{Ooy8eFK8p zhxk-pe||QEKg!2k8LIF1@7axdereBF=U4K)m7g7aImgz1(4MdH@!U}S+UJo|dcNdm z&v)W?I$1oQ-B6jcPA1&L*WJ3z!ecrQ<+}D5`tS?o*~iy))YomwJYz!e`w$;r_n|(Y zukmC3oP3P;o6GZFKHqQD;rUg3&GpXlOsjn83g9?Qpyc-+hX zKA7AOaogB?{dIad#gdMr?D=lY1>f&^AK&kJCm(ePF3)@U)B+lFuKgb1Afo@__D&ugBy`Kt zMgL5BehFWB-o+oykMg{WKU!bqc?W;IKT%cjyurWhd4qr1^9KL2=iB^A&*$E}&+}bo zF;D%T_woIn_woIn_whr#S1;%7`EIp7Wr4KHcYcAphcdFMss?pm^TPAMGEcK(5yk9^W*%S7cU?C7&uQrcG7hli+|1Yc^s8%6ddO@ z&)fWKp6~LVPR^c}+*fkaWq$YG`JGg%XNAdmj@!oG&^6WXXKQ@<{(L9qg8zKWzk|@< ztE}G{AK`o1FC^JV`d{^T85R-9J&0k1voi=sVW3?T&lh)cE3g4`0_# zd%ngO&wKc~_q6A0eDS=8A33GxOMdqJ8a_OhJiLaFHd@V39$pha^0SnmJ-;S?N`IQS zj`{nSR?_HMWFg1^#w&O<{OYF7dx38b$zbnU~ zf|+YpXCA+Ibue?E)tQ0aM1LEPGuES(Pq1!hQm>fxF7nxr6XjaL-0qGOW51n=8r{yM zblyF7j9fnZbo6KTX`|=g{BdT7)|v2u<)flMvo~u@dd|hv{Kh(-X5S|6H@!stzRSIL`b&tWFjO5zF4nC-xKk zarT+YtGC68G29*}nBtb(;#6L}jfooF9w(*q?z$tJ;#J4k^R>T5&%gQO+;_Bmv*+Ou z@v0-v{T)oc9#M;vo-^a*GgAB95v&xKTqCGB6uyu+^xUR(x~AN|uH0erw!g-n+VLOP8`%GN?H9^7=3BsGd*Bhb)%VlQ=c%}E0{+(yKe|>3A$0|O+tNHAsRq-P~OZlkpQa+`BaeYspYq$Gf-%mH66K`Ag zc-=q8^#)`9{t^C>`|0NMV@$1`9zG0`^{qt||<$k(fu`btBv)^m+lWWcVJDm(> z@_ckzHRoMsbPj3zfk!RADw8(A|8_*RKj_WRZy~aPs+UCxC zv**{uPw8J=-{g5K{$KAn4@|z*ZrAJ8`Smsye*ixu{*HBVyI!yH#q(DDKf`H1r_T?y z+x2?M&z|q_olef4KfCSZv@Y`}xbCMn?U{U>>o949?SGJm|EYYAsy$!h%lIw+pAg%h zl83e1^?HpjTv^8bopQqQYd+pz9^Y5ep0Dx6^AS^%fw#k#Iqg<;gpFhWcpWvV^Ld7k zulw-pTfROY_j~5Y`Z@XPzUgD0_ww_7)BAi(X!h?aKJves&mLP9Kk_rh&%dYd=O1xT z^5wqieZF|!m!F{Sn{M%==WYHI^Jw1lHhElOuPnQ}hgWpbZfJD<1t+B5xi3g>}G z%z<3D>Exv7bHC@E@w+|m_2bGzru`qH`35T9N* z!>8#tk{|IrUhay2w7&E@fBfj3!Tv$q>2p{s{%fAM^K;GfHvgLEyL_jU<$NB@RNGrU z-)7$9d4u0~dz@48H4V=@_*0&D@WY_TJhMZ2bAX>@yC~rcnooe3siiPixh{P^xPd(EmtaSclnc^ zm)@!7+{xVX?@Nt3Ub}A7jk%adedp85$wTQp@)uhA_zRTo3yykhE-*F}K&-?g(&-?grywmeO zKAoPA9Y@6TUOu)P^#C777V_C+tN0k_1V2y#hVrB4zwBq={lYk3<;BUzK6qaDkAuh# zdtU9Q5&t#M+x%;uxB1sR-{m`+w6vUAZE@M$a#t$0pBP`O$vUPTQ5|OMdozhwpT9_WTihnUgN_ z_lUXmzmL&jQsQv$_55q{K7voV>~`)_IRBcJ?>*>ch{NG-9Bdab&ZMV*mrj_#nE>% zVYS=i1e0BJXPn~SJDFhJ9;bNr&Nz`xcB_w>eM;N$1E5E$jri2Z%nq$HquZR!!<#jx zuw;q2%X3-nrGa(rC~&{gaYdF$&oA_Enrm2azO*w()-@l;2k|QJ$K?CG>R=9g)xpfy z2QwVkxNA&2cRN#g^|m-^@UFh%y7$LU8NHjSyn5T%QKQ@Aq;%dr zc4Sk$>KOaS@flC8KN07fKhEcy{HCSR z)uHsix!nHWUG6YRwA*j6?QbgA*Ymk)oga@Q;%9)W-aqs8`-$w+IzRG!eEoh1y?K1r zQOi$stIdzwQqJjGL%!aST~mu6wPJs*;=?;j`55eKKKp24ewOl4-=%!<^{V{P+#rA1 z{NJJHf0z8Aujgft*ZN;PZu5Tx|Hs7F*CVsj>-^|+oBuEH|CRV(u`c&b&wj7*$+c#F zoK6Nad0yOEab}nK6OMDO`{{O=?5?Z#)3x}2LTrD!a6erSKVOgFK0Z8O%a3^8;>T^H z=eHf)J+5odm;CJcHT+M9hu82i&gA)J{N%|seB@^-KYM;n{MqxX_~Lns|1;*V+)p=O z`=I;k=6maw{hvK=@&B;r`|0jjm+u#7&)4|kd5f>_r@O=RaxGbVzT{`mclb^xXV1$y ztk?6=Ii&3e9<}2To^70O{~2TdvvEFO-8F6Ja5JS7x?Wj$#2^2dcEXl&v*D;&sUjp zK7X29C+BpT8#_&VCcmEvZ61!Rx-SIi9Ua#@R^A`Ur`b7SB=K|J4#rZY9p@)aunFZtQ?UcUUkB%r1teaE)sQ=D-gt>N=P`F*{IAF$b2 z{PaS9{DHRmR32xm`I+J)uS5Lod2fF9AwHGYpPvokkMfbTq56I(pT|7M{Fl$uba_yP zA~$*7%8!1Jp#7jdANPCai{~xAzSg9jrafQsv*$Z}r<1{C&u2GOoa1DQ=etby*fr1F z{A-@K`MUS|>*qd+^>gyo@5Mvc!@`v%y1(&$>J;;q@0;G|i|1GI5pSURx{%L4Sj9(v zrug^}Z1gxj$(Q@4_vqm5`md}h=l>Kxhcn_~)qgI&*Yg~Z zBYwm+dK_U-uHsW1Dep`2gZfVKM~~y;d0&3U`x9LDyv_f(zZbCv7T=Yu=Ne_(=-@cDo<5&!6Q5Ab>Zc=I#L7p^R^ zw{lK#o=^R=jq=6wUjFF&LGiqoKiWUY2YcS;e_T4BxB1sRZ}YEtzRREVy!1}BC!I_= zpYJkn@Vw2x=6Rccny2pbc^^NZG-Kaq0GB=N;>T@c&**al^w-goHNJS>!$0*T_g>s@$#ca%@8Khtk2Ykc^L4j9LNT73P#|D&CzJzw&(=R5H`ot!-{u~%a5GQWeLzk4UG z(s445|F?YqN1WHoaj)U|e`4EzzQ;W4`~2vf)cE3gi~j@oKP0}sPm!)^jW3?J_;K49 zzkZLVJzwLC=RN!<#v=Dk56bf;KYM-+{}UQK)!C@8&d+%KG=UcLrB9c{kNhm)%eAMo1a_x{@RB|m$< z!*@DaJfGQ>n77&crdL=PKkbVik($RZ&!3MO(dpgz3TF0rof+fuF|)ht%;;_(GyA&6 z#B=PsJDK9>JDF(c+vB8JLaw}rS13u&?D7GeClIn zht`?VZ9Zo9W{oK{SmF8IPY8NgZ`Q@tpX|$&8<$)tJhww=sDT(SZ(Tz-H|@ z>5r~njdiE3__M>t*r%AtS(AzVOfk3g8FMX8>IwhYaq`n;9$t0S$n5zyf1K9bJiO|N zv+oefu^H#!xg%I9F1bcfaVUCG>Z)By>u}^dJ@h=szuB94Sz)SeHK(JVmg^0a_vqOgAGHe9AJ_QN5j8$0=2AWn?o#}L z2G5SG#ZP~{mY+a`CLj5^%m<^%M}05zx8&A(e!@lmhVb`h{K$@6Z!qR>KEK?y*7dxa ze=xs?`e%PfobS;&t?Q9BKAs!m>uacbJuoTIwot!;?xQ*v9&1FgzJFUx%PSc*rp6@VegUk2R zwfNe-W$ltP`8yrw_=PLWQ09c=*FNvBpZSr81n~7Oq`1(DFes7{ZU-Gl(JA9{;v*)90s?O;% zsjE5V4_f2-d7RIO`0vO*9Xr^Q&-Z*SLXTaq6ZDmTKF(ERjvn5z?H>C<*G{h!{*`~u zZ<`;qd--^wdoQh5_~%@=`5apej#oot{TzSx{CPiR{uwIso#WIo>vescB95-B5x<*{ zKt}lpMSK`k{Cb_9KIey@;XXCxaX$tGcsRMJFQtDhKRdNT;#01KPvQ6Y(erkHPR}p)yv?8WL-f4OpYt2I?D;O= z>143j^HeaZEf&0_f73r7c+mIuXy5dx9Xsg0KH39Y@_d)c9vI6*$&a45`D1k~`O)(> zf2MJO1tDNzJ6P%f4RY7p^R^UD-1!ejPLQlQ4UH z{O#cN^Mib-oMe6gq8&f|k+^pJb9``z`TwEfSNGqd*qZrAeTVs*@@>vlK!Dl9ul1$$ zkL3r9gA=d`@)hfj@O%8|`GNcoyxUeXxopY*y}&l9Z4)*=GLdJ)de@$+?rc9pAS>Cb(ZJ%zHd< z@Mr6Ic;4Vo_hCqNwD{agdG2TDoc(j2N6PaC|FY*zzMA_yWN|VE);wR$^T+C+z%Lah z`Bid7tNHnJe(<*xw=7%z8SsLf^HDy%ZnVA^J#XY6p0Du_&l~*d`6Zq=__KaEJa6zXd%n$gIvGy*MzzenS?PI$NxgdR zllVDom+A0)$v>{!wDZ9Hu{xIg6!&cArx&OdRo z4~Zjge0^Tm7u;a>Ow2#WCd>yx)AKz({x--*yeejW-NWE>-tGL%@r5f(3`fQjNSiqi z^mNX-jvw0|$EiwvhvV0t&$$YSLi|jqbN^8K@nqi#v5pAy%t`evp4a_@o%8wpKz@d< z+f?Fb&)fW2KSa;l{4vkJ#xLjdUB1)F;(08&w$+|An5Y|@@(B=M>FF?Myw7z#ZgM4990@r*(?C z#Yg`Q^Itidsn>P<*k+IqKOOm@vFKd2;|G89=YO0p^K+!Wh~&t#jvtKUd3ue`k8ovK zowKn&Pc_y2b1$9wl>V{&(4k;I#hGeaJg?)&c-Zp;@eg_aH9v@-J#X`8{SZBG^XL2q z?q@UqC>gzu9+Y#vj(pI6uRX)(^HSSt&vcoAihW{==etbq!;w7H_;P(da6eXKX8uSW zYkawGWAR5kU*iY%n4KR=t;~1Kr_-DQm&aK0QS(7Q#+RAJ+-&jj!eKu3M&w|b*RfxD zzKkD#8|3T!XnwHx8_gqM{>S+k=O90hUFW&APNjY%F6ukX&-Fd;>-BlfS9y{B1j-lH zozg~eNKI)q$Bcb&Ptr?w_573gzepUnM^0OR-)^U#Tz`)&4j5aM}@|ADc8 zRPN;*bCP<#lApjiro5$kmN}2}g||)f2;hca-9Ji?8p6f^ClbEb8?*Mjbyn+swby$=UOgn@Y~R%=nul9cT7@ zhe;c3bH58l9h2uR{=TE1_t+bHJ;ofLuf;E(xA@Pu{2MxbOws*W?l&s*{L_~Mx|ewvT557+Q{aO~k(exOXq`Q#hrS?7oT zcrE@wgeD*Pxy%Qn$wz%J^Qo0u{X^xwmLKi;vVV{rIloCh4uSSZeMM!bKGw0tb?szx zehF8W1N<0gx!+p+;(4n-=kDv0J>TIYL-aa&P|SLr`kfxS=kfP%v8G4tWlp-xcx=+l z?D-CpHrVvNee`-{#+=vq;(3d|zi-DqCG;^R=Aq3O&s%)`TW0;T_v z<+}DKIor&?)5+rb%&x?Y3cMaO==J7jGnEJ9piB4GrP6UMF0Ak$92Ox6Z6c?wB}}XC+&~em>)a`UXKA1&xk{W zB}(|&z12v2h*zE;Z+B7*sC5U zjxq5&8MU$FIj)ay?As>4=dUr9S6y-TnAH5PzT&#~^;NZL74{^NRoEQ0dB3Jo( zgUn&cq0W!w`wCzDSmRS~Q2(vs1H78Qt&AV}xy(1}djns-2U?rI;UYh~yVgI*j$Cgr z=GXM~ytlFX?wC_@k6X|6NaSp&|MfLgy&iMk@+Z00Kzt#Vc<01qk7@UoV~=^L@x}8NKOch;%Nsp3Q?H-n7tee6uFp3($98^n z%-fDq>@jA_>G2(B9+!?^@_mJ$JzwUZ>PU56#V7D${A#jA z?fDvCJa5gfCwlw(ebZ$=l>XWGZR-04;(056eeBrZv9I?yf3@q%{2<=s`3}G9`6@Gc z{nJJ#>aDfo?!7m(DPH@w|yJq>+g2yV~Tb~Eq?L56~F#YfqrkIJzw&(=R16- zlfg`$kM0piI6TkimS>O2b(;>8J^6gk*CO=T^?E#aJ@eyn4*keJsK(6vZO4pD=fJvl zdcDSv`L+2$yO)m_70*}l6XUk|B#eNH(vtqm>&gQKU-B`+*BtC1eRm*VgQmUGYjpmz z=gs`{wmJSWJ`a>VVDZT($NL%zbtry%Vf4Tne)hc0$7@r}sO_;Hb1r#%%|Ghvi2w7! zr>T&chv$p>QlE|GXQx&WCf0>db?Ncpwz2xo&adQoEB~{8fS-oqpYt2)``P68Jzvxm zO!mCEL6%fN8p;EY{&kz^1nmJipBI)aPfT{#SRUxy@612HpK0^Q>R9s6$I&)_%=0Dx z+<$F8lHZy8GG|};!h2no`9J%dIGU-~b^eJ%eYlE`F|X#c$5zFU{0#Fa>pRTWi`;)6TkYq#t5njfO)?fg&AFZR66pY=oZyv?8U8@TNGF5mF{YfZso z&%e&ylM@Uk^@a9;c)rVYc)sLE&)fX5I+pzCd7D4hhb2D*nnyODgdyj9^!jjkIG@MT zOV0V1{utqFw-ZOZUDjXu!j+}oABMF(C}^&4j7`?*Z?gWn-*f*Ukm3B~m>qof*sA!! z9p=-$mn0|o{#zTLkID0|`A5Eo`P%L0{>h$y<G{Q; zxB1(SO6@Vv`aQm0$19MJbALw9+x#)lzw%LE_I#I*uA$e_gW}ig6mf;gp65ScqTuyG zYE1LyfroWI|H>54cbSwpe1Bx*x=qQK>ozDrD`w`;)={q8Sp4Ze@oa* ztAD2W6bJPs{xkWyraC{yaeSDsJ+Eu=`aGrcK@oG@VU&-dX3yubjCme=Gx9S%zu5CO zf7|hzeb)0ff6i~{Y4&`Vk4~r8(ZlI^t}V9X+@I!@lc_x4X5Qm@gFjox!}A7zx(_+W zsH4TFS6uPD!N2Tzlds*PJ!W`#Fh6`=a=3lM^Je^*4{pBlyvfgQ zXJ4Ohc;4b)^}NBKo?qg5gFowscs@^)la7m3XI}6dxjPCI})29tXA z+$ZsK*e=tNhmwC>w=wcOR>zWmT(>d!V|`fiLojpB`3Y2)!}I!o8%=xQm9J`O#7{k% z-xuWf-Dm&5@)6Tu{M1(%1CQl=Jx6=~m5=To=Ii5#zV2c0IWKm9(nQYjkMe~pOI446 zskS}vkeulJXuht?Ykt5Rj$iv+@9Xt>DiOsM{SpTGc-?V6Pn$@t-~;tpz-#>2h(Cw5 z^D{la*z-1j)(_G1Hh=7V{xv_SFMGbrcRCqN_Pq2CmVs)GeT1VY4JP&Exlf|!yG)+@ zV|gg~$LFxzkJXr&KUT+*A3bl!Kh}pOKX8r*_-Y=V=M*u;6|a2Bhs`I?=j*h3U3>DC zPrX4sGRDtwVleXEjN`Yjc#e-X=l&Vzzs4y!d42wcFMT6R9?z-gWB(L!j_}p|H2JS} z6#nb;I)0V+0luzpu7$4kYkjG_WA(-Bl;`n}U-HR^vCd|GHvA`UKixMy zd${Cdn_<54p@+YX#y`Us&kxjBR=_jf?O>dg# z(t9~S#K(jCR`*rFt6%xi^8@^W?^V|L_#Blzguh|gj(^q<(erlvbACg-?D;MqDW%uZ zgL1CddApaKaqPAH z_u|iU{pK@3Fbx1!vE9V&*#T`!@Bv zX7Rkmf4)urE<1V5;^Xhfy&Ckn2OYn~^YJx0|58KRwx9ntKYOg?XV0(UWBy;xPcMG( zlPA~2pFKa%H|l#i{_Od(zLfsxnc4WY=WG1vM_+$xCr3A?<1fz<-T%UsrOb!Y^D#Ef zX|136;(04SbN6*Yyvg$&zSGHIev37Yu~&1_Wya&wOCI?CM0EV>dq&^eN3Ta_%z2G3 z=kpeS$1zmyDWQ)ky1q5Oc;4cF5B~S>F;4y7ME7BhACku`e%vrF<+@GDr}ST|ul9V6 zFP_KWhV!q_jm`PR=Qp;0Vr+4KX(wBLh;jS)dSB(bo?qGXaX)uB84UKkup3O6p3Wi5 z>p?m`jQek?ZhSndvNVUOdCbB;Gmp<)9n4&(Ix~8l{?_X=**4yrIro-4{}N~Lk3FB4 z*O+*2iYX4QF~!mJH^w4~k|1IT#momp_iNo0Tz@z2Q*7KULygJ7B zdDX$RYIk_m!8ChJ9Oz+g@>x-BF5tN-Ce2G-FI^+4x%7hkyV(OwVs$i`Xq%}xspnd8 z;!nKOJLAL{rf)shrQZnVkYXC^tzru(vRZ0>ihvo@})Vnj_uy*p_#&xWtFM6)tuJ)nSWew;Pc)w zzUTeKalOI8cfB8?=BC^^_)p|HUvH54M!Bbl&JSvJnNM?8*Fy6p-&f)nSJvW3VlKyT z@VBe^@9~kJ%Y1QkEkCI5Wqz-JDE-&+6R>%^e~=w^x7|O}*YnupHh;(5nYkW`IX5(a z^)*zz9_MUpevxZUzSGHI^05N7{X%S+!?dKKJn-oMUO%3LY7a<$yG+_()9x+D9`jJ+ zi|0ErGe4gnBbGOMXr^92$1k4u@Liv8&_uw09{#ptgFVJfHIaE#<|li8o{!j)=S#ly z$d&kM_?`S;&X2)Q9-GfkkB|IZ=4a2B`Olu8kH6PHRQqfFN#$$z53-XyZ^i$_oV|YE zbm`ZV)7TIDjwzMqlwOZHZ}+Eo-ilv;mbJfQU+FU_?Ye4xljl2p%pN)((1YUC>!=^{ z*81OFj&7^wq|1!g1t@I~JYs*u^Hlun7y5UV$$8f2z3N=(`9aMu^Rchw;gT=;xDr1NU+3zaAME^M zehhx<)A{`O_{h&?e)fEsf7JIfzt=xh`)m0R*u338$WHRSmH!X){M7et-^Svf{k|~# zG}NE^I|cf^N#AeeY?JSFGML{YGf;8rPVO`L-10n6#q%8|Z7_KME$YcLUp)W+X?uHQ z*^wh#7sa;+z!A`BWo49FpwPmTxUng<$RThh6+gJIe4HU7oteZJLc`Nk(J{k(JTBaaV_ zht7n}ihhTmee4;2@p+$L?!iEFDf*4iSMe!6@AIkrbNwScI>wHUxXJj^Uz70xuP`BB z`P4R;5BErmuRibUU+u5#^B#ZIAJpeP{^v)z)@r@oj_ddopC9mpo~%Bv-hgBs-bTIh zM$O|eX_IrEh|dq1Tmy4)sQKdaK7THcHD7$*=g;|k&6oW7d;}li*M8COEAW$uxjuj8 zD_57zoaP?X@01YJj)~dhD{qExIhJpI_^KaLxCS5OvyVN+M|`IF)(>rdtaD?RyH_=lX#VY}ncl@u<#voZj;nKG*3}d~m1vb}rW2?f4ph zXP?K@l$=v<(YjoRL8kirkV%a%rHMI3(E_|$_eTp8!>aCu=#s@i_%-hEonQ_q1&$TX&XC_5&!Dvy5H;bRzLDP z&4(ErbD?rmzOAKeerdf){U@I<%!JL$zG}YsJfcJ^wmpX?jL)O!ku`U(i`IO2Ha+R` zw;k*3!jJpB&%fvMLq0NTz1@zn9Z&yKGwSpFVzVZLOyl!?Cg*W24oIK+yu)A3`n<=#>+=qOxxdus9saf>Q+Isc;jj4{dA3_W zK~DygeO_x5%S8L2CDrm99^UnNs!3aiTe)uYk~q}-<66r5rP}K8@zP{` zc=socG9A9^)}`*R)O<(h4By1vhnWBqD$-1gW_z*C@DUF zxYP{$Jl5;y)L~N1Sf={?kVzX%Ubm_F;`2U#E{`=|eBS5J)nUy~+&2?^#ArW!zKqda zrjM?Ca3}dxALX+-JGMT5<)i+l`Bo<;V>|(Wa1F>@&h<0Tw>qt-S)ae^r^+KA^W#q| zrbFi}U;A^0Z{uV6*7L9Wm8(n52Q6vdZ+K{IEz^$eey@C*^IUuo8|+H=MZ1+Tl?Pty z=a+rn*T39f?DIZ<)gQ#?eg2%!U*iw%k8b=CU0RPG6lXg|9@rmjPvLd;dChIJW`<13 zsb#9q51Cv8GjV9~^}3DJV^cHpXY$zM>vbECKU0S-exfJw&*M`Ysn271j3tk@r)>O@ z(@8##&&B7>zC>G(ukrTv%iMFnoA>w|Prt|Kz)ZylUQ+xd!WRK<{MY!1&m^B#!#=oH zXgin%ZSj)RJm{^|Qy{=4oYypDBpAK99>{#M1m`20GbYFPFw8f<>G zM(*gR>G$|}>2`b^{&qM1BR=ADn{UqNTlu}sFFs%ASN#jKSgcPl6C3&wKh;e@Cf4@A21u2U>i7zz=$I@p*|&Gv-64d`^9iv-@mgGBp8?9AmeXp1pM>(vTd$s%tb#lf=3>GRP&3^ zuk)cT`*6+I8o8st_+-tez}$_G!_Pjs9-k2(@wv?}K3~TN`Mu2_)enXLUi=d_@7E8a zqv!MN$68Ocq`1D}AvG^^m$CI^x4*K_NAhd;RgcN8NSDM#ect1*-Pfh~{D2?yC z|Nec``|%NN5{FOhD|{a_C;ojt^?EP}Z);aePc1|m}^|Q=B^{dW@mS>+? zv*fAG z6d#WaNG~C;u~L`bUxeGAS2ZLS!Yk`TZ4wza~ zF`XNg&5W-G<__MN$vche95Ly&Q2q0a$8(3iCFUqc^jci!xRx+;K4%Ta^Y}al+wnP- z^%LlPU(oqZ+gZOlGY?-4)Y7!C_L-W?DZFUt;-L3GMM>Tq2Af>oFP-rL9Gvz_zsxtA=Z2A zxl0^ceC6u0p_%#R{1~G`zI%jz#azskp+ z5Yk?JiqEg}i;uPPEBSUV=ev>3x_Y;T260#j!()y zf9!|UVC|DKPJ_4y`0 z``EgEXgTG`=9gZ}bswmoWb!MU+ZwR^;`8hJNBO1K?&%-bC!+JGIsR9~Wa<01+2_6Z z*zb1PV~X{PR{g-Ars{L;`_9GZ2l|7aTzvlUoUD zKC1Y|=RH1s-f8d8q`w8huFQU~@uAv~I`{eIypEWKPi>;}y7KYTBtP-0IlmYezVYEI zKD6ST{)80~>mwI){NnRod}x}5kL`}%M2_N9eBS4m-*3@e_Jd#Mg`GkJP4Nwn92Z@Z zK>Ei^$~*l@>q$&@JasV57<0lVgZyTnPY!>%zw~_G;cq*pvgiE1V|tDE`>pt>&wKhm zKgzXMd+ut-HNW`$fRE_Xdh{Uuc8obyImPSWD3@6FW8yHW49;~TK0jpA29rKt^W}Wr z=g;M_=F4%^=g-w)&6oU5@Hu7LFU6D5Lx{OPf8{Gzmw`taETI9~zJ6ukpc4+pPW-KJ9y!Z}V94%bR!glcrgI@pYD1ZJeATbI zbqS5f{%GAd5^c22jIDmlqd3{WuY71|?(6#eh0j5o(SPOWT&~YsKD{=VU;DfK^O)wT z`=YVsBfrypd+e|^Gs-W$HmTp-BOzfEtsg9pF{4iUF&*}KKmN=8#Xj%zw;ft`iL>=~ zJ8tR6`8bl|^Vj^1Jlo}?I;^+bG3G>@pJI;J+2`>zC5ry>lIB2vzTvUz^UBiYiAjY! zc|L#D3~67i);@pR@!CQj&)3EJ{N*}4#k$X@Qc|C{y<^ACoX+xx|Lvom&s^(!pr6xZ zIlZy$D%wZL=`8=Q&wKiLdg?7S)!x|Fq{f2+QVxsf9>PLQ+tIIC`rq6qP4zuV?h#wvtH#-)@ zCBN$P4u847)aM=kwj)yu{&4ub!(a0^@@%($5NTSE9u#vs*7CD4$Lrs6jrTP>O!}Rh zWvb7cdQW*DiE8!@52=T_IMn>(x=mj*3EJlJSo4qTHV%KT4r_kWcsP8V%Oh0UJLSIV z=RUgfk<(c|>Z5!PTi$n5=&%ooVRa8?Xqx7eHszGO%e3|RtA5@&3dOGPLR3^;@4WJ`DIEzw}z}R}on9ebJBgAX9ag`boy~ z>w9=(8@+Dh@$Gkz>~|aNxT;UcWuKpj{|+s?=(pEu?6{?0eBS4;`5Sq*8-G*>tw#^i zZ^xKZ6%)M9K96NT<_?qUhb)2mnDnX751F*Vhldg*Xcz3IY-KwreBS5J`TR9L;IhvT`KWGMj~-N?cFajZ4sB22b@qA9 zE!L@PX2_(~&rJ3CA(MN2CJrsWUbjhHk4??YpUGp3uh(rn{!AUV_=%om*|KcJob~T$ zUG;e^kFo8enva}L@{zaV^JZV7P5iCqlb_7#mu<68n)fCfZ{Fi`V5Z`ec-0mk8ne&W z`tgzoz%<73$Lm-p%BOwL#RnP>KIOD^9IW*tztjBU?Pq?OSIsYdi}`aNB;S;G`tuDB z&7I|(=Ysul4Y&B>^JPC>{>1rwi!bN%K7ZRWl|Acx$NG)yx-Gu=yw6|rH}Y(^eh^(+ zj~=Aoj!DG$UcOs;{o-w|LQUt~WXfAx0|>hm7| zE9SoRI}S<&{nP7|{CC|)cpdBHIy5y;J*#~r>)7}sr#JZ|tr zpN%{-`%IHB0+!=H=F`5Pj1TgAn?K4gy>?GOYG+VCh>q61E)(rp|sTQhcS>mT~x z=k%}sj#7R8m`6wd+V4Qgvt9i`PcA-x#HQ9fWXiRybDY)Z2Ta;vTl-xw@|bn z^t)#Dd5{13j%!c(9Kaq^Y)yiJx;w`wag0qp)-mV!$hNtjF_+`q!}L+jFFudg#4m$< z?CI#!nqPc=olml4UNxV0&brt6#pj#+P2%zlzxez*e-xkM^XvRke(AM)@v%PNjDPm` zh<@wIZhz&vkMKpOtw}pR_pkcA$6vdzOY!*uKj_KD=T$qBj3PT7TZc?+*T0XM{yw;7 zvX9w&``EECCC)9r`uspM^LJ=lxlfV$yvP3m{QLJ!S6@5Dob}7xB@Un1SNJ|=PW*d( zC^~#z*0FU?I>iU@8vAjhW`_F3M*8`^&xgi*9I5rw?C$Cx@#(d@{NnSq{^IlN@gL>4 z`1~s0`h2Y)(aAm^;oEa#>+>zX`eTG|J=uDGi?3W=&eXqfY|Y!T?XTkV1Afqx)#nSl zp&71EnrIz**s;|IzyEKl?;*=_m|Etq{4-NLJ;p3~YBR;hW6V-pZDwNci!n<-w3v8q zfk`FK&f$`QR5*Ey~w%$(0z zgYlg8)kw|1V}5*X5n8I_6g-6Alf`t7J%sk-#uG=S8ILQv^jfgg6!q0{90f_|c4hMX z`qvxyyc9&v|A|RPPO-s*nBJIHd85@x)Nx&Tpt)j3-cKCY8v^=6?}w7iBclHku?k;r z2yhXQ_93r-?KM<8mY(XxU;Q1i>&FM#i+D2D z&BrvoRx34%T1|64FXy1=JgU9{lQ!6__ttZlIJEf6)n!97^UL`$rt?k@%e3ROe)ahX zKlJ%Vk~)d-w;i+Gv*u0TTk5>5e&qBfAA34{ppHM)#y$OFBZK(g=0julv06XP?ymk3 zpI*DmFFs%EM}BYfNBO1K?&-HaU+YJ7^z*|nvLA^T)z#rSRM7Zre)049?DJlK?fbU$ z{Q~uQkH7Z)2=Z??{zIRyV_tk-y{!@RAycjkSf4S+pj!0WBtbY{MOK~@%8x0_72AS9c`(N>|+hSa&?I<(V%soCcJR;qZyz2sNy51 zIW8WbKI<*N*T)Wy-&xxI(t8J+U(zYH;`7V<4$uwX_*kVM>rL_#ubT6VanVm++mAn9 zBmr*yBw8nPXgtTKeb4gGzi}`8QGANed+|r!j^A%3h}x&}OLLynzhkNg(~J?bBW?&9 z#TLpf3?5#d_LC^_So#NZO1DM{-8eZ>HqvF*IK*hu~mGE&ky*hN?MN|ROfb# zIklMICil&7E&JPUV(Nacd^9xI$_(FfEFUG;<>RGkJ~SL0%ZJ9}`Kx}s#POKX zzrv?|yFJDA4~-_yCBM9RS3hZ*-AU^N&=Y0MeA8>zk^NZ@B_2|*^`394HUVE2Hl=eY?Q!l>Zv3ftu z`C5Oz{+Hc1y{;LFKc`2J7o@W{zQlhrK2)1+=Jojt|Iq8y&k~>ZJ(u6}z0&Qy%C51p z`jOvhzCCu7`XPa+A%f!HwSMTeN&V&?3<;Yk6U$@V;)~Dw^|{<%?DIZ<+cEtGe-NMd z`Ex#hjX!y}8-HYv)}sgI(T*`E+Wh31c%6M7PgA1gAC@!+`tuEsRiDSEeJ0n~S{#67 zpZEFOj&&CDsMl>g{mXTzana>Qu|LIJdJs>k&nMG6cFdbzbE;fj_V}msc}kb|z8zB? zkQ}N7)k#bIbNRHIGDl;}H(ZxbB9za;lDJVUkLR!YX`5O7v}%-3`<~^GVxs%K>POE` z^X+>an^QZ!^69ln{Y&+U=;-zNl=s8?11ymisxz7Ua(}VU1LN?w9qa6QU+-AGd0n@T zkNCXLU-LKeY&ZUhko9&uhA!UR_7q-MpO+W&N~f3yncL<2K!l_npP1Z_YjHq6)aUz} znZKIH!{;6Tavi3eM~5$VmFp0HB&~ll7Q`i|v;4b0@9F1hTEFUzt$tL?w0(x{VX(xjfeV+JKITUw{8nISV__0;tFA#>X2 zTYSB4lUQq0vv|mk*PJ}I_&@>aav z>`S!u_*ik8U(WI12Pi*bZan=Sp93=$AH?s7!oAVM1ULrgcUW;^L*O(Tz;YP z;A21db0$8>?=-)7`P#RonC$bc^bmg7I>)4rdK5Au7PKgut?c27TQXHY+g zj@G>{d4J>jmpZXIwPRcV(4T$&*iVPQ`a4SXd5^#LJ5cg$H~v9SEW6r{3;)NI{LKc7oT6}la0%~YCi9reSV!^e7?!&dNF>`sUO+4j=%N!nqPc=UH>RP z#pl=gqx{lqPu3^$oBcha-+Hp!U)kp)e5~92zKuLjcJhXY#6^AHAG3VFp9YhC*xuX6j)f`x)#B^<{6I7FcW7I=Pm%h($NvHRrTZ+U zbG`K9BXgHHd}3eW`xt}Z3t z)EAVuH$3dNGh^Fd#peh7peL)(7j{E4&K^lCtwRqxw))`r|4sEVWLXYVF_(PLO68xK z$7inkUWRM%8dKd?l$Jc{^Jk{`cuZ%htu`~I_}oiBw3v8qfrB@!pzxQX%58Ze^^pI(4TL3*jz{- zxi!z{%`v9eo8oOT=Ga4&rAv42)}uOO>nGrT%lYD^)>${U9j1-H$uLk@2pPL=@L`Fw@3BPkKEs+ zkN;t*HS5+YN3r~#v&B@#E16(Xz{5KAdT~o9g>!{D$~)qzzWU0Ve~;_*dh_trfX=ap zP>fxjIKtRIv}0TAT081>T2s_l$MFdy&8y|m7~6f&!!nhn%O=xoYdO8~nSWew;Pc)& ze&qecalIkH54|5^e~HEC6LBur8`Nhh_VlpvL9TA{sa?f$TYSX(HvbKkV{>iwjeqgw7GLY}DL(RhTfh2sOTYT{9sQ&FLE!azgA@Pd>v`xLUx=+WO1(Vi^KzU!_o?*HkVzZ7=)UPq z&CD;yU}$-#hs3rXpY^NH4`NdBL!WPCAB*s}9Rb_3{^NXF=VkR5pI_yZji}Gp`K8*R zTEU`UGgW-7{&Jq((of*K{NnSqep3D2`cZ^@HeVpZD~C zzAt`0|2~)BeczV8U!Xqk>3_|A)3u(c@2KtG@SwAJIv&u2Ji(5!8sc{TZ@uI7?DOJn zai&}spth#{OMKPm2Ta;vv**C|F-|vlHoy2}lTQ<*e@^|#wz+0Z z{O$RC&DVN-ijVx>)?a+S)=%NT8=q1AATHVGz4(7!{l0DXd5>?u+hva_)+<`^QJ?qt zYu|S!&vxTK^!ZwI@%hBPr8P>uJa_D%l1RPZ_w*$2Ug8KjLphijL*0D+mn3lAwNDe&7vRM9l03k zFFv0*PP#wJ%h9tOTlD4e`>llV><7QZjY4tlU#vTqU+nT=+A%W+`PK7zPycFv>G{0F zU-bv|c`yEJ{#JZ`z#sd3l~eV3^@e86I83S;Dyug34L;ZDjQ$nA#(Rcu<70C%(hu&m{^IkS@qEdt#;uM| zn&e}>!{_ZWg*GpFsrfh$!g0ip&vJjU&-?sUe-NMd`D^|LE}zd2`KWqYj~uha_hSx! zt`2K{Qm!sH&A}0Kjt_bTsj>YiRXCYYG?57hSe)?cqJ~4GJ4gSIN^joGKkND6%&A)Q2W;?e1h5SzQZGP=B z#g6Ovq)9$%1Ys7P38BQ_6ZM1Wu+RJXUG6XTd7r=S(6VR!?rDdES;@Q>Go;{WkdA zH&5|Z?+o9@#EwV$(X-R~?Ry+*@e->tuH%y?`B)F(&pv7DlQtjm#pkhY>iXEd{$ii^ z`K$gQKJW9_{Ea-@^|y7O=iF+IVwtG!xF3T| zyc?gJKJV}oP4SM;d;F>E^L2jlIVuH{{$Z*4z_NIn)ZUIY_I#Xr$IGGfdBTtRYyM_@ zzRwSOGML{kT9sX5;xMUaDQvVPmioMjZ_VU5&&8qUAJ=V^tIMJ}kjI*TT(?oKE-(B! zpRf5TQJnnvoPEArlRx|Xm5-dx@+n!zbs>8WX2(}P^~cqa?{!)65y^1m(| z-ksx;L}cL z;?Gi|eC^MP{4Vj8t4rM<<%Nz*Hn!I1ZG5cH*YQb#_>`Pt*GGPB-fO=2ysv+`zu4z} z{;EHS&-?s2pTEWj+#lWgMAg%J^q~5*W8|Ub3GDOKFT`%v%#bPPmMxzjGN*mM#n zPIBC;_>iB>>9;!J0mcW47uEVXFjMh?$3sf?;S<03e3MTT!YkcMT`K5iU ze%e>@$&r5KcTzv~zkbes=G*#ZZUDuf7_3ZN!d#zC{6Scw{9^>C$VLQAJJJ-qaJE`mY zv%=&)TKgRVq+~J^B(^z=6?Ua>CKq4eu-`FBXg}%@|gXtia&Ci=Hk=i z+dh?bY<{UW?((^=%p5Hr^>mwGe6rRLK24DRIrZ6(&xo)2e2S0!-qvqCxvC!u|K0c$ zpKr#W;~tBT%|$&v*ALF)rt-V`J4*F==)it7-_#d}XL4K0jb`9M*mpjBsY3_xSt1E&Z-pect1LzAyeRJNuZ&$Lq&uLmTFDoO|%` zI{QDbL*XRvr1~g6zse`faXwb@sh(*+q>Yx%njt~-dQ-o>wjk?R{j}j-e(~WZpW}2# z|A?>gc#2oN>hm6d zM{HN_Q=~rc@qYmS{(aM%F{gm$dz49Sd}3eW`dET!%I+|6^f+JZr}g=Pq*2f2 zzF~hKvMh(GW&UlZczTRk^3-OEkH?s$w%W|Z-V|e&>n|-Po?Bp2D#W8(OsW;iRZM3& z|86mn{UxS)Wrs-<3F{m&wYH;kA2GpN(y2b%o_ktij`EHiv9|{2&ewEo@1Kvya=sa3 zdc7&$7GsV*L|MAjI-p)SeAD{U#Ms6G+;6#7b;6k%vS?UFL#Hp2AI>n z8epP-^5>3}bAI5NH#~BlQYc>>Px2!9&Pt0(xn5yH5r21~#l&k%O#Mu*!_*iA;z@It z&-q$R?I*nUGA39r*Gb`gAV=z}k-5+MYJlnW=HaUW=CrT&ncLcZ(>4Dm4@Dnp{n=xZ zJ$JUgtiGwsCX+Tey`L^~ZashIAJ-eypSiwHnk#_nOz-E5+dV|wn%h&VX=i+^N|i_fp>hy23_YCc|jf&SxraGdu`ezOm+ z>n}cB>n}e43}1WH?=M^PwtlS7*ZL{^;xp^|o&08>_xPX4-DmDu`<<`y9+i5U9_Rex zIWn)2r_l!ZZUH@{kL*~Oz5ar~WuN!-uYErP`OQ8*;0HY!%WBQp=W9M*dx3uS`6i!h9Q$$VN4Cu|H}SVVS@Vm} zKf~90e@Z`vpZe+!AKP~86R%~T_u}&vF<<(=ZT5MOZ;u_H@8y_cy`s)<@p+HG_I+pM zH~aj6KlJ%pGnm=u#e1}dPM$etQax}hywQm3Lw$b0WFP+gDAyvoKHuQ0&wKoB$Hsf^ zQ{=IAK2P|oeu*#EXTNF2g!L!e`|P)}FNt#=H~7Mx;2+m*S>={QD3-?OD?aqHZl8bh zbLOaKy;e?7;vYZ#MkD06_`J-cA0OJ_==b56!l`@=C-o;2pLF7v^KE+ite>CZI`#Cg z@r%#agY?`SbWJU+R!@spqJvdfvw03$5 zM0|e8qzxv0zUGV1`~0~))_n1KpFdZJHD7#wf^YhWd^8~w6t`48Z{x4^;q%EuiVqOC z^nQ8%s$aRf#Qy4>9_Ir^k3sp@~h_zk|SF`Twhc1Pv$*Hf)xCn^G;LIaU=fh^M3s-_ZR!T&tLTi z@p+#==kwS2AiwPMLp~x+>(PVaY{yi74JP|MUZOTSn5yVRS#=4QurOt8%_bNuBxWZe_`k?KA73wr42qr}td^%3Gd%fIFG z6Z(y2E~{A|2g%%wb!74ZBe{`tBMUKr|M?l1OvXmI%3j&=5| z{~fD0zNgXBFFx<{*Zd9nWuG7NQ8lz4JxISDW4kKmcwK#-bBn)uNyieh(l_2F#@vd} z_nDOVo9FXH7}v>a9uJ>)_{(*eNH_n(vKe!Z57Kqd=NN|I8=fxj0!WCnb`<{#H>`f(7S+#%o1W6eLV+c^9=pRf5TQN8%_p;gNH ze7T2i;%TY>T=~f1EdS*5#8Ia8|0|zrV^Tj>E6g{jRz3}NeC6Y{X+Ev0oZfYh27jB? zzrxqN>ay8WQlC84sD8uad6>V`(X*LveV+VE_hpYGb$n7FKIc3t-^s6Dw{i3@_ZOef zPsD$R&RsNHZ?|KTSos@&uhQqw`TUiSeDeAHkdI8#dh{Uuc8obyn(;cH&tut-xx)mO zL-i&*!2chg!}gh6hjVeL`N!w54u9LRt((W1FFrqv3G1J$!EOP?Z{ zKOW~xG?iSFJS`bxc!@u@ndNW)-@zw6I_IY3ba(}VU`}|dZkn?$; zzvge?vd<6sK~DyYeg2x;Q_T#SI7hhnjQaeLIqmZ;zFwa{*W*bu^Jntd;_G!Ak3Um~ zEq-F3^y9PBlyV=z8X^GOu>fUjS+&E9^xuQ@h8j#=RG zDsO~j?mXZ4`H5eiul3VzX7v{i^d6ciKKeOk&BuC^{Fwm}kjqCF?uWNmZ&-?rtpRf6d z2mAbx4@tBhJxISD({@+Qcs=|4b~?tMayn#UJN)i}Y?bma{iENXA28X6*M3KUd3=%m zc>LAhL8#Ar{I8h%((gFZoPO*dvCVa8u2m*HeRy&ef8_KgpX%l~x3BnA8~5}>K6*#y zC38I2&wYOJ$tFM7DPDtdAzu9Vsph#pd-1paS@Xepl&^ZRmq+wddLPbj_W6i@n~QpU zt{+@?k@E#7KC8c@RG;_sul)`b`OQ8*;0HY!%X_xPXh_$)b}1K4AVtwS*C-(@GMLys@pWXlKu)bew#XtLeM8EZ9x4*K_NBA~Y^_ar>M$_WDQJ?qtYxi|QKC{mc z_(4wwGyA+~Z`RC^iS2N|hf5szb69$QT!;4FK6Wfjsm~T)&*we<4s9#*J_&l3eKpU1w3$0@7do*P@AZ|cuJAK_b1 zwm#qD3pW;j;aE?z<4gZ$pC9NCdNOK;eI83@YYkB^Q!CRk4Bxi_mCqY~r1k9B>chO* z--j&AVQQH_ZO4ziU-6RTGuOVpidpj1W{Qu;be7s`GZTALjF~V~@#_{7&n+;EN4J>j z(J`HnnftcI#A}N>#cMiD_L`_p_1_j#{r8njuwJf{!kPUqQ1g@`@z&Pd@tR)4h%k@q zhHd6?z8PS8y?JVB#P+U>aWyF|i$=54HR2@YPo`)mvW1#2glwi2~Z4JL2(j zruGfkfw_}TJWT(dd-L$s0Mo7c_mH2kI^5a5U24<)Lz5~rE? ze14Sc4aH|$@kg$1@;9U(`!G4O@u%9jryu^4J*cH0fq9z0J*gjayU8c-6OV4i2l;)J zuYQev2kPI}C+WwdQ$L7~UT<*tKYT1+&to6=_3z-XT#tl5PxY_8hHA&y9=_R&4|%Q2 zM|2~ejCJ)`@kQ8)YY26g=6qg`bJhn;eEUqU0qec>+$9bzzWV&JtTi*g9D^~PcY0W+ z9iR29&qw&7&o@$zwG$t!dE3z+yJ)sPU&jYIy~#(L9zI|5sW$HEw?1Fr~W_DvrC`Pzt8F4_igF>1?uyjKdgN}g8bXn zKlJ%J=Edg^Z{r-#`@FnII{T!a2Mn0B!Di2adp_UdYkWPv^!Jz_{!B~s$;_X zWn0VXjnDB(N%9!sC-Z$k>+`k#;`6I~>+?0g`20E_jQoC~=A$rf#>XB{nzUD*6B%h=yKVhh2 zERS)M&+*1?bU*wzwi(2Ko=>9U@e!R8t9nc+dduA6^Pc{ME%qG$^LQK|tjj*^@ooHR zT=rG2+ce{^=kredm-|c4=N@9O~sQKdaK7THcHD8XSK7XzbYrf>q=iA<~-_=DwnV!1xm8(m#P0GtDryT!e zf5(I0?(28N?0&KBCBMWW-VC3%RiC$fFpU3P>t~*?-wPp;0Y1lLM*j*QbDQMTiW&!- z-$V)M#s|8m`Q~?8Cf8%W)=Mltww8#GN3JoNBMskZwx}EYW1pYkPn}1Bcj4naZmK@F z9oz0%=R4-zx~_{=u6*%%U;moFfy>uzhI~k(_2@zR?U?g-(Tvx>QB1UVHOKTfrG#=b zzW-Lj=E!kgmsnf={AS3c4W{n1*y4-N`~0~)*80Wgeg2%!*Zf428poXDL#ynEPnO=n zbI0>_e2~*gzU@uQN0NeOX}aH3qA64}?s`2YQR<2%p8w z=wIQ3JISZjj+mSKrqjHN&tKz%{7&hV|esMp0j{ym=`#+>7`qm+u@mfpd0=J`fWb1q%|<{VFQ zuRd(|d*zq<_W87JW^&4u55{r6dgYh6_M4<)35pLQ7e4XF{;_W=F&W$ul0-1`}{S3Q=cF55oubF9;DxnDJNIWcwK!y=Qi>3 z6!Rc+D?Z<6a-7%VfO)9TJN(-|@9>xFFy%gS_&d^Y%jX^bz4Lk0q06UwlRlDF^Vsv@ zG#4M#s^KG8x-XBPb^H2P_@rY_KlB>?WJ%d`@O=L`h@PG1-}L#spTtXOO6TJUoN(g*ect2WI-kdW9R8|596s;x*Zhq<+pV9VC#%nw+Dvs$9VXq+n{4~-h^t(m zA2I_zU-OUaHcp)9@>uha>oyL5&gW}>N|Z-GKIijx;)oB_&)fJTr;~i-`Z$izRFzNC z%JJo@A1_Yxi)Q{0!gve3{FbZ}hTm^LM46Uemdh`XRnPpAfgJKZwu!`j`8Q&*y#q zsy~R&`}{edzs5&>e#j4cviiK%PBW(t6M8t+Z>V9a=PjSl519dD?(i`@IEK_y=lFv=$*1#qy)QfIIqt0pWS>u>=Jbm; z^#K${){NybmUZlL3hPbtt&f?p$KPi48z$m&Tmu>MF}F!R#r$BJv5i|DAFUf*HhY$9 zV~wx889uFB=a)3=^R<3NM?Z(JQ@cethP9 z{;D5bKA#`*F=bkh9yED7=A2w&g4e%M&1+1% zd2I3Z`n<=V@%a`%B{$~Wr-{;#y>U0*ZpSqrIi2KFVh^9kzQE=E(xIb_@yDr;NYtEu z(WXq|^v37r5a(l_vwT`J>rZ^V7R`2y*RhV(kDNWq*LYl) zl=rg_ll&|WDLZ>R{?0MH>c=Mex=lLGqvkL77oX2h=-;7b&oO_;`i<-Jb^N#E`}3au zHGe~X+2@D)5nWo39;DxnF{f6|WS>9B{uJ{u6UW@~ebZI%iODsv_B#UbzKG8ZG&6to zcM$6H9{(%mzVtheG^Zc?M{IK)nsb}oc)qMd(|yB(xXAfU{>kU7{8Aq8>6bdpK2Y&7 zi>LV08&P_gfCicNK+|2KzdVcp+Eb) z$6x&&rJT=~c}TqK`dRxOD0#LU|DY#>nSEYk)6hI*Vmrk39OvVFKF7Pk0d zMdC2f%=~@dmVVc)KJW2AG54k4Wv4m)65HG_n2Vl!Sf7`5Z2XJQd-{8P>+?0A>iM32 z>ytGf^L(10eQZ5G#fNMCc+>x> zo})J&hu_P5Y9F@z@!0m)R?g>jKOC=`zjj}j;`7HmYJSj@i_hyZsu7bR6Wd|lmpJ76 z6AhTO!DjF6W5>dj{I>Y&^B#YPww3!7sn2`-AHctV-*oM(x=v*75{FOhOYfU*eO}hF z@h?8_>F@Ea&)0m?DSfog2P2=a)_fGk(|qn5)30?OaeemVGt!UOZt|_q*YPPnzZ(BB zU+Zx_KGx@J{fJKX`G|gdZft$N#aDlf@U16X&u{UStIIS|KftJx#YEpe!QA5UEbkLqI@N#aHR+>9tylF~Jh8>Za|=4hO!e8g zPH>I>b03Mf#+Yu+^Z9Iy>Gh^~XN)=a5M}97<4e6jr~Pku*tpG%ZEV5)mTQ%l!0~bH zRea;Cb9|mnIR~YA^CQnS*Z!A~W@diA>-CE^^YGPx&ab#`E7!i;%)?g$%yeAiZZYwk z`qj&rlTt3y@7bbAK($zXRMz<=lg^qWEcB|8cz`z_;&*z8>D%=8LzMIL*Z86EV^24e9XN z79Y7vl*6a^R2xt7A^d4R`_Y5(d6bX*KFX)?Kb&8^-Vo?7`&|R{OZM?r{gWTh>HiaY z>Q5iyKlU>&Y@a>7%@*pWf|0DBz*Hgd8I%oeRuXXhYJsHe=tWfW4c+Qad6JqjH z@AJbiqPM|hpZ`CY^N1HqA^DVyme1!ii;_z$!KG9d>^DVym ze1yO4sO>$^#rS;9FFyYa|GUG7pW$PkN$Tb?e)h3v_=wM={NnS^=%?^M9RKX|5&iZ% zU+DM4=j-|>kDk;2|L)uN|K^_BG2XSmjL*0D>hqrd{|kTnzuDh*jP)}v>vc81`22t$ z^yK36>TM0r95NGo4%zk_9ui+YpC2&U=RYxbJx8^3x99UM{xSbwWPc6K%s+Xf$({B2 z7XQ%g@MT-^UT8RK?<>aoJ;4@Veg4=F*FF3p(P=ovvG#MjuX=3bUwr-WNnM@mM}6MoTYortg7JzL zA6`X`>gu=tWNE};Q+Q~SJV%f}JKD>eLI*0KEJ^HIKjcOzk5 zDSzL*<`2yRQs8d-ywAVq^FIIUEuZ)KQUkf3@f{TX zZFd^>sd9CRKu;Y<%6-SjeCikKpQrfH`!t_@>?!?-&k{e7-$lOOk71l&3V%Gm3H30` zmwF7wpO1Ie+wJ)5!{YNk|DMnL{Chq>p#P+{)0EFg`PAPteC6u0Su>p9vwk|4n&D%$L_YH%pMC5pKDbN# za{n+lzf1ht`ca>c#fMThS3ii(;W3nF`#1ghhKKd=nQ_bKef{@*-sj)*`5_+>f_MK& z4~mZ+b374a8x!?;yhe$le@70Em4z}@RM1I^68=kvb)ueW^O=OY(~&!dMX z`v^JJTM7#$ET~tL4gJtH%inUXhxE_#X}uNxYs_CB__m(s`^flwfKN?=eQ;h9<~4JD9-9Pwc-F^EeTVq7K1?&s zx^-FCJjcPtAIA`EHW?q~>T-%d8z1BIA^vQBX}x%S=Iaw-RG-)V%*1EK=NavA zlUOa0&qVpN*FC`J{&|Y8TwP*sbx$>pBeVL|=cD}D_k-&5QT}ZGn0WMktd39E=Y9S6 zeBS5Z^Z6k^=*jByT015OiOw&$H-k*|`62TKKJWAI`Ml4+=kq@Q?DN~?_Zh%tpN#S8 z8sFUKXsEv>KFVqK`xs07+0QYdgZ(8QpSjP$wLhQYD_578&D3#ZK0awFKF~3nU)CGc zANF~lf6wQA{ym=`@`IiX7Jm+_$M9y&1exmdL*@&7-sj)*d7ppJ=Y78Qd3U%x-^@qfE-+i!Q_f4=LzV`y2%Exvw#-s5lJY>nT*enm}A{Z5L{ zYryE7kBPRrck1UUoEm@RH2b7*U(Ki5kUT%bhu)|8xlW(akN7;wFFyZ_ehUA?`90M= zqSdK?3M3AGRNS-<9`!i!F~!zD^ylx-d-3@n^zZ-V{>3)O?`uxu24BBF@A3ZzfBReZ zH~XD=JFfL3zdyS1ANqWgsps>j*ibLe`TS3aPxrnDeI_Ml`!B@dzj7RQjP-ZH*5_M% z_4#u?PnwzkAN#ibNA~$0vX6Ou**4cU^y7q^ z=OuZRam_D2{|ukvyz%k;89wIuG(Y>;Gx`yqNBPC)pV3d@e>lI{=RN&@MSuM@_t&o& z>wQHwq?DNm? zQ5aA2vyVNaAMtsVUwr-<{S^L(^P7F%)Biiv{O@vq*=r#1sN>weu7BvyJ|E%R`y68X z!}D8w!fhLdhUoOduwd&*e3faZO0EhQTko{G{!6*+GdKk#hAr6TTEr?Qe#2A zK&LA-pPs+#c+nCrm zASA!UndLf2N2hvAK<5UXa_ytV#B(oaQm*53AM3;%o?vdT)`_{loQWL0oJrw)_1rOY z_0>Rq{`#)hCR+6go$qm-)4m$eIqj=`=H$5};*c47jiBM7@HLH>^&lE=+aKX~fBZQ6 zk+O8zV47`(Q|7$EKk3ouAJ-f5b&VOmeLu19;Ip5$^&i(80(|>^sCa9epAyxX9$&QX z$jj*IH$3dzW&DYl==Fx;UoAdz^(dcoKB*tmf11BNsUPuql#l#A%BS!@86QMPuQvqx z%U;hbKHjQ-=w}~~^_RUKiS3W;4NZUhn2XQxSG4%>s^6eW-Tt-yW<3qtAJ>>`e)0K1e1e`_eE#sZ z+S7*2pWgf56B#hshwc62?c8llT6~?q$G7*tx4E-9ZSj?>%ieKHwiTZ**Wk9z)?|yX zJ|E$y;~F#y3^gg&O(^!)_!pmlhF^UC89p_T^wDGd>|@XH5uZo-#pj>VUwr;4zMjuV z_+O9Db?BOmUYBXrKlEpxkMKXi)bA8nuc-TrJbJD^?SKF02Y9>wH`=Y&)%@b~1N}iy zE)*F2XMSm|o_F?7fQtO`lne6io4~fH>U+$Ye<`ai};3+=jJh_mS2|lu!LV zb3UwGT{dfm^Ly5hGMnOKwdB_1JwE%`Q~JSO;+Okxx%pk<&(;rxKOX;tP3Gzc(c$a! z!T5)LKE}7TT942EAm{Tw|DMke`9V)spGWK|QM7p3`TUT{eR}VF-skW8cEjg={^$Fh z^Ld|ts<*Ju$M{%#vQJC>4Ql3|59eBp@u6$>IKn;_jn6Ef){|a}>7P9gqGy-*v-zd< z;`-t7*ly-L0ny2y!-nD$_Id0lbv>=B&r`3VuhZ#w{IvQT9>UY>HXi?;&kyyl`+T0m zOMSl2cpZEEns0aOw9<_`56`!%+w~_jx>AvBSeJjz@ z=bvhC`+p|;NPRxWCu!(a&dat#=`Q11Ke!9}?dJkxKK8xDpS|t@K20_l{|)iSHgoZL zl&?M?&F{PqrzQQf^@A|#bsOFf(p_Ie;5gg*xBWHuIczLGc3<`Q+`q?l8%O^=pC9TE zdNOK;ug`1kG-DoQs?QIZoX30T^FDvyVOJ-=l0L1UKj%@d&-?t(_d7oC^H24L_L%!V z1GtHNEXJqx=RT)XpO5k}fywWCh|fp)v!7!^2lwYweC^Mt_{!B~vuC-#Z2eGv=RU`$ z!|Y1^AgZ(ZWuFh~H|J4vJ|E-TSk>dRKZwu!{Chq>%T9`=nmCk>d&WH=#d%K5ynR!MD9ukI(w``n;$A zp3e{U2R*s?{1N*)CPQZZJ^$kK118sly`QfA9l`#AGWn32Y4P>@^B(^{P;Yua-Ou-O z?rr_Q#nIv zb?f?ve)cdwzm|_}E}y;j{YQP?(|`AVx&waDlZ(%5Y-CBjOs(*S2i;{6>-|U%n!6q2 z<((dQn%9;7IesUV1{jzx44l z`Vsxp@fG{4&n>xs|L48@_baTo+i|nMPQKIUQz5|Lcwf-a^!XNFecp@DPw=;&vcF-Q z<6Z}LT=U6a-S`JR8O(3loAsUzbroBeA@7v+|Ex!7^$NzWm|2^~VeU_}xxA^Mw9$&VVI{d`G!uK)j z=al2W#{Uj^bZh1YA0_fMKl|7-@ke|fL$5{N);rK2H`=nBwX5n$%uHA2!f!Gjj)XCx6uE&&=a< z)&R43cbl2mn_@cUSl-hK*2|fc3yR|_bs}9)Ft=Ch#N1!bL>ynvq;S4^?wGlL_8F-8 z;-^$E`~c_;57Gyn?{S^jCZ9LAnc{8qn%&3PLyCvCn99h3a)Z`j_nW9uj2e#>#- zCHXo1{VG0q>Z@~n90TZ_SdlH2j@7d2{eCui0{_wh*Psb6rK7*cI zeE#rGo&)tVSmp_T119_M|6;y+|9Crh8383- z{^9dAzxe!sKlJ$~GoR0^w>2~mncqY6_a9`XZ+PT+=i~H%$=>@9Z2OOV{oc;~S3Iwu zCARoFe~9}J)dv!m8;7}Ojy5cD}IY}6zojK_S~bzPf6kw;V1Kbz)#FeKTE9n z#pj>le@8~Z??;~DBaTn=bDch;AMtsVUwr-<{S^L(^P7D>qW>%EU%zi_eZH=L=+8bM z;eX;hP=AwceZIvPKR}j$$$nR#8(02dzwd0luI3k?AMk^o3}*Iu^`3^O4Vj{uruBwL zo_F^70h8lk{oKyIe*Vl?pZEAX{7{dfJ)dvs*Z6vTo4cORxA@A{CDws&l7EtYzTqLq z3)wawNAPUQ&wpZG>hm?f_&X~nqyL|c6)xp3pN z#7A7G_{Ha=@!6;Nl-_uJsC;Mn=#_AOZGTyxuj?QBv(Ja(^G@4Ieyz{9_;@a?UpRGN z*Zku11N}iyR-Z54AakHzK0GJL+{)*g*$*1b7x?^8GxPTk)Sh!bU&k5!%*Sb;f6wQA zzGzdQ$CvLzJ|E?m`=);)ZvEp3)dto1Q+&k#X+HbdQ~D8~C4L~ki+sHw!#KYb{&;>9 z>S2~IJ|B#~dA~g8^D(|X51jM)7~l4CJ+|ku;Qr{wKj_I|^7*{>E+@rDoJD?@__Ot+J|Bw@rEIQ#5FI|BkMZN@^D%zh=VN@^3-!3=^Fw~n zlhx<7x0*d0WP*{e+ep7QnJ@79p=RdqA9sA-=il>rpKt2{Jv7-z>hm!^)}G{-`t$N@ z^|LjFd_Jllx@P$zCLd4w^?BAm%cu3|IE8;?e)tDYK5o&UZ+OV@?#!pxW{!jE^H@E^ zr`2cpv|e04*wcLR`Jn#r`FxBY_xTv#=DHrYe16DBCQ%3cU3|)^9do^*<}S>9eIC?a zO$M3RkNSL{$v#|PhnG66pSPM(hhK6XI{f`(yK&tH5pnppecs{QdYJDcJ@@c&l{({fv{UFZRnDRo5H#{WH=lIX&m)48xpRZ5I z%h%^I>Uj?P!%6>&&jIF`&*y{s!#*G5 z$9+D=x4m4CTRuPJ2R#|AeBDNJ+pL)&Q+>X?|HHhR=QHjB?c z3;KMFzrmj7z89xHALV1aSs&oz$b)?Lv8VW$=K>$^r6%K3`hU=~mCw)fOI)IS?1T6F z`7wIGiRk3(HW7aObJ#MEp8weXiu-(wZ}(M?TRuPJ2R*s?yvDu}lOgkap=KmS|KWF~uJ8G}-d)O9Vzd!Hk{{#4c$o#K3 z-_YN2O#e>G(J$JhcM|w|-}F!HSFhXD`jOM@lb-%H{&!S>d|mY!K78P5e)i#K^dmlx z@{7+uqrdpeQ+(y>ve&=AL!JLF_ZQYZeurqkS6SCT^uN#5r{(v2zQq^4q(}BMqaW)W zzk#*mnveYI_4z(O=*h+BH8u^+L*^f$|BoG?A28X6|AlS!e!4rx`dxSH^DVymyvP3w zn0i0meFuLR&z!#RL9UlZOjy6YpRWB~w)Od@{_JC(e%V$uZ_tkuZr<-F=A}Mg^NY_v z!~gE^;b-`m=cDlfKl|`A`VpT;`Nij-(O-Q2DZcun$G7*>wf7aVK3~^=@p+H`TlA6M zPZ#Spe<#)AiyxHz^!&l{u};(HYku+hf&QQ;7oS({4b4O5C-i@Ie15=Wzxw^3G50@< zcl`>E-s`}QTYU9-kN-26Kj-rS>+N>j;_Lam$NxL{f6sjD?RMPar|e@MU$(8iy?&m; z`Ih~q`1~{c?@-|OJcjC*{-)=#U>!4>?K)OJ5Kr^74?h;4NBPC)pV3d@e>lIV^VEL* z{0;r}x7=UW+wJ%h>sDV`o<79VdjkKeoI z_eT=X)0``v#k&x4Bo82CI)Hg@lW2@_Shc^bdJNz%W-QjVe?GPXJhtPJ$t3unMJeT%IWj&F{ zDi6k2LOKzbrTrOy2<;EEQx6Dkcl3F1yQ7yw+fg4*(YZdLwyN<^Zralb1 z_=-x)-=r^x9IJtvn%?t}7ny#ir&Swr_l4#bV`k6nGLQGA>Lc}hE1lWfyG-fzn9fhk z9oHE*f7pRd!2IlNpanAt;KrxSC3ITJa0Ig`Tq>bzs-**_!k z%%55IYd-sDgt_l1`EJd_H$UQY-#@?{orh%qoY%SLpU3+w-ru@^4mivH8DY-)XM~CR zLk;%44mF=7?-6E_?>2Snv-s!hn8iO|$3$FSK6fy)hrCW_@z2*Wi+{e3S^V>rO!dzQ z^DF8T-|g$vCv;~2j4(fOZiDY5cA4s*5oZ1lWrs;#812n9{}d0<{jK}wfV1qM5$3Fa zMwqky8Dg^a^lAxt$i5V1;(Pg>S}OkeIwntoudzg!37hqG(u?^#gk#XG$*PtTZ8e(v z5)(1&GNEgUiSwl{v-oEuo*QJ2nChP)rgzSe{WHS!dQ<%~!o)U%Yk*oii0gDM(Khsm zynn~~eZJ|(UTacg*<<_0dpU#q@G?9NPjq=lnCKljeorYMR($D%%^m zzdp#K_+6JT>p$RssDO8QkE{M9yGoqucOy`OuUqo zLCY60*+X8b6RagB-*?8;|D|`9n4`R_f5zrcDd^`NGw17{F{WGd@A15Qy(#_~(>eAK zTaUB#sXiI;PwfM{zoVy2{q*}tKYy2gYH}*C8_!++bEvIidN~sRj4|C>q5`IWyqudm z)qB6@!B}95gkFxcE@L`3o?4HoEM3mco&1;{<-VfUm++G8G!)Mk^Zu z)t`G>U=nY{6#qm7(yWJI-Kq1>7}M)b@y{4@>>*l@5hiUzkDz~Y-gJM|Ym5Hb=Tu%d zo;xJ)`6uQcV0t+^{4>CGYboX43^2zvk31|eDNy}BGX5FR$*T_fU3!xC9OzB(wh>cy z`a-7h&yY^)fu7ePM@u?KIilBIT}zlk{`?&yOsLu8Rd2dA&*z^Y2AE!N9{w3%jy*)@ z8qrDH&?DlXT3@<9>a`XB9CE50jpq&t?4L2Fm!sqTdmu+{EhVbUpia3bZ08&dd01f5 zlzjh;>CD$KJ33L9OFBpIi?!CHI!8=p>9SepRek3Bx_0Ic1_eBrcUr%nBlXXy&QabG zPksN+dMD>Tb^aOC>Gh`gXN)=a5Hr{5xzjfEi1;Vg@AFOl^p3?_`TVHQsp@k)clFPq zwu-{4R0!&j>StiF<>Z*kUT%8y-}b$ivH-lvAns*Xe}XCzu=qumiO;jwj~+awc;0 zawdiIfgEN3jKmY`BL2PlgwE`r5$3FaMwqkyInN{yq({s@B_6aLz@&wV`lNs*D*1Nm(Lx{>>;nyS^V>L z%;KM~V;28>B~!dZJ+Im0Rd2e#Sz7$vLI2uSSOWV=(R&+w;={@{>JkRGF^V^;K zY<4?c@47tYof;_r>-A>q-e_Qc%dz7n5b5a6AQN7rzZ2{;oBe+DZE(AzZ-d(%eH+>i zu}U^p8oN`>8uK%K8`>XnSN6wcAU+Y=pXuAsc8G)aUuZkix54d>z71}7^lfmvqi;jo zAud0zG zXN2ipb5s9}Fx_i|*+U}CZAa|)LB3wjEdKdAom4;4M=xb&UwR$0_~+}G#Xn!iEdKdQ zrut`u>3#;3{WHScQS+nEs?d*FI1<+2Uq>`{QipSzjuB}`=&?F zOWWt4^Za@Lj4)^YGr~mujX#^t9ui@u+3#cg(#`wjc!yLDnZ-X}r?dFyOPSd}U&k!| z`8pYvFiU05jo=X&luCK`S*B^yxtW5 zjOm>7&mlA5pQeZ0I>$c4@82W*S^tbNy&Q>u#+Ys`u^$DQI0^I5Kch_QzuvixvUG|3 zx-~#PPp6kXCSF>ayTjz2zEUSxOU%(d77)KB<|yy#pRu`93i^4+%-KIE%fLGsbjli3*th@p2}%+$V#Y2V;TB=WJcC z(;ABDB=7Y7Gs?vJU7hq=Jf6H&mq~M2VUFgG94#?vyZ-SgEikdopqB8WUjIxKgSq;2 zYo7g+cRbDXdQudAv5NmoS&H(Vx92$Cv;Bpx9QK{BTO$xhkpiiy0yf08Jl~; z>iu&D#D0M}?Vpjkqt}OCx1^I|)%Os*D959a&Jol2XNWnPJ94z7leX*6JuNV?&7hX> zqWWiK?%p+j_0Is)>&?SI1I%gv>@x%Ysda=Ly6@evPS`&q{8|5uF})le@8A3J{Kh_X z%$@5GH8`mGMExGriA{X}j4??=p9$82&hb6{xN*aC=g<#41k@KZHIBNRsehXL*KtMdvfkm{uzs>*PG&>G3K0q4w(V})SS=65bGQs(i+2Nwl_Su z$ja|r0y!Gb9d-7F*b&Xx=A9nBnupq7;>@}8&!EoXHGiGh`gXN)=a5U_r9;~DTz zlOH#Rv~POEzW;gT-{sGqe?~N8-6{W!G3Wd<#@x};{qM0L?uqgqW8#!(lE^@z2=Y=lpZX4Ed+TawacWXTd+``E)PC;Qb6I^8N|`9Q`-PkL#a$OrBtV#j$w! zUE(CQ6q$PhGj*>CAoee37XN&mPHtTG`Ij=YFTIXg{PT58rut`u>Hd~2dtHRNK_^ZYP42$oi8nkp$i!`g*-t0tK4upGe4S1*xoBO{ zyhn2fGkeJEbYku=XBPi_ozCK)uVku!MwsqBbFzO%nBKj8gtgK4a^xIhqUN#g;2uQe zVQzf}{8M>Y*4j35U-Q}X_HEPiA!yWlx3He>_F&laDAdE39E;#~$LBo3?GpF1JI{+w ztiQCKdQx?At3>nuz7iMIwf1Uge`a2z?Y_}^ z^gw5w`U1~=%X)bU9o%1-f1*=w>bp}f+P>_J&wY3F>l~l=mc7XE&&;Ej1I+B1UFOl} z0cQ60F7xn!0P_<*jPsce6Zz79eHqhu$IF;hKcTwfypQJ&rh353bQ(W;8522rxlZF_ zFVl%=s>cPG`5eAepV0Xp&wGBa(PbXq7|@yD6Lpy6g|1F`rR_sI29~|C&1iTiNVHFS zSPqT#Jl-;k4=YQTXJ4kR>7Q_lZ(@7+$nV)l+I+pHrd(ZK`9Fd4Q|1&8-8MUxzCG(d z-XG@UNss?G@c)+i#ZR}*j$3^3);dmC{j#l%b8l?*BTwvKPx0Y9kMdCxPxIO19*obU zeB}30K82sW;i>oloUi3+U+MB%|9?k+{XO?r@$PN2<7R)ckNf(62LI>GFFt-;Kcc3} z*C}j&fy?K+KL7WB#yWqNo-Lk!T=VMi$!Fd82R#|geEhk3r-}KH`A5X+j~|yfWPcnm zd5*uuw!h7BM(hr6x8oLHxw`DtiRI_(v%FvH^DVymyvP4HX#TgXKVMU3zV-PQUwz)= z%eGP{+m52!YoD+A#pj>le|PxsGknZ5Nu58&&p!4HAMtsVUwr-<{l({>;;YYl{C`J( z{d?}O{5d7}m-YF&{-HnnyvP3w_jy}VDfx_hi!kC=WD&)j$3@4e}v!j`4(Tfx@^Rx z(vRB3d5YxG`h1J8KJW2mTVW>oz6kI46LFL4CKUT?{EN>&!~gE^;b-`WWA^#S_}Pb_ z;Uhke@{7+uqrdq4Q+)M#kN*eM_8+o8d`11^`+Qvg*5~W`FFx<_{|x@0Gyn4)J@qbp z>+>zX`n<>gC;0!&{2wsJe+QcNTc5A_#peh7peGlfSMO>hlqP&*xkEHNFvk&*xiw6K6a3@wnylL(R2MzEl1s&i1-Z9cOguFOr;Hvxe$N(ZR&)6@V6)Vh|dx~kl#ff6wQA{ym@f`S*N&$Paq5`aEJ!iNe3v zozD-MFYx&oKkoA}e%$9{{KTuz_*gj)8055yzuePjhF|J0#>aLcpO3`{YvbRHeqNDl zJ*Iz_PxF*sit%UTqdt$l^n3P3e%0q={KTtI#y@}G#?yb#=Y9S6eBS5Z^Z6lv-RE;{ zzSQUY%&HFK=ktg|fWPGP0sfND2lxq-ojYGLJ|EyO`Fw~!>tj4o@!=33+eLl;5x(*H z5Pvp4#^*zP+HTH=Q|2O|y>q{+f3eMEePTuRd53@7=NG#Fz^D#a=aOAiAF@D_VWBja`?j*nH#x@~-%Ey<_59j?_zHa03@A-V0N6#Pb`Ml4+=kr5;(36YL%X_J2 z%?z2}Bd6bgP+1ipKH{45dHkKu=Nq!E^rp?J_4yWGeSV;s>)i4`-^=eH?DuV2eEt4> zg#Xq2j>CShvc*r?$0Gc+@;j+O{O9?_=bzD!QhGE#;Aj7OMt|}7XZXeEpWzpOd5W)G zUC#Ie);)fQXum(-?63U&d5`}mc-Nnt@6WgR@Fzb0dHjEX|BuYKo@V{O<|Ds9y8NIg z7oW%ZZtvJVWd0Fz>E8FC&txB#ZN=y9vDL<;#aEvnXs-GDcKoi{`h1J8J|E%R-(_2$ zZ}HXVBm52eaYE1Y`b5n2cTzPUIn6%#4F9{sho9kNo{#DWKl}VM`VpT;`Nij-(O-Q2 zDZct+gm3RFVtu}@f9TJ?qs!iLM7EWl!n()rYwYi&T738ud!@(!U-aq!IzC_Xi_Z`E zK~F9|ui6_i88XFl$bR0A`c}q(S^3qkh>70w0oxt-x@qy%=OcWZJL~f;zWRKGZ)?x` ze2cF>AK?q9_W7D$eEu0ed@TF$GklcM)BNni&*(>d9_1IGe?~urKcDkuKhu7`UU&UO zpX&L>czpH;_4$Z?+f%mJWWQ(r;g13R))TB(wD^ba03X{No@TwS<`Ev+^8YsfQuUa+q4?PuuYWZSr>XigX zFx9VKrqlT9%b3W~%XJ!GeVI-~Q++kSEZ6>8^$DHt@jlx3Enlx}GY?-4=-fZRbOCx11lNwRU>+`U`RSn2XQ9z}Nff{)(|)Pc8o5(obIN@`IiXX7+iFwJwe4 z44L9N)@SPaXfSC5{I@I0f4>5;JFdIfaf`3K>(XduKJ7z2vz#lVj^F7ad2I33=RN-a zfb&0@W4+yuTl|zHj~-vPwK{uan(iA-_BYn&pW%N;Mu7cbk&jQhtm408rQ9#$xmf)K zewfd3dP+ay^C-XgyvALZuZn+qR6nAVeO`6z@~Z#0JI(`h{aA0eW2vii{ix3?SC?0Q z0zYN`jN$M<{8|4I-+oM3zvc9NzNufiy3FUr*W;AsC&WvC zKVf~o<`MX8*hx}Q-`n;$A6FsZmYx~Rkd|m(4=X3h4p9@FozkdGg59;%tetRv*dfNVhSbbPu zvi#!n1Afqx!DOE|-cWl^kg3;ghD`QJd(GU&!H%1GWQ{)G=59Q;aYmQ&`-B+Z*5R-3 z<@$V6Kl^)-kL&LGd+4zbD_57O`#Pr_e;X6~d+sqG4ZWnl{N8=cNBp1WvyVL(pCx`E zzl(gmAA=Wv@%dPMlDXf5#}}XX`Jd>cb)Wb7`wqX|t=~p`-sj)*`5`~($zZY1YwtEa zA;?spA2Qiz{(sueCs}qJx7VufT!2^Lc+pYev4=@STmUn-S<>YnF)zV+C6ox*wHCg%a-`8oc) z=O_6%VVyglpXHNYrO(InRJpqB_Dtt__Z<48=A2Q$I zd7nRayL}$-d47&R@A)}?;>{zTtmgrPnsz)){)q5v|IP8SUx;7xGRMb$Q9gUD9;egu zo%}@kG)|dIbMZ&>qn@9QKU!b){2V{==8^uvhWUM1FF*G@@5g`7^FIHc=ZE}BC!_X! zJ`ZN@%}&oxGL7f2neXwu!@uqM3I3AjC-?~kik&Z^rYU=7g3q7R33<|Zeu^LU7!Q=s zIR-s>!^5EFxOLg-`5S!W`A70&JU_)>@caZnA(^rM#D?m5hkx7i4*$029sX_4U-KuO zte&sE+3ER7rh0zJe1qqG{yopn@#j51$4^jqY#yoS=lD1m4)VdJV6Z*@v5z}F)A3~V zx&#Yjflr|X&nG$V+4!S;R$R?lnibbE4=sh%G)-{5(lf6w!C{CUsM@#F7vft$#`b9~x9_C6i@ zZ;>B+9~mB4;!nKK%ky(KKT*EU&!_mx)n#|icAiI~@l*QO`X^jp_PiheJiL=c#QE^Rqxm7xJemLM`DgM|J^u{9`sFFUa&=kebE2mKdOnajYv&iX z#q)#QZ$CfZonIfZ`u@YdZU1n1J`%q5e~%A89iOi*=I_75Z~vbCW}UX%SU~` zyZlKfSI@(J9D66{L*|BDZTs>0x_nRSn#msi#CY}hIPKVNPI`QeaS$`}W#6`T*7H5S zdVYp)d+&GS`5s?AKf||UY1eK3QPb?nXZY~gqkQz!)BNoD$MW+izk2?e_^aoi;upU= zez1LR=aijm-T9?lUH-`4On*Rg)#nk*$5_kvD0etbKUd%5!%qaN-^aS(TfbSS?Z)#h zzj}U<|4AoT&zIQSn1{^2N6c6Me~bZ>J^bI;SARd={?3ohNsq6d_xQ4}c;3E-vNi4T z)$=oa`#VdvCwqML{0#pSxzguE=?xiI%deh)hW`tRfcyLzK24y9`PswI#E<+u%CDY( zCVoo)!}-szGiTzrzY}OZ-}Zm??+o95muKI%;`tt5xw=#zoxjg6`^r4Uw&nM`cC739 ze9Nz%AMhugte&szPRzJ;OR>^6bhGRBJW{XM3|W@L)H;6UADI%*9J6}7&lHc(F{``# zOmX)dv--Nn#C`0$cQVz{?_|PiZ;um9cFjBERR6w{3D(==RL{OMPGpnaI>)R&rTzE@ z&@0zQeLBai4(&6=ZIjI6%^p)(xR>gIj>GI!(N?W*6VSapX1nzS0|XMT;uLBai99?ZA|0Uw=q%Yx5r6ScdA#p zm&W-tUVYoxQKPrVN$Gs|*pW^3>crT;%6mM${xn{lV19n+ZwK_5#j6v{`d(U(N%y(= z44ylJmE+QD!5xR97d4KvH|hVmeEt7j9xzEZ+uvf}zwKOKuji(HzCMr4@a^k~>eD`7 zb1=iVuZPf^<-Lwxe#EW%{DN(}&s!QB<(#fH)awn^3%U($@}kY;`7qJ)DL%aOC?A18 z&F4Hln4d@an2V3{Dg96O59-VA_VfRD==s0Pez4c`s>gf%kN7`g@&63D5 z26p@RbUpq*Bes9ezmaL(Zr6M9YYt}k^?C&Naq)bQpOW;U$CrJ@^V<&YF6-9wEgv;~ zl>bZd@H6paoR7v2e)iZi@gqNv@~h{ciNAXODZYB%REEAm)zHp}paN!zsT)<2KDIA8r&jQwAo^Z6dX8UF?UztAWD<#@iwFF8=IE^AI` z!1-VHusMg{%zBTno^OtG;>*6R+uQqX{!yRo$!GZ0^Uv^+)<@&#vT>h26MyymGknxH z&$DOvlzy4VPw_E7Liyh?f44k;zl_`My37UJ|A;@I&wKIP|Nn+{yIt?`)$<O5a7lXlqbwGQO2ypL+vdwli$ zAZF(O{!u@FjoO#b``Gm!U+d@bW#6&qdwk{UQjd3hzX1ud&lmVpzdw<1f6AYMZTZ#n zvwZ!2%$Q$2{|ui8${v{E<8%b4B<*uzn;&eKJ@yQr0&(XQ_ou{``{x(z7mB}nem4F+ z#HT)+kAFw_Q9i~Us_&O^yUkU5Kc(|k^PWBL<;T88uuia^m*XD!>UocEuQgexSiGeG==m;_Jzw3>an2+YzGlx4ncV01Jn!@GdEVzsK36?I$;ay`{XTRGd485(zt279 zV?y)u_fvdK*QfdHv8Uo!&(HEF>bn$w{XK?pebw`G@h9}B{@#Pf-`Mj$|Ld0Lef~Yq z`}}*JAMz)i3>JG{=Pu@0dyQg}sh%G)-{5(lf6wziAN^Xc!;jaG=L7OQJ;}!j>)iSL zET86g~x%?#5H`YJM z4tw6`f8FxD&%ft+pMTHuL;j?b)$=;HuzZ{6hs-y4-sj)*yw5*)Z0P)+=jZr|H;;JI zoCnb4qknBpJ08YUhbK6}y}CzPKkpT?QBPw@Hu^^hmcdBzk!>M@&qrFa;eZ4c|w`2JHEIoU7-ld!G0C_dM_O?|FX6 zpLBBdyym`>^C44eO67e~iMcQI^Ya5H_rvG6`dxnenNs^%(;i-_)*{QZv2x@uAVQsX=5HT|MD^T-2=^c%Vf{n-;dwneEnXq%}I~1 zo*%@_eEa+N`wo6~zO8AGuU_}~vaj@>JvTu8OHcOr>iHS|p(nZbon{6mR~(T;7>ZadR}Ai2E!s zA24Z$?SHWE|9q1?+u!-IIqC7$^B(`t;Qu-E?e7#Jf2F29zUIK=%f1r7eT`;4-{Y(2 zXZW8Oi~er9oCC;lTYmNYGyGqWJn8di_-Kr$`PpO7#E<+u%CDY(CVoo)!}ZPQ*)#Fm z&uo0*Jm)K)+qeBsb9+91`#Xo9#`8VC#;r^B#rb(e_LX^xZOixlt>;^Q_56T8>16eM zWp`rU=ofDIeVOJrZb;X!+SmF$Sbg2mJ&&hj(M_mz{CfY9DNY~8XJg|?tH=9H8RHzY zy1UOz?4~(p^>vSl``*q}N53;pl>hBdV8Ge*>}c?Y_ePDnANAW zAKw6~^Id#8$E*(RGsSIl%<9b^Q(3yi5XN4zKDk)O-6ap;{>;6~OVp3&12#!?+E4kq z^5@n4mXGHL^=gdIM+46HE%_I!-*MzIq$ecy)@2{rLUJUOsW(Vx0RWlX_xmo^l862y?_NUY!|xx!%_s zJL3G9kJFo*#j6u>jvYd=yK$l&BaQmpG-r)4-uixtLi(g&O>&DL>_v^cZukU4DU61VXabKu^>@`%oE==n^>mPEh z%b#>InA!8{PIZtuR~|COnKn+7-yafhhen5%-=ui`y1Bt-S{(ahQIAd*q(EORrP$!ub#idSI@M3OyW1hf6eE?@jP0Me?y2v ze)iZid^&jU`-%Rv^+oK1_^apd#J}g~k+!~6-h1)y2!F&^&wKHIVovG%cvtVwcjNzv z#lP=}GtVizF3fBHsOP=-?Q_Te4afRs-G0Tdo*(chom@R%+?MCCaoUh6PCI&1&m#v+ z_M|-rzVdvJujBXl*1c`*B+os*a&>w2JSF>D&ei%cKZTdCZFtGE%Sq<5A()4o zdcKXndVVJUGhaQ~@-d0EM{dM_&F8^UBFgo@+5A|~xA8OiK|b=6J-M2HZadS2&}F2kOuw&s+-N`I^8m8DC=WY2$otJfmz*zLN^*<+s7^UBrb znZNA_X_tPmwX^Fz{yD!_{AAqQ_FnG8PJWbkUN-SlMzix1*3|8Gy^X(mKE&7aI`GxK z#Mkwfj{#-RKf}kdqkPV-&GXgzv43y`_KX|<5}$U8^0BS@*1G+$4jK>ZmATdPe*D5s;OPan5YHMJ@b>8*zP(fLuSIhKeyvN63-8rw8P>5)oI;s*L!^Nyw8t# zzQ-5O`}~OKdwl6{pHDeTQZTGho@JgUbAQWMt}emIwQc&`Ft^QopBwxw&)=3$liTeX zuCI+b&ga2-J;{8DExXIaFMY1LYWovMc#uz%EXv2W>Rww5B-dOxQwSwsr<JHy3P!cX zA}@^-947tl4o$lk?amDG{E*4>G?s^!FP``Lu{ySV@x0HE^Ko=)-%>ougKN!a6_4na+gg@eo=L7i( zoX=xSh}ZT%;%CqM{8c}Q=Y9T~-%wxn{E$ECWc55cGf{1^$ji9rY1d<(^}5Y~$sUO1 zq2=p!8;>8WW6Rg;HXc9b`IetbjxTf0`N4cc2-S_(>o))DdEWV|rp({$IV9H0@1|o{ zxW>d_`L+MN`~Xtor*+&4^O|4d_V|f6&2GoK^5szVSm*x4hMbpY_%zNazq--p2f4wY zSMgJwqWt=sYE)~jFXd;y# zulhke@AKFEhB~q5hkVEL=bV7~GuJfNwv+Qo=2kurhe(H>S<3^)@WYLn`((9_#q&=5 zw>|Iixzu*PU#;7Dgqo&ce(rkSiJ#n+vfHi462^7yF&?yd*x?hW^6`fri&Q)C7#@9) zPX~|kZ+hO%&rQ!e{MP4_o_F}m^GiMN@K^m%Jn!(={AN6V&7X9#dcOANyyx53P35}H zb)4+sSRPt_xo+d|V|8r#<+_c-kM&{8mmCjsF6T4GlL_ijrzMD_uAlkpd7n>0QXgW) zFzfv|4(_+lBj8dnxF7%6mx=$zUy1&F;U@E)9>)GWmTjxoB@(vK$B0qFDj*;_Y-y& zbH0taQh(PRxzjmC_aEN}2RF#481%g}yPl{x#RF$P`Y+6{9OB#ek+1pKC&-tvt0(LG z$e5ag`0>~_pMU#4@|dslGg99g=aCP_W&V|`%kG?&{yfz8m>>1C7)qX? zqK#@#->ju$)2)5(ke)yGiC&+Ve(5r~4d~6uzW83U2EXz6_x86_d$Nq`( zZGOhDz&Kh zw|puu^^sX#@NLeq5B8J%>g?XazVj{q_LkUR`x zX8!8;Ak_07{|jT+-+Qy`*bh0$PUz&P#EC?^6}DjeQhn;b=&`lKYQNeuYQkGJ@4_?z6VPFcJn{!teXm(P@9{rB7QdIB``Y8<@p@i?v6OQU ztg7c_8yfBlH|me-`8#~|e9Nz%e}>P4qX}Q;>s9|qY}xrccG&YesaDUEIfphscr1Ht zHGca%(#_9pe)W9Iub#gXzn*WmeCjRgqxJk-&-eJnkB%Q?U#Y2evh{qAkNc+Mx5sMN zkNu;bFULu8yz}e9wcmBAo*(chom@R%VsB#}GO^$F@0gvwH+Ig0{cRt+E=;L!kFTB| z#7u?3?@7>2IQBWk*0IM|&wKn|!T&Y$?Q0X;hdsV}%j3(w68|TTHT^qgPX0%H^`vZL z`}`LY0nZ~mCiAK78P5M2p9FJ{Z#~?`Po423ANje>2O~dEweeTaujZffqn>a1)$^-- z>-ipEJwL;@=f>{*%ATL$TPJ&dP_8a@KA-)D$Kginv8#1EzpCd4{7EOP=PSDtGundU zqiyJB*KK?l(_d-+3|W@L)S3(BADQCxIcBX>pD7-nW7gj4GbL|x%mg9Gd3leC``CB$ zOmReyi3$F8CJ$n|?r5s)vR<5cj9oc5_A!$VINzVh_Q#$Um^;E0clVj% z*2#SGHJ9u8F6WzbOmA+A+vb>KhbT*zm;#CV0RIv#UbxvYM%JyP!2L-)vwSPxcvX)x z=FfR`g6Y++cy)pq_Ua51wUEzzP|f+4>zwPv`3u*J^I1P9(PLury`4$@In`HzIKkZB z%`{$pXN{KP)Xx?5YDDRrAA3SC$!C@N%;MFVu}8f+!Sv>4@#+LK?A2=~o|3P8+HysE{>im2f6~cd z@^b~I)(>J=M?^g@&vQ0Tt>2JIJG|+4)4MSemJhl~Zrk-^{Ob8ZP8$By`y1I~ zGyH8w!gh(@dcMtn&Br>wda~tL&p*S*IB(}?6hHXcW6#82J-^Pco^SJy`reMedcNgT z`o%M=@mtUL`09C&|A{$!|98{td@xSq`Md9!Qh83z0WIg+&*7ovz)8-V}6q6*vXIOC&a0r2eh7V^JDV8%&(qo`PK7YeXrvm@sao2 z`EmGpzCIIw_53=&dcMs+>U%r>>iL#mJ--^i^?Z+y```tCetn_mmp*U%5#z6ZUKoA~ z#cw}TU|*Yz{Z>6c$p561!OWf)_ZUYc8VWs!jlbVRH9dZh(45cneC;wxd^f+xiGFnW z+m3_e=j$ua_u`lQ`ut?w%g-0B=X-pK+vih`5-KXoy1tp~HZ8yA+s)5`gQMinCe&-? zbj)*otLLBL^PqVid3=d2=bZE!il4G6^Yj^h^}Nr=wio^SJy`cB0Ez3^!& zf7K7_d5{13tzK)jZnx`g{!!oW zZvKa!?=so*>IPk+)l$s!;sjFB3pa`HcwM;5412!EKfa#1=11z-;~$?#ulW(r_xQ*D zxaLzriwDfy-wx|^?rQU|yz>&QT2s!y#HMrKoCDk6Am??2?)blhgtq1gce#m6c#PZPc#q&NtR>zhvp7;5&K5Y5o zd7n?hs2-@lZ*=s)nXmm3;aj&8r|0}LU%9%};~jb?KaW@@^;3jT9P<2weD>H=d~m~j z`}B zzvegf{E+W>{+x3#+4Ecs%&qR6b(q+v>-iyb!t*V^T%S+WkKLHXGdp6~#VuFYZFv7v z{CeF+d~?l@^q!Y1l@TDSAmp8Fm1Z{v0Hb2x9OIC~yG$FKdz0gdy2h#C8Z z_{!C#9S;t-y$r|3jJuXgT)uU$%}>2<)AlFD6y;l=+p(PQ zr|Cj@6>f_15pwlB4L8pPX#BLft~-3@()LgAX`I3SJe*_O{5bUu^Uprl{G9JU=08RG2>F)h zo%}D)FZH~`U-d)ryu-ik`D^~9lQGBG^V*wTCp%1<%f~*E>+?e>a z_PWG~kH!e|X;aM!Qd-s>{uawW_2@ib^R7#+2f--D7j7D}&5w=WdY)pi^9#Ii{MP4o zEa&?zpSFwT2iq0TV@xGih__s;$0n!vaR;Bz`}tX(U+j6GzwL-+&-3d8adtj;jV+q^ z#q&Nt=J_)p_5JSVA00&7(T(D_>lAT^$)3k{Tw5#?9fLM3J?SuMP96KCybpWLq#c5u zZ~5Z+Va&{r)v@J^=Y4*x4_kiX90&NwQ9WO>bH{q%%-0(FeCm(-ewke-rn>0NM}G(7 zCw}GF^%0+Xk9sf?|CwWBw(H0K#1S6koB6ND;qlP8%AAt^JmklY<(w-UzsXC0U+a71 zAMdw(N`EXr*sk=at#vx|6&?4;7tfnBlx^=11z-){Mc?IkNNqR zee?50m`@wV__U$MoXq;>)i=zq&)sLfdcKz*Y&)GF;-`FWK+F+eJRiva-Op9>IO=?8 zo@aLiy-R(s-oNYRM?CMxzvef@%bp+dC!Jh9U!G%=)Y#-?$i#lm@1|epdF^`y82^tP zBftK;=C6JaLOnmo2|tf~VeCuaVCDbjn{Z`dY%(B?HiDSOQ0 zOKx*-V=Q{^L2lLSA+n9-*L<(@t0!B2_53q@jPrJWM)8B6`}CRktLNAGPJM63Up?Q} zm(m}bU$Sr8pVsp|zW9sg1s$jMt2wu%hNj2MHFN7^cYZNcG&E1``C4xhaO)& z@9}r!cI9`9)bk$ySMcxuZhAN8oF5sx^u{NSHT^qg+>a~#>Pd;g*7p}oAh&0n_(y!2 z;1Bb&$GrMp=YJGG@^hPCJ>TXZ^?Uq5ThI6S>Ulgi^t|jV{cq2Wt>=4u z@vr(g*8kSY*7H5S#68EiV`?^IvK znCh0Pu~Q!p#=gYV&tG2DXo)$hyYcG8*r^29bw^tC+W!R8?fH-Sx_fi8cy%Jquvf2{ zn2EM;?7DTF&Kq@Icm9B+y<$1Ej{UyT%`%mx%P!OGYdKfzM}E29z}Gcm{F&Di<$A*e zf9mxRH8B-zfKVv-v@-Zu8Z-J$}vidi?6O9v_Lh9lyih?&g2QM}BVe z)zQ8DpuV^HqyAA}oRAp z>rV6cyUU++a`n8pv(902t~_MQ^PG)S^NW7@LGgB(w8NWzH~pGlpMw$02i+vM?fNl( z^}H9q-GRa^5Vz=6jt_!@uI=q1*X! z_}P=s#E<;k=2y>m>wB9&>K{t~z5Yzt{kngUo$Prp|DWi+rT6Ev=RN+uV@l;YW!LSz zZu1YnWzT#3wa-Uj{$|e)_?SJk9o=Xi*>%*fnX`EOr_@y3R_Ack^YR+WdZ2oKz@!~E zdk)+_$7QEApNGOY`1u2X-zfHO%*?m$ZEJVUSI>L=`uY&DlxuLk^<#b#O$7Sq#BZ4i z{QA4;b)L#LmXDg==F?oi%8$wSa{M&>D?T2&9lyih?&g2QubyA8Z}oh)zPIBa^$(^0 zUVf;2*ZqU~X3u;1`9jYxecm>E-s9WPc71--=M?LTHviT09)Iog&g5)2|3lBWF;~wg zDo)>-Lni8pnp)2w5Bz!${c_Eu9YWvZ?D5s}9)H_$kX?LYYj;@h#4q*p<4@MT7oP9N z&w26rlq2lVxk_ezIs+(%(^|KLulCFii^D_57-eR%wxE&bdEA9cW2UWCs*m*cd2nh#g; z<00u3JCKd$3HdLB7BxL5sl<}2^KM6Boh(=ZEjw0^8F0>Q=) z^10|w@xcxAd45T+Zr1H~{hWW)H_WH>YaMOR*!44?`XHEp^BW8ayJ-K|bw-`$uXx_i z|ML7|&-?ssM}8LkAfEU6Ykot0+4Dm_W)*EmH>$5)$C#*mhn(Ya_B`&U;*_~Xf77`xPf2k9Fi@JYhcdQ1wh*Ki^Noec{FpI>D#hDxY@Ob%%dAjvWu}M{y`; zg-`p~ag6xZ=k{3V`)z)xPEo#njbQ6L>K{sfkbm$z?I(Fl*j?9=OQgfbk3aSLJZ;!_ z4()*Vqv)1vadBO=$HzGx6_NrP^0yt^>^bHSY@W~k>^WhNFP``LYkotW*z-d^GELjj zjpDcK*ssYs9#_wEZM!`=$=s^vubEuOwLG96KXM%%{%ReI=NFyVe*33`(lm71ZWad~m(&jo!jOu|911iF547 zpU83fbvNyTzhztp&!73IX^>Cn0ri@&eeR$(&|{tX+9Q7aM~_)|5%Y?Vhr;onIhJYH zkNtxqV8=-OD}2M%{Y-Ke9{P z(T(D_>%E-garQixJRrp0=G6^yw6|r8@TNGAs^YL?dV2%w(FGfbI$QNdtPhX?U^By zYJIL_`CKLUOP3k;e2=f!ZIZ)})Un6c>oy)g(uX~MqKUw@pyhRb=%GE&qus32KHzc= zTRv(U*mMKck>#b%XZ1<#DwxAW6wT8Sk*bS`&ImSNCLnZ$N695 zQy|10&MB@PZH8myI%0?7%<6fGfi`&&5?s_b%&*Kudl&wwe>84g)_R|xMmSuuG6^BImhGK^OE~+%tI#j!}}_yJmk;M516#Ww)Q;&jN^yo!Q-!f4?;cf@xL(k zrSEa1So}CXa+`b4_Pp`DY-96}n%?GfuW*f8zUdKt{jJAKq&M=B#C#n;ZD+T!@#7)o zJ;mSd=6@7F@^hPCJ>TXZ^}Wrno^Sb-{(JdJ*d4C9=pST9--n&3ukEFF{n$V1c{z^h z*HeG4eveYl=XD&{{I&0alC$0XPdd4JUUJiodB~J&S;st=^Z5^ox69-nSo>Zu`Y?Nb z5Hs`leOvlovwGg+e}2^O(Ann{+lRgUB$^2L=kaCVJYO&tJ@=rT>O5-s)${9on(K1h zmS5|+&aa+q`IMNu`EmH!W6#8o{M_bO&$s!ho?nlD)IXH|d-NlRZBZzjd-Z zzt}r-^Got8 zLq4A$FxkWQw|(ro%|nl`p7;1Wa=Y?7Me2Ev|10?Se>c6GbIy;9U3%ja$C~~fGw#O~ ze)YV>VC!3XUVg6QuO4ps@BoPd{~qIKk3GXjes1%t=iB^L&#%W{J>T-H=U4gG^F6+L zeui()jjiWmTc6>--*H;-2FRr}ccxM}4#B_uofcWQ-UIh%?p0nAm;R>ZJNU+{F+PuGoD+ohV=885 zdbKNForu%zG0vst*v+lP$(z|ap6a#0l=sE1nA%fwaiZ@K=@nDQI?KdkWC?VVZp{=W6}PFV`C;_%p93%Jqf` z{?zLs_F&CZBtM_XvtDngbEB7k)aoX`I=9D%cW(2^UAET8`rhYLXAb!6qxJj~{hCi> zqxpG-?mfeC&@BUi0Og*w4@M^*r{t&)>goOV=aeyik4ZHB`GU&b-PG zxz^<)yR;qMh-23=Zj9^bWIUcdukO@2X3mv|OnII=&QtaLfJr;N>37q)sXFKP{Jh=& zjL!!>CVB3~ub%hfug~%Le~W_oduG;iXpP~RpOmDIGyHAGIQJYg5BVy7)bu9bdcMsM z9CVvsJ=XGTJy-Js0{&g)hacpAd4^A8yH{VtK8PRnz0D`ab$-%KKK3u3@77n}Kl~wi z(ta||p$UWEOkaF|K6~D)@4jP7 zVqMYZpU;;={j>IYXVfNpeh~kplflfMFYamQ?2sunJ@$!ue!!$1LcgcmHIyj>|c+cjC-XY?A*ELD_55YK>Ft7Ng2E4T&>&uqo$eX@yX{u z^L(dc)$e~)4@eA_Up?>h^?fqRvE^5fwR~(Bj9>Q6IcH>E2SPnB+t~Q|LC&`qzwA59 zr$D5hK40JS!ybq4KaKK3wTbetzP~l9FV`xRpB-WDo$sI7yvh10|Jn0yepcsK_Pobm z^+P$I&waX;C8g~}#iRi*`VF0~h3^H`QxrH9OGs3B9%{f>1M&kvd5JoNbD zd7mGtV~;P-qdq_4`5s^D7vNK~l<(dhot$znwS4935{y#YV;>%Wf6IQK8~a}JF}ax+ z;nSw-Udyi@Yvb2=BYYdD<#Xb=$GZHDdi*IqjV;Qr&w~_?KIfw7Kxp1*jCOv}-%-Bt zJoxsv8LsO~H4E|)rg}aZKK3_tKgW*;+4Fw>m**FI-si9SK|JsCKfjUdrH+@^E2t08 z^<~cw`REQj{+({bx9iAnkI9}#!4lOL|H`sB!C_KQ+CIeV8h-zB$fO-Y&v(-EN4|L8 z=f~>U#xI`t`LRB1`H6EJ;8T){=c^ME?oP!6XTJ7_&p&$JGQqgyD_55sOzxf1GhAQR zMd8q6>Mn}et{>|wJs9Czj^zVC;&Wh6@hK*nOA)?)){u6w>vmkUZu3L6iSm!n9jWAG zRA1_YAm6+ON!UgC*uSiE9uD#2LH4|#pXK?*p7;6Nj#zf-Lwl{puJ_^>&-?tC=R5Uf z&ky;iBx-o+`3{pk&xN6hLIui8TD)-cerJ((vVEwY$K8e1FlmRN=V{9$U$5JE{8$}Z zetTW4AAhV5TYhTt(&v*Z)bk0eDbG{8j=S;C<_GnU@;7@9Z0EjRKl6M2cM(6|ZGGNb zKlAZ-IDXn!nWJ@^AKFgiJugeobAR%d(|ju0nX7-F`SiEO&&AHiwd;hl@l$P-cV3?P zEA^%HpSk+?iO*q5{MaYhpV%;8w`uEqJ;(on%{te0Y4>CP z;kW#G8!!Ht=g)l9mpzaBljdEQC4O`bZAUkX->wsn{+)V8J>S%Jm1#VG&7>gid*0!% z*0Ffr;V<`L%5`)2w>|Ii?|Rtb|4q+({JWla_{;N4J@4?h9p&AnzV;m6u2TmbooPJp@Nawm znvbruZnx_a@iAsR&Ym~DnY8yy&pS-o*Y>%3e#oR9f}U^r<+{yv9+)4iW6LksZ5)2A z4_kiX9Q*mfxjZzJ`w(SG**OWh({*fszij?d({9?}s^0VWZyTotZ zZr6M9%lW*|k9nRrHb1D%cQ^mYG;K#Wir=mS*K-1U9@|~#++otbHqNbnZ~vM}I|M!7 z^2__M4u9Km5VwvkUpzm|3CADn!(>EVSas2fyQf}Q_zc?L&?Ljf8uKp7;4N&lAV? zKmKOV5BbP0ZAUlCzg?%I(7q=odtPhH1v>ZqkePTF%T&(~nY2U5^F6*^pT}e4dAj2u zyY!)bjy|kolXS=l?)Xi($>B%(5R8VOQjEVF&)aoj=5aNA)Huk;xU1*Qv7}F~_}DPa zudhMi1LFj&XAj6&j{OtoQz#NAJttP@V12~Tb;YrV{e#CB_!LO2zKF5#=~y-XQGRF+ zNBQ-+^~fj2Refp9F+MTVfn%9={Z!w4eO`|P$k{pUhvoUjp0DG$;%_?!u;(~GuzlzH zJYvM|$N0tbK0o65mXF%7=ZAb`owlPJ#c$Vnzf;V3JbPZAV|h^LoDZ4U53j>cdC=br zXx?uj^b0r1?b`PUFpeL&FC6~r_aM~sgPhQS@g0uE?{R2fJMl|yb03<|5+@v6=U1D5 z)bu9bdcNhuLAUwUV=bQtCq1~B9}w_Q^48^VvHp>L+x(CD)$`at&m~gOw@mir+V_I1=Laz}f8V#I?=`FEJ^tqhUX$c=0Q;O` z`>>avl=I>7W#2p>F_v=ffmQW<%STOb@~!7ve)arn{BSTvko}1qrVlFD3%5K!Z^uul z0Y4vSJ^m5DdVZZh$`3hO^0dw;#&v$uO+NM?^d}z7exHfoI@z6H**i0QY}-Gd@ARj7 z-s9Wf)WSaaoQ~w&uFG+4|D!h9^8@~*lflfM*Vs`Yc`i)lxpl~tm~EUGPd=X?FlmR) z{txRl%GIULhx7aF5}VEQ)w-Qus7?0#fIsPE zFxm5!-H91zUlbp0LpQr_<5Ry6S(d}pnhWJ0ndLp#JoZj}4YSs%&lHc(#aVl+&rFHt z#vHTGhaMC6EikL2drWooT%2$wX6|*}r6#jXAV*Ag%{!Uu-&y8p>|ia$N&8*r6MgaK zUP7wbt&?NtYqEnlKNjNr(DP=Bg>MM%g`0hDnTvDm5M}8SM@n+6qnA0Bli%#v?Yeao z_EU%Ql7{k5zVT{|Kj+m6X4tC}%&=D{mkSk9sn2@lZn@2;&a}OB>>usN z)%+9vnooYcSKo1d$hCL*#JJ8+y2;1>+1(fQ)$0vTe=c9o`-tUd$DCTZ9tr2MBfb8y z*HG;`_CH-?w*5)2b@`J{1~Wfbs5`Ysqn?-NIU6U&kn1;K(hl$Y-Spg-CT8Z>=V0{R z2i>H%+x27o>Ul4I%b9wABS{@+_}h+z?Kys|raVt21{*(WdXsNG-}0;HSL3%HYxz7l zo=59^FfQ{$kKM~Z6E6AH^Xu^w!}jW_zPIDAp6}&9-Q;8cL4V@G?0GLgpO~{t@6Tt? zd;ERJl-ecFc3pCEm4ANj3iYRbFUvlsSkJflubv;okM5xD=tgncb#>jTXR_zjZKwi| z!8mislpgxM|8F_gHfH8q_qMf@I`;S_Zig@XTF%w_F+VBg zxF`5&<@11xeCzo(Kh^UkPZ#;O`LXd^&$oOu#?AatZ>cA{e2sTGKO=ti{4@E%oW31D zF>J4%`tv3~Aw6lpM@_^rPX52p^KbdxbRAEk!@h8nvD?pf+2<7NieCS~PoenNKJQG< zcKMS|22;=HQ)ah088W4&$37|N^Vdw;;r{n~9R9ZBAiLDm*6y&5P15P}`#L|9!%xP& z(hqj-ip94`8*F$@$UTEc097+2lc!c|L3=Qt<|2p+I7j5%@69EJwM=2 zIvGs%JeJov88YSE&&H|e^Ft=>5b}JFFX!_% zK`#3I@cUcQ?{i~vbFW1Bw5ht+^2vpIKRD;-*)X5>RgUG;koEo!pYsuke}zwDqkKpB z^?8uC*XLZsK8T-Uit>%;!H@kOgL*y?Kf+YcC&N#OzSf=MJ^BIXM4|jF&oB0TApRYJ z?$RfRbH5M7pRe)u=C63(=SMu>^1)@#5BcbB+Kz4%zg@?e=?Cz+fWVg zFVW(KoA-OV)RV_L%K7||Njn5R-}1%tK7ZSB5VwvkUp(*gV}0226X!a>rz926S0^Og zUFXr6kD3PgZ~NW!wr9A$a<}@H`bpO*X1jjuAL&IuKVTS+<>T%Vp96b}PchLPitz1k zlG$}TE?T$wp*bAoAD=r?$q6y8^Pi%8^BW8aAt@jGmvzp=A$~l_p7-;!JiplUK7Z8@ z;(4DR^L(ei?D-)d)k6(0J>Oxn=eaO6QRts66D?l2d7h_TY#(mreOQ^V^mxOh9fF>x zEsy+ieV&?2{+(lH{u0`++vU@~${ekq>Ra;d^baAY`83Be*Nvabqw&*z zy>-Ib_^CEgzI}~jYiifeeCo3xpF@_Iu}`o+v0=V$gB^zbxjetv^BmBSzwOv&&+&gC z{?6w#um%3v{KId0ecp*b=J_)pwPDZW{%bxug|?#`#c$V%NB?Zhcw9ZNwbf;!6uoe} z;dy20vN9=%`<_>>E>HZ`Iu_3>SC=RLav!Gc*nb!N+n!ghE>H0v&*#w##WQxDDrI}d zcwV`>Z1^*#7$ZLCosR3|e~GVLUD9FlaT1mJ zg`37nfA`jDU%j8!PxTGQZ#{2&W>jC=j^g#>$9CAP#+h==bib|($HtEb^}3DbMVF`i zEYC0YydVFzBbHs_zka=c&i|Ir=Y4+6^JhN!+s!{RP216p;9FOz)JeHbk zUDljCOxo8nkq7?#{E$gI1U=vK%lohzt1fHI%#YQv<%{S2_+x$8@>8NZ`g|(aUOZpl zM@z_EokwRr{*LkygMDw#t{>0sZG90`m|x#hpz+%06!fChi1T3iJh)hXcwglloi^li zzXbBX#Mk*B;oCae_=%z8>eM$Jzh&BWVqWnnrdWSsJA_#|T3@<94fx`DKR?U!i#_l2 zSN$N@ZG3*r^Te_JkH6XTLq4)g+tH2kZ`Y|PwC{<@p4ZyaHdJH$OSE|5Hok6?Xww5z zJwIep5FyX^_a}D>%x@z)$&o}ARl$B zo;SymKDpv!!!Wm2Nqug_zj;rv~mU+noh4jfUAlW6h6E%(We z)jj9o1KW45&nIls_$^`)$@pN=z;6_NBKd0 zZ^uuJ>-?mfeC$8yPduo3(WM?QQMz8Z+1MiMw*PVL?D=w>3;yc&DCK~qRt{$iW+?}Dc!^WWp+@p6u_VJzj`1FPzJ*@n_d^Mkmk=}o@%e9Nz%UyUF07@^Ai zZTWcUcKnoz0iW|kxs^I#V-gJRpatd8?wdWcgMPIl*4uImgR+m^Z3t{?NGp7;3nH?^?O={Iez@`KuZck_?z z(spzsj$Nm5(9On-$A1b_V@HY3JwIeh{FaIF@b!5bS7x*7LHBt?w^1iMdDcnDokI{BR_yFXL+Yc<45t zx@*AC@vg@|;?vlk%n#=5Z9Xxs^OJ7!v48P=x4!v2ekT9++}L`)$5;Q(@U4@r=X-qR z>Qd`{K2MN+ZJw{z?ffEVyZtliWc7SycVfn@r1)qXy4iIbpZa~svK*$?Tqys@EbqDI zv3KHYn6*xQrg(fV&e~gjW=d3>IcCCOgXO*9X%Ik^>UBNgP0yW_QJpG zUc!TKW~zVRId-s?;-vkq$DS6L*k{m7c#z#XId;D0HHh=+~K)=}W{xw0;`&)&s1UghJs{5h{qFumFpuTC(-UY%ejv}MSv6HId8 zHPd)?im9JLq~7FP?njze)IWKCO)+U#+rze3nJQj=8&mr+-2WV%Ou?%-!Qu^OnPUg0 zCFZE^$ftUBCZAESPB6W>S-d*I414vO89aB?I;-onr;y+3X!H%XYtBKbhp^u_x*dDH zTyNm(4qc|%*K)4bk9@tZEXRrQXI@W~>kSj}PrV*uzYKHUv-SlqE%&*VEh~NvySb|h@i@nd&6 z_tkOP_^anv`PTDoeUa~*@o!u8e9Ol;Z}Vvy+FINE;GyiX_56(ZwI841SI@8WDaF_M zNw@P;J>RWwzOL-W|M{`_{(Sbl$KQ8MsXV9by2N~)AN9P)U;BJS_56U3>d|&|qd4vQ zg%h&p#cj1mqn?-R0>^nI&(oMqzmd zlsz`XPlwL~R?oNbqvkjH*7GeN`M%Aso^SbRjNAO`;VyrpzQjMLKV@I3X)^hj-EFOH zeN8_;!bg2?$6r0)%TKz^ub%JmabGC^UW-%U65NOag2Zc;n@*)IE>VqMXTUp?>j z&)Vmm$=PmxhMsR@1~YqJ+|$j;kcsmGOiSD6=6pU;yj>>k5d3~m%a`Xl^s2+(b{u5S z^YjDT_s-`#@k{-DezJ2P>)W60+|S4D@Fng5pZ8S`w$J@Z!>;S+{8Z1o`9a9~oswkM zsb<%F)RXh>$G;uotj9W>&v)_@eSgdL(z$==u~>d6=X?Gh=Wf=K`%;%~{-^9;%Ky(p)_0=){>d7{Kx`#aW6kqcl;oJP!T8!ccHypq5JjPppkHO}xoxdr_ z$9Bc@aDd_4akYG$Z-(-}JiplUf&A}00C~>+K%AZPKy1Od9dr}u~+j#tKM`&&xTfSbm@%XVmZ25_Ejo7YpF7w6wmPz8x`*Z4;f7CR}KX@Mdq0%@E z{@HnYjvs%A`PN;;QU3XUI_!%MOieezw@lhm`GnE+bNsZOJq|stf0v#wd8i!POqnCT zb?B@gw)S!{2rsWTB45^A3Nx4^uGyyPkLAr~att^XLUsn(9J1zn-V) zk!bwpb2U;&XcU)lVSuY>v75&wc8iszm9Z+rflkFK|Fx9eOK{Kw`5kF)2sH+6~4 z67?EAAKbWZa~&rI5%fI8VPi&U?0Jnm5eDaBKncKyspykY)}4j{ESINy5y%%?mA^Fx~z{%HN! zKiCNyYu5Xg9b=;1 z4>99$_B@t{+G4Xr+j7r4OzI2U=g7lf=|Dp!?GW^Q%NNi4{B6fU+&Z>=@x0HE^hTCx<}A;z<9pLKetXiurchfK^f z>}x%vo*y#9p6~JXy3HVF>GMDxdwjiar_~~3ruge|zwC`1Ym8;7-p7wdfa_ahVT&*9(^FDuhezE6${Du=Qkl!DY2amt{JqY!@$N$3Em%hi5V)5hn$YJh7bFGqgM}Ke*WgDCS z>Ul5zD?ZiinvZ(kjNf{`jUQva&99#C^0#~Wm))=OZ~EQo|LgpZ;;){^{=@lo&8HM! z#ZQmj&CjTR)C;;a`ARhI7j8DT$hz%+#GgIy-SlqE%-{EI>3hxUc`yFY4_tf7=K%IOMQSJg z*~?GL9`pFJZ|-x9rJQ?U8tOc4`PK8Qe9W@}ANjr+zx8|@KgM~RUp?97XOFGtXT-1l z_zb^#ew|M#9`xt!{EYes_2uU$^>NMD`SpU-PU5sqcIQ|2{7ioAvD)>M-}w5xAHV%g ztt-#Vu`IuOeh~kpldI?DIjWoUAyeYFaaPX{n6$&2emA`vGxPUvP~$i06Z=~ewvN5{ z)$?Bb%fGXfJ?8NxHi`ceW10RPGw#Rh{9N&^=VcpPU+`|mZ$01gtLO0;gt`)c^>CM; zJ@yR0#`_GvdVZZ>J>Sbux}Bfu`5s?AKNG(_H@2Sd@x_nu&_w@OCwqPn?i^p@l)2ol z+xb;JKZt+Q$?AD!*B&*`t(a*PA8kW7yKdvdxc^G?a>%kArq(el|Hv%wxqctbdEHkc zt##7-k4*9ST%5JH`pm@cn`6>0a$ePA;=ToDb##xZj-HFNdb!6`FV8a7#TQI=%{!Ue z+wWw8wG^j%wm)|9>};Is);?3*I>{{84f{;-=^WFWo8q=P=GY<1(xvtR^)2<_3peYu z$h!3jxIeS^bjdyOF23<w#dWWry|`eiucqSE&v5jZI-l^^+n8XzJx)sJNbiG5op z?U45+rni3N>-&f0yf?s~c|B3CH|TkFfIszmDA9bF%g-nBT(38%6E$x(Kgjn@esyk- zug+bMpZNOug2_Uu-g@sef4{r@Nhc!*{9J+B{vdWYCqt$@ z&)GP&KZZ=svvqGfcF9AJubv;o%>4Qsj95PCW|?;V7{7XchClWGM)vRwf7@ZFJ;z+m zeRW(me$?-8`pQ*R}aUeZRZ$PdXXQ zpTaEH1aghdbKj6D*9EL+s^-g`@xxE> z4*og$U;Df>>YF`3;7>Xk%-rgO>5c4%4qxI9@OfY5V0%;-N5Qgs zzReHvojvd7=fDBDd_QKyub%h$m6@<=`Fh=^jUU?u$^CNZa@yqk5!;kb~ zk6-HN@u7h_H;;3te$Srftj)j4yTjj%=OxbU%;tW}$Ang{E;sRl=^4pCIO_8=|9HRU zW6;Xgc~Ief8sOG{9b>|m*-si9SK|JsCBc5;L2bVoRI9WxW+w*yBa>~Ec*5Pw7Pw~MG^J`7(XD(^?QT&>ZNc{G> z!yaqIr+iV~eSV^C%I^m0XIm+Ld)!X`+4BK@$nz~9uh&EIZ#zQW^PKtsr}O?Dji&J% zU$^n&U-KL4%bp+d(do1u-6(#$P7$AD#^daHegL__-&|w*8-H#u+{V{!WFMN=v@PX# zE8pWpg07gfL-6;vD5fJ{uiJS1ZO1{}I<|bhZsYM|o^Sby^Mcr%{LnPg^ZCS^=bl8J z?77o1KR8~L-*Bpjuld@4f%q{1xPWU-eS}+Hw;pKoBYBDNXUpj${^lheqvT|gX*_?;q#*8l-r?W&yu)Aa!<6T#!@uo$kB@#h`dmG5zTftY@x05w z>3Nq={i-ojN9p?5W7v?IoBmwy|^2>D_haanB%P-e$9Db}1TYgG3kA^uH&tQ{!K3`uKBj3i)XFh5eashhq`pghm)V5TgjS5x2xBr$rwEXfutizAhvE`TdVI6+V^DRFm z%9G|=mq=XAdGt{aY zA()@Tb!_7FJl5fFPx8<6b5P%<_?35FcKT)_xY=S5YPMkHNPR>?D-*o(#c?E&r9yRH61dsA3itUJD;cf zso%Ry_WauS2r&L1GLJm|>h~bj^B(^TV_*6nNA{%0$K&NQ`N_P7O~%8rjm+`fq){OsXp_|@~z@XdU3=9lEQa}C5ikH|K*f7CC? z(lWn3fA#pno#P89zg{!*qQ{rd+xYy|?@_AfWgMm+iQ4vso5Z>HJy7tn=Lh^rCxe+i zFS+T)JY>rI)W<$4-;??ndw%VE!PWDFnE82R-?ydjHLK@6{^!Ty_p-BxJw6^U*9DXzx8~}$2f1tUp?RDXV0(4KjK%9jK_)H~*7P z2J@#dCH8L2LnijS{v9)ZU%Jbr#J%Zv)35nEVq5v0BK7ftVbdyA zj-l^)|Jn01@!NA_>-ipE{7YVn=f^tPI={yk?i^n@GMC%+)BMez zm*doWo9C%XCxgMB$CB9>Oi=lG>pN{{*KK?l_g`~fuUVGE)H-Hj^9|GFRpv^0&vk-X z>(pn8$LXt=RfA-^yX%9+eDmWhnRZDnATAj>vryg|1;-- zms&rX7xc1-TxOjaS+{)S)fj)ys}oGGcEzg`%&=D{m^-Gryq8I}=Uc8ru9Ny|g1HTu z#;a3I?8ooP_2Q)dnd&R9JHvHVK$J?1YFTtJ|JH?p}^Y=J6 z(Z6!8J;8K){$rl$&CTM~i8#Yvy=I~vuY70oSZh+Q1#|r=`Ng3i={z|zxBT1ZmWliL ze6%i6OM+P@?eM1GP1pV!^JiX9l(_6K*YnupIJU#z!C$!^iJoPjd3^g@>2_Uuo?P0?54qOmPdXV)eXjT+?38;b z>UnvdJI>QG{%avJ&r?t^ZYY1fbOtLJC2T-H=hykw^DQ5ZaWg*@ zzk0IE*LwbzeV~6Q(!+~(Zt9y%{>S|4`PKX+L~tE{_53q@O8>q7r1;hI-TY_Id+~oE z=S!cr&7Sx8_POKpqduotSM=gn&wKo}&pTJo5BNjRw=q}Gr#!bxjcd=3nLMYC9#hW` zm^_a@ztw9Im!9wN)$<#z-$M{QruXDojCp-7C-uvD39>2ux@U2hm+}V+n zJ)iHj{Ob8~9G$ndrV>9wRu1utTZVi*sB!D^l8(Kum=a9*L9?3(GFP``LkvjJH;(4DR@qCXj_4E05Zf=}sam#T|o%63;UDkPPYMMP$ zKlgX|4cEh*J@fG(&z}h2_{x5##9p`Q^iP~mv1Q*L`1QEG{Nqu0I1>K~ANdLLX~W`k zQ{QCnZ{tVYVZNF{44D(2Z~5YRpC7AZ%NNi4 z{FvukeoAi6IX_euJqM#YAlH2VZtidMul*N@-^@*_oAT{(TfTC2N&89NP0w(gG|a-} zO|p{@o^SJmoxGmR{F)O9LHQU=c^%Q=^Tv_*SNPxt`LtQh&mSr1Jg!mvsBf5GIbfG# zCEPvA4<4V+e==hszK#n^tkbYwxDgls*zhdkf%#q&OY)equ%pC9x5Iezv0knecD z!(`7R_f#le1-Nxg`Jm2zD&b7zi zQEK&k;@b2)f99*_d55c-a{lRDNYBAGtbfm*LCH_Ywe_w2=f!X5KJ^i9d|WsNtJP`e z{!y+jF?JqD`#eHp&rHxOpH>I_!V_*Pf0v%m`B~x9I5pleA3>V&};aYozI5~c>WPS9XwXw+n#sg zr}9RX-HZJNz}jk+a?W zPdZsWUwgCEI8ljTxOwOE=hq18`5}`E6Z-#SBpkn~BYWQG$LiSf%XJ&4jxo=-{FJDU ze*AE}@qBgWj$Nz&&wSK0$WN$&aws0;n(IQL>HTf~@nD$$$I9I5b&2h8K7WoML52Ay zW=g4vAIIRawDDuJjW+i4FZ<@4g!#(VB@Ksn#tOyw!cCd|_^~}Uxr(2B9gF|yd5S}s zBfiEPiN7)t@PS{C)v2#ux5;_IcquV}9rLq1zu5DE_;(z0&pG+P;k)PaZT#YSpC9x5 znXjH7@=;0Jj&2mcUFVvh7S#UKYm{3&{xdJHbM7$doWU};d_E8MHIsG-dcNhC_hB9W zw&Ngf9b3M5-j6@lhb=!PH|Lz69i>iXzSnCkbpLMdKjt5C2l?oQ`g^)qFV}E}d8?2BcAW^Q<6Nnd{Szj?>pAj z?RLH8qozSV752M&*zk#|$7=Z$R4jhDs`%=9eQWwB&Zm9z^9T-gy?*RZY{`9^PD|7C z{5&gTpXE~^K|XC+eBNJg^WV<@l#kcMzr?Q&P_8b!e3|?x8SN*zvg>X9*f3w8$99K0 zocYW1i_hoVah&<9eh|<5{58L!zU=uSpQi5R`FxvmY@0oQ&b`UWn2G1y@$aVBcny>1 z(c1S2!22QnF^HM@tKWlA&wKnYjD6{Q94Qt*j*r~txns_4cBo`mzcu+sO>gq4PpJ>T*%l$-gn9`5qjb-Q=NJ5zf8VAYC+F+@ zJh=9|F4gk`{_xye#$scxo-eVtF%Oy85978>{GES4XuzZ$-t@cawJ*0d_=V$o#+}L`) z$5%hj@U4@@lUMVr_T>y;;X ziHZH#J3S`m?Gh9FjhNefK56XNOnPvhnP{)eIFXOHGu5+{Yl>I@rWN}0g`1s&GCLDJ ze7OHOkHoEWOt~}ri;Yc}`n28f} zQ$8<_%t#8|(zR}Gx)thzM zVVZq~Q^!oN;p^-89$&934`Ock_Vq;dX+QpQy&+#WiNtST4}BH4_W9!0x%_-0Cwjdh z70>qgs1^I`DL%aOD4%+d=HXNE6ZuI#^7AMk^?j62>3=dm$c|obn3!Movj*5dd%V~G zh@U;~_s^d(r~dp+{A1ta!v5tm;D5q4jo-e-^7B8~_kS|~>UYyyKDpNAPdXXQ{9K{# z)EY!R{}<%sFIVp${*ZV(O!n}iHS|@5saN z`TGH1#`8VCdVYq#?da`2kHvVtMpA+oy)$`>zx$n($E9b}Z$Llu#)$`Br;jxtK zI+34v{K(_e{M@IH<>yg;_53sOQ~DpSulD;y|9qJ_wVAmleP#O}@n_F_`LTXDIKjB0 z$A_!f^B&*&%{tAxuH{$H5BQT#1~YrUxJPS{Xeck-=n4=Wn{MPZyN-uB=f^y&=LbyM zVY9Er?AUEidVKY~$G7JIsC{`YW^3BxYkocc*G2EO_aF14TwNjt>6@B!&X2^F&*70T zd4C8?95?09gUdFSkNRX!&hq7bGLK(9{|ui8%K4b#qfODO?dzR3KiDpN>=`}SrcvLz^<9d; z{vN}aPw6Mm%*CIuz5d>V$KTlVbA0SmUN5)nM-PkVef~Yq`}}*JAMz)i3>JGHy~%Tn za+#k4)7|s=A(Q+0p67l3JayE2T;F5-)K3vU zHsfA=kk1}_iVyA*zy3a1@}9?+_|g7R&(GzDN*3!MWQQFy$3OH^u_kcUnG zP4Tf`h>y*btIJUQG|)(XXuF)3NBA_(6@D~7RHqeww7%+jjA9}`i8l}CztnT0KO48p zv1E?)JnzSU&+|V2p67@Bblp4Ij^ViJxc;4aP_PoQt?RkfP+w&8Aew`ljr1AU| zKk6~l-&1_-7mA;@%YM;i+w-00LE0_iG2{6uel$PE^Hcl<&rk3ZvXesj!G@ae3BH{R z?fQl19sX_4JN(<8zvd&;sAu>+Q*5i(ZQjPz>+`1HwXUf=cf7&#KL4KQeg4<2^Ld|d z`#C{Pv3Z1=(#E*XgMSm}^U>G!;4bl_*CkjO3-QxXBOa!-tmG%k*SzZzN4w~MTVE+v zB!2SsO8jvTrzL*0e>5MH`I$bS_xblc@AL0@e#l?+y!MXP0Lw&u{laba^EN}~8$9px z?|I(m-}AiBw;qVU&joHG56tmt``G(v=)XmN?0rV+y_NW*?<0fH9-GZil&|yiDZX-b ziP40fN22jl`d9KFeIHrlos56l^FIHc=Y9S?&ky;Fp4ZxH4Y0iJ`62TSp7;6pJn!@G zdEVz+&+pJj>~m}A5BB67pHBZ{eD(Y+ANxf=cefaSn9m-YjURI&6hFqfz)!SSh+pSF z_Mwxpkms>&kYDqHeWv&+`g$rqFU|1nTxi!xCv;9K@s`h3I`QB0e9aT$kvt_@P#p5Q z?4IX`{AJIVSlgI~%!KFJ^yg!q_4D%sCVT$hzHQsTeUqHn&&=EP9$!B{@A3a;-?qQm zh5z}Xza2x%y58gK=jT2C2F}*`4(yk?p3~!}becbH&N)A_Z~I!ly`MJMKChnNl&i~A zAGVyUV_AOn{4;zE<iMVgpB{}L+1GrZm#6-uLa8&c5B8J(wCkzk zAN725oD=`QFn|9m&tL3QzF%`#@9_2W^B(_S;kSRyezTvMx9e^EsBixK{D42{WH9;q zJdN?>o|=;(^DoHHJ>TQ2=Laz}|DX14`={*r9qW6? z`8~dR-sAr##{QqVPwZ=lFXQfW#8P}h#x21JTB=CS#SB(^Uv_B=bzzYoZ0h_ z@w3OC;Uhnf@~h{ciJ#KH@%iafeD#;d|7Xmvf6nvkcdYC0ieUfZ{I>tA%Vzl4w(I#G zUp?>f|1X^Oe;v=a{Ob7uf6~d-^BTL>AbQ>APZ-OezL9=jxJiHL`TT%MJ8b`peg8M- z!T!#V^?Z-7p7;3w2>w52zWtq|Pt^1?_fLzWpx1m+^d$ub%h#vak63 z6UWluh)8^nA@{fZ>iK8*zmN#n1JCf$7*F%HPxbrjdS021ue;askNiB!ubzJ@|LM{A zk)51xFaEzp&;MrczKzjKKFi}QPYja!#G9^*{*o8@C${C@ys z&f4{sUp+tI4?W*y^7(vacVgb?omhTfulXDg4d?9lA&j{(UDCthdKW=_F6RGfrfa z-8#p_KG~8G z{5KAs=`n)@NfXRq#fUXkk~IxZVCV*Ihd+`-(h@_>B)HqWfrK`!D{w@i$EL!5H$ zqsPR3Z)X~>zAa9S;q7sPscv~&oW`qfW1>cHkCW0l-=E`NLN?W_6JxK}CVKs;{=j1s z%&=D{m|?G8GlS=jb*y@gpyN<@P4i_PMC;r3_we1{e>*x(S-R{n&A!5^V}?SCL;L)4 zy@CC#bwe=e_tvF|tr`?Sw5*Bd7I_VrM8YoDLkFZ%ovi~kcj(d!L$ZuI!5 z)uViP=TSb@k$mw~eu(@eANhHdkNQ5!r}RIWA7n?bH%!bgdp)muyx0GAKF#>YUXQF! z@AKiRP=Ee6=InpxYYg^!s&!rKPjaoxpL8;q`dslt*c~Sinc|$j=hep@CVSqx%Z`0V ze&k#kJ+ag6$S>UMn3*s8isxon|Nt}(a#>iGeG(#h5H#ci$AhRnZwTz^hvz+?~G z-;cLrw>jzYb^IRR{{FqKovmq)uUuVTJx|HL+4SI?_^N{(tyhD^x`X`AvV<1eq5@_g+uX@||eR$=T@0X1E z)$`Brd7yv5f43PvE>vRrN>0Y{6IuH78GiNr93T6I;;){c<5SDT@{<?e6|Qo&(H#-sjuiqt6ZK_ua=HQ?4#+-=D8L9r^Y9 z++#i_G(SH*#m97dn$I44Dt`6+EPtZDOYzs=V;I+$(ofHWbMYthdk-F8JU_>`^DE~0 zIli3>?RwAiKL4KQhx|z=gY}bYs&lvNgh{4)e#m@-=Y9Tu%kw_}^Oom*zU?=vQ9>nP zK|FcUP1a=_+lSg8vwWK05x#PD+3gvQ^B6zcEX2oV?D+@z?6If#;4bm&?~}RpUE)Xk zhtlslp{Z}eF0uYWcKG`IWd5hm=jZsgSKDPB)sfcAe)V zUXR$A@i==Pxu-(W;%(>iLnimhz4LjWzwglD!H43p_I{faaPxJ&K~6aS&yPFj^M3q? ze&fv}9!5=bExq_HpL-?b;o5(5eC!wE*SyT}v0s$W9;?Uc^gP%1n4c)0#wl}YF8*kK zP~Rm!?HB1E_556Z5^o;ki|6O~^XKz(d|T^wo!a4ro77dW+j#Z8=lNm$s3hvS;`uy= zPR~y=^?aVva{1iB^XRtc9e(TcNzXg{&ySm)cld{XGV9tSI^J#v0w0Wed769KI|Rkv&Wv|W1I_o z%)em#X8!AO0wRW9!^&%AW^!j{q`1d?N z%+I8gtLOE-kxovA%=UBs)$;=;d*1$@uKgat{teFgCa+<8eEs~q$N#6j{+{k9o}=|M zkkr6F?g8MoWdkP@c;Mmg@gx%YQ}6JL=ilLDY_H}A{5(J3iNARM9e(lr zJN)98xA@A{Wy3k_hkwER`j`AUc5HimKjk;vub-c<``^sh$^5l^#BjM*)Ax^heir}T z-_srNgHA4<*Iet;eAar%+;-&u^1B4b_oVXkXoJah{0n^km+W)vcDvrMvvSFSFf;TO*< zSC`N5F_i3idxcwV`>e1=~9Did5Cg#`4s=^uO9zD;NJhp zp0{qd>&^Lf@lKDAPQ$-^9))9_ugTkaXXh8rWA%3rF2}j%=g;ulpR?bv&+%IacD;@t z_5Ed<|DcnL=dZDwn1{^zcX-PA{D4V`+x{D4|L>fK-?08$!}%?~dVa?L6PSO>O#5EI zzT>GW`@h9k&(HY(4E{f7zWtpg>-iR6JwM~izS3`BI9B*~%r56nDp%iw6w$v&mWC|<;!{W@Y|o9xgwQ`{C~ z7KgT&%F^XDPV1A-y3GT)KXSczNj{f+bn?()()nB~em!s2<4pN@4xn>pJ#TI^53l-S zW@b58ZZi+B2AJjixXnDg8eo25>~c=rV&c9Osuz!a%rstoEKZtGPsd5K^l7H?>SJR^ zjUJDa()sk*kxlh#VC?0bwbh^MCp;Elmh;p$Q=AlIVxN3&+G5gu(|m5eb4L@`zZ0|R zxZ%02%uk4K`=H&0p)6fCy-co9U+{5{^YP+P-R8_ct~UhurB3JH{c6R3TyF^QOK)vk zacd|3bjgz=KQ>qOy3G%2`YKZ)yr??2lah5e)aWR z@gw{BeZ5Hk*g0kAT5JC5`EZ0^&at-5x}wGZ`#fJGeCssqf4HvZtKWzD4?4Mc{%~jQ zoFTKmE>hwfFll1rx8uw2$J?>noV57L)urbBe15OLZ7)74uXE0xZ}HXh5q^1XcJ_RW zpR&gy{B1|VcI!r2uldFE@9>M~-{E7NujU8*?8$fHFP?vgUp)T~zj*#FzIr~wFW39F z&3eA>f5iVO&*KsPzGHgj`DH!d;;U~$e7H_O`(|BN^NZ&P{GgMI=hbaG2II^j^Y@7V z_utOvWBNQdV6x}`6Z`&WzJ71V{u}Ps_Yzxt9si8~2XOw7`906K_{!B~BPSfc>?^)S z@8V#xZqGeheD!>UpUme0zc4O+FR|tq&%eX}>G1G7eB?2E{xyE~{5yQ)=T(03{5$a% z&%ec2&qw&bqW|^tw$}4?{}<0k_+OuxQ~5I~*7Gg?;e)@*^U3jdqRSZ{xQPd3Us?Yd zbGG%n={3K2eh`1q$;I>Po<__=Cbq|GkhbRsO!lPpxo{*W_5EkQdVa>=5t}}T_B`K; zU-LWT+uHR!-{LD*m)M4{cbVr_&X4RXIZ5aq{rRi3;dtNS z^FYJ=4Pp7>$9CDnk@)?53M8H%#O{p0cs?5c{*(05xV}{0c>FuU_wv>Aq4>>tl=Xbw z|A=4D=X0N8oB90ur2Qm6*7GgC@*?pINBH%+^;_}$fFE?SdcL?p$6%ZjWWxLZPI(%BcOQTMhTfZ;&r8nFeDVA|{(GLE^KCy+KK1+1Ul`Zi^HF~JKKGc9 z3C;88Ej}#yHlIEAR{Y4%5=};p96ziJlH zsARtWL3a3k*cjiwUiO{O$M|v2$M|+G)axzJ5BZCp*SXc4vq7eMe#m^l^K<_G?T+W? z{Cl3C^KCyQ-rVEKa-Jc+Y}T~lVeIGfaOuAoAN#rZB`+~P_Ve=DljS(bGoLq^*RYNJ zc=q-eLmsu-?kgqZH77F z_-}iD62I+-gm8T4OQ>n`<;U{5zg(V#kCymekMTgoyMg?0wOsM@mM`*YoGbbF=7)T} z!l(Uw9!?8uU=)Xn2?|o!=V2SU29~pf1OEf=TzRu6L_{!B~bIvxNN4)V<`hD})_9yj^yT0uC zVEkdv$M|v2$M`l^^?J+mLw?Z7VCCyJQrl+F1exl2?UyF=0ng9*`z_DU`S(0O=i7eR zp%35Z)=*RSWQ@PL`PguYkNupV>s#Z)-d;X?ES?`9ALCr$WBxhgFY_P!(2ES$`7pM1 z@=IQ@Pl%sj3OdZ!x6$VWutC0V6X9bY>?eHR`>tAZ}HXh%GKqS{}(X-lAk-Q+wFRbubx+~F0cH51OMML-@4tdxA^LLV3NdpS?-#s9CEU;motmvy^c|H3v`|6Kjsu{{r`FzbUo*(doPFBy?Y!mb5`|V4NL*IYR&qo@kVPVX4EV>D`I9>0z&O*<9&+ZB^ zi^to{v<-{Z`mvO}MY6RrGsoIF9~IqR`}V(jd% zC&v!f<4pDJlW}6??A92w_>}hJ8$cg9kBIX#J~xX)+e~prEKcl`9ok|lOP92*%+b!= zH1pBUO}lO#1@4cW2VLf#HGJ!3_|)!iygAw*dtLWC+!);N@LzDh!*QYgkRSC!Xg}ks z(0*vorQ=asJL*`~!FVMUC-Sm%JmZJZ@i01dKybffo(K0k=5lC1ou_7A{Zh?Ws)C)T zm{IB_-EXVTN4oRzxL(jtsor^V?5NS>ajLJLj1$?^ z*NTCj&*$)+{zROg@fzjV8eOJ1FgEu5nyAA>jj|8@y+r%a?c_}38S5x)$G%2BzUSw| zd_2>uCbr&u*D(({CI*TP`#AkMh^=Cxu5_)|#7u|M=L@Xe2$44Jsu~eGv1%$UP3mrKOLPJb4EKF2Kne2z)YF7xP7W_HMP%;L}In8lyZF^fN+WU4y*Tk$_Gcu{F|+tH#>9TzIML&aaqe9v^@Pl)NSr&u95L0O5$3e#vp*xu+1ylr zMwsJsu;L*3^`g0gt#hlgXcy0^CIqfB7=~AEb%5zW^ zC%uo0?;@JqVw2*n3!bB(xofT5fdRROP5bDH*$!{!EL7cGs>LQXemzq z4s)kQ>d#o53Aw`eqPtA-XN)=R`OkQbW^+^g8H>~B&j=IShW%;gR^6+nF8vybKZl&k zA>*;5m%dYtV$4~M#Gf(dw3pZ&K_3q6lr`gO<1`TA!tpR;RL?9Ui;HaEqe zG3MAI+T#)Cia(L#M0L~S(cj0MGX2w^NBa7Gz*+R?Ft&<0tC9FK#`O6!#!S3STf4#BugVcPZo(wW+4AkHF*YEQNb2N60b%{y) z^~atTnApeR&*0cy{){nab5r~oWBU9VVNws%?RqYu_oGd=58SdZf8@T>zw2|7m_PfR zsz1kLM^Aj8##S+BH9Gtmh|}%Q05hQg{c{G?D#gd{_GchY^4!pMOK}1@a0nh0*M;I7 zF^xY%%+c6Uqop`$KZid9aV8AC-%EHfzyFRkJ z((ifHVS!08^qGini8*==i`*OWTNP=FekHQ=7+_ zl+Lxf4{OB!H1T@!>GEfcIh&i}&lq#;5U_Zx5hm?Jw}?MY-Rj&1{5j+-`ZLCy)kt5z zAAMSnw~Eu}&sdy0rgZ-^C#YYdc@$&fv}V9me@2lGTk9V_0A& z+N;adIT?#{%v6>xX&y@-nD-;9{v_t;oK|1IV>@|Hb}*+s{~7Pk+1wO=#>VdRXM{;P zr(4XQlH+E*LjD|Zs=ELDZS>h!jQM-+9ew_E)cxyo{25*KXC%&F@mxIoEOB;7gqgs^ zZ-biLB0bv&Zn?)FXBK}x7bl{9JWfhMyzb+C7JoiBcFdK>rX#(&7T-s@43m$@!ovjj^AG%a4LW9@Mr(KSLmhe&k%D56DN1&cSWt2 z&=Y@^{){lE-(|}Vi7+?BiIc@noT%aB%;L}I;=~vpj}y%7kmuqo{(O#E{P`TS`147o z`ZL0uerK6|fq47gsOCGi9e%g^IR6YVz5evax#mxao%R*KnAZztj`!w!@#lb3<#YVq zf8_eR#1di7expGB8DUO;OCdWX!u-N>hwJx4`1hNdb*b_>W)^=w7iaP3qs;8j=a|Kx z&oPTXpJNt(KFL&nMwrvz%wfl2-Us?~_S-(fiZQXz;5UfMyz$3L`_L`&`dyEsOPUvS z`Hfyr!kPR(OjrIpJMHvaF8=+*iMqWm=f@N8>Gryu@0ZwZy1g!E`(eAK{nSx<99_C;U!(i+ z_SgAz$|vR~@#)r`n`RrD$~yOzt4lEQ@wgnv+_!ve`;Bh>*Eq-Pk&^>PF>l-KoacBw z5@1fx&3I15#{Pw|yIzk3;v6&88BfNET0A~>sxLY5$vD+RPcqTVkH<;re0uCiB%hPS z#y))w{uz&RcCA317>jd!O@n+hjni?xrTFZ8UO`=YyzVe=T=%D+k32d38DY+@xv4)R z%;~kkBsGdKw;ie9d(R!H*W=9M&*$RA7#@!kOlit|J+Jhx+)dBf*Z#y^JKcKuEdG3M z?1<~}IEz1@ixYXt{){lE?*V0hMwmNlGvO%{ zkJHtS&IP2`_4g3`e7`>bj*#Rnd__7B}fx8AuT9?LxyiF3>>{){oPUpG$FXfe*c%Pjtk#JMBP5mWscVNQEq z&p)|OkqbxNXLD2i8HscJ8kSro{WxF-{HgQOGhRA2-LCzw_qY6s#{&5rj~%`AoyHzx z&T4c#4+Y|!_L8!6>F6aISN}UiX3Qbx*J%&M z;=~JB?9hu-S-SMq9b4nyfVokR;-9-$d29S%k4a-#VUEU*u`V%bzh0c`PedCSd*aRe zOgaCIF{eGx{){nab5r~oWBU9#WXAl-HTU#6wpsC~o4@(}8DP$8boevCoc2=6b2Gq9 zT+&|8BlinTw?6}My8RhqV(-9Ufi^MrOw>kV7V7mR;X9oPKedNg@wh8+)!uR?!#`O6!#+>$2qWKsWtcX54H*WGs54T=btg=tVYNCN8G2LJaGRx-hU6qIlSf% zRw9SQn6!QWeFXH-BD4QK7jm=2oV+KcwbAADS`*^%zJK%>)70iMCZ%(&?!y}C`$x+5 zFf8SPp5gn)SUHFqMnb% zxkG3D&zvCl3rw6U4VdcBSe*3v9lEvO=i)(!$4+q$nLN*%q`i$9-ZqQ@VPQ|CD{;GU<{N26X+mM(pB6UQIF=F0vI#p(2C zgz5F?fEn^9&d;3BL2Lf>^EZ6&if%pUqbI(ze9LcxI2^L?VB+Mi`&|6jICJ`4w(Oe2!WC`5cqd8Sl?=FCm+H{^_3k+cy2q zGP4kGfQfB~pN)YF;ieeV>(4=)W)2SKV|I_k=y?uW^QWJW8o{5xIs6%6&VHjn&p#u~ z>2E1yheViP7`yBDL%63r^&;Mg35Pr$CpEkD{BvWc8T2$0V}G1k{Q2bA)8lbsWC&VJiRSR1`B0+0H79@}F3f%kry_ENx~E zD|JBE==(|VVT9l%F?A_^1igcI2!xF9XN;M`|Y~S zfiqvPsVP^NSN@;D{Bvd&haSH#$;WE(kJpEMzE;L_<^L=A|C;&5r`u-NTYPbA;r8N} zeQln5>oz~?*|+%cPNLp-Q#|H#j)e0B7D`A@ILkL>7c(aHS!H_Wep z%k!(ad)w@KbAEmL`tvW~|0VN_$G6R{xA=e0uTAIq|NB2;n?K5&ElxkKd3F4wejoB- zciN6_#JB4$C*$$_{Bw1ul$xFo#-9Ht;p-mv!kqS+Du1X_7vF zhyT;z;dl5L=d1C9pFQ?Y{K(I%eAM?YknjAp66S9yz;4j*|;(&w-7v&Y`yBR{Y5i|5~ozj*#FzIuMf{|ETt zAF>~QMgQaTe3j?x{x6=N@&5?^A2a{!6X(I7!ndAp@zwJ){(pi0Uzz_i)_>0HzhPZH zU-OIS2mGLu!PN8lJhvK78#2Yul>U#Szm=gr)4!$tX*; z!tZ&$#aFH_J^4w@hxBPviT{VkMi;Pasugl|GZwu{}Tnm*KOY6^FYJ= z4Pp7>rxC{E_wy-`6+ZTJ<-d47l7EVSck!vb@%Z-uUp+sI|L1STjdp(7^ZB|z5x<_# z=RWPtuN{0n$F_d3o^SDSpQ}Hu&xIrNtG@p-fAxI6AAiuv>iOb^Moxmvt$YrlAE$AM z$N4r7sN;9a^DyR$Z|i8U+qCK^o{#ZuAKLTz7GL^1$j5l`{X-tt7y5JV`6!>iFY4f9 zLUUc;;=__}^S5~aXKj+sz zk9dB_4>}nvKA+dQtB%H8&e2gFWe2gFWe2|Yi#LnlV ze45`L4=7ic&7P_1EB)l*qvaAc--~<><}E(BOML#V9EXQ7XP5Zi{!!1z@3?|FXCzvuZOf6?$}9K=LZj8 zJ&$lA^NTn4@x}9V{yopn`S(0O=il@EkdI2Do}JIzh)bWxoIX_;$dOphcdpNOQqI_@vVEB67hL6+F&ppr2bTU}^ zx{cJf*)u_AVGNiLcwYOl9FN{aj^>pR$J|{Iv2tsX+eye0c2D_~C)K z`Pq-}J?Jyp!?LgB**>@0 zoV57r`9aJzf8UPpHCxZO`0Dux-+nLKdcMV1&qw$h;>QU+kLwFL*U!(_eAG01@*Vz9 zhlk(cW1O$X4}SLiJMkkwukwrM--*9?{w==xF~YaMD`Gug_dnv#-qB_6c|`Udd%neo zpV*Z%{{O=~{eKhB*Zku70YB*E;(3j|k&_`)oJ0EgIQm-|17_u`-;fjiE->~xe(R>i zSIzj*!~K0KB^{0<*&^fo_x_?`HXpI7CfkUm*4A>yFW0zULW@EKl?#FABo@2DLdD`;EJzrXa3>GK>XGT))g)O5qE%( zeGaEt*VX*u`QteMF7+_^4?0;rZ`ds+*Oj)R8`V(foQY}w26KBlpBVe&Ow{Oc zrh4|tUc$)rz0W|;7oSord;^F)FWwQK#^NjvZ8ODfF=p{*i>WMK!Z)?!tV0~@*yP9q zxIc2Q@)Gs?F8Pr(QNHXP_pDpK#;eDf@?&20#mr398?TjY{O33iuLhXqbsE)&Zzi`m zUJB)w<1E)cT1?#cIMaAFF!phrNW1OqQ#{9rg3g^mZ$so+=0h)Tb!i`T0tZ$8Egn^9uczZuvdk za-NFoCZBZc=SSSC&o7AQJJpl^(W3BW?85oNvGiJU@mDK;)G7&YmY+5LPYC!;K2q>D zUlM(sk35@yia66(*JUOFYjyj@^61nx11AiTk&|S{}KPEFaAGaPW>tSr<@;e z@HyT3^H-ccpTGYNzW$!>Z&=sssm1TD_{p`?_=8RcGkachtxG92J7>rg=a9B(+je{n zCVT$R82g_mo^SD$cU_v8nNI=fHL!B7%zbcpzQtG1&-nlGxo!WEeQw=u*IWFQBu_KG z>?{2?Ubp!#o_~k`6N%t&D6{YI3H&l&8s(+)$Mk@#aGYI_-EP-we)0T(A9Ql@{MBtzYI67Z z_qYBG*Zuj^dZs+j4VbjU_P>ya|26S^i?8FK@&5&}{Y&<6&+{$5a&>tekM+Yj;rJ~d zy^H=8CtJ_A_$i6UW_;OKn8|z|PM~-{B*VujYq3@6G%d&%cwO;`w*@ zl>RsKgY0L|&*J|J=I>wf{QVXEufLmaJzw`f;?JI+@&D((ZT~ZS{tL&_&kI}6xA^M$ z8UO#nZ~r&@?Psj(@1|SN*Zku70e|TECR5Mn^W17UZO9aVlJ>}d(jUk5fUq8yzjAf?JP6e6B17Fu3GAVJ}JuZ1xPtY4b0s_3$yaw2*%;os-YOycIvVOZ@WtWMdDbzDs;>|4{nl`A^uz*FVS( zU$>d(|DNaP{Cl3C^Y3|n$Y1n4a!-Y##bcfyGT8(7JU{1K&y3ftC&6XU$M|v2$M}gi z_jpV_ALGmKEqVB*{{}tN@I3Z&J&%;QV|?uA<+I1iaT-0}h~LYnamrkZ#qZ6JdOjLI z?dPeldOpTayt$7ro}csYd4A5n=lMDRp67@BbB2lz{#5AnSoXJK^8<{Dgno^ArAU&-eL3C!_Xy-R3c-dcK_3G@d&i@cf)_ zJuqHxc|OLEdp^cb?$^cY`4}ILbk0+7DHv>ze*sT=uS>8n7WfoO#PiYky?o{B66va6 zBR8H$ynOY1l<)U&;<`rp-u^+E^t#QYf9`pH9{;{?H?Ggm`S(0OLCZ`0cZNuCm2XX~X#v{ss7H<$F@E@Qdf)i641+H9wsB7xP~{|4x32=ilKM zzr4j)t}c)H%+uln1(G>y=P$O!e3AR@=jWUA>(e*C{>Q#;|Ks$0Bz)`t7GFOtZ6~c#eS~p*PpZ#k4}T#K`kO6w z>^3JYzQ#C+nfbDBT|4Xf7GFId;oIK(&3L}WSIWzey6DyT zsZDdQPx`aYv-DDZzs-N~{5$z6o_~j5JpUH|@M9qVc23#3Cbh8nNBqjw<#(yKl)XHU z*g9gL<8#;h4y9%PxA^eW-%t}B$La8`->lPicu&74Rr8DI2mGLui|3En>zIeke?rW? z|31cmNrl00$Cuxax4-jabJF6g=VyG`SLUXD4P|TE;;ZK)eET~~wkKPB^?Zc?g;wx8|>LW?p2g+~frmSPzOo_%EV-{bxn7Hq8 zraJn`IMLRR#|b7+nkVB_|31kC>+v|%vroo}Y_eNp%;Hnpk8c2x$MXFCjQ4zTXqzc+ zi^W;I*D#P^T10y^jFD`q)EN6u~~oi)-7MJgX?jo{FqmL zF*DQc)c~_xkJJ2|$9{M_evU>SJ-D&X30lCO2iQm&W-tUVUur zi0|<@DVA$($|L-mjm?WF+@38ORHLkChbJI3opGP8m`+B1Iw9VHXMELgg z5PI`?ucMV8ajQPRVB6;Nmc~Xor)v%6dPDJoZbO@V&}MQjoM`zLAKrPDkHFvNbDmzz z&#QdQ#aH>1{x|yv^<{U@^ZyU%`G3fMu-Eg7$6Ni6_}Sxg{vW~rW9HlIk;Un4zBql( z|1a?WEAxNDy8dqZ&sf*rT>L%OfB)?=f7$Ote$dIq^XkrqbB4@6fA)V*cfh29-Tpn@ z8UJ4p+rQlSJ>3YuT#w*BK0M#bPf9Y6W_;OKJYTL&ppTDpU&{S8|ETG!{GSdFzY{<5 z_iFsqd2i+)`FWLJJpWey)2s0#JK6KI`2T|5*5A`D*FNZ6UC-BB{a-vk>HbH+z1-4?4Mc{_uN!ZaHL%bAF(BAGmeS18OGi zu>C8>{;!ks`4+z#e~14csMmi?Jm2D1x#;j|4EkQdX3pX5dW)}~ua3j%qdbb+Wna&_ z&42OyJN)ALcla27l0JHkpZoM3e)0S}{Nnj{_>}&a^Zy4Qf5ZIU8o!(VtMPnue&zG| zS$^z)f5W=nuDAH=`5FJ;;J1IvezR`3>op(s&7L3dgHA42k zjF0_X@fXj>_#3`*rbH44p@%p(>q<%p@ zK7*p)cTYnPD_56Dbno?ueQw&y_qoS>Oz1@O^esN(eVfl7dnrbN)Tg5BWhStLJrYVOgL11)1vk zA@c#x&-wQ}Kj)u3HgtZ=^D%zn%{`tp=K(bN=wDsahKI3V$nzXffRDa)@eMZ=KlbzT z*^}ltuKalUG|rs&Q2gHfP@Puz-ukNNWBEzExu-v|A$xw#zvuZm|DNaP{Cl1s@`FxB z?fHBjOzoYz=Yve+`9AX*&rkTbJwM^!_I!Y!P$1v=5^9>V2LgP)4&(BqInN03y&mI% z%JWBvkNsTn({?NQq1`+lGoIJu)N`uwJnPMm@qCEC;Q0VQAv?bQ#D?nm3IDd|C;Z!< zpYU&czRwRjSv_xhv+l_tQ$0UqKH&K||DNaP{Cl2{@e|bKn@8&T7#|LE^1-EGus!|- z&gZ??C0G~>dL9ad->}5DBthlw3Huj{~#ai`FZ^JJU{2( z^ZcBD&+|im(8=m~?VV;%2AS&lA@c#x&-wQ}Kj+``e2njZp9@^}aEwpq^S<}d(0_}3 z-}}hu!6m-;ePr<2W6}J0`8q$};wx8|7>(r zbN)Tg5BWhSgO#t_NNt-v6J)CAwO^Xd2RuLL-}C&Of6wzV{tkWkKDUONvL|DFIz9LC z)$>t4_H%x&Pdp#xqtCp2_Sjo|jB|mXXfId%W&UFydJ*9AJhpZ6OJ1-~h@W5zI!qeA zkBkl2^W`|b=c#+1pY!i|e$Kz=`5`~(*bJF6g=Laz}-~RsnzJs5gZ)@7(tLJBY*;jhc zo*SV4=w-RT#aGWq_@|yU=Swxec>W!J@%%e{t}z7oHEjb=UH;-{4Jl>0@GXL8Q@vHUNLMSnLv8PC`J;`vDYe*RBr@HgY9 z3G^~w5{>U)%W6JzWwgJ^?cp`h(DiSM)G5S=kN>8|H{9& z(Bdmsm!AH?w#WDVt>EV>D`j9>33#eE!eMVvm2 zuVNODx0w=Gj9J{>W+rx1j9Gl$V&cBXnd;~#<3y<*kCVzzE_gCd_3x8RupW<7J^N&w z$R@ir#w7_&IE%@nuAn8lkdrm}R2AvCWq=)QE`He0uj!nQwhuksT0 zht52=yx0eatjo4aJH5`2EOMK5^e-oO_o^JrN)K zjxa~e!>f_8AJ_X@V@I5y@i=F5^YCgQ&ap!%_Gz4G9qTo_ewmXwF1<$3a41NcFUz6z zjb5|iW|{b#y;+tGrrFnWdh2KYalIiQ$HTX;CrZuQ@$2)Hj>E&ZuZN0T+kE9k_+QBL zalHX~7tgl%s1gL$&L|w643uij6VN-m)O-o(n=rbR(i(hdtRJr<23R0nY6=Z-CK`c z^3dX|=Z|HQ*iFpLw>}@QpW|20NBH*r4eR-4{5jqTf7_9;J?8|g>iL>qJb#C;o~ikm z#1F*Z=kwrr9<9cYmOVUK$B)OPQI7v!SEJ{v{;~NV^XcGuE=~GhVw0Ml`Cw$v*YOw6 z-^q`9xaJqnukv?wAJ_k)`LQ0Z<7e`VeB>v4el`Ed&Efev{^I#{KAe-EM{0iY{3_pi zzQxCVuKfRso|pe_-TA+XA2B z&(|>*&+A;$rQ7q=)|~Q>qrcVj%F?A_vd6x@m1_}p>~>w|to0cB@Vn$$xw^daw;dtn z=WAO#yWZko^V{PmwZt!_< zvz}zW#FpJ<;+HYQA`W&fj)KG_7OJ7thc6 zKF`;D$?=>|2~CIRiKFf+_v1d?Z}YGH;o*}5)svQq10VDE%2%!~v0vRYTwg$rn58vJ z{Cz$T8ofB@%h)x3YTvw$U59)Q<}E%QoaTXt|F^R%mFZpY_s229$)c|KqB^}5ZB@2g|Y*XuSjzR&YD zKWUEpIp_Q&0~5 z%@6j%KjF)v%CWBfi49-m(>T5S;zpYv-%m0AUk?}KFM)XUdmxVut6TX%kz!-#hwRd!e8}+cz(|JdHxzd>h#Mr|Hu$+M>ooq zUFZ5?=r-qgTs<#Ie%AASCIxZd^ArAR9S_e>__sYj<8v$7`QBT<)HLNjneeGUZh3yn zzv=l2Kbibs75^kZZqL8MH=dvJZ+d>pzv=l2zxKK0zrNr0C(5LrpYWIGmwJA}U-iS` z`3e8F=llFc&zIh8Jhx7m_3NhNx=laMfah!eaouLZ_tmlHAJ=Urd|w~de97@J=bWDe zVd0k7ixU#2O1b~a$8&cg&(Hb5V6*JT)3M6^I1Y|w=P9^ueu;V8%5{lkj$8Bbpp!5A zYWx^-)AQH(>EOQntnoGPy2NmJJo&KO2UhBua!5z~*!MW!zQ&LGy5qN=r?lo=0bkDN zuYB6hmmg{|SX`I>)Rx0&!){UDy7$M5s}HGVob zpXMKxr0wWNHMQ$p=S$AOlXzWgpY`KKR09^2yix9?Mr`8xkS^(}Fp`CxSOuUuUsU7W8xtnGuK(x0dL zp7W!AmK>hvZ*t~`@}L}B-`(8b;)~}U@w+^K?N8)`&*$g-RX>R5=X{^%uknM+o*(jq zP6mrTPg9F}zu7ZGru6)|PsH;>CikHy4=ui4pC81`d`}%)e7$Zn<9j^c;_JMe@nv6` zv-@f8P;Rr|aKEh5{LcQ$^M1z1<7J*+`0ANDer)LGV_SW_aJlAO?ne+j6pbH$JNY(0 zkf!}ATka&_7BgU$bV z{aj!5{EWZ)JxcZbjKB6hP;&OPe}Yafp4Z$oaz12YKfF#l=lM9F|CD$eOxj^v`(7}P zmpwm-nfd#Ue%ocf+jWUK`?C?hdVa?L!oK>uoAx=y_M{w(!XZDM^D*PgzS&n83nmYb zD`8bVU-OIS@9@<#HNSZN9X=0E{66U)iLK6$^?V&a_*#co_{H<9`9bav&)4x6&#&{T zmHPdkZsx~&zK$Q+*XQp*{;iXz^Gmt9Ofv6eSTqmq*gfm#`Kz9v<$vvWU5e)i{GgMI z=a1OyoD7-R@A5lK`1{`_uLCCg%Ko;GT^FY0zr|P2&-goH)8CY^&neP-eZG2r#{U`o zrQcb~IiB(HIC3j-eqsG9uVWq_o|kQG9~RHw;j8Cs{!esp_V7D=9^5Vdh7kMl<1v}= z^c!LFd{Xy3_os}#&i|NC2fvpe>-jqW#q)RKSI^gcD(}7cccfs%SIcHPFeWxo$umc!IC ze&wH;;`A7^)TzxBkH?s$x7tj}Ta1bMggMpACs^D+ai%z~6{kA-NhS{hzKk)8D_e1b z$*y^lss4>Ju^*rNw&KKni*bqvTTJzAEY9NAHdEXhV@`XXeHvrV=BBta#vD6DS-M1i zn_i~J>1O9+Z{0cy`}`m;o8_Z?<5fM*m>=_MfH|w(;ne_h+G9LccW!y?R15jc2i22r z(8)(}$`VsQ$IxOLuSUjxe22fqM7WQ~Nht{RYR>0m>`Tl^jTV{mxuSMH(*iT0mqyIP ztC70%wQTDa>l2jyGhU*qja-r4@4^os*l z>s#F2iXYj@*Oh1dpV9M6*Ynup^ZwkyU%4KMoXPdDN&nkxsCHd)PEKy+2lf4B%7@)) zJGxo75185W$Lsne$BjlTKCptmzZ08_56%qo`Vs~ zC*3U5uAk#q&qw&7_cwArBK&PfDRzn3dcMw2$@eN|IY=bOwQ!aS}CgC6JzQxCVn78;h>Ca!$^Glz%&7Pm}?Pt5bKFf28bww+F_{kOj+UK2%=Lhi* zJzvKRX7;?e$2fwA@_}MZ&gc1B?b&1M`2myr2V@`<=p?Up)T~p9jtJXvUY=a?VMwuJ~!7zW!O`7thb*$F>@?`3&I3Jt^a=^N;!l z;{WB~(^Sa00$)8}^SRet`QND(GLzPoPs|Y?9&+)Q=U4XpEdQ&1P|wf!Ykot0f0^cI z==r*)V6x}c4Z75+@PU=F=fw#v&nrupC#Ku;E&loSQlIasV~c-&9_{lzec0lk`=igN zj2#{@bALOn)48k7zw)ljI{y-z&V6$Ze7t{2`&{`nxv3A|;^UBS^VySc#gF{B`PkC9 zSAWl7T3fyS+>Ul?gaFJN~$uRADi!Yv^^Oxrrdw$Me^@DhR&i8n} z&JVck`5}Mk`6iP+f1SIzRX304sV}T&w*3CqkQwlN%@@zl`Mx^VeDVC8@9V>wpV(t_ zK2@Q3p!~iO&C}w9D_{G=!?$iHPRsdMzH)V`$2;{5*O%@oOguHX_`DM~ev!|fe2WjR zo8SI@vT1$YeCzXb{}j((>q~#r^SC2F*rc4pm$95ZU-QNDbN=%DV$aX{t9}sA&-p&j zU-P4$AMz)jZ!p>OI=7m0cEZFyP0tUR0ngWby>5esL_aoT7SHU6Vb8CBKQZ>k`>?$K zC4RkbGvoXEun|AUJe7sd%DsIUj*S_2d-?1!Y(CA;3ZKTwfjaosy*59S`nvhn^L8xP`)RsRUM242Yv$a(IluJ!e4^v^>$^O^*z*|8gum_BW{>+pJU{3AJWqA8`N!YCNF4_8Bh$1U z-6(#$j=1RWD^oqswZ-F{8`}1mQ$ePl&l6)@$F)45eBW~(Cj8Yp9-g1@m-{gJ;!l*p z{JNgjbskY2%lUkxrcS=RzEigoN7wCn{*{l(?dIE*{ll`^lQc2#&&EuD zd*Y|T5So1S;%r<}LjTsb{Io)y7hzE9rzsuY|z4!VFW6F=>%IiY^l^-=s(aq986_{!C#)*~Nw`@o9EY4c;_w{^MZ2RwKD z*5@`?*ZZlhC@z`%$;rod$N4*pYwfntoh>kIp5cZH9v8V9emWQye_tL$9mw(2iM7`{;=nJWu2JnqAMT$7vLAp zHRc|ln-tQU=jZ%mxfuh(s6e2?c_eDVA|KXl5e zp5M*-X8cg|QPZ4{Y5aCRp7_N%H6I(g`N+S1p5*ko!4V((xcSD12c5pVrsSFFwEW)&H&hU|V`Z3gw6R$>eRs z7tcHR4$n8^XV1_19?!S<;`uq>R<({a3tZVrKs8_aM~sv-p3-*q6S?p*fz!FS*Umu|047Q{~^} zW0_w(EHT*n7SGS}(~p0|M;G1B&xD`*^qu&N=hyk>`Kwjm+wm9wOO0%O)i0>SV*il4 z)blOAaASPo!}o?qt|&)4}!eQ(EKJY4gO=U3ymo^SER zUpNl?xb&+Gi=D%LF8fN)TPIKFm!8iD`1V-!I)y`Vv0%#YFi-evzw3g0{36F0#gjGvr^CbV@G+Zi=Vuf@P1n2m zAMuf&+x+7BI{&Ee1AIN-uKASyd-<`RZ}HXhk^Zsg#@6#KzW8zOAK6#tmvyrBe2Xt} z$N2VG_4;N0X3xuU%6yix@bh5M$zZVOv1E3K2`c;g7uwFQ+xXP)Lzd+*wTzke;~S<) zdG0*kbM41hF-x7=O!0Uu&eB_LW=b?Sg3RN*yv4+QOH6f8i>Z!|#yMi5T#v^ICO7qy zajJi#Om%K6pSW)+PCcJ)G1arNIE!1`OmS=c+jM>MuKIyFE z?!!^w|HygZrOvV3!n~bzrf1#qjaPmAm{$YLS?vz52AI~PH)}DjC_BmIt^p4_>tEW$MuFl{Gr!F)ZD@NzrNY)4LaXi`A4m8 z^J&i7TG;%TddhXB@;6WO?E@pT`^x$`esyIle(Zib{s~_Kz5K2ORfP7t8$a@Ko3D;; z%^&p-rT<=kChXqtA7qE!J)ghJ*YnupbN-GwwQ@ZYes;}YdkxjDV}Cf)&JjDm z$hA{`(8*x(a|LS4?rhH4AydvlZJe6lA(M94tb6OROCDN$_52`a=9lwh#PUfu%e3p~ z_|@|fe(3!Tnh5w8;cq*3*d=Co^q5C=ev0SU`G_sMy5^T2S?AO62l>C9p9w#E?49_L zpWFQ6`8xl_^Xu`C`iE+NuRp1L{r*9Avgc>f4`eCyu2cG;QL z=dBRfU!~7y@ypmPr?-C2PojxH|M)ol_$@yn&hoqIWuDggFP>lL7thyx6Yp~T#ltlp zdAXgR31246jr@=J$j@zl@qC@1;`#OZj{2u~ew9zX3x*~ z_PN78r&w3C;#bel_-mhcMty&o`T=K2v>n~ZId+}%iyT|$;PLEvagUk9e5eoXG!mq z^XT^t@9iKE%B9p#;-2$q2c0j;tW!y>9{grRlPj#vDpPYQK5B`qu^;ikR*KyVHBRkpii8e$mT5mb*2R4wHm*-dZ z{EWZtIMjk4)blg`n%~ITl$T-uBSW+u-6&Ufo#!r6dg&SVJhtoSe8}W@PRuQPe#oRC zT%K?7#q)E%r;aVYcz(|J^kIuH{W0g$zGdzgC)3zm=TV4a*GK(B z$D;x{@`Irkw-a(&dR6@I1wF=AW;N_4&R!*8KD9u|D6|hc!RZL_l6qV6&|A zL-!QV+qr4iul#F&=y6(n>s|`Sx>wh)eC1u2Ek5mQIlc9Beb0H(<2=acrd6&kpW=h( z=6_&Q&53opUBBiZ^>yDmnS~DhPI;{ z#c$VjJ4zw-7bO*sv*+vfwM-`9sV zKXG1$Ip_EjHqm)X>pG99PImpAf7H~;KcCNIzr#7_W1aaJkDE_DTs%|OulL)Yj=7;L!<=fW?w!WkOp|m*pC(qM<*_qf~ z*HIIs!^V$4_4<6GR{nAL|ogWVc)AxA@|D>^q5n z&2Oj^dw$4AhG;vwQT%ot`&Bu|>a=5}14#{q|RT+0K}`#slj!ryj8uu#Xt z^ArAU&(HV>|CZ+`{M(+N@@cxsJd)ni_3Ql?4 z@@XG${8yjrv99;q{9w+y`8Pe!#~I}3uIDHG<@u$apYT`xaCm;gU-KI|d)hxiC#&bR zH=8w`FlkQNK2*;SnLLktd8qlvb(=|^eRZt)$90)pYyjJvFuU{dk$~crDit&TmBuAIe*P>>iHob9YovFjpDcK7!&uIjTw*spgXbD z+ES7DA1$~iCrs)K%S0ad`$a=0?Qs8n*nZ5+_tmkEUpzmL-`9sVKXHy7eB@|9JYU}D zvU7^^c+Nk#PCnILf1l&LPE2*tm5=^&^UK^PetAxz-sjzRiz~-+KOp|I|aev^ZIk7pne0$t0pZ=aYf#(-`1c$1RMeTvdWDX*l zbn%0Dejfkw{9@0~`P+`*c8Sxv-L7McDt+h)%UnN;g*9rgPBfXO}J$wP~;*KKBePaRu)y>2t(d-|}&Pc#wmZ^ox`sONXH zzH!cTe^&WN&7FMIt$6;#r`US@(j&9@PxIZp#^+Y+@;NcC{77ykPRdnr4(;BH9}h_Y z)BLaTDG+CUu^En$or%2;XBN*(47ABd=AyoCeqkos``{PP*L>|uU6y*wVJQxc*>Y^p z*m2c<5YIdKj_dQy_}TMw{;D6u^K<^1-^kh1{y_z-+wD5n0eyApne2JVeY2)RCicVY zFw5M^^?7}LmL%?LpR9e40ORU5>wB9&>K{t~z5Yzt zz285`PWF7Hf2@?baL^$#NN!wkSWho z)&s}`U!T`}G?}!+W`EnquGi0fXTExV5Hs`lZ`;!E6shND{GY+U|GVk^{MbBv;aKH& z)5|=SZESvu=V$Tv`83z1=WBk6cb#86S@Y2tBntd{jh{XC4j=is%`cv>^Mm@{=8yWP zcz!iMRK9-yAUoOf5xzY)ww|x^qkfO|k9D$jev2=0$N0jrbIPt?=I<}l{tr4?J&z@` z%N&+g`an_eJt>~^v<=-TK3%u*Vch!uYoBHI6>1rOn<-AG$7t-$_$p?pQ=2Isk1UoAct2lg1dje$0Bj6ms?D<$WojWCO6=dajJi#Om%K+?6_|! z&Qaafv#~g-1pQu8x5k*$p8t&Z{A_NDLt}A{9il8<>Ks5$DE#dMH|sRdy7eBoKXM*; z2^ob*_{?z~r*X}lV#`*7?S^HQ9&U$5@QtARKZ2A>8@^e-lP zutxk|*C5W%ICC~P53dHsK6VJk{L3^>RN0QxuG?NO`O|9z4Tpk6$E2I(&^jFXjc%5S zzx8@UUN)F!U(4yOpZUl2h5$eEdg8d=5a5Si53vVJo;>;aLZ0<{Lzx?`{G(1c`Ng>{ zKD=|APwuj{KG*j?pE`5EXUDDQpXhx)jg98#9sVdksPAn)G5YyQH~H8fCG7LX-Shk` zU(aKY&-weeZRvU>oad^qy@qPn#hJbQkY}fSWS6$18*%J9#*J~Eos7rx^N+ey=a`iG z0~MoZ49l_WsOKl$&hu0~KVZ@h5B+XBHx=jI#LWEi9ISClZtMHc@vG-&@mo&l{f#7b zjPSP|%~e|WxGUw!}ZyW~mxNe;`-;raXZx%mEk_WZ2A`;IA<=agNSnEUxr z&(HX4pN}BFPWuPdqwVNMaoTlt9i@jIXE=Mp^+{_D7o_8ho= zj*~pM_(y&xeCyu2c76VliwR$1vz*@gIX@}oyaf2kd>$~Ncqz}*IzOoCO}_Pf%`cum z@}$S(VNq|@d9d+YkJWr09D8`355_5mbN=z*i~QpG_4teD>-?a;x8o;|0vzx`~NeNM5isPj+f%D(v5KJSd$WX})cNA+ksx=|hNI_DQT zwl&4$+4F~c>Nz`PN=+@Zcz(d79bDhzZ1L6eGyb;YAiMOlt=(xIo21ic;c-Xy?~I>} zd!--j+{wpn@Rh4e1R&nw#RvAV`+C-G{!!D+oAIeXewbsG?|*<{?my?Jcz({;_sJ;7 zG_0H-d%lXh&wRdv^D*Nm-ZV2=jmpOZ-T3J-$@e?_;`upW-}9qzv7akHR2y&nz3*?0 z>dUoq<$p)Wdyd(zCk!Wz@}E6F&Clxm%ATL`SN))#pYgxGm20iN^H|B%W&UQ*5BSI~ zYS{67lgXaPKI$4>7Uv9^hd;*00!e2?c_e5s#JwNBK`awKD=X*R~&o6M<^FuzeOWV$#WgW^Ft=>;5wgg@x}9VzORnpoN|Ic`FwuP_w`}TPn=^1pOR$G@lu{U33uyy zogdWH$v?Z-GO15=o?heExOK_FNbi)M;red;w{mC`T_>hpKlhLHpoeccmJj@h&w;(g zr^Fy`q^3Ts5>Bz~bzSIX!zIhFju#57s|FO<_IK__#+4J-K zEYC0Y{G7k-h-H^PJiW&MMEsxq{uIy8`99A#>dT%V@=;0Du#EBOf7K7-`8nU`d2mkt zM19%wL;l3`4W@ejTHBJ7Ak%oh&wR%76aH!)56@5d%YB&gJeu%tdw#~h>-i~v#bc(w zr+n(?8=ilKZ#+NcujI#ge#*b;`5FJN=O_H-`K6wp@K^nCcz(ja?fE`G=w$Q^d*1YB zQU_5Fe$YIcFlpcO`OR9uS>oyaeG# z{NP+3=@*aDCMi2DVN+eF`keERntJ)Tj%Tk47bdwx{dwi%Z#Umwi?Hj&?D2VUXg=Cz zk{@{@lw9$q%A{R&{Te?#MjOAySFSE`G|pE(tjwuK%rxI@%yykN|HuIKyoYZ+Phlu? zRA1W8mmh40kd;~9YoPnfu_#U(KmOF~Hk0};&oB18BR@N0*(Ls^>o$}4eV)JO2etWS zntxQ1wxb)xZ`U!VmJ`_X*sdS*gh~6J>v+5m+h@`a&g(Wc|9BsE!uNT;=8NZtIpO$y zeOU8TqB_p`RIdH-e0d)&A$MgSUHSOi%SR0My*ayHJb&dQC^x^%eHyQQPC+kn4kZug z{_*oEHsze1Hso{P(7sd$PNppR&kx+8%oV=+#lyFCwDA+e#$fZKTwRXhw@kZk$3^Rw zPcixW6Wbxo5~tRe?oZwL@gRGC9{=+EV$aX{tA3F4`8nU``D_01H+z1_M|NpDx>5e^ zI`YeIu{Fix?0Ky%7wFpaLuTS#EOR@q&*QP-Jo4nB#n59;gYm*>_qpBTOR78hWj;ru0LI&m!1uAluNo-fDI zdduNHK+XH!{aocF{#8GS=jZXS`3<#U&ky;?5N$^{%9UN`{g6_db3C3sueopJe8|Lp zcz(9b;`srScG%XwM}TpB&;56OKZoxweX{yJ2=)9d{$DZnU;iLIY1gqIaw7N3`Z+%- z`Qo>nWO_aUuk)+sqoz0c*7G$V4!X@R9;^90IPuG*zOrw_2|%bTntYxAukefKaqOWd z`|*$RgZkc%pBRJwyva|s-~3wr9;JHz7)K}mweNwV zHrew7e$dHaX3yjLRIew8Ou4Rg&a+&%L9P2t+F@J!UNE@dCDs{#-?ydjHLK@m{I5@3 zd&-}`vd<~DC&8$G7eYNh~FP>lL7mw9^9vt`L zIv>Ymb{5pS>A9A#>|7GlT|BUNPy>*X|{RjPt2eaQJ`LRx(&adp92;b(a zUMF3B;3j!d&(HYwH?^=2zDFyyuAn`pfXlVI^i8XE~oA zFlmQ}em5PUI%ekY$nBnUYoAkW9b56M=V$T%4F3J!P4CAqu}N=y;aK6{G1Kp7ck-2m=w+r(J)wHl1F|+Bxo9@wb`Bd#=BXoTB^Ea}s*&lWunW z=QzdVu{cX_>9Nkt#4e37%Y0}tao+;7IJ(7zKbDy4ofeZP^{j`GEZtXXguU=@P$PB? z?c=Zem`P)p_Ie}E(by5+5|j4pk3B6gu@6eyXNp^c`8=*a(tdoyQ9f{!n#lQPj5(W| z;=0$?k`r}3m$h|wtYecS58$dpc}eNXJ7Z=CCnL5NpFOdwDFc42aFYR}TP+@yI? z^(vEit1i=cH5BJ)?1*nEPTJ4Tuk+Z`0u%cTdI=BmwTWOpytEW$MpvN zy~sKzRs5mXLrHQRiT?|E4qtBw#Bceo}Kc8P6jhS|EN2)N2Sys_;Y++S)S+4^GL@(V6rEzd+V`F9$I|m>ar0t z^UHHE`tFl%mTA||@vG+}{LuRwN$MEkZ#zc0=a{jY@;t5cgPPvtThG^gcjuSxRtf&r6uaD9)n#aGYI_}h+y?0Fu2qW4IrhfheaKjr*m6@Qo<+Whc?FY=4$=kc$6|A}fN{W9m9@983}{m9R#zLZlR ze>Y6Kj{T3i$oeJ!+4Ix*SLavu{EWZq2lf1n|Mjh0YwexK*7-qgvgZeUbT@5BH|le{ z&h^{Qa~6-Y=dsLgK#8u-88Z187f*`khfFHG%kwS1cz(|J)Um}E&(HZD&$sweKL?+Z zWag%I^5HkC@hShx)g?iynsWZnzo+Z{J~t*e_lk#K=KJ|rU}O)s^5f^z*wyVeej2jg zPupBP!};*Uzrv@nQNBI=@;pe}Ykd*>AbyI;%Qv0}-}ieA>JGH1>?Dk8gLKk;sYz=>+{l+=XoTa zA2Qi9zC2LRpZVhXIp0^unlGN8^L>3-^AqRV!KX4Do-a;FxVy}wD_{F#&Of`?GQl`J zdF3ltmlS00c?7yRIChftLN4>|J#hT&K~?jG?uUQhfheA~b?dV4F+jWeI=f$OG*z|?Jw;3>L z2j}^G&DZNTGrq5mHD9mW%=o@OtoccEt;+{z7HGcf9TwQkKr+t+$NW@Y(z@#M zQeVDXIkaDEop6?q`nvh{H4g2ke7k<-Q(AJov-mk=VPYR=e`3RY-R7vX9*+-O^1nR4 z*z+8a)Vagoc5Jif_&*VUn|je!EUQ z`e$Rt29+>Z|W6eLV+f4YrKCJmE(fpt12iI({S?)vZlCl#La;NLUvH4fe zJNP&cu-AkOlU!o`WBK5E<3Ig3+`QK%cyPY_$O|5+H7iwP2BRB4J?6~+5?}MKOFdpb z?Dl~bjg#hBYn}Gh`)S?gUp?>PThH5`8P%7z^W_KIAUA4F z4*outl#i01<@v>)cjRZs;dY7Ny4|j~;up`)`99BI^Ml&(`TUTNOw)FBqxkJQ##H4T zkMsFFmPf96!eHAY=MyIFd#>a0K5U;!J2*XG^N;soC;V;4L8f)A`QrIuPB?yFAJ+Vo zD7kY!m1{pdU*1Pc7*?4_S3dss@)3i5Z_ch4&tLfn%FQqDDbRTBa|(Kqb0~Q@_m7`X zu_@>5v>~7ShW6zqM>chN^t_2J%Gden;oCae_=%y%z2;xJx}@-X@mr={r+s^Tiivo0 zKDI-cg`@SQ`_q6go_FvapSNlC4?OLPf7=o0F7aEp+w~S-JU@@$=Xv7T{>R_!`5_B~E%yEY89Dh@ZLX6+Q*xt1n_iDodVA{GWi-+)xQVaGSgji&{*7H@#+35YPQ?dWXOI zJqY#uASWFEuNeE%_c&7Szv?>Wk#pwb_{eRZkEZ7n?$$Xa+gxgTlW#p=^WmV|{Nk~i z&x4csznC8o@K5sAS$xO>$d-K>`&kPTKyiSdj1$kC;qkXfs(VQ@ee&Oxw1Jao$P8ah(rF_E?jj`{f;e@%%c!c)pIG9DT2U z#`UG%y2r=)7I} z=V$z%!C(5FrF8C>M$S2YiB0nGg=2kv%YBF))bn-x#q+cHdwlDGn*S3WoISkG2P1p9 z=JVig^1&GKb3d-fKjPEa-po(&{CfPv7|gGm@h2pp-=BCedp;7sJvX+VZ}pG*F~YY_ zp7}w!y3~40+Sr-Z{FOLu&h0vFPWw^cpf>q@e!w4kUXFEP{y4K6F|+CA_!I-hM@zn$ z`1Cx!#Mxk(ed+mwo+IeiXCCjl=COO2rB3ZQ#pAI!OK-KADNXZOjXhy7G9Ow@+_%6i zj&3p4(e#+O$dgYv6PxvGgh8D8)5pYCBj%;&?=#iEPmUd|r8sH7em>Iz6Z;H$2@kSc zgJVCg8`6G!1Ly-c=^gQDj5(W|;=0$?lET;Cr_%`+V-#=J09YujE;T8)P8@G3D#1al(PQV(-L!3cVtt&8mYV2s{!V0 zZXR9@Fvkv|ex1%E%owO&a8{H_j*}9Ec9XgD; zVn$w19M>BH@rPayv0q~Ge<4@pdV_ja^Jepdn%?9W=eGFhk=uOrZ;Ov+xXo8@cK933 zA3PSQug$;gZu{2ezs#X``0D68@l%R>@zY~>^P}$Wh5{`3OJs{zj5MiSV}_3EOkb*j?vo zogdWnCZB5F=c7k%^NZ)}_%Y7ge42)X`fm5~FT3~nWe%;@cg#n9Z^ut5?!`}!-ObOa ze^8q2`B{FxFlU$EpU-bUgn|!L7dZ6Yb-?#b2^EDrhahqQ}-{f!i@-MsF zTHE@Xew_5b#3r0%>O1D6zPID26!+q%$L{85)IX?i_WZ2>e??A~K5v^nKjYiac71)8 z=M?J-sgbSkM%N*z!KQwD=6BOgKk;EdaNwwu(KA0J=9Fj|XQE%w7neL_&kvZigX?>o zExtUDq96M)Gk@E0ko?>;BpYl5IuDNRP zw>SA^4$b2)`9bW?_>1S~{NDGsY%kUMK`*%SkJ4d!NuGDJj)9astNs6Ui>{%zedPisDS+$$cw<=F3woAY@b;N0hY2R!59b5Ci7V>( z=^pafTYSy8hi~&^YcYx+TzCA&^B8aWJqDY%I{(SZ$99M3QA5MGtwet}nVef+9w?48|F|wT;cq*3-SfGDshzE@}T_d{WgAV zrd(Z05LJHUZe?2jb^XHU9nCl%yF>n*Vfe5nvQkOPjd3nFDR+x zKb?Bg9;@by=jZuZo?qgAt2kNpl0+j)A8AAh^~)?LI=CtvSB*VoUtOzJ4*Q=jYlHGbO8 z**`oVlta7e`iM`*^YX7851;Df<=fX#w!Wp8FeZe1&VO?9u^o1om}xy7`5E;OHq`6$ ziN;~_#l!j_=)L*Hp67su{B6fJdp_1D;?L*s=kvfiKjQg0-{<)&A9Z5S5BbOtZAUkX z->zf7s-}2cJp3m3(epUq3%*&zEa8w0k-^!R8+|_426*jq5_xCw)HRb@M;y09@;{+pYiW{P_8_ zukuIhHa|3IXa0E(MEP3J>oOnKc#^{i$B+8D4Zr=W0_ldAGXh=9h{!8`N#XP6TYvGHD5eG%n8Tu>%*F#5*1?3r>EupIA1F7 zbJ6bSIcxI|u9uG(%6oHm-Fp5SKZ0`eZJcP#!!y?NS3VlU&8JP(UDjzdcl7=Se{<%a zLs5>Guk+tg-zC0sb*aY#jE1#+;MR)S#&7dh=O+d7Q#^0$JL(^Vr|-k^ar*Hu&oB18 zBR@N0*(F!j?RFhopvUa|g5UIg*h&08&tLh7n>{~_9~GwU=tl9|b&9ybWY5$6)FjQE z51E)}bsqF{m3=0A(vyc4U$5H?VrKrfW5AO-w)lG8X2$pQVT+#=;r?|HqFj4?={$S`#OFE<>nioQ0pG&mc{c; z{^rZS?5pv6`4otckARQ-B-+arKkDn|7x$j|l;U1})djjNOf-<;1k`sY5sc)pIG`tV-qOy6u0&pFKb0uYQkGJwM~y-$KDYm)|<*<)55A&419z z#q*LI)1!Q-4-{kkxk`DBbI!AV-e$n09Ul7K^k&S=-}i0ld(G9Q#`nwx&J4dfwwt z|IX4T^T^{%Y!d$`#*+RWGro`5ttsdKjBhTPtAK{@y{;iWe zKL|I+mpENCaTxj1WY^_d&HDaWK;WWM#7cy5AO9o=Ihe^X4o&(dS6m+5aK zuj#(hO$%*$=&NJh@kg&Oo4Svg+BRHXnaqQa^Q{CEUqJQ)GQG$@_$I#bYK))rYJ%z2Zue?}8TM*| ziT5VT=S!&O{6HV*H4pMQBm^z^pukfAv z>iq_%f2Qx}y~paiVouH6k3`MsMU>nB_8zKTm!6^PT`&;C?>=n*qrN}7d|YeNcJz3? zZa!i1xkBApdq}1NU89XXFXuTMCyvAQ8!~x}*1hf6B@aEmdVaqbQRc0Qnfdh`j9A|3 zVVQRQ7{7Wx!%w}xu}K{>{AEQc))Mo6?W^Om@uP+p`PTDo{;TI_;^Q_56H(M)B8ppW##bul1)}-{N^M{!h%=srToL=RN+4IklEK zW!I&q=YCMndwly|)@sfv)^%4xcwvhmYkdXThF)r>iPNnjN&)_?)3j$ z{MGaG@z?A5Ha|Q+FmLgn6aQD_eCqSI#q%EDezxoLy`EF7D|+$6PoendKJQ#TKZt+m z`8H-Si|55XriXYazUMc74Sw|4em&3gwaa7=f8rdc_ady@?Rt-|o*%@_{AEQi=`}Fw z*u9?b#4q{9_D=kpo%>i{iiai7)ydxupS4%6F3Up1EnHyFuU+>$r@ngGS{Iaj)1TQ-czk0IEUu2$o@z3$A=Y773`SAUx zQT(-Ee15GXxJaX7KN{aOP?EEU8_wqCA2lc$i zpYt2?@uQpnq37G2gUO!9@;v85rd-=lS*Sh|-+tfroXK^Jko^ScvMqUi?%{-#*x8l#^oOotDO zcO-u6TYIc=ezsuz$URanHKmf(TG->h#*gf<=l%Gn=NEh4=g;~ko`1~`>dT%V z@{>*mlRb~zQ=u^LJ9E}y(mvJ$%lfXN<+<)P*4eH)J-t7FU8`!*gw)`u;B<6IAO zE}lfG^?Dw258>#XvL1fr1;y33e2mw1(e)aq-U%9%Zzf*70 zf3$eRqjGA@^ml#UdaT1&9_Q(9K8>@)>+)+&kNFwJZ{l_NubfzZwqX3&4q*$E*0(+X z*7KeGm-{x@;mkSQ|I_n}J8Cw|J^(dX)c*XJpn+ULgeF5g~5PI%tsQ|&co>L^`*^_z{K zwhQK;drO(Lo34-e#`A9cqzYx){EYav-<|$nUO9TK*XNJ<*@F4Oc1VdZX}yjm=y@kU z)ALI`@9<~+uzTL&U-tYtA6(*l(KG!vn|0%w5b=jR$(w|d&Pu!`P2jU+P<#8^3mU6K5|y#C%(N`Q`cYl z*eA@VeS7YDeg4>=ID*&nlK;c?@GH|E*YaQI|9Sr$@54v=%6nb5{W-^{^hfi9W6so9 z--kUMr;R^$9YuMw`A7Wh`9OYF9CN}C;(4Dx=QnWK^Fw~p$zZYPUu%2F`H)G@dCl|w zxk{&wkv#PHdf#Sq_z}`uH?jQW`4mVjKa^+XZ?u=@ zY8b!He?R^?zH)V0k0--=qd?1fkhUq;!+2KLkH>BOu$24r8w1bz)ANfxABcZN&})hR z9ou)V=X?Dlp7;54enURk^Fw~p$zT@GOYXZlA2P8Y-akK{Pu24SCiltQ_XsflFEWoj z{_OW4)bk$yE5<(cJ&r9FKaRhDCVw-pVX61_>+L50sNqFE&C_#!^}Ls#v-qtCWSe9E z=y_zGZ?27-{2-?ytn#^!ZqIXnp2t7pSI<8azlry7U97`09zN-x!*zZqKilQ})bm%j zzQyyI{McHw>&O0)>v`nE$iK8*)$`BrDgAOC zGS9D`2cz+W_=}#WUl5zAHe_NL;BFZHnDx! z%a3~ACLj zLb(wCh>!d{%CG%CpZ`((l>Ue7TdwCb@!M--cYYPmXZY61*7Lpo5pJ&kg(GvJUAN~E z)VFwEj#KL`WqCt;jXxVB{1+yBUfCy1n4ZtOKhkz~-Llm0Lzd+*wT_wg;|In;W079l z-*e@$(pn8$LVh)PwBptQ$(}B2G-~4NfYN*SP5qJb&rYXCYaUHJ*GOE z{+1X!&MR^sxyM8rrs7oBoG`h-**Hf`_3xcbux^i2J)4cwsgd5p$kg5I`S*#Qf5-Uv zH872jABTCgyDbst*dZp5F(xLq#%5h-*X`WLw%FrkL1|-;?XbiPo8nbI4R*rQ$>^r*UEo z6U>eFI%Ogsw=;EK>U`CIQy|@W%JXQ$UpHPmsgZg$lh3GE6HISz?p{qW!(KgSV%k`* z+4Yw>Sr~ec0D0%vlBPBwX$>rg*5SwxdRQj@t@j(svcoj{TF%+}k+1I`>Tx3c%4bHeelQ&tHlU^xynX?)j#^o5}x}Up+sYAN1QG z{_6Q>_|@}Q`0Dv?{)^{5{#WFD>hre6^B&)Rw#%MVtSfr)tLHtw{Y-&-seZ^*yD@meSV}5dwi*%&!>9n+*~-%(*MUfg@PZxudG~M)_L2^ zBQW>x@tE%p+T*tIBPi~b2p>gOUmf^h?EZg^ANz#)w6Emk@SPRz^Wut5f8q$z`+S^n ze)4=ec#KaQY94HTH}ia(f8;&PxAm>-W4`7iQs0_?ic@=u_?x=Amw)zrfFHPyYV(6* zv*&&OtRKYlK0o65Hhyq_bo(diWH8zDI(N0k)M%Ir%Nri!`!=X2YTEPskeTp&%NNi4 z{8$}ZzIfi}$2{NiH};Fqx4xx1=-gSctNOpqzxJQcw{w#!u6%pkmakl0c6)~FOT*lm z+)u^H_WnGN>)1co3C$Pb*PKYdDxca`J>TXZe|?aTxPyG!tmfyRDd>_nTGjQ}_)*_5 zzj6TFkG0|HbH3Iym;cR-h4|Y(me=_4NA`SxAM$+57tj0rSwD#9eSXaIukowrhkVEL z9VUC83xnR*8q*s6^9>Kr^R&-#p6Y!Y{Naqr{T$0f%h&rh9zRycmaq41JbujcEq^O{ z@%SrBU42d*nfvYYHvj5*l+MZj(evaF;iKd)$F=<0e?H%O4EybTtnVIc^P^l{Zqkg{ zfA2}|A3TpuO3YZVd|FjccKFJ3^E1PzaZ2BN@gqnRf6dQEgwy!d^Vr6Tf8lFs%}=fG zm`~VP{KVNx{>SUKf3TC@pLgP)o?m=D&%q7-GwTQOyw9KW8|uW@^FuzePTSFg>TB1z zeyEGhIsUGmFSXsY#&u35nalop8$>$H^IRSBA_yZq`I=I(qx1|Ms~>api}OYTdo4f|8}RZr4>8b7Vd zx@=?fZ#?ht0qN$4nCE=V*}}zE!}w|b*ZWSiUyb>k&z?x1M_2bZ29|r8;2k3!zzaKD4#+*=i`rI{y$gdQtwMF2hYF8kD$VQ6EpIIF-YAh zwR_$={Dn5Ajd&*b`xAd;&-?u8`Nf|1`Lliy&-?tC=U?*! zE_;5+PdXVa_Po}%E=|u2nKYH9)YMmNYllDkJqY#uASWFESB!n? zdmLLVejFcjqRbuh*@M-3xXC~2f00jpvZ_BDKK^)_55_4UW4_D>W5i#s!tsnXFc^l-=@x$!*DAn^G zf9`vr)$;>>(#c>J&ueZvIUh2yAMR@%^Socrzf1i(Oxj_Y`(7}PS3Ez6nfdDqU#-#` zc3onY=X>$1=RN)>#y<7E?BX$xFR_*0##kU<8JF>}Y(r1ebtvV#dVZE~J>T-H=jZv= z^DQ5vxR@X7;V!>;Wj=nysMq1>fn)z;Y!~?(5l;El^Rw}f`IP=LZ=Lxoxo!KC`0Dv? z{?)$;zI8JESFeAX{8K&h@!PSq>vn!E<#(9PaZ0{qLGw^@GWWYK)${u}T7J^W)$@9e zLXBR}twSdEJO3Rs{oYv1q{Q9yyXmzrU-P^owwd24QqK=^!twtA{`KEYKaXE>D?Rgx zW2Jw`%*p>5-+ErQv3>p>1nGeQ@U;1%A{t+KzyU5>& za2kL0{A~PVe(lFA{H?gITi@dO4BuWGThI6S>ciNp<#EfZA@zFN)uN7WXQ;xYp2`kU%9uv<^Fsq|`Om%cFPB^D{r^keoCgT*BoiKUsWaC6E zr}=9rid114A#agLel*?gShR@#pr2>gwr7YDIhb4<7A`MNpB^ya3xEyo-?L|MAj z{Ay|_N7iYPb?XywzZLKC61Z|6lhj}38?VOrJeqn9O5^4S0;~P7do{uQeAoLIedg}f z1oJCio5{WJK6Berx#h8MU~YWByT`!Gi^TXmb4_}MQtPZ9nn@}u_~w%xNmK5F$SAKrPCk9ho9kNoR8)Q{Nl-H;zxcS$3d6GN)Fo>t_wDD|&qOyvP49`0c-n-&U;adtBCaEx&qxz)w24dS2b8HIP>2 zYnvf+W9N{zX0^pz4sOC`Z>WKUp>Dc=j8Q*<&W2G{;TJo;eSUW;Om)Z_{iha{L-h-#E<+u z%CDY(CVoo)!}ZmEPs}enrxr8UWM0_*r+FTW-}>R;1mlVxAFc}ZzxA7Snsr^vubv;& zH|gZ+`Q1HQ10Kp7TK2mkQ*wUHvwD8Oq#YLfTFj2!=A_40&wG4(4PejFwx&J4=GWtY zH9i-PIKO@Vm>=cp68lQu)SPpEEE98Yk@ttN#Bt^RIG*I5xBTk)EMMMx^Z3>C&+vJm zoR172ZHiWHU+=W}!FI)C&+x0~bA0R|Mk7T2Dg5&>%IO_&wG4(FW36buDAT^`2j!aWc7S?gVsPw{f45< zdVa`ck6rV;&%fq*pa1oe=Y78PK;}hRhp0@AI#D-sgY47_$DWEG+$nzjeX?!nVa)$2ezbqo^SS&`$zuJ3?66~U z{KH(Z^Mco@-QG&x5kFtg`}}L3_xaa6KjbH!jGp;M=T`hjg`)p%^Zbx`gXewzHP8F} zujnzo4{!Uheg35nHP^aqbI$p(%#Fi|c+y-4B=~%N9`dm1zZ4()h4?1#DL(d#@)x(~ zoBR_!#;0-4@T2)r&*Lbm{Lp@p{vm8We(Zz&Vtn+q=bSeGjoal|GDlwKm)@Uu@^j7e ze*Uj{e#l3rQBVHNDCNPfW54Fyhrg@mwYFLVF2x&mn!Rs>UC)_Z$7}a(eEwz6JMn+L z>UoDR^(u1*!;Q@&)O0KJD8Zlde2O3S7!OoDkm6H61U;i%UA8^ndWP^JzVUpDAI%Ty zt6W`%;-~#$`Pr1K%K#ty1p5;k?!3~c`@gB|?3_0LGoE+izwCL3f7$cr{7KK7-fVN8 zWSaXn=W*WP`C-h=zvg+Lf6eng|LFPX>tgkMj!)TAH6TZ!kFNbBVr!I zh7a;JFS^9h+BwyFjFlIOUp=4Y$347FTPQ7Y<{AAou5zfm8(mPCUhQ&#!u;=$xrlsWQ{i&f7GC|rSI=kp*f09I zyUF;&d};3Dv-AG6`RA7}q4+V*3I0ZVh4^*;V;_1E6Y@N^4f1PUu}_M>MPE;q^HPR? zs72#^(#abh67T-GN+V}nHzGx{qdM*{rvoZ z$)5k~$FltOLvmt2GjG>>eEs~q$N$Z`EWcTW|M{-J9Yf2y-s9`%=RN)c&eHh~>{sMO z-=FRAx9w&Av^nSe$iD4s`Sy9*T>HFweo?M2U;41+oE^*ZtLLBLVq0h_v`YdKdDgaOzeaGq(ANY*71*ezB$ed|8JPTe=GAB`|RJNJgj&4 z`uTZ}{}=e}FU4>6GxK)6jUV;>(e*>p$zbaB{QC>L=48nH3Hdqw-Gg%`iDUV1-ipEJ+H^n@krX<5S+}- z|A5o}!|{B}ubv<9aRl0q9&{|bPCkBhGX7pXud#Px9x}hjSib+jp%xmSN6CZzogeG@9$!80@&5$=p92E}Ae2pQ`w|vy}QT}%%0)Cz9m-=Mekv&hPP+t4ke^r0osC z$=tN@W83|A8tr<^Cuh6)PdZsWU)i0Q7y4x7@ti^1^8;g|ah16E_Z^2U%VBDDdY>sy z&oQgV`%Lk8j`?+Wcb~a!l!F{|+kM?*;gYS;MD=fvlUnNTe5!x%96MOI$4TkD zd+f+2yEQj<>{EP7`|$%$)cGzx%`vM(`%H0Xj#<6gV=7CRnhPvhTQr_Cznwh~jqP~= zm#>v|iTaiE%sqUZAJnUS9GB0dS#e&G`y(`NewdiS_)>Z-!(72!ZBA?+fd3`WtoK1q z;@tAg1#!x~j~)}x-Oe;#P2_VNC&qAloM3WOA_up{X}o$H6YOF#vL*X^emvs=WFUud`yFYv!eWWa1c9>>g z;nXohA-hBS{QZ6d`&sKo(a_6aJ+J7#!ndy{))mKKpXxTp`1kt_3BG+jRNdO=ZyN`? z|893AKcC2n-fyV>>hV#lNBQv1qkNR`Y5wwL{*j+Y`Ka%sd`kb5`9XH{enVn@+536b z( zd;D!Hxpwkn;~%fv{8Z0p;*ay;u}9-aV?525Mrr={yX9%_`KEtT`FWIIJ^xI7Dg96O zC+b@~pNZejDLdDsF1G*4(fRn-b=j}|tSfqaxayxU3b%i(->lQH|9+3TprCB`Aqy@_xE+^o{Zj?>Gi+yjpH9%-%l|0GX>TavJFi~ zI{(YOg{%IF{^7-M|M!1>fZO$d3&Ogt;&Sv;@q={Rl3l$^ZeL0^w;l8+9P zc3A9dB|CQO`5s?AKZu$6*5|?zC%4ZZasnza{M;t z4fqX}zygk^hpe}J)Ks~;4D$8+C1ZZ|yqEvi_+xyGP2<*OAbz~;#7oaeez4tA`tlKe z^?W8jh&>p8^?Z&`EfdSnHj$qd;Ya!E`BeO7ep%1A{a-zw;U9Vx^Li_vBkS?i^B&*c zE4F^K>n*=}e!x#USv_yu(9WqOQ?KWTO!n0^&-?t==hElx^Ayh8KL5q@KK~Q_pw|F- z&-;Aad-NF;{l5Fy!^+iV?R%NNG){YtD06?Q-{&6lF`?OyPw^4n(|k_EQ}L_kv;0JT zr{b@_$1tuhrJv4&x%fA1ufO-;@x}8wzMWq&&*%7duC?n&KZxgj{x#1J`AH{(^^Iz( zbGPe+BvU;c@-dSz&wr!`%~`w7^AWE{Y|QvOdmg!`Leb*3>-iy* z`{dg7yw6`(=xUwyywCr9zj8hA^AG*Tn@2p1nwDA)YRdVyeD0Nyhim`k_}DMRuX)Mw zv0s$W9;?Uc^n52jQ9g}R=29;HXns)NDL(BN=^yocE!fRXp$WuX%pRMH;^C^DRV?0p4=J5K*<_Fv2zes*~!w31s^N-}mcs|9S@O*;5A+5RV`C5mL zbJ!1u`lhevb9{TOcKyWjPJS+X{+yq5GHS2)ZEj<#=WD;8)$y9=ef~Ai`~1&Kp7;5O ze#0p`8&&x-j`ruOz=tF8P8|qkMfnPOQfrPjof;SFNq@YtLL-) zxQ91(L6#rwACyV&+nhV6%}?6%x%dxr4fEQ6AJ*qz^ZbxM>3Qv)Zciqe>iHp)>v+xc zK7U=83-@h&{x#40{6p`B-{%6CJ)Gmy^?dAoH1yvjKlVN{JTS$NzK;w(`z4#7C|~F2 zQ+(y>vO8y6Pln%Tr}WcFC(Fl;gy?yeJ)h*KJ)h$r=32<}KL48Mhy0|I!7BIXrMBIk zNix;*+Am$^4W9S;*F5j@uX*0*+umEDkJ#tdP*e6~j!&28F}`{}%g27f&-IDtvwYY) z%4d%~#m6`&_?Ume_|5#+;{;wW#Q7#KN&c4dyg5!F{+avp7&E;H3%#DQbFEz`UA+;C zd3t|-bNJUhKg>_k$<_1v-U!CXW04`y*v8+7Z9nH9Rk-q7Dlx1XQy@wctyn6GQj`%w0k zJZ#`^`n%B>mwq0m(y#{4zhEiNAXO8GiNrGyLk8r})a%Wyd+} zhd*O}{keRO9oz2TPx%$k>u>9}{cq-zGrue!F}&QXIroox-i!b0@97TsL(jK4sh-zd z>oV&3Wkvqae)pi9GdfJJ|3ATRKNY`WpZ&KE?0OqN>ieUc|Dor*%x}VcjorjN zWVXMwSI>L=e+BFE{fBK@wLnq z%$5AuXNt#j%9J4yK&lI=inAM>@rm}R2{Fd_or0D({5w=dflwYaru0-U*T1`Zl-bbqr@Vy?Ou(=%*=YN+-L4yO)%^Aai6(u zWiBL`pBTGb6Ze>S?slf}>TPkNT(`#wCO0K=a9f-h`|V7`cRQ2Pd3P^i8j)wYQd~y7eUfP0j`SyThHFH}OlHHs^NT z<_EQUl&{Xs)i)kLn(EQ`scWCizk2zp{Gh&%#;?A9Dt=^N?>8jomz`5~uJz`xUT0?J zSG~qs7VC;0|92nx{;^KO{`1|_brR{eB1ws z|2;py)^*w6YqFm2@wHzv@vm^5e)bLf@1Ae@)$;@X(DPkp@w~cC$6%Z}WPXpBzyGk; zlhyMBCVTkr*!S<{{=FUhuXtYHOYHG={2u?0;QX=h&phAbD_57DoN)ZIulN?di-XC! zz4qww)$)csQ?KXC-0H+UWJ=6^&#TWmO!lPpxgC4^{E@Go_xLOFsprr$&-dcj{Ca#_ zyED)C_{!BKwxKr~@Eo%rB|Ne^FTQt z8UBK>V)0|U;^Alb6o}L_$H#u(Nv+5Eub$8GF&9F7DsMji72!wu>iJas<~quHzU_a+ zuh;XXPqB?ZzuE_rC5?|FV0GoMG+5A>dMJ>QF8Jn!?bdEVzsY?2fDyoi1u`V-^wJ)h;*@1u|T zn9y9;r}${Or}^C6PsNY?Oz{)-o#gB9F^ua==_fDd^0Q(4C|^9EzAKWQ^{e7}={^5Zsezbqo z^SS&`$zuJ3?C|@rIey;rIey;rIli3>?RwAiLw?f9=o!5~PldvNh=G^fO3NFbnZ2IJ zuIJ1fJn!?@kLAMkywAVpd7p3lVdKpso~+jyUj8kguiru*uKkzeW4{o;<|W6+eo?+O zx7(k`{6zUQ&N7Fb{y*}g`BBf~C@DVe7wI3u=Htgc*e}Kx&nM%bxNnomPu}yn_-(D* z^`7U4d}JE+{E;4%bGyzChsR%->iJSz#BiVI&zbjl-r=tw7d`LrFMHnM+kV)%?2&nd znr~V|S$1m5`M3Nj&nM!i>xHm~r{V`b>X{NZb~wAX>EtKMH=a-NqxnI7r{bsmBK>1L zpNM}$deWXx@blO6RIhk_r#zqF+qu@RQ@g#Dc*)uB{GIfC?ahu8l1!XW{)gfmGI<_d zzHj5?dHq-}T+jRQU-P`rxBajorLlRWp3m{AUNJtn6ilGLHvVOa-j_hTPw`3FF^^%x ziTI;@&ATo!AKGiD&UqxtSI=kpaSv}(`HA)qvak1T_&CA*q_5|5`N?}e$G3B#UGI5* z$WJ;MJ;T@Y+B@BxCz)Wd=ZDN2Jn!?@k1L+{`PV$}^KC!G-{%6CJ(=Uv^?dAoH1yvj zKlVN{JTS$NzK;w(`z4#7C|~F2Q+(y>vO8xx=aFdqlzuu7X8FR{_hL_E3P;6dmQ2KNjdqE*rew-@b!1oKXF|B zJWLyZ^}HAV9RE9-pwc6c#E-^!nqTJsWBGZMUp@a!{FMHO>s$K9i~qOi^WT>Fg>B&z znG5!Fm2Lkc{`Xk?mVb6V-{bE-bNb)%u@BD2?fI+aSI-aflXP7;>hI~USYJyXtmk`t^}NUbcQEz$bk`O9Rq|{--{Y(2J-+=tUHiRk z>-ipkD<1RsvaiIvAbwoXbKX8NF7>(#h5H z8oMr~RejHYBL36gF)ObPI!yM}@BW0b|4H2SD>(XF2X?*3SI;X~mnLTB{|x5O<=kQ2 zZr6K!^}KR*`O5z*_Y>vp@|n~+~S-0EuPi*t* zpI1Mg@qfa;KNY_HZj@c`@s;S1$h^NHi!&it-8l*TY}w2o0KKaLaSx;;*sA9v>yW51n=Jl)QublyF7jGWz?t9$jS z_Ji$D#QC0&vpTfT6#wMn#6HELJ*KjBN!v>AbD9@&jh%y$b(;rpzm+`bvdk^Rw_b)% z?f%A_qy4eh>wdc%ll$%dOYXNjF0~)>vjy_gjL*0#bv%@F>Uh|X3ufy1W78)b<*^RN zE2%hfoT=j(KctR_(WwKH`|a~Qx!*pQQ~Mz=KZg1RlZdvZ2UUdTvE6TJu1EOKGT)E$ z5g#GxU3=*JPp{WChGS!(Nlk7c7a2Z1t+AnYU!HjD*PrDz(Fv1Wm5o#Vc6M!J9ffVb34g!7D94jBlFRHIx9gUpV^-(Y zxDBUqNYtN$*cvA4O806{@`>U6;*Pgrmix=6O!a3b&hnnk2^0C-@^Oxt)t~ppiG1E3 zCz#SS&HaE;FS%pCorxOV&ZKnSU3X-&_%l=Y@}A{Mf6^Sw$GNTxz0Z2eRDWjTTyY(O z_l8fH)kAS6?L&{8Klj&J7yUWlG+v7OGsBGfGs8sxp$E@ugkIXDmom&vKHGF&_uHA( zpZCRyyxblqn8hLY#fh=s&aD2tFV5=EJDKXw4D&1c6QAun>CfuV4D%D$HuyZ^DO3HK zVg3Mr{t)nIoH^%DaRBXGT)>Mrw4EKVU55@A`nzneuipopX@6#zQGaHbQGaHb8xpr2 za%=O6IutKunfToNNq<&<-pAxY{1g6vIfr!nr>Q%JjkY?AlW5XYnK;MH>dzb#`<=## zu};Rho-(N?@?&2S=7_2OOpV>UX3*%q3s(AQ4grhnoMF;F^vL+r%&oSsOkK`vB>o(7nz=b1J9_C0^-_-M z)kyrAW5)cMWMW+Y^=Fnz^Y5%i%F?CwR#EoyhLzWz(Z8KB@pty-%}jR4olLN%nEbmr zrvG2gaZ}7u-6@?DJ&#?^>yDB0{m*1RL;lP$y}2p=%rVCf(H_q*XZ(pAZ{@sq$)7{c zq(5^^uSVj}95d$69CPE%&%A^hay@cPzE*ernPsB)PMONmrS>cSP3?5*WcvHr*y(S) z^Qb4AUgEt@nKXtO=4k8~>lBmrJ0JTt!NfiRfAU81daj-0Z9YT(%rU*WDgMkcWB$xA zsfX$DdM%;PBURkj#h2eoUvb@N8~yj*|K|LAUU$9!33#|h$7Mt(LVIZ_*47K9&g5$WN8sP4$7zJ6zRaO@#}=JM&yP4Q=rId+JSHN&KR=#lX!wm;8p;`(#Q zY5H?KcJ*hD>D5U5nPbNMnPZOc`Gd8U^W}M6ntamr=lS~x=%GpG`TJa$n^Vlu`&?k^ zn048{ChClR#5D8gHm0ffZA?n%T-}E?Vt<-=Bl!&ZGspDiruZ|*96JOo9&3h4`_Lof zPgA!xw+Vj^IZe-x#}3vP>ZKghtC7Bb-}|&3Zxd(CpSd_!OzHE_oS=SNe(bnZ8ZgzL zxj5`F!H|1E$W&+}OuVW$BXU zamh0;DDSWHnzuz61~t;p&u8)(@@F#6cWfW{{3mjR-inQV?2yWcGie`syyjV-xBZXj zzLomuIjXIfnLFn-+V6j!a~d!G@G<)AD{}qCjjdsRqDG_7=&C>EH4WvY9D^7A{``tw z8h(~|%g4Eaxt)GK8FAgtghOs;Vmd#;T<*?i^=GE;ZjEk_lhS$j*iob6&&=4d?f5$* z?-OxiZbtl>i8JcYI8!~D^Czy`&YYj}=YZ3=ZiPS3zk7vT7k{RhE10;rJH1}|Me3em zy5D6h4#_YV#EFZ=lQ^qC?_*Yf-p9lkZXY|C#Ub~_S^aq*6E(U$&g#$m;zTx!KQm1C zJIlqN878(3`7^_e`ZLa)^C#lC#h(LC(7F-}VvK zQhu|HJSKf0?eK=Sc)cd%Z3n+WR2lI&XZ)$h(WSO9$GqSw3IB)by3oH%Zy$ckCBC0r zQ|k7*RP6cj_V;}_r}6zZp5MB?F1_PnyQ%%uQF>$2du z&QkSb-Lc)&@ze`?99??H!`~10gW~%guQ%fR9p_neKi%$ic^Dr}pz`0V2WUTf^nM!+ z&wnd5<|Wk*mpW3TBon^Td3(<6&i8%ZCimOtZF0YT-lq0Lu5=!y_A~P~wI9kbbv$kZ zxn4~j&&=D@e#nc?+thw$-X{0k=WTMoecmSb+vja+KbmuPZs}Y*%(2dV(CuF5(_uf% zP2$tzbiSKyXez%^W6d*V)#29Xm6U^d}`{JZNe4s|RGpj%E8#_j>_rv*m zBr^Ax#eEN`_%jpdx}xPzd!Bv3*J3H=2bibVVB{~i?kRsBUtf*-jOW`t!axk(b-Y4rcMveQ{QQ-p52uZjZD2^S(Hd z&En4t^DFvu_!*?)&kXYu*EXZiO6m1yhB^LBSM}$BnewO1^~ijrW78vf{mJtw!jJni z9y9tcdi|M*6a5$RXDZHR^c^DPkK5mWt{8oSr?di|NGkvBKhpP4wZ&)^;)YNXen=W!m{X7)T17@?=OUlyaH=6%6XX)k08y>IcAUs9?oz5dO<`nbW z;5QNxkFsUJD3Y4&g9@SQ~jA`IyIV%^ZYx5l+OIvu}{FC$+3Gq|2`3? zb8RF3%*7e==a8B3r(2~7>dzcA=Fc26=FcP(?YF_P{m(6Hy|c{GHLbFA ziDS4ufQh*Te-9z$Plw44xie0%rkHQoZBU~r=BV!K&)nEI)abmIFa&=6o@2T_&;HCY zy}2p=%rRsB95T%u9MqcU3UV3l^BI3;_)&l6m|l(K`ZLFLdx>+JV^Y7L_q_Tu$HdkH zruI;lN!QS4eWfg2MxBgUMojk7olH6&T`%FkaR1ZBqp@SGQ_N9~=x_Nr$GwDM=>5;k z*hAN!U?-T~+!TN2m@$72nK^%QeIk91ZPM4Dh%?Mj_%p%uYP9<^!3_H|!5sHIa=(>% zlweZwiQB)XHU3O7M-JfwikDK%pg(V88h@skqp=%*rkJA|8Gk02<6c6I)Sn5a+w*+= zNgYRh8u1Cn7JB`jV}|{C9;cZvXLHAnFFIcAllG_fsXZR`;2R$8J;3qUk?$`QYmVvF zNc@>&y1leb#ED(bU5ETlFez8(OpJMo>AcpSVvf9|^Cwv&D#7U7vE*ySyPPsnqbVkp z;cTAL-)7<*)g5Wk*YC`Z%}uxG_4Rv#>CH{K{>;^V>=2CgM>n4de`?JmIizFL=3ZnpF?KCpQb);UFg{Kco?*uPnHxJU zK?d)cBF7ue?;I0j8ZgzLStj;7{hR;?I2GrR$@R|0iC9kK#26-+w9`2gHM*UtW7Z{( z;m%Wza(GQE*Plsd$e%f;H#fzfIcChCLuSgKlFLY4u+4-&<9zxp!{qN7272l9ef$|+ z^=Br|ujr-WXNimJGRzIk)bAMv#y)0Nf8G}-=I-rdXCJVW?~Akg^FC(v=Y33_=g5Ix zGhVK{vUC}l`@Ah;7~E%gm-BlnPRz~J?->Th9`)xS&XhlK4nS{4ayaMDI3L$a@aOq= zuaN66Qlk`e1#>;GyZST3bid119Fk!!h!Yo!rgrvv9=X4rS^armoEXFHae}$z>psqB z_2+$KM~!Zev-xn zmhpH0t3NYL?>7q6pBbk6TMES?8RjR>9iiV3N#t|Ptp2<&PRz~Q$4>ebf8G~o_2+%e z>d*U_)t`4V)t?!r`XTqO!O?m3Kh3w1Mrt-QSzhL-Q zds%-6XuLld_Bu)(=pMJ(Pdu03Z{zu#-4EMO?Wa!49uH}qIv$my)Gt*B^+z^NY(I58 z^+5J`7@fXuO^px7d!NY*&p$cer;caFHQEnv>y&$7Fa3?@zu9?+ICy?hoe<7K^X@Pg z?Yul$KhC@3Z!NieJ{lZDE;9ThbALaVV~;V5Gf$cOJWnu-+fSLh0}{+nj2+iACrs2! z=j&}u)cSTN+U5x+H>LJ$tnTA{QlF>#pZjynM0~e1DV=x6iIJ=061`Ne;ZOP#alYr{ zEUz_Anec&mEflMJc};Y}M2&uQnaj&{$T{nfzixc!8#*RE?A)exn(y?W)i?SliTCAq zB=z6auhz@7CH*HH=X3r~;QYisT9)e2<9d(3zdq#i$vOWo;QyuY zt5283uJ`!c*2~j($i*=~vaika*}Ba?>hvfdaX!jN8lL7$qF?&-uKW|{;rc$xr}RG= zKeAKq<$3e>uOG|u*D}AVyO+hTcjp&-T<5JW+xq?t{?CP9J-#e0~gA=a24;Gyi~G{o%uUM&m-ie6jsTOiSC{?kdtz5U&f#=_mXB+l-{Y(2J^sId|1Tx}a!;B0*7H5Sdfwy9z7q4Y zVt%Z$F1;t~Ex&sH8UA;>ho9kNoSXE`WBlT=XZXm^qkPo&Q9h;r;r#1+HjW?u74z#~ z%lso^Sh~=6Njse+U2H3x8cPy~_Nup6~J1^Ire_ANc>Le5~XBV2=M+tp8fp zTYmNYfIswnmsvcoZtFO6$ow8LfB!+@zu_VI)${a#$>aSk_Wf-c@0sU&d>wy=f9Clf zU%9&M_xS30k1zWQbCb^=@o}x^TYmNYGyLy%4?n|49yjTu$M~gB zpW!1vkMgVMpNXH+|8V|`=e_uU4?q0A_~EO3o{#(AdcN&{#9ut`@&5$=p9=r;9rq>5 zb)fZpkFTEh`2PU^ABFz|)_*AL*7GgDdVau9IvLF3d38_6X+x&?nbQBZ_qTd}z~p+J zxxIb<$XCy2_-CH)#jp9z@XtKo<11H}ot!uM*%tm@A3y(zo{{_GOS#8o^HV*a<>T|^ z0seQpho9l2jf&?peEMvBEPiTJ@z^tb#PKM2X$ zpY{I_=yP?WonO}T-T9^0^QDi@_$&B&jcxs4J>TQwxlsJp=faWvx6i-K-ydCm(#h)i z>V{5El1#XV?`sd4>=Qfo@w&|e`r`}bA;-6MwD)b~xJSNtKF7CxXs_pce3_p~K240! zJXNkPwI1XjYR@+UHTf^!LFMN^(f{Y?5pa0^JjF+NPxCnuPsLAp&i5zn6t3?SpTD;p zs4t~IA3yd15;i zQd_y_LcO}b#!oVh=g*l%A9E0mJ_6&MsD;`Mk zqaNcx_;p||{-}p(q%-kH`Lx{(KbjxZcZwgaukn1MzVZG-4p0B-mpXZ0n8$6%m=RKd}=RKd}Z%{|f!|M4Qe+j={0GEQn_Uf}v&ouR&x^Hvd z=N*33lN9z${87H=l%Gv zdEVz=^ZbxM>3Qv)Zciqe$`~@6d78hT&++q~&++q~&+#|;{a?=8_<9@Mjf9fp)Asm% z;Q$}~H_69u4F~w}z!aZ<&o{imzN<>U^W)j?N>|_$mE!{S&S)d)|-# zn&*A~HP8F}Yn~tSlTHSU--p%Oc6%ntRK}3W^KtBUd(A_e({&Ix^8WoR=|?@@xX<&R z&&8kje3Fmh#Xc8@nr=!zZAdo3O_KWgMUNB}7WBGiT(?7If zh)!S|#}J=4u^?ZhJzn5)2-{Y(2GyDbd zrGS`PK8!#9uxC6kq+A;oIL8 zv7T@HAMqFO=<@75BKwX#-{Zqi>`IUSznG{0>v+E9SI-alNhep&YwVqz44L8_($Cx8 z-@;hvyP9X`j>cENA}9Kr57=-2t(zWSJ)hy*bF}q*kFTE3@NMr|&-eK1`3zq;t>;^Q z_53q@c&vE%89v(RX@2qWGw~xokMgVMpNXH+U*>IM{(fT4>a|C^e)NNSJ`=y4Q+BS& zv5x%RkBRuL6RazG{5|djAN%Z1v#x9T)${vt{)g&8eMLHb!^8e>6_68XA9`3n*qq>R z-)LvU?lEEdBTKoKg>mq{Lzd+*wT{2f+`s$!W9hv%zJ^(A)@SbDcTF&BpY@sB=H{`9 zQ)+B;Yx9ZY+|ER=+|ESXJ;7Y=&L_>2yP2rb?M(G7^;x{<$GwD+>wBLGX7%Yw&%fvM zSsmJEiraEyuior2m8DDd)WMr}ZU)w0=IOVR2VSCnU+CX=@ikt=ALHk|nqcDmS$+$$ zmuK|YFR46mob`2DpSgQA5$CcZmNnqj+nC0yw=ppW_3E8W_0?@m?{ae12b9?>qFpeEhvz+gfdA`&FK!*?+~ii`{KQ!F^<4FAFaM|&`|BzGcSs)f-&1^mpXRgUo{As& zd6bX(KFX)`KV09#``S3(7djs0joRuB59xXPd%E?Scv-5)d;Jd{d)%+@zhh46@9Ea- z;{`sa$GIQG=|2Dez}Mf?{T1taKXt{r_`Mgu`hCbxIvLDwoZR{uyEf-T=7O9oD`|=9 zBdnv}&+GUT#`{y}{<`&ikFTCTF25^>uYE!RY0p@<+w~q_J@4`V2A}_}_}sePuJ`!c z=H{F|FZ)Wrjn{4dtLMG=$4q-%%SWCcjUOd@nqT_#vHU#BubzJD_vuo`(iZ+F|(*J#zgGyLlL zXZY3gPx00B9{*>|-=E9;{fhqoTIQGaeB1wszj)r`|J%AO|5iNziDT*Srd!YV`09C& z|KIT2e;2>~fOY+CVC(soUp+tIC!Jh9ukPtMZO9a7lJ?&A{@$={BP5b;Y{yo1={FZa(`ELBm)n)q{s*QiC--ouIZ~4{psr-Pi z-!B>Sv7N@P%V7L5KH5mRx(x8a4#rPyTCP_g;UkVm`PK88`ciqr3g+=LhUC zUp?=||A{%P?zQvFdcN&{n&+|jtci4l>U5vuuszS zetteNkLEq^^IM;1Jn!?bd49-GIvK2QR8yV1T_+@&>iHp)J#)?TKHqw5yiVb~;X%2; zfBde1{?499i*4e#&b42Xsh%G)*#p-+@AIu^#_JRg%`?e?-nSX#gyXl& zyyuhg<6NBce2!0pkMV2&rSik6jd-lao#P{}kSA%RrOxL)-`1C|g+hGVZiY{n7?J#7 z&Q9^8^`-6d@uPQw{exka_hG&Ie!gGvJdWek_nPN@{x#1J`AH`m&zIWX>iKgf&!fwp zclg%B<8=z>4Uf{_d_7P9lz(?}!tqQw=#|dp9YI#@VLg;W5)9-e$-G|55ojH|cF6MXZ#`E-==Z7&j9=1+y*L$AN@$;U~@i(M0=3(`Gj=zMj$H1jv z*sJ6E+B{F)w>j_groOUiiHp)=jk=i`+Vz}@p{kmIey;rIsS%waIyE%z-15T z_;imi#z+56@?-Dw!oySi`n%xE3dSnVm%6{ymrn}W{6zUWKcC_&SC`#6+c^(L6-}B7I9?Qi~m(Q`!#i6DXe2g{7SI_6-r`Pqd&yygK$@s&3_EM`wHLojP-wyzrPQg z;D0sW&aYwQ|1bFMzlz_i z)9mNxTR!UhqZ@zH$<_04ANPJI=R@X#T%G>z!8w!b_=!B|Z?@R6+nn_H>iI#;%$I%J z+F8%{`0Du#-}c_G#`8VCdOpLqV`_G?|y zeCuTfbSSt?-`yzD>)op5MpO@{>-kp5J3nGXH>>&;Iu@223gpemlPYe!Tsi zADfdNUp?>fWnZbCeGO%6+T*L|Gkp6yOSUI_eD!>W|A}1bIZ=8;#?|tx=bzz!hX$8E ze}+#J=wW{G{4?<*KacXO=bwq6(*JP&%j?Wc{PuSOt>@eRul~*O?R$mm3J;g-{2pJq zy6jvVv)^Q2nWxxx|GxiahzktvK}d=0aDyw4Pm=a|*qede~gd2HgWzV0#c-0e(tbZ+e9I8puE zStGA6E@!cLLrL&w^JjzFXALXmBpUMx-4Zc7t z*H`#=_guIvzemsizWBl3&#NBq^}l-DkN;2L|Ecip{mAO{K3|;f^Zx<tn2Tl zSHJi8HYlobO%g!*VW(C_4t2AY=18A30Sw=^TQ2=RLmcE1s{f`O(Mw^)%)FHUHJ~&+xz7J^T#6dj2tf@#HgnL=pV8a;d%E@B2mP*Y{cYX0|EuRc{=cpD_jK!h5V~&HYxmy#g5UN1!!P3F zjx)be6WHI=UEz7Xmux-X#$P=@h(GD%>UnirC*~njoI}HUqoL7_l$Y}~o;W#Q{{>_J zi*r5S;~&R=&i@i_xS4h<8jCj_C6H))%bk8Zu4I~ z{|p~-ZnnP>_DOxmF-zWh`FWgQ`t-5YIcDvr| zA6&<=hdjRh-`}uqx9dH=dfwyz6@L3`@tbwKU2pl-^8zV5L z0h4xE?7a@;Zhs%uuJ`!rd5`}q`sDb#w#6-YUO)TO<7<9BzU({pe2=eOUCQweIp_RX zKE6A#;K9#t#{Vt9dOpk7@2`ych_iV989o|gf{)m7%8lfQI!`>1i9gP#IzGv-p3lX< z?BCxS*SC5;!(Ywsrh9z!EPL4Fe>HB$KKpCr_Ia8XZ#D15^B&*6M!>mYcY^i29QVjq z&wG4(ugN;idcNgX&ky)XC#&bH8#>NOGS%}#Cj07|=Y9S)&-;Aad*k(EpGf_ZeCpzm z$CRr}?00g#eTW&K1Jdu)Z^QG5dj2Us;$_c2$Y&2f#aGW~`HA{Y#;?D}Fs`q9J{SLn z@Zox%*B&2z2haQbua`XU^RIc{=U?;uke_riSbTq8=PruXIw8qa&kvb5c;4q<^SsYT zzwXx<m|?o{A-@~`PV!@E<4W9S;*F5j@uX#SnhdyGTXFyHalQ}--c95^0&+@Tf^z#^# z@rU{Bv26TEP$+)&e2x!#kYDHjR>skJPp#wmD8I&?+rj&k_khs+Ur`i=fXFIx8d zHk#6<*EEU%CDY(D*xM~@gw`1cU}HM^MTHf zq#!yUw0($uuwOgZwvK-=zr|$^-}=Ei;oyo6Uq3&;kK-hM>o@B(>$*06)b~d>{-l$u z=l9&SF%OwPy}y3%-dxXXzFQ`H*#3U}3g_$hf^ANEeD(YwX6D=9zh77Ii}P(wdwli0 z$CrJj_w2QS?a3ZrJ)hwpdXjrjj@$C9=bzzM&p*S*eBPwbALAE~J;NtoJsE%X{4?>_ z>&U10>cnPc`oKwKp?@oSV{j+=zx5tN{_&nnA z?f?Fdb(-~j%degv@RLrip4ZqrIT2kS{{2JpY=7s+ z=A_40&wKnog8#?Dx4%<_{OvXE@zwJlU-p&w?Q1ma`5s?ApW%OEEc(0YoAG?hubzK~ z{~eN7>RkH0(=%LOo1b|6XpE=%+NY1ikNiB!ubzLVzLfrl>szj~Gx6K+R9ers{ZDf{ zAHV&b!%z4@J>TPN+`5ePKepY!?{7Wd@~h_u{G^lB^OfC+d71s)^bQO2pN>Tjq1N&1 z^Q4HkeXfYphw(Mc>hV5P;>t0ryZg+I-IQZiU-y`J?sld+`p!5}s@vnF^3z3jxiTd$;pnjvve#%#bX}7U_oFDi;xE{yl^U=ayjm6B&uvZhzuvZgIyiWur zo#hjGi;%tU-s%%!}? z+^Z3#Gau)=|DH>qxqCHHcem%?^Kp7}bN6Z@&ap!%A8wq%Ye%q3TzZdS+lWoQwL27j zqcyN|o7NZlZAm8xnl`dZN}$V>t5VJe7;zz8zBfJul8YdUE&s7m2sSWQSPywqut(^!R(M4&VBGync*dJ-;7k zqjAvu-Oqg-zh(aVUf>+2pE??xEpf%u(Gk9ywY+jGZi&MDS)ZT!{q1OCwSUFJ8*$?i6uV+W@Vnc_6- znR=cZFlmR&zo+Z*t$W+rNgaFfD_56i=PB#+@%k}8!b1Z1{ucVZ%{k}CGB@*{Asi1C zp2c51e}xa%m>6vQ)$`Brkr&R#e15DaC5JYCaEr%g;~(>@=bzzM&(HI#=X?3tF6PI2 zzQ@ON>|rndujcb0c3qff{fYJ|p7;3n-0}Hd&neawa;#(jsOLSteGOt?n^@1c{Ob7u zKj~yJi|5rn9p{Xhe82J~4~N%d=N|jSIZp3I*sXQ~aGhkL7tzhRltfaO@MgZ!=`l4u}7(PV08N-s6kseSXCAJ-&F} z=STXm$Cv*0`IIB<&$*&?)Q{JRsn658Y(o7@{h?f4g2A=z^f|WG@6gkJx-QImtRo*B z<~_y7D1!XW#BAf2K0k|}(q!{=o}W2B+`Pg>n*WY8HmRU_N9qUW! zkHx=IE9{)g1bfIA&-?u|J-^uVK7ZB^;(4DR@qBmwvge0v^hfMZWEDtSTJn!>kb!_?Kd7mHa!R8ub z`Pv^5es%kDU}E2W{=V{+tIKZBl$dLri~Zen63r=}2aP`R`J0K^^1&YSxlfK-&d2IZxB`HS&$o1ZNh|B6Gx=_OaS)<@5`eDOR7G>$*y z`Ie9Svds1Jv#f|=E%Co2KfV7AWT1}yztCq4L;N|vspp6JK_zKBdQkj!o$CA=Gyblg zFSXrhBkpM$${QZ^Jsiui>pdp&Q0~uTXU<25$-Oa`2ORTD$+N>>RzxsS$KCS||FY*j zKEl_ziRH<9r>0vlKZpAs$77v)7?V59uQAI|s}s)oJZSD4tPT5TGx?F86+YPbrylDy zKiH{ob$QmG8#d7V$NA*jSpGL`R{1p4Nc@<8Vg5zWm*bq}XT9oqhd({P)bkF1)(^Yq z9sZo($gghyB%KT04!dVa{f!Sgf!beYjB_{rKU4-2=3XI-z}@ z()m{Wf|>^Tw1fH(D+j(lFUPff#2x0>nC*QPivOICn1X!b;K9AL@YINSl1H7+f1Iy% z)g^|rj|Ye4I@xnjHh%Sdgnz~JKA+0Cmh&kJy4M2F?a$NDU$2Mddfw+x&oB18&!6>! zc;4q<^ZbyXbh3J0d#Brz4wGDAJ+PGP`5}|%W-Jdae}5lVCg15iiq)~@i|76LV}022 zW!?w)=6V}*rT(tDnNu6^$NYoKUh(<#dQX2V-LAu(V5*B=`S@FyPy4FJ>U#lWKK2Rn zDJS~g@v_w41;;V><8Htm^FvS2Nx{$09AD>Wgio<)exmU!SC`#6%kzukul2S3>gSEJ z@iKq$Tqr-(ChH!5tp%RjpYQR-^MUw7_iZ}yv*&&OtRKYlK7Y<{;PUnSkdKnlcJ!d) z*>##euQ|cr`FfuJhT3*}#$nQ&>Un<1OnAQK>wTMz`>`7{^J8^v`Fh{RBWJsqNtTS3YXWp7i+`pJCc{Vv2w0SjYO}-(mhM$1?5uv45g`n;#mB#*F2@ z-o{TGF4F6|+_yOyGO-^%4|}ZRet-V(IoUSPbKfJtIKD_81~GHL z&3+F;J@4_qV(j|6o^~DkAt%y5vVP3Z#yO^KN-Ugj_R`CZ0n`=|P4Hvg;fe2=eO zUCMlD{UH0=I-ae+#Qz@4|LpfD)$?Bb_P0>5&;C1$c3sA3<0ogk@h6>JJ-?p=c@7_P zK4i+d&&G-I==Y>bzR&77_r2ii`9aJS5Wdq)59tlNemGyhgZF-nUp?>fKe6xB_p&+1 zbX=+DS$=Gs3&yfvdl=8lHa7n1`73<&WXnfy+z|gcALG2pw;pce2Y)GfpUnT5Pjlx< ze)arpebGL<=X?3tF2=ta&-eJd9~1evPPYE<@%OwW_`(rawCi?$k*{O*o%>yv>iK;f zJRhz&xq5z&J;{`F(@P$T=LbyMVX?pMW7mZ#Iq&iHdfwx&AL!=~;n;JEtz(a`p7;1a zfd50`+t((x4|{y^y6KlT=bRteSK|M~vGlvc_IkeMSI^^bd|iBY9vSh~!z~~E#_?W@ z|D2D;xX8C2ZsVuUlf2C4XUs=_9_3fh&&Q8>QC{!#^0QrxAM7DtJ)eo+UK_jftN1;` zw@&u_pj=%><`=f@UeC+()}Ph$1OD*ZyUYAWJzv?Kn3vh#P4BQUAUYO3=6*Ll!mM@D zW7#}n7XIRnxrwv(R-Y+x(ci=&p*WFQx&P8*;yLzRo(T_``0d!$(RVVD&xtszD|=%H zlUGRzA)TeBEr0Gv@PX#yLR_z7z+>VrHgSyWOh^X4tD4 zCMtUFK;)70m&+%ex8yS)*pJU&wg-$?Q*n-%7{l#xQeyITcgH@(L?ox@Ddc#Hsh>OP z)riuWA3OFb*Q|Z!?$u1)qh3ugy}7x2HNhM^g!19$GkEO?7RO~=w-Ni`=;XDnvUG`K zv`m`Bbbn@W4Nm6+-Nw#&b!d*Cc|Eb;Z&3dS;!nLEVqPx(PvlDPH&9+=4)^k-`M$ze zKlb?Q+^6^$+vWU>;^*w~eVG0H9;ojz|06!l9hyT|@`IgE?+2j1m-*`JUVYWq^YL#8 ze?5&Ke=P5td-TT(eVG5Glff*W->*O0 zo*y#hJZIz7_|(Vh9qNBdk6zy|i*;{1cJX|VulJP)F;hVF{#^e%xXts&_|@|ne(L=V z&as~#8~?ImK&#}0#-<)<^P~B`!ml1{`KaUN_(yzI*W$>nGTlM^apLBBd{C-cM?fD^7?h70}Dd%YvTkqetOxoe5-%VGqwe!@vx2;`q zX7hPBja!%Jd>OmtoUI@8vvEFh{0(t#`WZv)s-AE2ukl{tSC6%PL5n@$cXJ>Gc10k&pd%&$s=9KbGrxFF#)q+tlZ6i|0N5?B|8m z^B&)Rrog^7vDdV1elUN__56UJbTXKFJ-ipE;`aHJQ0&iRA&#!o^Xhqe z{+NHwcZ6SkC7crfey^O5|H8-dIPXvKdC>nvLzFz}cyL^9uQx0;CpCWL15ZcdC$jYE zGkl6O$~Q3|;s>FOW$V>9%t!7tCpgrq>!`1KzU5PSWAU$GZiNZ<&d2^{oyK^)&QZ_1 z`JbI%dOg3^PCKsC}~qi z@%)g1p64b*L6JI@Wu0*7hSgbnVw(ldFAS| z<R9we%t>yR2b-g}MsMq-`p7--VJ-^uVK7ZB^;(4DR^ZaXmP+#`^knecD!(`9v z-0IF*he>`o_KDuN!5=W6x=ikkSRPuw-na4iu{ySVy>H|3V}022H_pp2=Vk6-n|&S; zN1a)pCtn@&ule@*N6%ZQSr5PRwf`b~%S0>e@sIe*)uoOH$E9{!-tf>o;BWgn{k=Y4 zf0yeuerzTn3U1h++`Bt7%BSr(&;Z}o)aD0-{W||Oej0O>Z+&iSVV{5H({@2VhFU#e z$AbO$=P{6%{=^^k{=Ad_>G{Q;$8j9~vT~p@*WR&t_w{}ozj)r~&-o4YWzP@!=t|m- z9@O)89s4yo$KTcSTwDB`b3?tlGH*}tzZkS>#RJC_I4<4fto^O%`GTgTn=4u852 zImc8F8pnBlHrnEf=N*sVfVblpYt2)tDZmSqbq4UdQhL( zb!zWU&#>pUH?jRjJw*SedHKfsn!lydy zp0}^NsVoBz1o?FA<8`kxU!SLNs256ag!$HEXZLMhdlE+p^C!pu2=uR^3i|6_>boi z;;6e`*N^#$^UZI858qRM;cMP?$>X7UMXr6LGCbd@}2rBSC<AG(fe`S=VqT;}s<{UDzA`E!0lzS;9bK2l2C(Swp} z*Jwo2ll^^Ietm{xv`pGznfo3A#{Wg?IEb0~v)_YI z&wKo@82i-sI5;0jfRi8m9ovYzHrw-*JiVT8@~`>6!moal7;Js3=jY=e@e%js{5bq2 z)<5U@AMvZ_=kw##_lEfQ*Ktk%s9)y$XTz@hHA9CldCBo@E!uV4pNPMB-pl{&_bAo# z9^d{J3if&Vtpl0YG8P*@Ios{eq?4=XB{%AbxaZ~jM>bB3hkqAF^WA0A4$Iv4g264G zAH>Z3bw$6el25xXF&BTnQ=G^6)$<ykRuf>o3chC3u;z#a}aQ|2*iyP19uhccimpCoct{?NGo|ogC_y64Qx`0IlG$A+EOWn`-eqAxbS!$z{BC-TS?i?7vUx-{f3f+DF>7!2 zncFtOq{{Mq?lCnk`rD{qbzjM6y?3n7+p(*o?_^>OQ)5@x_u{0)%;a;#RR3njjz~r| znv7HKoAk%NO)#-faciF`ZcUDz@41kh`b_a@j_J+K-EE1Uuios%Y2u49&3NtD?Yf;) z;D0N<%1fPN)NeSAvA^xUk#)=0>t;QU%f~r@&q3urQ7KqJ zhKZqVOz({y&u#g!LjnV))+AS>Wzo+d_TohAOvULi)h(%fj+oTvGx>bOZgwu%o<}~W zn4`K=I`eVX?|+`uNZ)(O&X2>F<{tHYQ{Q;}GAx1g^?VyYvQs?o#sB#}`Tl(IyvJWxOsO)b?7GBkU18@JIXadf`(Bnk zr&!Oo`Kg{C#6R?Wmsvb7ZqqqTz4}jhaK8DKbF5C&i%VY*j+u}=BIjoo?kuR^0l71 z{2b%29&Y*IUe1rhFCLrE&xlWR=W2a<-tio1^HV)PAOEO-s^@3<*7I%r$WHOR$N!3+ zpZdIQ@w~^M{k$;zL~?ZfHurhw>iI$ZNhgC@JTLCiIZVA8^Sspb=&}9tfIMHjOzz>& zk9se{y4|k#`0DvV%rZw-45OT{&phAbOMcPsPW+p7FP|@3&-eJk_4$Z?QJ-VEuTyR6 z^Z$%>oB!(h&56Ih*T~0N^s@T;ad~^qGM-R%gUGL2){GC0I<#|qqOlpavXYjg) zujhx%u;+Vx@x0HE)Un4G&-?s{=X-pqpU+1Z8h6?C>iL$hTwSV{$v>pGHv-9d@bo+G z#-B}nl^5Yt&*`!BGaNX)@q8OU{=8A35Arz?Px00B5x%V>l|^%9YxFw5zzxS=KlexZ z+`rSqHPvIi@+tkn{9~wk9>G3l-JHMpSk!JbCgS2h_Pn2;>G{Q;_xZDa5YPMki03IK zM}LC*BjstxPdXVa_Powrv*eO+zd20W=2*w({n3qJ)c;gwX0m5ud1(2~eXA3Gtd1?e zdA)SPkM&{8-<0>de8~@zW#+zhf?a>*cltw*)9~$Yby&CC^;f>>5#{Q#;ZwcUC+1$q z!Sk08`1?}S0?N0?dgcHB zw7oyF?8tGqjp5e|;0hQD#sn=HG-SwPztI-? zd<=8cIZshjC;zhNjrjS`$}Jd7s>|Vg{@mvnvpat6cD=6s+2E(ZD7(F$&v9y|ULWyk zJ7<3$@_5cXeYod1=X(D)&Gj*SN?3sbKX zQ_o*rU-X}wuQ}Q|+HdFhF=#hmyGwu8VDK06qMd*0(UJ!*U*@NWuk)k%FC4j-f8okf z>OsdHd0zANc|x84&6ywM24PB^rM^ec*Zf63hvnn+g1ztyXP_1axCuc9$$Kd z9EgLrdxm49FeFYav8gb%hwJ=cClZ!}Pje*CQ`*7H=eVEZW1LPtZ6@*4P9^>q{i9!B zH(xXLx;}25|INuq?1%VeEJx4R{N#B@{$1zuH9wut+x%HSr1N>3@ALdQe)0T}A9Ql@ ze9FDdVd_e+MC+xA~DO!vI@LzVyHc`N=tU(Mf&FZHzR+vh9KSA1|U=f~h@kIm<2#HYD)wZ6*p zRen(4%Y1T6ejTa!;+OgQ9z5URr@Y7bx|izpqkqKnR()rGM=74S_;bGlEuJ6ngHA4< z->+%$9P@iVUDrD1dHrK_cDLfKa~D!@oUdF>zluC6UmQuvi5w7pSZF5CXUXzUf21@d2IeYtQEh$ zrxx}(-P5MWFPd#r`Tl)hCyrI_n_lK=+D7NUc;1S?&o7>@`4X@6yZjr=(lea@KEHUl z<^!`O&){!p!Uy=-W6$s@4_D(ap0D$R`d;Rb`lon)Hb2_)b^ORq_I!k|&yBU`Tm0n5 zSbu6KCr_q%*W#zRWBkO?Ouc@ZzdxA$GxU5Nvv?j$W;f>)W*Wsr+t5R=>-aEk`5kPZ zr8!J3;}`ysxqs#wV3suP$`}KxA4p01{_d^>ech8fD|A{=y^@cJxTKPw< zF7m0aIEJc`&OdtNGG83jik}Zo8%*a1e#73q_=$Wi|6@KK`zn8wA93`R{EX@=zMki! zcLx1~?8x;7V}5;)o}ap&#~!!iU%{Wb9tr2U`cvO4U9Tr+_WF}tYx09m1~b1_h&vn3 z88XxBoc2J;?|{h;(eACsp7PM*3s;tnn3-Q*gVDQhdT6FzKgKVfkMKjEZ)8tK_{)m< zvF4c7JgW0kJU`3Fk@k67^Wm|J@h1%q@_(66t{w1G0Ok8ed_3BRrtj;tZ{q0uYtJ|H zbD2+Z^x`j`f2O`v-sG8CzV>{b9}G=CKm3x8llrO7|0m|`)PL7Jd)|tFT`{HdoYLzl z=3f5cx9oX~KllBJ;`sp|-9g*YgW}Zds2{sdI}Lx&o)@<@az13H_eh#qJU?L44vRhq z?s>k&-^c&+xKFfu>)Pe{+xoteaAn!?K#EOsdh5shY|KLf0{jhe%6-%IJgW19nqK5n zZEy^(QOz%&pN&6hq{rujljx@N14m-#0Y3%s5TA~n`*O0rbU_ieN1t^S<-zOZ=S;?I5GnVfCrC+Otj`Q1Gm9pmuYI%Lx3TkrQh%tBpj zCOhQwqg;#VdA`LL&ktfwj#_c-HO=>)=UaTKpT*yldy@~fTk>%m`4O%xmri~*PMvVd zdtp6~>iCQ2Ek2zG$nW)uS$#13R) zVr9%zkTKHD9>0#C}{`@(=mrMWFOL z*u8H$?IPQp>kAI^JbcY5uPG^x9$(`1@UhJvr{>dG2Ye3TDLx&W67Aua*FoB;)Vg>c zPa@q^E~;DR%5vj^=6ba1t30or4^Y3p^fzbxIHbIGU>~)v$90Y$8?xu^{7la;_PouX z^+WQ!&G&e|SzkV%AM(-N_R9uW z=WV{P4{QF$xpwf8Sv~h6tJ6Ve^moS=3DJfiqvYvP6tB9@fr_g3hla+E>Ks zJ%8+WTl%k@(NgYd-zW%hxfF@}~KyubZ!5`_y{}1h^gY zrupDy_lKrt79F%T(`0KzCNt^+ad0Len>^)dCbdw z?&x)%l85|@=Y=avf>A6lJj7S}o=iMHQ{H$N+2$Poxxaa1Y}De@zM9ipKlaZt?;}3` zw(~hzIexuh&|9{^sS+a zc_aSg`8>^UahhH~_Y8va#?QkPCUJV}$9d%E1GzIfS=?86PCb8)pZ0O)pEs45HB+yj z`Sdq0f0PqB?wPMVFUR3}&~a(o7ap?jMbBG&PD47@Hsg7NKRv(1^9Fxek*YPv|3+I! zJ#X;m{H8qL=cB?io>#rOQL`L+Cdd@e51BW3-saENaldZU&ojqA-G_UQvk&%vpXTY| zeQ|l;t>;t&)ka z<4I5aw2kJ-`uTYsKX&0fJ;fKUEOE3wUo_Si9uns{554Dg{Ni~J|BB~r{)Umrc?i{O z%j3dwU*}XG`Um^)`MiVg_#C#y$9FD#{j(yLHRZhbJ&hJWozL6xU-SHsk4(>aUU~=P zu6xp8(k{9WmwY}yWYP}K>ozri{~R_Ip%pXpmlX#w>sa%X=k54?p0D{E=h)_x>el^y zzI>*3oJVIqxL*F@v$?{j+Q^(u>$<)O%FWmFUB9Mizn$afgJT0nes~*kqjnn25qZAB z=e~K0FZ0vG*Ll|QkMbj2SxUa>xU}C(ja@VKx;}25pUs&cY=<;Uo=bhl{fT|#bJ!Fx z1%SZo_^0O=d)|?s6|qeCA$i{B`#gWnKe#_oK8F0DlfnAN&4E;>Wh3VXljgGafOwwb z?=l0PulaJ_#^NvQvenangF>lQRbV%*8%@oHU+>XF!oWU|T1j zIElL%d;oVo?Ns6)<)_Sln_t{}@H-xU%%*hxl90IhOl+i=RAC+Z*|JozI{9 zA6)jl&0kgoy{10tpU>C)+F~Y`*w$eB?Iwq3Zd= zJgV}KnqK77*l-LUV~Ro77j?YMS01b4=YuEz8ujhvhx#0kPW&{wYxy7Zi{}wv8VBdA z?*D%Lqx_)0m*XGRm;QDwKj@u7{~-I47g;*;qjOcS>;6Ri+4K8xI{ew+QHtj+{@m|C z$=PQ9gHA4<-*Z#vWXMdfgU39}_iYADo`ZA03q~EY=PmxaE>pj27SCJ!&-di-vN^}9 zAM2cResKK#v!MlJ+0Q-HJWAWp<}W;`KZ@tA_%&h#V?+JCO^gV^ZZeL>2Jw1vwZFOX8yC^BYf>-?fDj8xU$56&`@Ejp7p(b^m<~ZoVWPm z`9aL=s1>oz+^0x9Z}F$^v&1~Poqm7!`S%sB$|KyI?~L~Wqx@btog?Q2mGLu#q)*Th#9Yh6ccSj552DAgSY-h z^Jd7>9Hy4>3;)PWPLDB5o!ZRg@ffr8R-3u8`(n&8A6iU2H^C%{fvfVY^C^yw#hJ9# zWAXvRbuX@Ljh#jj@1-%5+&{w<=eFX+b5qPwjl{FD8jX7iBj3DN)yI!{HNdoLw|h0fG<%F| zB{?>8%VQtU1+XTVbYyUCuSUks{numi0h3olOzOJ$>&tsCy4Vs5$Bus>(_nvY9LOxSNlwKj*dyM>oJ#p zlxxAMrw$GUN%EyRv<^pp&_grvZ$2L_%LY^Jt2w>(BY(f%kdNcxN8V5D*Bb)-(EFi{ z1+?eM6aOdj9KPNVh+p#&Pj+srzUYmM@v{!HjavP4olpI%d+FFeDc`aFJmzP_r@vjR z?>Il==qvG$>PvsS7JqSftACK4d|g>Qk@7`()8~bB&-9z_o6g{xzk)w=JrX@jftvGI zUqjXFspotBNv<{dK_?f_i#r=RA2QQ9=y4uN{RT|-ymoIr_LPSfU%0Yt#LWD1evICI z(?c`$`Z0d-e1sqRd}B*>jPREgqg->$OZgnW&JSvOk&h$op0D|sFPHf=O$PbD%%?d$ z;4jzm5B7jhf4j;b<)?Ulwtpx6Na(>LScwT&&5?tq5p9A+i-{SA%@5f95E!w@QA9Qc0^%j4R+u-Yd8?PVpvu!!o z0sc1geZWaR^aU(xfo+&7)aQ`c9&cIej>?TXX`$N4Ls-#yXc&wbyS zoNeYO=;Y%0ZOiOB<{^`I+j_t6=`-2GpC9E~M9=drzIc8RGxL`fJ+-F!qHA|pZ^SS4 zv-pR(zh4vNK1MI+<2Lxhl_mDTiALRr8~%Vf!(-8N=eT~(KWduuZt>|nKz^@J%<}sZ zecUr2+qwB=z90E?UM1r?^Lfy;LAfuxBR_~;#ZS2$@R|1%pN>uS^zdoyDb8d3qx=-l zTlK}f+<(7CvgK_c~0T)d_Iq5KPN*b z<*)7eA(P$Z$wP~uJa6+CM;%-IgV924Ke>YSF|eYo0>;8U%0a5J==YL z*L~A@0yX9l4vkoI{N*(z%{O_z?jLSc>fL@%?#x^6o8FBdF*M_+vG(GpzmZTp@fRP` zPEy}-ekdj{UwK|TABQS+sq?>i`4}qv&b7ckYF&@3<|ohF`I(+y?0K6%>xbldn?L6_ zaQS?G$PYRhEcQGKwo&i!|ISV@nCE-+F8T9`A(MN04aAn!-ne1U|De)n3Wc~a+ZT=z<{UP_F zhmUP`rskiYKk@lEPx0y4G!746$4uk*^@ptw- z{>gZcRl1EH5INbd;G)syq^1d{T#pQKa)@Uw%m1o{@6cz-c3I6 zJD-!4@`{Z7Kgipuz^3Qqby<{_uSIQ(tN7DGk#8U-IM6ky;l?J z$Y138{FaZy8xf51@xmiB9oKDId|a0$5Dg?PJN#wEHfuiC8=E&hPl#ju$@4bf=lL_A zoNdOB4AFMLOvXbW+_@;_~`=9??GD{LrRR zKE>hX&*TU7b@MNJ{&1Xn{?7F$vLl{1_|x-CJa6!4{jhu9;9vH9pC5Fxc>dg*hnfbN zOSx{-kCW%%Tppl-FY>yf=hGqPG{;x;)SBk$;j`CwdF@Ui(&ls?k$L<*m0?bpKi!9$ zGycQ-;@)+ev&Y2qcKmc6AfLn1>+rTajZ`asJM+Qy#(&p+)448<`c^)dm}y&CKgUmH zcIJPIFL{@xJ|4wFeWqjctn2<1&wKb+Ja6+i8rptcvGfmmXV5>`hduA$Upk++`OAt} z)|CH3?Ce^g%`5`ml`I;}+ z=LazdJYVzWx{by6^wP|ga`TVx zL5dT|N4@y@;Ish_lk$Ysb5C-8@%KGWS}%NZ-hiLE*oTjUjc?@Bu@l$gBgQ>`+Ns1( zVfErieck-x-Xp){EyY0Te9T&r9yH(K+X1CV!VzGnaCG{%{?xuH)SA2$0_|Ill&f_ID8C`9V%-!1vuZz0NuF zas2WeHQjvq>G5f7IEIQr*B5oX%%|zyDX8EKgtj4dzn9~Fa7OW{OFxQ|ERnh^H=xhcwP4=;(z<%pZy)BcpfpOKIMGX zew+IpC^_4VKj`G*`8_vv%tK~+zjMs9{2q3|oWDbX7Rkm|9s=x zQ$7dKuPM4G!9d>~^RsQKjut=dn|+9}?B^b89@YHf`B^@Ww9nI;Upzn0FCMG;d~lvW z^ZerZCO>=Z8GiBnJb#p*;`w?0sJ`^KC;Joi&3=r;ubphpuk85K!+@u@aAC*vHZZFHZ1M}K4w<8Qpg=I5SK z`_}RE=3PD?{30JQj`%46x(DB6{3Aa7?aBNU&(Fs{sxSTRTKxKazV07nCwo2;zdkqC zo^SERj}g9ha&mjG|7lLf^ONG#Oueq>SMj_YC-oEc6}9UN54uYwZATB{=yi_o*y>pDL0|7NmuOiV4~Z!?qAhw)X+Ql~aEc|67}z13!JTYT(gKD3y4 zZi0#WVV>&R>l&d~rkK=UJtiN}>Y=Je)T=`#H+8T^L#FsQ${dXytf@FhHKM=W-AhO{ zyEQoW{kkFT#}9yBcqCUOpT?Nh+)QqZF~<%OmMkfJivQqE-JgziY_jJ8TyZEbrO)o- zE3f+aF|P)gR_%7L2AFQI2ACVlyLEkqdeH{-nipVFzx0`?^%PTnCrQ1@57k##onnrB z1?Dm{_7PM1J(|xE6RfE?DP{fFscnimsynhNUXApU*Q)`hH8*#!2AFQI_L-P9x*mGH zUmVxrFXUqUEl^*b|FpaARh@t7 z$EWz>=qr5jbvr-X<@|`d+x+BiJO1hGd2e5RSInK6>yemquKv;2Q1yD6v%UTy*P8sG zlfmTI3e^1zv86|8Nke(zF}{Y8Ugvb5OZ|pS+F{Y|t;e47(Bg~d2Qf3hyapqdH$5~{ zuOH(V&qw&7&o{PI#|VE}k+3z#jNQ|Dm5fWrUpzm{*PgHQkKVW#f4XnPApe*7)Vl+I zYVJ|bSN)^&pLXx@Wey=t{W*1kUpzn0rxNz!r@vk6&vE~tH1heOk)O}^ZsRIKjiKBodx{;TgpjtoAjvP^Xa<4 zDGz*}gnIr=>?V_TSoAq?&+{#Q8o$lg?yYN=`n<&#&s*`QeKn`Ie$3C7Jr?0_>icfA zyUf!%e$@0LU(eH;k9uC_m-G3WkGfvwqwTWCn*7D=dG61&Z>s60@}G9swbu2Oez*H` zj*t3Yj-OK8i=X~>H9zHizM22*d8_}wBInodn=bXBCH2J%k2H4u-7fu_qFvF7Up#Nc zKlgoSa<-ZOq37$Ei|4nE*v*^_nY7#1`+ZNJ$@A#*qg;#VdA`LL&ktfw^K?Z?*E~<( z=-<})d?Wr;KWuNrzv;P;b-7o1%5y$$gP*t#KI$R!5lgjRJYVOhc;1R15u@Z1Cu+a{ zChvSKO6QBVPCdeTvE!%Bb^L{2JYUC;qd56GCt$1ii|3ns3XBfJ$7%LF_s<+(cpiSq zk3at6c{~2{`z@N<>t0_ma^!K*shfJPFo;9)$@0A^0D3ScDJ@O^cx`TP4ZgYWCZn!gEGmW$+R&pGF3J9xghop!_Dc$?-u zl7%bF4*%#z?Hs*+j$ieP$)|mFoW1p9|6p)dPv)^xzFN%l^C!OKLyjZ=ro*P5zra^> z$mHw%(EO3HjN-?fm3U3Qer?q~qdkAFFa6DzfAk&Od7IE|EqyHAKa>`3DlG{Q;2gcwpE4EqlvEJCc>G`^U()qm2pYt0z+sr>Qq}{I95f|^SYl^?~ z`8@rN{@BcUkhv7k_nBPBxjdjAUveG{{%jq0&l~*dKHQw~U-i5Z|M7gDriILXJ!j8- zjvn#Gf7SD5{M4@{=CV#P%k$^>snwnNzv_82{&So$@WUHRV}<_Nv!g{N3|L{BwR&p6~O~-P-MXor-eqdGWmVJ8eY&rfvDP zHOLgt51BW3-sUeWhA>gb{kly*&m8|X&pYBjc)py&Z>Y_Ns$g{ZU!$h90oU-n+-sWm z#qRqxVeNLke&!=?H=p|_A4{LZ>-94qF}eA)ug*hnokE~kI9Yk=$Ukr1W9sKMzr~e0 zobx{uKjtitqjj7!|BB~5e55kmKiEgE+f?H?#y>s3*z=C~SHv>mhva#if6enlKDu7J zU9V$I+_$i3%X9oX9qHezrh%sW2eUs>J=%^Q6u(}lh#Smr z+#DDSEt@@KFsY`eJml}s518yIUmj|{T(`0KzB<-?xo%_eeSKK-x6RBs=Le48J%4n* z_UD<8nmhRz-_FileOzUJt4J+7LcJa6Y` zdVaCzZT_qu()qm2pYt0z+w9MvlflfMPq~*Kr6u*+i<)E1ea+p1%u2s_R`#i1kUp#Nc-{Vuw z`+W4q#rV_r0kUVR_%Y_oeC5d&f4P?bw0kdpnL~E}_wzrBzj%JWzLer#{Pef0`5E<( zmb)o$Jtvy`UmIZlt9xzv%jMh&s+JQ`yFWU{D2>Ha`Al1O*7|1W_piv z%(HlYz~nm4{Vo`Nm_2Xt*L9itU9))J;(xv;f0vy-X7Ta&{W|~)#tRIP21@F z7thb~wdZR-dgNmK+VeFZ#SO+L3SM-?XItUU(#5rP#8&Ry@7t zb>2>IbE@y<_$kFbKK+dYxDbEwd^7*~`!C3;aMZJFHi|4KQ z=kDuLJU`$Eom@PhVsGYT$i#l9`)J|c`MS-3Nr}7ZzUj@FnZF{onfnxp=dJjs@3XX} zd1UeNcjPwB$4{(>?_-KH~HCP_}kFKY2P~k zY4`Me&6j*r?VjLc&R&k6QrwH5{&uZD$Nhu)X3t0RqtA`C=j;3<{(L?k;cF*r&$sxA z8>?^P=$z|yJ->?Q2k{4;ES?v(^e8R&bB~3t+#Ij<)Aszpb}u|~U$EbYEX`qR8GoCZ z&fR0oQl~aEc|67}z13!J8|5Izq+QZ{YccWM1hdSs7E>G@i?evS#YFX|;uIHmm`gmL zyvw0i_56|Ej*fj4Csi8_wScb&G`XIz3|Aa2`0Hc{hqwVM6D;8>GQJ|6VXmF<@**LrsN<}qh-XD`Gn)$ z#sus3IF(mJamr_$oqUQ{Bh3AJbeoBJmd+&tOlxlLUJWqaUhOlT=Z?}lICqwFNUs0E zp_to}FYQWN$9^C5&|VgnEU|CRRQqa9Z~e%Z>&kSCyzQ0h%kHlQ&i#J>GQ|7Pbf7!j<;v+wg@?}2Z z*n$4k{WFeVe0_y4?r!A=*^%oFM*QESx4+NV+w^x0%DGFMpFD2Izk)w=JrX_Zn!oy9 z>3Ti&ymsAb{{CR{gHA@z@M{HX`-RxjL)5D@louZ3?}?<>IUT3ucgSQl*=2eDS=+Usmk9 z=6U)?|F+KO8~l`CY|p-F=7i(l^xVg~d`COwIUl#dPh1CIpZDT@)s_;0Ww~y%ReZ#o zJ!!?SeGWGAoMJvcj{_X?kL}!i+E?;$%`DB44PDgD0uP|FAt%YB{tN9xkzV}7tF%>2*J zuk3k?KkEnh$rb;c-%#J|`9b_B8Er=oDxO~F`kiWuzq9ADhhVsH=eBCD1 zl(a|Nrt$CB4f{;?q$dw8{{DW+;Ct%W;_t7c2H)fP7Jsjw#YaMA9#L|a-I>MnHDA@z z;M2al2h`lGpV#$8ZwObG3)TJ5GhE*kTk`yPUGp(c;mWehSLeNl_|MOu_{>vzx|L6P zpnQ1v#fP+$)K|YwrM&6*Wsdszy1r$7oS)4ZKepTZQ?J*x*70K}_Pibc^!#Ga+x%HS zB+uLYIlqC+o*(juo^SRHdtS}my5|ihoo62Fm^?pZ(hko1vef+Kd7JO6W6e*VxB0$4 ztoh0F4nA^JJTKoJBn@gmpZU@sHlO;T%zfe%Cm)~J^%brxalE=`xW456!qmUf*M2+4 zk3nzwb%U29K5Z&7YrghagD>$u!be`*e4U>cc9XG;;#c`FzORloU#{C&d|w~d{Ec&sMD=r?Jc&|^=V?yi!OtH(f99j6 zUjD)J#1YSE|DXBNe~$Q7%&9dBU*6YKznsq#QeHfKa-J{|*S@Yj+2E&O=nv>uV&vBq zZr_*U%@CoaSAKM}1#Kbt%ShVMfM{WC}t=SLB z^Z1t$|MdJ~&)fW2KP1oFe4ppf`9Xcz^Fuy5g|?#yL>Ax z;Q?=c*wMnA@Vps6&4(yodEVqxZwp`N=j`XxoMkS}AnK#$oaOm-Ja5;>8u4j6Uw>jd zlr+VUaj3Bv^_9e=aXPBqwK|_nxP4Xg}gnO#b|c=c%7d zu8jJ!=k5GV&oB18&0kgwcFnI-Z;ZR~Jq>JuaUJuMJa6-_d49+bIvG8}=kwAlvZQ0| zJ!3Gbmri*&{QjZIq#c~+^EH3}9F~LZ^L=%!`N{LbmE|EP9KWv*YyP%Ta)m3)noo)U zVLx9gZb#oK&!73&$IHj}E`(3<6u0a3Gaqrf`6zOZpZMikjb1 zID#+#>U$~2bK?=8>i8sI`sKWA^v_iMlzwmg80k!X<#X7>aq9S|=NEh4k)IXuua@WQ z{!E^?`99B|`QZLw=0E6UFxm6x+8%OlFlo*n=TZ6`cE}8PzUIqyn`1v7VrIV2^EF?t z+gN;GAJ+Wjc{@KVhP25%!ur~9e)6ZzKWe&BpV)kQy%5i1tULeg{9}D7C@&w|?lG73 z+W9(u4%{8Tc%I^yV;!Ab=O0@>$j3OH{9_)x@uOys@}+NNDaWI6QQBS{Gwv*nIKh z`1^PAH}zfO4Rzely{r7ArWg6tCw)G8;|BijfhvBC`7&RfZ@2i%wfrAmM=E~tywyLw z`i}Xi@1yaHU+nqYkDuI?JzwQVxU!V-9Gt^`(ERcG(LeZ2B)^VhA1wR)+22u$=Pmx+ z??4f6_WXb!bTXLP^C>sYoD7-uZ)}U_2TZQx-0y;m=PmxaE>pj27SCJ!&o{0;ci|Yi=Xz*^95ts&pnifYd>k*_^p^NZ(a<0rm&pyp$om*X#I$>#iGZY)1KSM~ZaKjL|8 zH+&tLyRQrC`vY-@@dup@=C{O5u}cpfUR#Gu?0344R`L9RNr}7ZzUj@FnZF{onfnxp z=dJklZ<+Ob6Wxcc{A}4{7C-Hq=IJNK626Za|8B3JpB`U(K5e7>9KCTde(m|1PYrJN zB-ghefAMgWpFM`Z4d>|`ANhHdFZHB(_eA`Z{;T;fo^R$qdp;7sJ~uY!SN42_ubr$t z--Hmet_&bn^e`2!dh23Go^fWi?>p_|&ejlZF$Z`;@r>6TTDDR!7Pq$F~!mJw~-@c zU+O2c)qegh&mU`)yc}hUi#tqi>N}a@-#eLL-5#fSHX5h6mGM zFs<6{UJWqaUX3u3`t(_*)bUg=@oIp%VK()d%BvwJ_T$elTXEumlW`82;;T@ch@~4R z^?9iO^J~h8iG1A7lzA!hRsK!!@8?f?p6+p`&mcQB60ZjGY4-d(o=Go=$ z$!DZ(pPuGqW*ooUai|UIAvMshq;)v*gC3eG-Yma!eKn`Ie&oyNhl7|ae&qec ze!YRe*VyY<8GDL3^nPgL#@~Mj<;l+{@+{XI7NjycQDV^fL9H(G5zl~+gJ0%@k-tCE z>YwX;3}D3PevI{}&Oha+&&Sv<@(IxAqrQ*wrQhfCL*Z}P;?4TX^#)^pO<&JrkK6ID zAL#RsG=KGHT*c|F`NhxC3zs>6^}W*dddi7*-D&>*VEQ5GWb}-@R(wh9jeCfCb$<;W zGE+`;oND}iChf3j_ts-id1&#)^ZT-nnfbb28Z`AGblzwx1Z`NzR8#t#SV9;@TW!7uZ{=;jB1<9@+mCiA}$q06VabFscd ze)0Tl{DkkvPwBrN|CT-9tZ(+b760dZ^7Hw(FaCAKJj!!Qucw%M{SUwK^?bX3^lOKH zP0_Ba^Mm^SV8$PGa`F7`Hm))C>aXy4;W55eo!%oIJt^ne115V|p9AZ$>-832`orRD z_tv$`&TM^O>F1PZi(lR!B2D`>xYqhHKid}PZ{W*))3xX8{1nee;@A8QLy*^znqNFW z&o7>@`8fE+{80Sju_iw?cfRjF9gga8=y~qXv~Qm8D*t0XaW2-E2>ErSj=y+*Hvfe0 z^CchHCeMQ{m>0J=j)h@=fyo+UDF{G^+eAcJtm$XFnJz*ew1qwdhB|=#TU<8{AEQgR{gr% zSZ~C?=XXo>Y~+OF-_+bsxlMe%-i%+kvaEBSJVVNm^G3u8*8cpeoFX!`CerD&F zoX;ElSwFx}?0GBybABtHAMlY~+KwKSXT47Kqh8W;3V;7bF=N@!$&g7cb7U_0y48@$ zJ>bbhi=RAi^F4KJ@ssCmzQ^+|eyX3%r*gICX8ruBrd&&#zoG8??|87je-|4;ACIf~ z2+GX|NIY}kQy*r(QGyOViGREKC1&bj9siKOm_5(^N%;|`pO3LQ`Ly9NPMs6IuJez& zy7|ZYmRg^WtNG%2U;jvcHXv73(=8Ph&*FdQ`m*O8e23>-e4LM4PUHH{`XPDVj(^T? z;QnC7kCf7O^q}PGbdZ$?oqY0GnfvAa!iH-0`4YD*n?1wz zr7-rGabInWIX{nmcPE_V$7b&MOU(NIUKIb3zxeWx*gNr$_!yg$Pn+QwoRd7)^7@F6 z`nvgNjvVX!JRSCh2jxZ8b36T;|4G}GI!gS<`=%2^j@76yd*0DMF3;Eexbld zn?L6_ayBJ;$VYZ*J9X{KOFOqnmYMM&zHHmp*C{dnqT_Q zil4&RW9C*UekdM3$B%=%<1aB&oOp0wQT#*x!olpv!S-oh@zXEbdFO1Bb2p#j@bPh+ zW_}3Jk014Q^C5#hex0ikpSJVGkL~vOk*9qfPpkDtedYT6mW~5XJO3`v*Zkyp4r1t^ zSwAGt+kBtr&+(J9&HSUPv>iRDSM@sL;#yD(zvv&x0sbzY&$Zp^oClf9{(Yl#4Cx!{ ze@Z(YJI$lHJb?El=b;}n&(qmD?w&XJmpyOrSENjQdzeS+`DRTwUw$ro-iV*VK-{So z9Fq7G1K7{!&wY;eaK}%Z3ZME*__SJ{$2jo>_1!Tq^6!nGr~QxpiRUNy#5o=Z9Dr*+ zJ-6-g)3GIHT9x&4elTa<{EME?$LYn7=lA$Aj(r_ZtMzmI_@j8<;$QW=!JqZR?sOhA(xMB@IW8M=`$ekeJ(iY%qu)b9Uzucf`Nqc~AUw?ABP$&+Gm{z;fM& z$I*{}dVakn-$s5`#Ioj|eozq%dEVyxUaxEZ{yFR|eOU9ijrz}ye?_Uc?5o4MH=Zw^Kl8zL z@`?Gw?!$7eenV~gd)B`O(0s8Sv+_G%WS)N~WeBpWcv~68q3jg^0DgW$woA2{HTSOe#l2kX*+sQuj+M5GycadEIG&Dv*(YwKh$*0#5J_#54sPR-SYz`?Xb-KjsWBT z((0E(%*>zt9fWw^ivKIdKJ`0}%@;q8kKAUD>1&l3>MDMy@{gKc&qsY9qr0WpTp+Q0ebw|-%*O^t@!7D2TIO1`zPq+;(5tUBPT;X-JdwP z`1hTU!^fk%9X+r6UprZQzQy1365#7&)$6+daULtblQQ^o_jM_r-^WqsC+Otj`91a^ z6Z`e=VZJ`SufI z3E#)e$bXN&p*CywWZFjeIr4llemG$FSk1@5FZ03Z#*e>oKdSl4|3*wF&y4cZ=M(2* zeTmSGzjz+;kr=a={qfU2eZKJK^F#P8d%juU?DzakW_?yYn9Hy2r3;)R6KXd(I z)YGzWinP>8o(5Q}uQkuBxoP(NJI=J` zW^!9>>|=)rOO|FnbsjqFczStJ%2Q6i=_Q`!TzBi$VfJgcdzFu4^4Y8998~&5$BZ0& z3B}CJ&$nE^Xft=O2IBmRYjf$^cbmC;HNf1!-1vHTi;3s9_}Irx)cSTN>ih)r(6hc? zGRJ;96E(V>N$I@1?vg*m8|cqvzaHJ{PsI72h!b-&eP6K6+`Srz)9uwh(|PV#@|RpE zc|AB34wA8HSJL{j{Pu$$wECid^6RFsWQn}v`2$n!n>c06%TgTL=F4^E2w%USC_ZiT z_v;OOUX4*X;@9tozV2>q^SAAoClCJia04(*I=q$PUk^<@7y+u^)QZ^IHB%9=G{_z?}NSNAi#Uj0^kkpXapr$>}!#@8JJE z^LzJAuleL!Gyg#+gPC6|#GMW244FS7CqKSP+b=wh@eP=?!}4Fq!++&G^gQ3<3s;tn zn3pNXH+|73rnzS;AU`1N(k+HJmwQZtNV=>I;vQ-~BxM z=k)IelRf;2vCBEC9=krDZ}Io>8~lSCRqeFrTl_s220!ha`VC{;d+#gO)3p-xOCvwq zmh%$e>togHI{(G<`#AnU$Ah2wuvDk|^`d6#Z8RU8N8?9$PxDhE_WNEhcjxC(e)0S> z^`-Pb*`KH{=NrpF|9@3;3j6PKZEMZ1?0Ji?{cv!Caz%>|S7AQc@oT?nr)k&K{NnjR z{6Qxd&u=of>Yg7mQ_i&q%KMoClXf_K?^};u=cL6K&s%(b4uIGA{WV(Gw8fYFTKun_ z-m9NK=0~`)L<~(2r`WP@;pwg6=d_LH7tcre>2osViRX@f{nGs6`DgfOjNFS6K4Qnq zmws*P#ZR4==IJwhdOdxTUpya+f61RKTlJ;%$Kzl1y(NbIgY0C_hvElQ&f)dEsQVxB z%lUlnqjWr~3+efVN9v7V-~@ROuKl3bTYT}n6~DfgtNo_eYku+kfFE?Sc)qxyk&_@( zJU?WTI4*kL=3n!?&HsAI^EN;AK=u_S%;hoR$`boIUPsdJl0BXj&p*XSygWZ21Zycr(eCivLL{W_BRF_@pQ=WYHq&)fWKo*(jqP6msw&&%9Jv1%s- znd12&^9Ik`{A-@K`Cl)2-sYng?yv?&!_mpm1T3zHeP4_`PruO14%evN6^=h zOECVh=WYHq&)fWKo*(jqP6mrVhn3gxX3qqf;`t%-2G864Yo53H*F10Ywdd*d8Q)#w zyp27HnzDyue9UbpUpyb>V?S5?2xKyTH=jKgjUREj;up`y_@F!aW&Uq@9Lbw>-2L3F z;dw8=#2w{tAO`aN@# z$$j|Ok7fDmM{<`whu7;ZzI=av5Hs_Cy)MhI*TnyP%e`Z0S=L*8`To4cU%*)!zk&UV zoXF?1E&jHpJX!p-Z|(N_c^ayg;@%%IKQ~ICmPt;eg z&mWeJ*C}j@7e8ul+NXKlW^4E-ecy)np%=cE)0p|cn7{v<=P&lze_wN0Z}8>&^T%=2 z@&5&W`%CtlzFwi%>-bUMAI$s@J>O)?`Mi8~5%m0z$WQma2Yn{z`G1gy|H*k+u`a(0 z)}C+i#q-B{)_MMqby@x+dw#|G+Hii0FP^vfKVj@YkFP^vf{|Tr4r{VdUUpznH4?W*xX3tCPjhqab zzr|R7`$777;gRzDFZupo119aT`~&;`Bj-Wi=SO?K#TU<8{6B*K$IRFFDf&cBKXd=I z_~Lns|2y!1m-+g$hOf%=Exvf(;-`I+&p&Z2xktpt=NRevnqNHs4F5Y40iP#5!$)I0 z&6hrv->=u_Hr$_c`A2>prCLc`N?kpyz*+=a;?)g8g^T*Zohv_VuUc z>-!vH|K0g5zQirdG#;w^@w%DjV_W?9CDNSL>ovc4e!vep8BF$kVK-u4=#yCf+@$&} zmZrnm??aa6Fts?H_T$HanVcSD7LT`?$>TBR*WKN1W^#9ox$VAgG4b3+jdLdxy?8ql z<$8k2lji2J-_AsQw=*f7ch?;?VzepHNbRxwa;{(JC?D^HG+oY;2_DDb`Y&E z%kSa4-+vq(CoEYum}=j|DPx90c89k4`}Kx=UBkoI?uD|Mm5};_+7hBYyUHjIXapV*mYmL(^~hI+f+O|HGX9zkH2BUr*Jp ztNG+wGyg#+7tf138$CZ{Cg-$0KVY)w_1w{8Uy&dAEV0GkxnEK~8Zk3p`%u?zUBSaQM zsgS4te)qV(q5M3`M|~gVQ~ICmPt-SiKGL6hPU*Q;_b1}#`HE#=eywY9f_6oV4_EyP zqcHi}Z`x_tf4|0D^NZ&P@duq;JioiGcG{5n-9gzP|sx zuAQ!Fi!WSRroO2?koL_!+^@kci|)x5Upyb-Z~HZ9G#Gj^T{ofJpYvZl{|vu){uw?^ zpfryj<7baO!>2xZGXCQEXX2;yKN&x=lRY1a|10`mzGM3fdS1RWQujaN&z_I)Kf#pm z6lhnp_;3|_-s0>3{?GSt`}d8{4{Lt${D2>Ha`C*lr{T0AGv$P|{lX)Se}6x-rGGb= zw8Ns`EA>3z;)~}8F*9HLJaLkf>*tU0@A)<2|9qF;K<}b|6JLA28NYC4S--Y&{5od* zb^`NHpJS)>nqNF`<>$>M`k(ysT{|p~_l)T8&ksrj4%Uz!QQ0L{oe1u;-AIXnD z{^I!L%&AkxsUIo$nULvo_~su@Yuf(@;MPt@x}8|K9$AeVQ?qom-{h{ z>r3gUMv29beS)5k@%8-jc|OM1bFE%K`XPDV=3n#tkRNn1Sl_6o=uMtmSls6MA(Ik! z@qFIquPb_Qt({gsf2?Ejyv_f7U-7)n*ZoFQZ_9pOFfL3g&SBa{$1nX6<$K>R2v?TP zo>8&M>qxn8`Z#`!jeGGyK6~sbKDbl-7j}zyJ{rHbe<=N?6RP^^`=*=qFdQqSmho{#Xjj#)g97UQ|a+x&{XPeWO__kv70 zpC2;0Pp+NM+x&Hf4i7#|^QeAa=LFoJdGMp0aQvU|E1tLGKlB@3i({UT@v*g&U;1y* zGn^kCKdZy#u@ZNTkGQ=26pUHlWBgt|ZRhKsBcJA5#Pis^KW7{H_tuxTi^q@N#D1Rm z5w~2QkHjDLd@Mh@7WF!%^MyysOY*$UzvlTNADPx}*XyVsywvr49s{;P!%?qN-_h8{ z_gSo&%l>_}3~9Yb;6A+U`F_mIuYDf$yutrOKIgC7AUg&>-+ zDSBgy@AVi5LL1Znc-iPluCLBd>RG2}GWQw2@_Zf)#pwZ;up_H z`BXMvel|{Kl<(~y*ix?BMCu#%d@O$5OZ7UH>xGB*yv@Jn`5`~(Wb_PQpO@Zg_GFML zo*y!~&#!sj=3n!?&HsE~@x0AH^c$|h`94PjccXrc@o9S>AN@DU_kGTb*)+v3_XS^8 zFxLD&2sJvshsED`zDD!o<;(nhiZ5JQHs>tQFWo=O;*FouKi5C*`m*PP@rOMhy*y3=WYHq&ky-QCxgYFm)bUaCdd@e51HJD*F10YuX*0)f5IVGuG^&f)XaH3PoWRr z_u^1f_M{#Ep`X#oKE8N9%Ex}L?~@>q$@txT_Ew1dqC-j5d zPxmYOP=3duzdzsNZySU5>y$ly+BctCB`Dgf){wMnr^_A=M#{Bv-=GUL|_t>!y_Dgf&7d-F!om7C2Ie2n=-#`2H zd4qrTe!7yUh981XE}l;;8Y|WK;ItugS&{$s8~)!5kJKOg@1&U3WYP}HPapJ1`P6RL z>n*-`eh@SBw-v`;Gau_~W4*-}&s%)`-`~(~*Xu3*mOWJ{g;OGTYT}n#s3qSf67dKjc8q$-T5uPc;4dw8~Fd0`T9Of+Vd^G zc;4cteN!KP;#lGPn8|%O>ep`0{~Z52ObB0n=lE#3r}^1q&*UHZd6Zu~|4jUp{)g+E z&x5V_{}ny|uX%py`vhvwH|JOOyv6@D_`lA4eT_vszr`1>ER*l4?z=O2erZ0oZF;`u z7tas)L(eyv-zd1kZp6%{KYkaVw&w@N_QE6g1^a!-!uVz1bT{@D<4@OUs znJbul?%rl5kH?tB-EHQ!nR%?nz97zY{iVgkbGI|mi?=f|h9{WI-T9<>csCO@x}8bs zygN>eoZU)&Mr<6T`PwginC52jsXTw0o6LwYi$mMYv`H)*LeU} z9Lh`bIpvu8jZ*!>gU;0?HqW}|gC}0~@%d=Kz^m!JS&n;T?p_Tr%eiu!xqCIhEa%5< z=CVAnMrIy|>cbN=YK{dz;6Njtz5;tM|Rem-6t zD%%|S`}KwZztrh?pMX~U`}KwZzx39!6t{Nb->A>z^`)8fDnB|`^}5avYWgT&ocmP# zNX(=0Q|6z{zj*nn{Gh&%#xK5pDt=^Nt~Uhcm!4C4uC?ZG@^~!%a*nku+7&JSzkI~| zM>`Gs@2;!)^g3elgHA4<-`&Y$pkCe2m50pw8b-FKa5xIAFs!*bJF4qSC%R7 zhnSh4_N_l3&^2xG#q$w~e2c$jk45;)iju7LHRhUMJpT+Id44p0jPq%JYVQ5M z*Pj0I=b!p8&C_S{Up)T|zj*#BzIZ;uFW38)MSH&Pf5iWe=YL%>z4H9ho^SC}zu-7u z(s4Zfv%+=q-8XE%d%oru&ky)PCl}9)+Zr(snZHHMzx~kXlg0A`CVTkr*!S=G`n?|e zFL+))OKkCF{1*QY;QS%;%k`||`Fx8nTv;}9!ttkllY7y-I9OWO=N>J-cs|14)b{~D zF)sNmvE~=gKg0iS_wX}(Hp6TZisZQVD$<`>To_(3NZ&x?B+P8%|@ zJzksIo*yvTliKHrlX6l&f8>kjE&htwYJRgc*okwZU*Zp5SAK`01XwSF!c#bCO65%IK%74AC z{Z>3b;0K*7o-b}lW1wE$ofBlj`+uXIhs+y1Z}Zm=^tN$6pK`AAjG^=Ew9UWfd7H2M zf%*zA2zWlq$Bo-uuOsM<%~#)J{9ZoB`81!K`@#H7@dNdp;+Oj|d}3bo&l4#9@%mz) zpyz}64|_hwk9$7G*K?s>*Zu*Qug?$pK_`RtjcO`$7mlvaErU$){E&Hr=WYIqexCQd z&A;Y(o3HzUre5rPKFasLUl6V=n?1wzJ;q<|zxDYs_Du5pgM9YbQ+#lz_%H0{d>xLwzc)Y1^P&8B>r30kzH zLuK&yPyBp7#@D@CuWP?4&-de>^nB^f#+(W=mwbJG$mDri`#j=#o4wehKvOW)s=VN^GsE-dW1;gI;&!c6TxNg($^M>cWo|O3+&5xHaTv=j1xL&8ceDQpg zAN72c@9iJtU#{Ck>KpcaEdIFXV|+cA>-CoBhy0+E(KCE~UV5k5lR+jJd_F&9-r#wg zzkXctyv@Jnd7H2MVZ-Oza$oaLjH`d$09^KPj8C7N`}pX;NxtuMUU*=NU+xP&&X0IL znjbG;=I2v<;mWc(XB)4B-uNl~^!gp;2R>(K&jR1F;AJ{4y(f4PsNs2f+IL-Rn~ZOJjDeLbhe->=W-erd$a{6B*K$ISnHqxW(h_3vR@eEI&o760$R|6S&PMIXxV zINZOJGU89MrTlE*Z~1pvpE$0Z&)4x6&s*`&@xP-6B%$o{wU_@nKDbZwv&SCG&!ha} z`DfxUetC*7Tv_(|=Qrr{-{kp)ZP9OOF6i&u)cue6-@g9T{NDL|i=X1P`(N|1&;A=& zyvF_tRamE}xld&$syEd5ixiFy(%_ z>k9sw`b2xa#TU<8e0@J%{kv@K`4)f69<%sq-xTwL_;JF`dHck;#Pc=3c>Wpwce{t5 z;bWYS<_G-j;b-DUejeo)&p#7?@%&SK@w>&>_tVw)715rr`@eYJ;{O`+NbaYLZJX!w zEq-!jIZnfwJWn+r+cZ62^NZ&P@duq;JTI{~VjeO-5&vh$^8+U5;a~oUvHvl->lbk3 zUI%);#TU<8{GY)5DW4B$x9jy5Up#N|{|f$JGhe%1uebQ(d5fR+t=(QfPw9MRzZB0u z!~YHqp3XO(;bRz2^RtJai68lSlwUmmO#GDohwFQIA4~qD<5AwQ;66@0{};@!zvTI) z-LBU^vCY{(M?d!YKVsh>GhhD(R7Fhqjr?8L>FAPj+aFDJ)s`ye#|b`Pf_6-ot+1avo&KUO6~QdwKb8(fccJ zj`qi1=lym!2KU?j7u;`mTxdV!NBj`lPq`|zAKG*3c+}R8I#zX1UJ1pCyi6TW`5|;X zj7}U7+;5-f!Tt8R9NLfOp{ovt%S>}U7Uw6%j_ZsaCUVU4@=hkk zcsmotd4kDv{pPXX&P0uFXHq)jJwNUx)JWbd26{f9!*}`?%3l!6z!V-h7ua4>^^Wy#5@-Rxwdmx>l=V#wN=PkCaF8XM~xr zFL#;Sme>*IvLd3j7bog)JG1!nzBn<4+v5Z?*Xq7Fsh=OH(d|r1=iPB)U6Pob%`YK8uex@6Q3J8oSq@5vJFl z5hnT%J=k*{>b<3&k1)6N-KI`|7JuHyEdIQYiM-rCb}+L;?u)bd^FAhObbFk|pZCRy zY-WE(m|xMK_-8xsCWU!pz^H?8HefjLywDeHh7kYfxydHu&WG_XT_+EI2S^Rk)6LWJSPKvP~C+Rcwd?d~>v-tBq zCTcVlC(f6;H7fp$#7VpnQ~ViWnmwQW8DUy;Q~ViWj?clwXUHq}sr>ukx09D>8+t_E zzhnD8U(Ltf+{C%JTwCdLPI2=2y5suiFt&WP&xtB(L>) z9{HPMj_OV?M-x4d8ufb#L*V!C!F;;>8Dm;=Gx;;d96Lny_(pkE|L*oYZ9|XqT#)B= z|KquD45GsI_-gL-dI{%}eEx}A^*NLNj4`bmC4a`4K7YoT)bIVCM_o9NF($SiFr_b} zOmb_#?y25UCSn;e7qcg;ULszfNq?JRj>e7}O)*C`qQAxC+=jh`k<0bZtvko-e7gJz zc7SQk&E(G*)923!Q#={;C)bVkr5sbgQSZF)&~rzxBjx<}RPWuNeNI)Q@z_xsKL5mF z0!*t$yFUX=w?6~SanCD%2AGs6;|uq4nZKTq!veXkhH48qwe4H5&I4q7#2c;`I76z_jM(?#}>o>=5Z4Dv`HF zv=2QZ{*?Zb{vcmu^0#HnME?dDWj|CKyw3Qp$RDr@zgNeN=a3 zQ{KNb+c|cZKV$i{=4SF|j5&6Q9xLTl|C@U7g-6emz30&;ykF+=`*-PuCST2+e%<%a zj{-Fsj~%_l{v5_u^}JQ1cm5e;Zm4Dda|E!qT%SNbsXzKm^yMV8|Ctn8X^P4B z2~~ZidlF0;vn+oQr}TQBb{R3%oV<;x>U|rN(m7Z6VU5_IDqc@MUH*(Qt+|=}8Dowe z0v3-o!lZrZ5%H(0Tb*0g=axT*oXU0Mv4i!6dMU=VY9#O9_dc!1TgB<~XDm*ff($-0 zMg6vku_IUg@3DwKV{y{CQvWk(E>65g*loyUheYEXF~y%TCWYCLQ|9EIOkv5A<}vjF z#XoxOpzZr}Q{KOC;${!i<T2Uw83mg!%a%e@9pR8DV}!FAcv-oLv`TZeVWRYXYdl?M&44b|$9v6U-&OcHEaw z>gT(esL}0AndgXB&KVu98~2j1WZ9hK)!fAK$Jeah6Zyp49Q`&>{23X$*PnhS<%b?I zf8wX~nI{P!i zwC+(L{){lqdns(G=OfHdjNNtr5dKYYvo2LW$4u1p_BhcZPcT#S<=;c!H1^w>i0gJH zrStAyLXEONBmHUKGbj5q!nE$~lUQ&`py#pe;5RtZI}s-BLyw3*3dlOO}Pnv;92Z_jxPZ%hK3ypSQBTERFs4c`Mt?a=0IICG$_Vm*sFj)M;uz zlyi1JnMV?zEUh@F_CsE#_EYm#;*;etPUJ=At!yt#W50dg%J#A}_S@&JY%j~*gBC z`;kB|neV~h@fumz3X&6JV;^7BAeWhOs_P*=7s*^feZCM+{!KlwU$;5UaXL0VdM+gm z)c*AI$({7*#VoPP(i1bbebb}Q6n{qIG_MV2heVjmiuA3$I5F1SnZ=*?#fdT89w(UD zOZUZD{COV}HM%`cN@tqy_r-~9W`9PQ=4U|JpAqJ|qUF0i&psd-1snw)9Mb0{XWLeR3PVT$BppL5NF7rX|8+bBORL_F@O5`et$-oUVlcIUVlcI8=Tnx4m|Rny%b|EIHm1* zzWDP#X7Oi)xgeB&oM2{u-p4HdypM?*O~r}*x-}~PjKsN8X$MU4XM}0?yqte>pJGf7 z*I9E@-oHoU9KVM}TtBdU%l!=NI0OC!&plo`Ha#N#jPSkwj4`bm?XN@bJYY7v&Oc*u z(m7@Sw_}PGiF3#le=2s}OL$X(zwdP?m5t)WpCvw7-oad`=kJVD{COu6tf@HvpTnQA zI5*0b>CYI`?D==RM%LU+{*1-x^XHHm@TZzXW}oAj`#fr`W2!ALnqYj*B7M#q;d}iV zV_G#z{){orUSf9ynUuM1&r7|d%+Wcmuw;p2m_5KjLXo|5TKs)#?8fi+xu@=o6Ratw zanFh=CL-z9ozhA3DK>Vh&xncs4KvN2XMYCcd}Dlr&nA*TV@#hvhs=OKQM)a_ZkThY zGNldY4#H5G{&TJ2G9Fz)7;aT1m0XZyZ4{6~KMjKzuG z8Zp@+!uEQ8#KioWVvfd6$4lo9v9XWt+d#*QGsnGzk>}5kLUCH}x!9jzZ(g5ZQ}rt;@)W2fWYT_Z|ooH_0#6Mu1$38Bc`xq>FIx-$Ai}nFs9=4oPS2+9Mzrs zH{MGwf5zgp=4SF|jOp{|kQwl&)ZEiQ*k*S~YrS>;8R2{V8Dm;C+CM+y-Ur)!9pV0S z_%j$MT<7}yC=%z8i5}X>$+0-cPDXB~m}7^4IuYlHspgNcJ#`;m4^er%jY;X88N0`y zDqhdnUH*(Qt+|=}8DskVIb;U>sp@0q5XTJrGs5@!Gsd)PB=6t%J~i`z*=+UFMm-;k zlTIyH^ZYZ$#Fz$5@n@8Y{kn1Tpu=OQIEPGjNHoq7Q~ViYQkeZXWlrA76qYP;3{QU| z%nc3Iy+)nizi;AZ57X-Tcf9AVxtaVK8@tb+L#E1GFNabGB${(6|E3GfxX>GkJ;8S*E_klq`a z^AY_qbN=b(FUD`Lia-4^gSpb9_d0^U_?gBJb|6mkw`|!V5$1w8ak8jtr(chd``ekt zpZCQ{iHzrSJa#a%L+*>S`13wy@#lTa;?Fyo$sMttH-EFt^C!l{m>l0^Nz=9-P+`*8%n)4+0ZsB;k`-7p+qtFjuXn*s#)qcry z@%=WQ&(Zy`{nUQqr0DUG)v4oAIcD-H{)onj?Wc|>9*7>nY#l5%ukH{vpaUwOXllsOy!Q-m}s5b;{;P2a9fSE-)nT4$MY@IQOwNuL+dcfhi05`rFM{B2bSH~Vl?9eiH=DR z&7pO9zoD7JI4`NUw3lgb`d{J{Z(_gQp>4i=CXxIs$Eo>0g7YK$XjzIwkL$@<$N2a6 zhx~fd=l=!#zhr*#>9Xkc7C*UFxU#I{Py6aT_ttg%;IO}hE6cn1@Xn)rw8YbVcAVrz zmN(|-Q9i}V6REym>uG+?^^f>k@*>N-@`L)ydr@P4{T1`;uX%nIcQ1=xZ_Y3FxWp~X zI{u%)|0(l}$M@?;G^z6S6g|Jd`|#!eU;c<~|Cr`%ar%DEtHVc}NtC1d2AvG%w-ocy zorjzZnZHM_e*baGL$2R|$z%LA_WgCvGjf;Dk2#O~dW$byS?=fKr#{#Ge0`RWtDWEC zi{~x=zar*;&GF}J%FNfEZ}G+R7C-Hq`ea$rbZhPTnvdFLPd>x{Zujsre2nwa_`%Pf zd?tS6=TSb*O>@q2AI|kp@%%ISL3Xm|E&jh@e*IgXU-@%N9+&of-T#O`d*0&z3H(20 z{<>m%<@u$Z-{OnsE&e~j|EKV=j(c%({J&uRm%Lu{QQz$O0YB(uFtg{yZ4GA*nZHHM zzwLN_z~u4%2K)XdkGJRf7GK66;rBe>;tN-njhs~Rqj%B2sgBz7Exvf(;-`HRb4%Yn z;^TfIZ|S-T<^G)i;`wLz-|ZfLhL1dE&p*b`o_vOn{5;Apo_{9(;`yie;(3ezJM{MN zvLC*t@AGm0YtPsHUp#N|{|NpcGyn6AIrUC+O?$q@7tdS#e}Mmw%>N$i`0qe-{Mz$1 zzj%JY4?4McUfk1g+K`$2OyR%w{!R?!JI~h!lgHb0d;R>8FP@L^d!BE_FZqq|d!BFc zg)2)>el~n=hu?E@-agSY;`y3iJRjrJ+XWB*I}!n1fD6@k!}dNtf#duIVY&I)!;$>> z`3U4ue(`)Pe(dL}FQq@8|CQRp$rsOC@qhnO+^FZ5_I%y{h(pfjb078Q*9yLzV{1QX z&$sw^&ei|g=ZRB$zUHG&az5XWKj>sI`FtMB+n7uFoV3rp!SlnIE55FyzHU?J8ME|f zs$-0=`%s_HxA>{QgM7q;-?9cg{}i7l^hAE#@gx6F^Oq;%M}8jVqpnkYzNf0Ae<=O& z{Lp!b_jM$B-tNz9p11kyCC}UZYn~tSCp|B7S2>zWy}a$Ew=!a?QlrN#Jh&&T+2&jyx?x+nJ9nax=p{&tNx+%xZf`@ zHyXc}FI-v5`&;t!e(rQ3e(`*iAN72c@9iHHO0L@&^}XhKJN|2)xB1sRKjcq(UV5k5 zlR>6tr1Or(Ye&`R@#{9jm@9tV^D%zh^D#c1FNHscHRh4dIeFg4NB?b9*I4}i*AW)> z1mEv59N|H}%+F|kyzvWHmU_O8UPruqD(_5wqMoeB{!}7tcre z*v}O|0^!$@C?ETI`O-&u={XOf{P_6d`B?mf_wmd8-vaUb`6ccse}gILIG-P*@BLzf zeBH+4U-Nt!N3XuuJa6-_d49+bI=OgWa^J|wkojBG^tT^J4<|;cXM@T8koHZz@jW>5 zI|A+b7GJ(UKZv>Ff4D8vd1F)ZRU4Uc|Lja@8`o~ zkH(L_d77X7_)PwhpGWz{^UuUz{PGlExU%&0C$`1wLvn@w{(N(Oz0>)i#s34G^M{Yb z)bIE8_vc%D_=!$f_t&dl{C@}k@0qWiru|>@QQvezJmLqPTs)6)a_o(mhs@t&EZzGa z^qK78v~S9@er?q`Y4OGLgP3dniu2Vq9ZP$@#TU;<`1*I*+Vd^Gcs{~k5I;`1d0d~! zx%^J5=A)+Blh5$K+dcdYALD#9e(FG8K0l8B z+5MP(+;Cdu2kivy`4)eVJHW?2yVJDmYCh_lL^<+j(8*waqnaxA-}1k?)Gu-}{U7o| z+t5R=AM?BCQ{t>yn#0sGe&HXP$?3!RDrTu!o4NnqH4ta%vo>?v%sf_crW*J1iR0YP z6i3JMIgV4jd^3|>b0-sHznzKrZfA;T?;JZu&e!l_%;Hnpj~@V$6Ic%Uyg9}!4sA2x z1ItI%JSyI7F(p1(!nb2DX?|xNPw#mER~*Vq)bC3k1E+}{+TrNAuh%tS#p~n8yc%GZ z_dKmUBPBoQaR->?eOjBjdo{pZR>ZRQ@`>YY@i@m!<<;Bb#29Xm6HM{dZE-5E-o`|Y zZjY1Fd3W8BP4Q}A?B&{Dr{~}CIM)>|-|cxgM7$b^bNv95uSc}vr02{yo#&2V<+$V; zLBpZ&n#7^!Hm%b&<^FZ$0h9OrHTJ!7KivqwoSUK_-}LCmzh7_Q*DGxMCFh$Ki@dJT zy>!d{bjx`vuA6}W%YdKUDz7hne#&i%vz!Yegq0q>_)#nN*HirO5HKeqznE zz0FTfxBKUx;LH7Vf5Ez3Pc43L@yWGj{)0{iGkZR{teNv6GdYK}{lcRaUz15Y;J;l_ z{`(ck-G1FguebQeSo?fBhFrteZrAHAzIgt49GYLh0*}U-9Q(iU`Tu60Yq#t57Ju7P zo-BUaHyvxduJeyLALW0Cgg+TS()%=jc`|?b!Dsnf4$;7FrUw8 zx9j!h{CfN1-@xB8f5p1EU9Y$J;(06npWw8g^5=)z?RvfDqrTbm1AfrSU}n!B-A29i zt0g;a$ovtm`|+(kQ(or=Oxj`jPvqf08=s?U&$sw8evAKS#P;XxVeNLk-r@^amg#th zoN)Y_kKV<5%;aS4`4(S1Z}HQ1Qst8YG^xA;F{{{EEb?^pEy*F3+p=j;AQ{Mqvs|3B7c`H$@RPaNwrA8W<) z;`|n0Ja6&;2Y&mX?6>c+F5h?7p0D|+Z}$9vA9OO9+4JI_hSP@3Tum*3NC&)0l#geyxIe_7V=Qm)4Q;`vbiQEwj~8%o@=bi}_PEH{7QMDO=~@Ac=Q zzHUA?e3VapG7~@cbJds9ALp;s7EV6q3N^Z!|4+M`loX-!L>@j`KT<1Zr z*Lgr4CB}Zt%-6LWuOI7}Ja5OZnYs^ud6(<+&Gi|3!pKe$uzm;0uV`-jpW&(B5<33=Ym&*%G! z=WTxN^VF;L^Ll>4Z}OQd_i2BAUGw}f{-Be=V$aLmZN?mAisy$+_P{mI+kEZe@%pij z$@4LO-19*`^tZU?k@QED?|r`@Tv;}IhU=?yj^N>s?EDpDS<`yj=9GV)KM(TRV^8tH zo#L1KrjI?0`cCl?m8*Zm^RfJ(wr+kppSSs+?<=0S`L)j@p11keJU`?Ioh+V55AfV- z&eUbh+4l=H81qVK0W_Dt!&7@t}! z;`vy9(seHnp{^$G3`8=v? z@GpDb;9vH9pFipO(whw@2bpp{KV;tEd7H02JYH{kKE{uGKE~guYhCZV;em}_Ut@ea zANIXp0C$Q%aowih=iEQKrj#D{`vvAk^W)_USC-gMK2Iv=P8Z@A&qw)D&qw**{z0Mm zeBS0?^SsT!=6Rcc&GSQk(8=f-zCJI#)9lG0Q#?Op-r#wguRSncZ+Sk(k9$7Gr}L%o z=ddA9dim%-_IxaU|LX_~8?RGQzTaaw!h?L7pHIavTv;~fY~yvrpPy|iKT*%y@n7@2 z&A;Y(n}5yoLw?Z7V6o?E>UOWO1exObA@c^$+x)TH2cHAx>+^%0)bptG{rMEb@pWWl zPsZY>)AKcSJ|E*_tWLgoKFY^_uJ{qiM1ClKH(z>PmX7mnKVLi_%MXR`i(k$EK>U8b ziaW@6zn{w2=Qo3Y>v;o%&w$yv@Jn`5`~(YF{Zhxw{IqZ4>z>j6Z}Io*^8x->^*fGV-sO9hExvd@68|>y zJE=hYetz-%Gx4LYTRP`>jGz7T48M5(8GiBnGyLM0r})B^Wy3ku{KdBW?-2F(=bQ8E z?dzX^Uzg?ISAD*h*0ujz{Pev_+duyezx{Xin|9iY=jHqJH6Qi;!HhrXyb@JI~#9CpCuI(}lja{q5VcAb+JUp#N|)4p}>wC7uV@qC1@d+(S3pSCkb zmR-rsG+*m1Kr2uvI$p>cL&g|mb@9rQIZMz^E|<{W#5jr*aunnB3f{f56Pfb*$s6y? z43BR2O>s0}siA^_z9tZaiP}!4Xi8-}QWx`6V%*vDYzong58G z@BaH39VYk5e_~s`f4sfVkIhMoub%h#vaRIYzK60kZSmFfBYbKN7#a zPoVXD-T#RHH6FkH?%%#|r{`OIja!$I{>N+2`*-bF*Yo+BpFQ8<4>}o4_IzeHV#cLm zatghM9(KJvj>>s_mt{Fj&Er>o$vorvF10)V&Hwy>6l^>aY4&)VDIOn-GrPOZJlIWR z%jF_n|aw_^0t46ZU3%ueLbI>w)t`#8ROgc6WOP2 zzQjAmx9^9tTig7D{o?cg$hoDQ)3t_ty&?On#Ye3k<^PiW_*DED?4$8hHfjDm6+iOx zC?EBGl&`*iDnH1MUT;YEHNW%2KcMITA^E{x&&wWf^}l-DkN=;*|EI*a*CVsj+kA1l z&;Kv*|10r-$GYA(J^Q`IC)c|DIp}0Cljqf)jhuIxe}3KHPq)Klcdgz}*W>>SVq3YN z?g&3$kKjH=FN>dB`BBe%eA!kw`Pu~f_&iUg++XvbJ^u{-l=C{}KNy7XLr*`F^_jItZP&>$!WI zub%hfxA)WC;d#B5Y(3wczsd6*{-Bey=k*+R)brw;FSPat9;EQ)8}W;Kf_03OvJw-to@hzm{{kBI?wI-D*tgl0(q2A zeKHe2whQLxnBec!7C}C0!q?5b{`qNqE_Iap*3VP9K62iZ=RLlCk6`^^Jumw$`RaL( zZ?833r&-U}eAFpq+-tQkuKe=EmemW0{9!D@& zLj0dgp7-Nl^SsYr^L&>-=wz_i^E!7i$Leb=gG}{&m-z)e9QBL zeC%oqoiAyBjPj%J7nG~ZX3ubai#*_j_&_JoFplnVie5k-c#zK?dx{V46hGfLy`LY{ zcZ!dwLj9wjAIlGF8|I@gLiPQ*)gWfZJzHkdA_fm&-?r} z&-;Az>w@RU_%qjS#FyAlUDJk#^Zl9no-zH$K92IqA0wV0%MYJ_M)~Z?r})Uv6hE3D z_55i3(fX?A$N2I71eZPU^VdA@^VdA@^VdAz<?%bs`m z%bp+L$LEor&-?i=;@_ekFrFWXpQ0J|{1Bh~7d(zASC@6qH;#i*zVZAJKbjxo`5}I^ zzQ*$d{CIz&5!CYzf7$a6f7$a6f7$c*{6Qz9XY{(w+nDNk)9*L)XzhI7=dXF*=NF#r zp4*c)K1g+VzlwQur1!1&Ij=l((1xM+-KgmVpU#J4pYtLwQ~ZhRHUs&g^n{Ni%pI(6 zn6F%2V#AyMFZw6USI>{~M?F8vkM<7+%AWW6Yo7P{Yo7P{Yo71&Cq1vd)9lGXrh2~1 ze8c&?&tLPr&oAcbu;<74biOqFIqZ-pqkQxqdwwkb_;G}VC!f;|#UJ+=_V6HI=jUjC zqVX$Nm(4j_ohR7;&eeflz5l)zm3JmTqn`KUU-P`rU-P`rU-NvIKj>tz_z0q2KFZIY-yVq{d4Dv1 z@Kc{Y6My#nGyLrNXZXf1Pt{ksy8Mmi1C5LHK_0PlN7gY`_@tg|2fsJ5{g3!xvH4~F zV4YC7qQTei&wKf|ezQ)quB+om9wZSxe-1hsOg*31+|)VmGXMO#{_ftK&)+ktFt~So zzJL6Vb^Tqi%}I-|oUod0`|7@iy}u<9F%j^WXf> z4@^@#Mu{`KyUje)d z=o0nQ`Ox->;oR-Z@^O67`wQ@XTt3???9~Bg*sBA~uvZ6|2WlbT9n_lIeBwE+&k%D< zpI^3^#;b2*qQxfS#KF1~Czw2U!@bJA)Mpy64vf9eM0`_mVmtnfwpAla=g>UmvF}vc z4)gTt$k=h*mut{BalXdm^ycR2)qyzs4x!lHI8o+^3&PT9H++Ox9^9tTibkzcZ~muJfGJa zPS3XZs1^Hbg|9Aa@o8dG|2@SAc#*#$#GT#Iik~81i@(pu&L8EYzRP?tI{7&k`8%~p zhcE6%ZJhc0>$h$D^_%$N?s{I!KbYU4{@lUW&$8~WN4EHQF2uLjQ0=-ft@o^d$h9ti z(8*vX&#OBd&g?S9nKn*SzaJ8BgGn1~*1h%EB@ZqB8LPv$KJTxW@vG<0{Twt7nqO4j z4?JvavTi@$u%2(m&pgb9f%vx_yWP`%jpu7V;#}s_uIw0XerOVNA{OHB@iERtzV&dO zAMm%e`1^e1=TScO;cEO~+}4-UzsBFGMLK--yx0GqulzaQ-RJYI`rR{YA<}W8MlM{h#J(&Ci~nkH5!9+>7yB57+U7zj1R<=fBU-o}bN6pHFjhHGVK|>r3fh z-gm@vG-OzI_j3-6_ zdA`FRbTXL9^WvJObNWnN)Zvd5w~urFsOLLO5>xTtaI<5#>$LMLzdVjMV`l!gV<)>k zF4yZVewp8U{$bo(_g?D5R{Y6hUVbP?=X(d^_QLZOANd;L>v{X;@MM)AY?D0Z#y`cUjl`2aAFmybAN39MY3|rQyj!Q~@{!{X@(+Z6 zB))aKU9bBGyGfq+@-scZUcvnDh-JbL>Ul5z&u{r!t96=Puk(YNCC_*Gv>9GU52~qM z$C#>~$KToWSROVv_&5KPYEM`CEyu3Yl*GTeedx8q5YOZJdnS80l7|*wJn!=(o^SER z^FBY)hb_L;&*xJ@4`iQ~8}j^0bBdVfJyfdvD_56ba2@dPT+@@OoRYtt&aC67$xWcA z_!w%CZ}VW|N6U8N=VXTBpW|caTP#1QEv8pp-+ug5$0#4KJ^A^*>EZ#|FOBg!e~%!4 zr&cgMsr#y*r*`{DdBK7`@AuF2{CdUmGwTO5!P~D4y>!*)y>`)O_*0&yUry=8NZjeyk5`zU0{Fb3IPaQz`P?R6ieh zdgrG#|JolBem-81CrhU8>&jQIE}K1*jwAV=ThvEK8jHky$H#!U2Yo(xC)4t&o%b_W z*Z9F_k3Gc)H_ZPV6Mw#MdOv=eo0~UhIsXR&(L7L4+CL--b@G9y%l@JC$M|5Me5!@= zcS>z9|Lpld{sZrqoAI;feg3Q;#PdFX&Tps<%eTv?65gKA*Ezv!+4Cs&LAAw#mw2B4 z`GIFV&(nD(wH3Wq7<%2N!{k1U<)P;5bsLW#t7FaA>oy)g=J}d`q+GjvBoy-}%~|W= za=pwyY8T{Nw-@(k!hSJ_&;6GC+<#vD)H@nKHHWSrT|U2%d(q<)N0~I1?rY_}F=vZ`_WJ&argkr*X8HA9$pk>{#7XpT7{ZG&=o0D6gZh%KqQZ&tbj%&-o2; zN}vehHhwB$$Me^i@mlqKs%;}DgG}T>KZm_%avkULfZ_j;@uN!JKG`PgczWL9FMHnO zV}LsM>HW3Nqw9Lvhp6ch%#UGO4;7iszm9=ln+gcHo{`O|%PP#pt&yhi8#ftK9NIkt6v<$)ldkjf-aW+t_NI?t)jXApOo zZ#`Cy<(`k2f_&uW%nuDkb497`^0)E)$N5@UT_P?X5BZr+OFr<>+}iv^<5$l|_$!|G z`8LnCe|Bto-1ZNKuh(t34xRigozDm2-x15S=Y9T~=ezttC#&bRcbYjLWNztvzRP@r z=Y9T~=Y9T~=L7u0y?M^Y&gXqT&CPtim)8$&e{~T(Pvs&%B|o0tVsYJij5gTL^U3IO z1lt7pHV^jwi1iP>ri`DXf^hx(%<*-8M))>A`M&A>_?4^6=A7mEC1aO5mifW99SoRV_c1$6JtV3J zw)47;^vh}aK7ky8W#0IT~oqmK3;qFQk|bexw^dJ+x!q7{Gwv;2cxlZtKYT!Qb(kG-u6w*y231%0Ftl%%|Ry{YnhBzBGwr`M;09 z$H$l#`Q)Gb_`%=S;_vgb=V$BN=cB&M@q=+&-|Vm1_;=&^x_^-U)c3kPxZX6b@;D{i z+CIEnxBZFuU$Oem{*F>T@5OKLg@SGH`K`on*JX@0e&j(CaptL!pRVVd%rD7_=4O;B zpH161F`o1}Y==o3Y;(U0Mjd~+F*ASPx2fMXtLMG=KVSJbboQ8H`?HlF$#L$-M$S2Y z**5hy#*$9lH|zPDk3LDB#NTM*++J6?=hLoazcrsGapFG0r-0Y^){}Mol#wU-+4Hmc z@5fI*T#X-$+xk-a*Z8~fd^7)gelyTN*2(VtQm!t!pD1tTaYSOXeSWu2)A8f%8}+#$dqH#B@fB-9VUCs-rL8n3sZ95;;ZL9{*Ghl z%zcW~^B(_K@Tcyx#5u&J7$9l4kpQfwZ^WFUS`N+?seDc+5{9xSHm(st+->F49e0ZAAKSuh;o*P@wx9Y3@ z9pPIiTmQHC%GG6L{tCxB&92+|l|A3#cRerrx-i-EncavPZA~%JYv^IuEo)2X@m-eX zFg1@~`6W}FKE}*-YBR;-W6a!JZRVLbJr*C-%Xlrf^arNC&6{L2pO?3ocupBZ%q=;( z#Z*Vr-(;?xad+eFF)_4>II}BTae~RN8H=;eRR6w{3D#7c*p59&vG4=Kr5;H&nPBdx zTiZ-=EB!5Acem$X#2RCIb5q()`=ekGnR-^w>$ zjq%64I>7X5cY1Yz>GqiBa)gPVeBI73)a&g`;=u6&5!2eDZV=QDL$Iv(fm-iadYSQO@aQ5=U=`2RDMw3<@nXtt^T3(ujMDZ zyUiDO`}vu^p2r^d`8(#+%=Jh(Pp+3Zez4b2?K-wUuOrI(W&VD5`GZbI&+xGVwf#YC zbp-Vi4TX-?&hPbK*!E@P)ckgtw85M1o8F9>`S}=3G15bhDfN08zk0rtlZrp|`38H% z&yS6B+mWzc;EQfW@vb&1)!!p<*pbc{du{Rq@oH8JdZxV+zdrx4?!EDRGk%WS=hIZs-%Jokf77#JU9RWS-;rNV+Xube99JX!%sjBM zemA7g&z^VlZ(@$~5lApUMNSY_EPn7gPkw&p_}TMbeo$MyT~6m4;rMB8Qk`S*%e8O3 z*xYlAe$%PX*Zo83kMVcJtltN*>%x?AwfOK*EdJT~l|1j|f7TD`d5=HmH`F(IzQgZ& zzRo$A?0GDCZkZ*Q;)5Eb%aooeJt^P&HY{alX4vyBe)WFuh99Y8i(ef_Z}<_iIx@&9Ot=V%=`{W&0CjX3zWl>G{Q;_xZDa5YPMki0AA4 zgUg=p@&}y^7JI%ick`TenB;`Aj^g<)bHMX8Up(*gV|A?g;(4DR>%*Eap7;4AjPrc2 zSSO~=qbpzgBf>8|eD7piU*+mj_lITf8Llsde4u-1N#_fBy%#@T%AS9a&z^jW4{n%m z@4sc&d-BAM^Y*|EModq%MEZ$zZbQk$aw7__r?eoE>Ct=kGW>OrHC5c|fQ?IJjQS;+7rb z+NHOPYc(%ynm&_l_Tg_a{&XL5j=MSM_z%29=O)dan1{87KEFKQE}egW9MS%Z@To-V z7Q1f!bM15G>QcvpW$sC-FTJNY`Q`e3{NS=DpW-7wVZJ@~Me{@BjPt9o6iIlt0%8_y5Z^XnDN&yF!p_(44H=V#7u$elDgH3W|5__r>3SRdH2 zca7ybr@;71IpN-U2h(`|p2_ocE)N*~4>xAzji)P z-QD-YoZryX>iK&-Xow;D-6uV|Kk4KgJp6Paa3Ou95uA z@Rh5}=A7dGK|v>ugW!eZw|O4*ydVF8QtA1;?WKdfQ}ikgmt4Y9$=7Z8-}m`h^SmGb ztRLij-si7*zRREVy!K8r=Yvf3e3!|6K9>i~JwBiJ`LlIAKZkv)4-Y+-rsetXKcxAP zt~KFbI*(}Xlu1c>D3&xqn?R$8zyNm|wapcAO&J#PUD=ekaVg z$5}g;Yprd5OkH(9XTHk*p`7PDTYluajoHr)|3D(OKW%-Fkmm#Z!1rxrj5a@LPd=ab z`Lliy&-?s2zk$o=^IiU+lfmNid78Snb9Ruap6@c>;CY`vTSvWa)5!_PKYhNz^Cl2K zlzPr1yI#!SJJ0)knvd#%>zvi+>v^P}kMJRa^STqZE6(xmjw9G6m>-H?-A?g``P}P~ z_-FVSXOK@X%rV>bT$eikI{*FnWn0a&j&|?&tLO=mp|xaEVE-6nnmhK~#`sxYWAm^1eu|$x@8xGMe#HG~ ze!yqH;QyWeoQpqu{uw^%yBxpqd}IC|i+u9`>G=j<@-mixTZ?+#_CMMudEU$a?C&Vm z^B&*c3kBO;?sbrkzg2#ayYH^w2AvFM^8EQ;hvyje(s^v{GUa1~2Pb*H!yj}qn91`Jdo$)PQ{unm zA>H?&!=w#1dv71RUgxCb>-oIL-*F6`xlfUL-sArY{`!5>n>pwF*gSk;^O_54Ww?YXh_e2XuB z9P3Z(WO1)}zQvcg$N0jrOuKILkNPIh%YK^kYtYGHu;-P1!vvM*^LKikUAOUJ-0b%* z%W{~S$4}ew1JmT=oGa&Nt~_@9{YY-%Qx1BajYsa%nd{VMipS}1Jx}Sj!pyy;&zECA zG_DcmdHtou#B*z;I2^PcXAv z+e~pQ{cWJ`d`-d5uS?Ir#%tuw&C_iIarPZz#vEf>N8PO3Jb?d|^1w?o$LMLUtIc6# z-SUlBWBf6%4lupion9SahP^t%Bzy4ZL#?@h=hRn2O#Q5`#WXb^V(RzpT1<>#Do%%~ zZh2dr#;Ze2{at8l?09Y}&R*RqokR1K=Mg@0?DP`$r`P^R#vb+R0MnbBr&kAv?{5cPoDEJAF??-nVK$(YWk+8(qtryq@=BPnHxgLo* zM}fM0dkxjD%bc~|v-68w>+%Pk3}*7YxU-p)E>n(kHclNs`sD}3+ho!PZ@O>#JwG3V z5zC7nlG}Q{j9)$P#cw%7pKm0OjqtY}3EL%p%AI;%VzBX}rpx^7`I@i!_Umi&Q^ub? zT=Oxu<@g zXG+d5dEoP4g!3B()@0HKZ@O>#J>R;wu3d6w^?e+TTbK8I+i(5#GC#*5^T^AOWgdw0 zNZ$>l+^Of~HI|<}KhMveulbsfvHX2q^G{<-fvqrM{a zUVggg-gV5`^Wq+z!_-T`V+V#SheSHgNPgx07^dq%|86qb^Pk`HwTSw?Ogf%6_;MWe z`P+VOe1ATFz9h#l^T+2O*1bGm?6IR0Kj+2gBeV^3hI2)q59x1N=y{z-2Ug4cqjq6_ zW(p_8Z}wI5wVsjqvky!D^?7@o!hnMDBR6M$sLghDi+R3|AN)=F^x*yIc#57+IiKN! z7v}%XP5jyO2Vhlw!+etybMIRU@VC}vBek9`}~OKTYRaX&!>dyd=ZX%`1(8zSM#r2UEX`F{5^X4+rfNH zxz^Y4ocdDunDbH#?h{=%{%rIQHu8EhF(>)lr;+^3@R6S|Kl{9_@AdgheZzcPQ~hoV zg@^y0$HZ%WY0Sa=W2pP-cI5M1#~(U;@w}h^>G{Q;_xZDa5YPMkIlqC+p6~JpoeUOx zUgxeZ@jNS=+|j=lL@gsznO@5qT|S>^GI^fH@=){3>tgr(SRHGA`F{AGAM3-Ke;kx2 zwqBKRv(L^FDvp z58`>BKj$~pm*v~#Bc=2@dQkt^b4#o}6Gkvn9`WnY01EKjL4v z5$BYAy>8Qqnfb9g*756g8;>9B!3Qq%SVfy?xMC;w*)=!^2w>nL@%G~4xhP{+`ebPp5W6qvHEV? zqUYWCvwO>0)39>huIFh-H2zi3JMmA?FZH~`pY_A(d51seH*&VyKj?JpcDqjPM|E#` zUV9VEgZ4plhUO?854`I(SEhQt%Y1|9eg146&+9f$9jE({bL_`|kY`TMQz>+A+VyMx zQM({t`azk*xm&kAgP6j6>oMzIyMB!yV+-@CM>S^JOxGR$M$PT#pI>$|qkO~F{qT5- zImP|I=6SQ9TfVL7==r?QN4}9p&3WEe{k-iTl#D-z4e$e>!`4nio!Ij}f7TD;d7r=L z`7R$_Y29wuk>6X-QxB%zuX|>Ysh;mLxzFeFfI9xrW6^EQGLLo)d6z!4-<7iKbxyDi ze;?G3f6em&K8K&;NA2=GZt;g=e%W~h?pZ@8KLykB^PH{ogZ>NiufA0$T%Wh`V{BnQ zy;PajV-9}{_78_L%Gden*B3>+i9d4PCc?LMwE5}v59KtLpW5fztH{A^e`4S4c|ZQ? z`Nf|1`D>o{`Ez~)mrt_0{6Qy!^+h$++S)lxPk-RyozK%t%6WQzuaf(v$z%`5@=){j zy3OJ6V|A?gdfmq3$NI45ABUTB&JUd~?K)rVI*@rDUHPbKkbfA@AHbaZ;`0IZ+m)~N z?Dh=DPhlL%!&sV_t>3PE{5u?f<{a28=OjN*Pha~J&v-qb;?JCeIhvFFJUw0VG0q^L zUUsDX&_+4_>+=-O2fYGu>-_igPa9-rZ{6~ht4pmn?e}y-l^@!bjs?rheoMZ1KEMy1 z&(pX{zMRkd{8>NzefmA@!S%S$&z#?oXGt{jNeOTAF=TojJ!tTD9r>XD6*dDj!{zsXhxUKjhqJ$fP|thu|HRm*e#gP_A_4mT^(KD& z9j_6$9Jc2vdFuZv|ETFQ-<$_leC?5y_>CtkKDf*AJNzxyKll0X@sXcpzVUpOAJli5 zj|gx3NBxM`O!nttJzvGITwQ8E(YVU_YxCbp3tO6Ia% zmvPznk%#2@4!`gDD(7G(&r5EaIqx#%8i9tTjpoa*L=-4#YPiT z|6R}1`}ngbYd(gu9KXX)o_r>LsWs5J+-Xc?RuS`?0Nj{Zhj3qIeT7WZ_e2+Q)0g4A$h*T zqz&G5-}Gk8%-_FlQ}-!S&wKIz3jX?i)9>S#+)BTFVqe4eG2?!m;b+fF47R??(|*@~ z*Pg$RKYO_5qcIMdNBG-apL2bu`N?C?@R5&Ye)fEwpX~Yh_z_|9e9h0EpXFQ6xA^M$ z5xzY)ww`bC#gAkCX`O7H-{MQ$V|?MrT&~yc{K}q}{WRy-pp(_}%D!QOT3!R9*Yg7n zqvw$rH~YQIvK*%7F}IoLXRhCSb6&Tl&l31Jp3Z~yd7DRste>+EFmrFUnFqUx{uYlD zk)-+7V&b_eraHRCH1!>dQ@z|`VhmGpI!tyY?QbNXJ*N71l&Q{bjUCTT#o4R7dUh<% z?ABJC*q?s(Ig(F)|8M7hIgiArgK@rSe%>?1ZDY*7LzJaUGY6=(Hu9H^C$ety0PYuo zbP1f!hqv&JS9w1!f6S``%zXT#T=FC3j|ZB)I=~Ejb%1%CpD(uJ#B*Ao0cQSQa*Jtt zYKTd#V*AbZm8tU(6Y=$!>Z`XgjaP@5y|L36hUOHHxL+gM-#D}1OQ?~0b!6;OuMRN1 zxp{hZfEo7cJ#&*YGMzJby^g;phF%M9I21K*afr$1+_=tC&L3szvcWXlTF%{i$=A;h zNBAS}C(i2)>AFcI{-O6n>_I)gAc_2MntS%RsJWG#e16N<8}i)H*Vz1kv&hf$xy4uK z&c{!EBmQmiH6JT{%BAfkn;+V{95+Y$$L62UId1vt<(2q*`Ju6`#-G0%D6T2t+1vc`ts;8Tx#K`vUR&kbZ3BobzM( z+m3PWDgN_(TE}JMM@<*`*7FjBEP0=gpXT&k z{MqyK{9b-&->dOw&$se(Eb^`ATYUArm!HqqxUUm-#t3UT_Ea2i}Y7ebencs^dpZ7x~unH9vcPHhzp8C9}CI^CR_~ z&yV$d9Y5_|JUJgf&AGeyv*+jez5LL=SL4r~Z{_D$_FF z?RUHEF~z!~l^>jsv*$hj-1nVPUlDrG59mI69X+TI?K6p`AO|^)f%GU68+F>|e=Ow69&i3%q3y)bVG}d-2nGM~>g}%W;+Q z^PuH?X&^t?m5HDF_dfsF!-M?nc`rXSJk3uTe=k2YwrKq3x4965-tX2P$LspizGM8| zc77$#d-ZMe}2o?TI*{ycm0VvCC_*GUC-Aw1(Q9G zB{d!WkC*s2|MLS+^xq?pE3WfYJl|!8J>TMs=Y4*pjxD};-seX=-{MRC0(`2+>E1kN z4>ONyzH)WhtSRT;&UfLY=blHRVJ(=Q13{C#^ z`3s--6N&%I$zv(^Yx&4en4gb>W&V5lp_roiw>h`>P0z>iy1umUARj~3bAyBWq2c)! zUp(*Ue|mng=Y9UHAH?%MKjQg1Kj5-_yZo-_n@sk+&Rulqk!nl}o_oIM%X@ll>GOjw zljmtP4_Cf;-seZ_c;$=deSWkLul$2^9N?n@+4Fgw=9Hd?Q%y_0_J_~EdOkBt50rf6 z>Jo9)J;U{7U7Q}aPNPk-GfTemB7D5&sYzp5jwXGZV$kH zerRk_zU>o0&vS-eeQDo8esP~gjQ7U#Rekw<-p|kU{9@1h{8>MU=Y9U1-%wxne3y^z zrq|Jf=8;`Tom);|&*M)Ai#;u|9slzKfABm{Jwwx)UMmc}Zqs412V!}s`Fh>Pd#~%ZzSsWi#Lw-ZOd4iu z{TjdWuFFP#@De0Qaz(w~TyOAGpL+FWe3NPSb>&mh>|DaX?&>?0AKG`6f32hD>iWE` zFNGWAPxUAAq1Wd*FZcPGo?q;FhqH*ZSf-RJMzQ;Q4zdHCE{Qd>u1}|0DIG!(aBi z!=LWMBN+eGJVNcF{8i68`H?@XTc~YY>-9VmFH(o3Jn?vnp5*@FSDZ}xyYlUNgRfj& zzLjr0@A7flf5sfm4~;F@KU4LkID-7C{=|^g^SYmd_E*<;dValv@$ZObm!6sOyc7Sj z=kNLG8sux(^QJfJoDVW_yyNekcbRYSyw6|ryw9KRL(Z|!$GJQ-kopiUnb%R|(+^jV zq5e@mzrV|FESdWJm5-Rhe0yEOURSYByYey4FrRX$aatxhL!WQ(H}XIr|NI)|MET0q zrH-fe7>9AjY58{j8b5KO@zb^%e{Y?p;|Ct%$0Nwc>&~8(YX!2e{`*aAqt|WH{-oY@ zex~Oadp?l=9kJ{w<`;6F&f%@|Tj!Z_KJW9_Jm2M`s>s){=e2h*?t^Mw z;CY|F=6Rn#-G^t6WnMLM&iNtD?5F4RXKMX-_ZlhXN_{pfO*cxA{@7E*Wy2v(i6H=kq@Q zpaGoM{BwQ#{fTYZ^8tR~`!+2P!_z4rPJMU8vP;gb+wFRbFP`_~U-NvIKj>tzz9bh1 z_ddpb&S9i#`@qAyZbS98eW;!%R6ozLJk)%>ZsYM|p0D|Oect28JYVw<&at1L-FW`$ z{Cu8v<)fxSKFvq3@mIaj`V-jAQcP>*40oIu;&@exQk{>-8Ht#h*Hukq6h z-JWMp9(bX~N$WAbdY-oJ_dkFqpYWNV_e=&3z;1eI|~%<#+P8 z{Ci!!4tG<>x!(~WzdzFaarm>pgHX?Ra>5??iLp=pj)U_-d2>9#xlQLA=G>+@U#jw- zJwMAYJYVs%=jZvx4;7!~K_?m0`5`x+o^SEhzmxgz^Rwrl$q$V!*8kW)a#;6IzrMy_ zllkfQr>W}z-;SkTFV8dOeBSKm#y_*aqg2m(^|kjx!8VikO~*Lu_y?VwJ%8qAkSXtR z$~^1$Z8}W$9=#c|OLK&NFL1MzNS5>)|G!^F+DrA7^FTbUwTzu05@r z<4DcVo}cIU@{>J3&(G)cb^Nq%$;&L?dcMV1KaTLNldb1leC6s=`ib&Jrw<=^*tru~ zxBXAPj^)SRQ|r$2b^M4^0`2u@*Yi#0m&B~GH*(TtO8l2R@aM2O9}OmL@TU8w1H@ja z>$u|>I&+^Q^?WBM9RIK2Pu*uJdCcQWZlw=Du`j)Ex}8Vz8k>LQVUce=U-RLyWj-Nf zTs2?o>GzLpTj$4mzRBO*p6B|`@sXcpelI`N=d1B&&$se(Eb{yPiR`5FczDbPJm29DIvG8~p2sq=8!>Nmg`Vfm zcY2*&xA9?KvfsNb%VBEH1#QO<6#j#%&pja5XvUbiPHm=me2kfUtIa$Pig%2e=R=E$ z=O&oh(JiJrdMr*VhIqNfGX8 zUP3n6t%GAfulvw;`~b+zP4?*+)0>;(wlQYkAhXao%WX;IK&nt)gGn2tZHeivmwf&FaD+ede&W2|kgl5`JUP!Qjw@x% zL+^*!FW7#7|A{;gUvHS?XXok|ZT{7{^YK%?L)ROo<0p^VzOwPt-no#|`OoLjH~CrS z_wqwyTa90R-HM;~y~fY(Zu7<6e*gT6o}ap&_lm{8gFkaU63*lI$lm<5_e!_x;>^4L zB-gt9K_`QmJg@GQIY7NcL*aArE>n(kz~ipdMo}j?%z^wZuqjT<=m~8`8f_Z=N!M~A9yc1ec$vz{FZM$FEQBo zv**t|4fC_dYCalcF+bMBO+Lqq{S4H%%n$XNt@R~8%luw`Xy0r7)2}b>dyQ{B-^@Q> zi}CaS6FoomecR-DufDV27go=E{JHNtqrS=W9e&sIb<>7{;VI=^B#ZBZ>Ur9e1}iv#Ovrm zeQwvOepe^s@9cRj52>y6DE`g={J=l`-*H~&sd&E26%+r?HRb%<`7RvwaDHE3^JzjS-hIy`KD|_# zIerSLe4bwZK~J;a<9r%Zi+_Fo!q?jK}_J&)Hr`JbL&uV8+5#Ij3GZ{P1X{3D+C|O13%oDnIHB1l`o$6%vqE}zqcaUG) z9}eTb@qATZ_Pn3}>G{Q;_xZDa5YPMksOQW4puX(+E+5@NucHUm)UKn>><8;i{GC0I zKk?k6*HDe|JT0~lJiPOH>KV&a&tubjCT$S(e9hPEHXc7#$C|I#Z9IOg4{QFRdC_H^ zbIuPPep_>=^!$~N+9_9;cYJewrgT0rtrKj0P5-%k>LKM&JG9oX@naL^>hd;zy!K>L z&nn-pH~7pm`*|y$ipG;CkK>j*zr>wd;tB=e4aV{;rQBV0 zo-g)O=Vy9;splR3tRGI#JN#wO-}BMw$k(vvuf191e2}T0?=s)ud7nR9$Md?)eV#e~ z={`JY9tGkr-WOwjG~X9rJ%ids`TYJ)J%h$MJxNS`{>n$(VZOaCVXu2wr(O9NXP8ep z)Hp4Z`d6QC@V8+8N=!U`GA-Y(U*jiEG=ADvWA3d} zI3Foa+INhP*PT5{O+=pU>q1efUFTq$U5aJ&$($ZK96ic|ZQ?K0Jc) zqtv@`d%pK=o>TQaLflb4=A$xcp62zd6RZaiRG4qwZeu2d^^fJFW???n$Z~Z3`uv5z z1@n)bjPrGV(zdi8{$IO4d8it*&3P|B%GG6$Z<)RIGCxN!KX~1O=l%Gn=NEh4=WjdW zpYVft-sjKx4czZ;f1>N@b@ZVAvFlV6s%*FV9B$4jp=d#RBoCPN@_gyaM@@r#;;7p(*1WIc{r;7&p7-lZ zVW`isG)}M{yYdl8IR4C``1Sn`_xd^tA6kpT|5rZ78RP?a z@@b>Y&-yr1^&%f=}dcE|I zdj8zc4S)7`lsIzoe#TZt9$LnQ~pr#)HA0n^i z-+I1|KYJd3<8h3~-^&k;Z8iRUK3~UA`(EQ)&$syMuaW#%C%f}2<$Z)NaoV1->$d;N z*RlNAdumy?+x0p>sPA`|Kj>sIzl5o=H+r(ml$bAhNS^O7X@mFOH~q!~JC30<_bF1( zd-4AY{?vVz4manVAIYus+b8y=za6&oNM2*}kD4y>t>zdJR47x{XiI3K*g01{Cc9=dPQ3n>ss0^h_Qp>8n;E-$mSW)tGE9D8Q6Qb;%ziI{%x)bVJ74p< zuRG@1aNWJRDQ+8!v+odP>5|f%;^uTy-t8D8>((dWszZ5c`s^)y?AadYSUO7Opt zx7_pH{8QhH>sx&77yNCYe{6mGe2Q~5e)V-Lej3{?^|kj(x9c)zt?R7c$g?hg(8*vX&x<>?M~j~CGUYgD)v|ol7|*wJ@4`JF&MGD=wX?5y^LQyKf)jSeB+Qhj_|h~jkTwksmYS(>-?a0i+t<( znvZ%e^Rwq`KE}4pCq$>d+gko9{r7zBcf7{wf7_F`zI{H;&DHp`=Ue$dmigK9Exvl* z%g-m~?9}J;uULNe9aAdJDZ6g#(u!X_@5Mj&{Rq_eyBq(YlfnEFrnpUelzQn8XtxhM zocppgzHcSxG1&Asf;5>V);HZZ{hn{#Th~rJAlEh8p7-LHZ7t_+z2qOsV_F3-+s5t9#gCSz03XLl^$Bt0`ZYNQ|I_pNDt^?C^WyUflR1>C z6o0X=Ykjll-Tb2+a{QKGj_cY#*ogbc2xB;PdU2JKSuo^U+0jYe;TI78IPal zW;Fi%`z;c~_p`p)^UeMY@@>pJwZ+M|y?X5*WIuV{t?%soN}l)l+m2W!{Gguq_;Y?k zos#D}d@3hiM-S?AyH34-%{l(gp2w1!jta*$#=p6hKJZWHe7<6C>AF>y8TLGl;pzeL zyw8u+vBek9`}~OKTYRZsfKT->bI1PXvV5M>NwuP)DOZ=xnsWZ>wR-H3IBU<>@zaF1 z`|0tGhq;c*zdmo{$0)*ldZ{vv(->i&zwnDZ_2Qr58y=6t{5#L7l>ciUH0JAmZTzTf zIDVUx+54v7$A2KtdTc$Y?@X_jeP!dvM(laNKd0vxd*0{I`awMJ^COtgpYGe26#EB}1I(N2FI}gamVDD64qvuax0KGe^R(ofy1M+k`)`$gEBP3ka&@`2^TSV{p0~`> zlNFygG~;+HAKWnC=Et1da|&!-tS3?5FyGb`(9^^De7^1<${pp~&(C4{)2`QjW#dO2 z?D+sca6aFRpFQvMXZ;|a_xW>vQ_pw#gH8sMJ-hD$jTe8+^ELnAxVt&${9s<5bMr9g-UlVGn6ozj>iGcQF!T4t32yyx zjbHmO!nYo??zK+7@|CMg?C-9=ADT=@0Q7ZIF|>M??=jm!=J6=>3N4g-G@go z{#DOA@z?WFJrMM~%U|@o%U|^TBYfj|myaoTx|g)1`M2v04=~rCU*)m;>UQ1Nl~4PQ z^(S7p=6NSS)ALI`@9<~+aC+Y1&-u-G{+>VRWH7(1i?v7bJeT@|3OUGB&nrup1@jG_ zSFSE={%jr3>o)g!=J==k@Njd^{PKL>&Z)fKJa$LH*|C%;)}*v7nE# z$L#u*kC?*z8BfxngZbwdTwI8p`Mt@H6i4%>VV$=A0>r^7D6$ga$NBP*| zd|zpM#;#xUgKhM>O|hRkKhyJzJs-&bj#zfdPx0N17wRh?3gQKI{Nj0^zvlTaf6&Ru zEqngjJ4Mb1nd=V5{-(k`Q!RzxiU$5JE{Fvu!zFxQS__02$`Nu)I?&h5H1IM49 zr_yBSW8>mH%H|(64e~L*f~oxSdd@X|1QO=|4PKhgmuLWI%+~W)J|`xWAFvJI=7d62 zk2Uz*>wf;{_&SGtJ`!T$jK;5iiSTLcng`3b$HY26M=(Di7V(!k*ZtOf@w^}Z^!#Ga z`}|oy$oag_k9q!@AN72fKj`G_dC9%@DD@IewGTX;>o)jIeEXC2%$Bdu7w^vsCVOn| zcLW&!5AkFtX6DcS4njTe@qc3MQ@`U#p7i+mJ93*mX})`K;OWzuRsNCZMSkJ=il03{ z8-L-qijT1^$4`jlnHE2JY(D-TU*{0U;q?DqeW|?n@zXqt_5VHJc)pRJW0`M`FAcur zWh_5-EcJTnA6$ds^90$C)}!{%?C&Vm^B&*c3kBOu-Z#A&f8X;}&N22c$%*7Rv^PKM{lRZ55yI{UYiRd5{13n*3dM@|efR-}7}sjOBcfiB%;dkbMk-3x1N{R*!uoLlH+-Vzjf<- z&(GH@YCcWSRX!o^`v-eijK9Z6ejep#&(G&Sd%l(bV>$lp`4(S2KN7z^H@2Q{@zwJq zeCuTE{1#uhzTae9+lP1Sc7A2gcj6y(vU*`OVnFqURjEVV#^xowYtO;gzbSqAE^jMtK z1LDmV6JwZ)Q(bw(WY>(w*<+gC9_UXh(f!yF-&CCH+4k6vDW2)ULA@m%JdK(it)>^%dN$H%cyL`sksyni&-zgc1GwRg=rZ+cFuMRN#4xxOw`3#;rg2ize z*J-V27d&_SpC3xB*2~J$rRk~6qz&kL#QA=@zh3gs>kWF|TgP1SN8V4I*Bb`-L+^(U zPDDO$55)h8T;=Nx>O{?<%@6Xu$j{Dg@zuHb+dzJ7{Mo-PJ{n^=e)Z-JpYy#Ee~+(T zeu}U2=_$VYdWEm 6oxBZFwvb%l$^!2<~Y<}&CZT-IKS`S*D&Sd}CYp8Zzazf|0 zt^9x^px*qNyxxG?{-7Y6F?X4AoGa@n^S{gFF-AbzIAV1JBgviSI>L#%eIztw_fJwINY4m26WzohcFMUAG&TlU&oJp zFY>MDYkv0pNPcYm*7G$VV_uFwd$`Hxe#Cy9{*-O&{98}f{OtK>_&T4Sil5TI)}L;D z)A_uYpP%UYsqfpqV)4&@Usyfw#Xt9bXVf=&zQZ4MGMLHp;vVfGTAohsG7ol6>9O;C zp66?m$sYUsmaj$JdA`M0&v#-LPwtotdzz;&^l$5Yz7fCV7q55XKa6{=6YP33e&z=F zh)sW=K^(iTzqzdW$aj#x@z_&-I90MYn^O)!3&lMP|* z=kJHI=j;4%RB}G%)z{=a&d;9r@^erq8gn>)olmj;(LSL`{9X5D?#tE658?{t$L3_G zwmA9MUcJ;edEU*>?EFfe_xRh6{7?8nJ@4`7{DwLu&v*EPP6m@bkL7*OcbVdZvX19< z+j}N$5dIx!=^6CX59-5i%*>C}u@(P$9ChN4c)rCy>*w*g4e#7*pSSrpd2#p>o8{cC zTRu(bVE(Nq%`t`ctDbM=C(h44FUN9y-o{Uz7mfeQ(fnMWw|w=yse|s1cDsGxp`2?T z^!XkiT;*vU^xqBs>3O)l<@r|r59K+0yzV@<9yA{to^SDS9u%6t)ANfxAISgC1EAvF zUe|5KFP``L5zp6raM|-+{-Be=V$Ykot2NF&<1*X7*Y7epx6wRY`Qmw>ANBl|FP``L z(LTKL#q$9^x1r8`{3FdHnp1iHk}Irdv_E{l^qBJRoO9(XSC`md-7{QY1Po;>->#SY zD&wa~N6i=E(@R_Y(vuaR<9&(`ZkTU#V(($oi(m5{iQncq_fK)%iI2Iqe<-K1{3G`$ zljPs7Q(xKRc$I(lydVGc{9@1h{8>MU=Y9U1-%wxne3w7yWH8zD=mDNv+C#L&RNFqN zIUFYSWZ5Tr-KN8255)3N^Yyxo$B)&q=IeDEk00y9ntyPvyEzw6qSX62kMi6pJ%8n+ zc2RzDydaJ`(;i2zeC@wL{DtSOlk-?w_py__NBGpIIp(}>$8wDyT=v*geB>w0w>h!v zz4&#GM&iG6G*{Q>%lUf*MU z=P`DNKj$~ZD~agw2b~P&SIP<3wwaSb=9az>L`~4o^IRS<{2y-2;>jHm?CE^th3y*G z=bN7SEykbjL+%esPd`6&y0qkZkH6}9mv7HkscqFWjt8Ro;W?a{!=88Jr};3-H=cL- zHYawy=V6_rf&MYq;mdRQ9-ra}_CJNtI1ee$=R2Nv@-scZ)bkF1+4By6&Tpu%dj6h2 z=wvY2^V*x*L$o}Pt%FSUe3!`{p34LJ@COCw^JnXLUbnf=^V<2w5sV*0%$_gjRK9L= zokyr$lwWw>x;Jt@AILw3ncZ%kZ})YLAL9(iZ{29u`yRs{V*SIRsOO`6&5JIZb4t!b zrufQ>@UMB$v0R_0a6a&$ywEt~`BBf8Zg=Xd*KK$|Iv!fm?kNt5bItRC{Os7(p7!;^ zxP#|`f6w2m^!amsLmoI0UH+hx!Th4++Fa|u&zui3)$?5@_xW5NP!IOJ&)+8NczzE1 zR39FiIZnx`K52OFWe44WA7CZOt`jwAu!u+eR zbYIu!OOIg>Ue8PZr_P64^HcYCsqYlO)%Wk@Q~H&6U0&m#tS@`MHI9HI|i^z{I|caY4qpc>+htT_~-nFd`O~u z@eeu~%;fp4I>w$k=`-;i*ZzIe@9Q}CI|B6652<4(X70V&-$AJ7J^s(x-*FtV__6=B z-$~uqROaRlpXTQ2`KrFz^Im@L;xGJD@iFGb{1n%sTYR3Mlv}F9eShA^Z{9Cd{OtK> z_!{q1@l*QO`qQm%^884CY%S__YUd9;ByKpHwFx$pEk zijS83KugoHAkBOBJ3X%qU7jqn?aY1C!LH-0n7K~vIK|^*apvA?Gmj&Ubztnrd0yUP z;<*VX)kdzlw3zB>`kU59m-jUyrd$VaF;V@gIMtOmOs(@!oIR%ccXaGMCRlHelhQff zOKy$y8r4WX`I^-Id>5aN<7j^GsRY%*x_WHU8cHaC{Dz38>jK=029Ox6Zx2kv(Gg1axl(=yZ@#}>eUfu z)T;wbZ*HDm9bksNde01=J0iDSIm+36X*4Yblv0##6R?Y=#X)Y#Q*s%UvJnj^~JNAH=7^SbditocKF!&G9Qfe zoet@B8$T6zEk6{0m%ly9$JiG61h|i19gW%#^k>mOT|T9MEkA@8cenZze@xevz4(9q zHhDeo6^nldf9855dX_!p#c!{n+I8u9>pk25bi8xW9p^zT)E4XiKg&-1kLJIDX3<`h4R^c^Qa* z+mWzcV&0$<^?aQl#JR{ncvpA%!OoZYU?k7i@nh%9d@y?aZ7u(lpL;&Ww#X;IJ)in; zE&e{A(!b6>U=7+&v%dQIq0|4LugTBnU$OZ2eVh7zfqLHa!`$~HP~Y!v{DV#g^Gleg z+qlNmOEJ&Obpa~r2bGmJI?ppYOzr`D4t(eN7GLx0@vVEM-)!$CXI9_m!T^4AbHefG zYa-a@e6QGAFY|L8Ghpe4QWEZjpar2z&Bm&Cj0KJmK}Id(ksher)`3!0EA? zkDb3Ee)VLN&+%eEsm|l^W7}SS7Wtre_>||x{^{~5{p)KlgoS#F;$b;deb>_dJ-%^XeX{agmcQ6R%IFnIBk_`kn7*4*54; z)AYdSw|p()&hyx|;;ZL7F-wo_=f?Nv^XE%){AYfh_z&ye8_ypN{u#H!CmpI!j`K4- zdX93Ej#(8SwNtJxw|4#y-qv#N*6lpS&XudnTRvV}#Hsx2^OldGl&i}dzRk}yC*^)G zeCA;{kMJ?JARjI~^JC*DzsX}{0Cm6eL|C1f6GPN-t#H_F}}_Jj-ecS>;oQS zqofn7n!oCKFaOi?>lKWDKZ6_cgL>YJf6i~HQ}TR=Kj>sI+4ET5_k5R0=W%j5EMrcc^S8>sa&@Wm7XRk* zP@QxR8YXk}`5vDpG=U;~+LbUR56U-wtK!EtVZMHU1>0QWFZbK>d?fxEKE}rLz~|Eo z%Q!Vx*XM2gRL5BUZBFPrfGy9tTk<;W2yZhp7--JJ-^uV zK7ZB^;(4Dx=QnV9qIUU%P6mrTuXDFqQ-?`CS@wx|zRRQyg8zMtnlGOB`LR0IeDS=` zkM&{AKY0H5{L<&dNplCA?z)br%lvD9`254Tk>-1zvpv3Yb=mA0t}hKU&-Z-)Ej*XU zQpJxag83m%n@>4W&s_6EJ0xL6;-BGz8|2f=a{P83gxmO0-!T8mu{p8p<@`N@e8hgn zPwO^j{F{3K5#affFP;zNKk$CJ#m6<;PBP~bojady!a^$JKuF3OZ1_7pw5qSb$M*m zn-~`@whugHTRd<0^!NOHm(M)j_^#)!m0LFSe}hrMU=Jetb`hW{h=p~K%M>v($J;ZOJB z5sQB}J}>5xdA{yL)Go*;=91^V{9u?zaxZ4ZxsK<$p1})weqxjEJUtAP@-XcANBG9` z4j)N4bAq81>-Qd}amMl^y|LhVCw`lM>ZM`Nd;HM(e0`oE=kt`&e*et+;q<)2pYt2) ztDe8-4>}o4_I&P5)DCltdWojk2Oj<3>q{?{$LsUD&3&A2@O(FB=Fisgyl&&fzvg*A z{{5F<&hu*2CA$%u;%_oWo?kZqsNF%u^ZCRqIqBS{dfxKE4fFrTxGOvD2zfpde`X@& zb6*Gj<2FC^$7p_L_!_q^DK6SyF{e`P+I)`iHh$v7;+MIpeKLAJABjKbyxiCIdD}l2 z9iPwp{OS4i3g%}=EPLwt7h)bdpZDWm^L&>->3Qv)W={?>xBUB3?#CvR`+P1B;Qi2f zL(6;qn&-PY;rOTf@QB5~qtr*5?*}|_o_pi@($97tA?_fbnEA7_%s;sO)eqP6B?>AQ zf9-QUj(~CNF)nEGV!yr=e?EuI9;5iXeD2FYeW&;sTaaJ6F~?7U`}j3(U3U8aCjLI( z^7{EF4r5^XL2qE}vv~`GZad>&w>C)|eFf zfrocKPcJF!sMqHY?)N5>dn1;Iny=SwJbtW>HD9mWc>Gu&*8GD#sd>>Q)%DCd=jR}$ zst>Wgx7L9#^AAptPtBs9$5>CkUB}ZGJ_Y6W495>wVcXj62YO1MulaZ;%%|9t-(GL> zw`lxr=0Q-c1+Uxw$JnBL-c~({e-upnyya7$1mmCLYd>C>b$=2bK})T%cHFF&{fQT* z>+?r3j+#F`zu5DE_;8_!qqW9Q3!FmCgMzin&z zKZtP4&z|@C=eE9GKF!Uw_z8a>Kc#=2e~4(v>3EcW(7fnU_E$KE{b2LcUoZLR_4(p> zQuAkjN2#9o;-C8+DB?_>@9_JcuW}A%^1SAzk@GGS+u=A^=J`CIe@VYIm|VxX-vwiT z$@86uXj=Z=2>q{oq({|g076Nc_X$4k6k_RIgIIBf0e z_~C%lV>KU}FY_q`8-vXc{>JgH#NXp%Y>RvX+{aJzXf6MJzV_pMeu$46n;yI5KY4zn zf9$!j^?a*;)Q=;4>tu2Jef-MR<-zr+{U)(l&fU7r4>-y59e&sIvfm4nJ)hZ)m@z9U zK6(v3?7C&4FZg;*mt{Fj&ACv1$rPuLF>{^TO!4>_Gxt`Tc^t`gsYZ=FR%1tElTTYr zJU79_emhKc^w`)jXOnkYabky)af-`sm^ya`@=0UAXR3e4#!kq4CRh`3_L=J0@i;=?^NY0lfkzo%he;c3{~Kfc-zg7wo^SD$tII~r%$IGYj<$Bz z^DVx5euV!!^6-25Eb*uDe2ae^lBW^=wj*JC8jJCK&Ci~HhW`tRfcyLzKF0YpKlSM| z@gqNv^0VikiJ#K{aDCHt<&pUBKA*4qAMq#8d;I^gZ`=P!b85%>uJa3XSwB~7@zwJl z|KH)ae@}kfv96zSS=ZJ4?D-CV(8<~J>b8b6yUc@~Lt6d7L;B-Tk=9kp;I8tqE zCv=&T^D@us`3{pd*z9{TJ9e9s7GFK@@$ESPYJb+w*0jaf`g#1HH@#OsU*<=-x}#^2KCj>PWqv*(}TV>}b_ZwPDu#m-Gxuk!a<>UocEujN|5+4Y)_JS5L|_=8RclRb}Rnp=&W4>EDQ}nv_PoyBrV|F4>iI77 z4W9S;Yo7P{KbJi3^Wo?7{VCSc_tG#AL!KYyN8c|fSCyGS%~4<{Lck^VdA@^M9h>G;z#pCFcbV;oNZta-l6A9S+uywp3_)(9U{vP5}{e#C5 zsS{^ zZ#4e6$FPS7`8q$JieI_9Y|h!naWI~rV=6zRo*#^V*z-Pr&GSBg>LUpp(Jk^Ld)O z>AhNg?lH(z&v%(`@Vw7o^SsYr^SsZuo~P6E*!KoeQ}*x}AN3FN)$^l#Y!`Yzf{-hww3ep8v=FoUP)I^K;yz{Mh>uM8b~A`;mXsxXyFSI{snL z`}{S}`}{S}clm=(&YsuYH*(%(9?1Vue1AK8zQg1?{@b^0`?qg$P1Sy9-mbU!`u%y2 z|F`?L{p~J%`<;2a-s0=`=RN-RLeDmS1N##>(d+gt{*gT9@nzfknsfa;rSk(1nkd=x z&+xP7pW$N^kLHKc#6mfJBjcz&Q|I}v7B>Ic^Uvgm;(Rjxt6z|<`rMBOTzv1VpDUXm z6F1LCOHWxpjK-+!kAhFjnNcx~H%=M^LD+CA9;`iUN8PZCxfZy^F?looOhXjMow<;dvMSEqB8s+U{H>T~hfGx1aUpXG}e$*Zy- z`FA~k{{{2wU()>g9qam=CcOT1e%=3>JHp3no1Sm+;b}gOc>Mnbr~NO-^EDrN`0nxt zoebueFg5l@&b!P%Vl03B_JzcM;E`DTJ1Lyk7stK2j{k*i|10Ie-si`9zQtG1d;EU_ z|DO`y-lymjHC4~I`09C&{}15*L*m=dlz$q}xA@25=A06m?hz+G|HQuZ9uWthW61M0 zA9;S1{|hF>lksEVPxH4Y<41lT<?;JZ=Z;w+w`_4F#O}+M#9CH4fr!LK5JFjKN<2A{r6bnD_ zM4s>B)4@1j7$2Xbx0&L$F=qB=i>WMKnq0KUZXI>Aj;GH&fU6GWC5;NXc*G%zPc>CQfzBK%5)mlxrU?CZ2mc(|Gl5 zabgT_j}uJw)!X7UUVR%AHF|rTl+N+~?DrC~sa_ozd%iZ&>QCd30cJioZ8J}=4lu)B zy=Ml`9T9V4i0e!asAL--pWrnen{^PaZ`(h@cmMdU^pUc3+4iz-E1W!LDCBggzNX}# z*BjDxjR@bqpV)WogMHfOpVu1(`1bu!c59n|uwV4}(#*NZt>otuInnD4d2Y1$sMVu< zc;`_*n(Ar(#?5`+cRbQR@%$q{kMdF9NBNZgC-Z~sq|e<({9v!=WskS|U+2@<{Ib_0 zv(wvrxQgWH_RoJ}&i-e*#$d0fV*B&jL+wv;t;-*DGMIX-_#x~@&v%*PoYKQ*{qC9U zF*|qc*mvYX&XtkOogO7$J%27=6g%}lrT+sDaieT2>$Y|~nCf|XP03f!kMM2pSo@B(Y=3&b=A*tMvL1iX$zXm-%%|HpN7PF+ zln*@U8WZiC9^_2BPTvu^|DH&PNn*mio| z`#65tHXT#WYjE3Ud$Pqp4mal&|2VHfBXNjduA8*-kNP~y&z>L2Pdt8%?a}zbPab`!DrozIWt=O_AKzhnFRD}QICIltIp*biUl#CU3_RrBi;O#M!Q zbw!I0SCJfDzWwk2{0i6Uf1};HuI7_pUH+hx!Tb`Yx~GwoE>m(sY5Sm&^Z3v6`6ID! z@@(HL*|A&CxA^M$PRv|K>vLPX`uQ^cvp<~pKTU6-chhGrrRSURD_55{`LQt{IKJxd zAh#X++U@%k8-Mn^m!FbP$aKu=^0Vik;bUx?7hMMOgVT{<{NQh?FCXD&&yVCM9)I@y z7$4h(>YF`3!r!Saf_(M-2;a^x>-pyV;(kFq1NAND0_L@R#z{+h*!i`c-*55w_FA#^ zn_aK@sMB}1KL?!*<`*%sywAxX6M5k4+Fd3kZd>!b&#!$h9;=@(>nNW0`JdCI%@yW!cjF&)GFa?+ox61GN@JkK z_JK$Lx{c)Ik_YyDm&tip^SsaB_pN!&t$x0YUp(*gKVK`J_xZNpPzaPFa=xwoG0Km= zUr??tn?1wzE#uGk-`Y@@`}ZUG8+-miK6~sbKDbl-eBbnbeo)^jKB5Zs52c?b|5$zw zdVP>Do*(1e^Qf5T$N08a>-EwP;(4FH=J_sv((~wngT?+v&v%*Zfi=(j{MzRu=kq@Q z^R?o6pI`Lb#C4laO*#LTZ||qu_e}1;F+R0e_UABD=rw})A@Ytx+3D%>+>V=51-GE<;T{#UZ-?YUr1iW z^FDvg^IiVD=hGM(JwM3Q>o$}Y$xDODeYos-hrjH3hyVFn^t{6_`Yk+<;DIB}(*gdJ z=ZE-FkLCXM`p4!+JU!_7q4*~}Kg5sb$9R5-pYOBSKaLyE5AdfvKfoV9pC|qF{bT#5 zzkcI+hrjIkd;Xx4(KCA8=50*%d_J#14x8soYo7P{Yo7P{pG%(i`9<$h*M{B~tLMk~ zhqhtd;%zrftl_@jK~>Jr=C^#5G^>iJRrsOLxd(f&c9 z_o<@+Up7z0>T;L8f}X%j9{w=6RpL=6Rq0x#W4DU-TP1 zJp4KAkSC*j^dEbEEdKa$goT~X3*zTv@%JNiM9}k&C-^!)NAnZ)uyS?ToU@JNV3beg zoypIr=Lh2-_WT&Xm}{8V{`YNs{+j2z{6Qy!#pm-{+h)%UGS%~4<{Lck^VdA@^VdA@ z^KI|Z>GM8xK0n6C+z#^9^P_xh7m6Q&@Ns06kL{v-_SjQ=_52tg(Ffx<^Iyjie7_LQ z&!Jph2KnLlQ|bErxt|Ds*z;rgw{xvtCtZEuA?F2pecp?I&GX&(2c4Wfub+)zjOkno z3m#kl`!@CW{IlmfO!mCJpRWBK!Tt@-`6ky|TYUZgyvP6NJ>O6F6US)%4y5&ei?83G z_xOJSQ}3ty6Md+^1^>7)GY`DfzC*dC1^ z{4`&mi9dV(8GiQsGyLqAr})a%Wy3k_hkwER`j>P+UA*@Eeai26Uhl12_dnuihtcb0 zo<;b0&E*{a-aqPjkH309-44I&`8p@r^O~DRPP)u(M?Nq2B{+X4mGa$SavlEypZ_KK z+`8SaxA^M$PRz_d5Zkd!y{y~qdW)}~_xSd|zhT{O*IRt`yvLVqCI0?84Oh=Mvge=S zXU{*w$54{zALA#_Kf}+Se}Rb5tp8p@O{NJyz zZnx{r`Bix5o{vcIKZz4#YL-|1-+HJ^Z5>w`{e&&?Ef$2;diY6-f(`4ub%h#{}asrnV9yofPKfIDfz#} zSI>L={|^3tPkeiyCF}VX|41J5__D3^;V1Srd>^y)`|P`UI>-M76GHm%nfTFiPxF(< zo{1m%d6b_$|4jUp{)g+EJnzN--_Y~_EzK``pFr#R=KM;Y_xOJc{@*6Py~bjl-{LD* zmv{5a^6}cH=WBlUe23rle3SV_HO=fs%xrpj4ZV)MLrZ?3r9X0C>+fKT;}KrRZ9}iK z+tTr4Gxw%!GsWrjH|f1bd?ud6+`(m!x0&McF=lpmn|ZLC#+Y&}w>hE1pXL*+w=?0O zw=)s)6U>e3{my)1>~CixzPB?eo$nqyM$T>>%V+i}ZO0FQv_BE&YdlVDlg^vlOmW*- zoY|o*rm}Qt;->I_pAZRT-|$N7n|%Q$b$?{hsIJ*`fNHl7C)rxR05cd7f`uu2XqGm{$Df^@ag{ z?yYUhZoP@0{W6vxJC=Ig<_EQUl&{WxDtqw!O>(foNTe)aNGeAM^R_|?}>#gD}6 z^@f4@W#^QgYpwY!9v_Q8pJSD-Xz~A^eKy9oPQ&)6>uNr^*6q(hCxe+hf4Y;$K)rOH zi+7pzHHzr5dZ#(A4E@P42koB66JS0y(!_S_7hL3SR8bA2Slh4GTJ^u`!`ds?v z8GiQsQ+)OO2tQx%+cxX@y8jXXYdk;uj_H-=mpvzJ@x?b|^LK~q^t*4^{`7p!M}0-U zJwFUO8O$%qiMmb3K)n?6{2vkXAHR{7KF;~0-xKLD*<*jjwtr36@9o%s$MgDGVvDc+ z;qm_j&Yu$h&hst4a&_6r3CAznif_@o*qN-`bB`8ZJwL)f%=ZC5F)sZqvF4+8$&=6U ze<2Z2bDZ~$j^rmEKe$ixlP4d`&!c>ro6qL|c$lxAAIbku^uK=J)_T6~f3#2X{0RT^ zg*lbJduTo1;!D4e^}qeTGqyiHU-MDlakC1%pz2OiRY>iG_n zJ!ySz$6h~Q^40Sme@8y`7<%XVR{WY@k8f*--feom#aFH_@fvuuIJRe)jw`eB|+vJ{sX~2rCvpwds?51o9|9dwwiG*e+CGO8Xba+;SV|)O!hpM zX>Q3F@NXW<2U@oOeL#uX#<^AZO>Z#SW3|sE5B2jUUp(K9nfd#-ZNc+Cf6engUveus zq2qx5UjGy0((`$Fjm?j8b%}Zejw5kCO=xP4r}${Or}^x$r{YI`9_1tMDSp0hdcS`t z{p0ne^N{FqL_9y3|6$LM@y9(s#+P|I;`uIr((^iZn@$*Hs^_~*_Hga<5zqVl{o9J? zeg2x~eZK7tl864@x<5~~KSue{_Y2C^WwU3vzGeLR{#*U{G0uZL^B|u+_7or7DSp0h zdOts??-W1UKkE6h{2WxTq4W7MzJ0$OJD(rpk9&TMZ|6e2PSfQh^$qIFC)r*8pp(Jm z^Lgxo=T>vh4l=>`zcf#~%r|)6=kMQEJn!?@Jn!>uKhXKo=yjV;O&cE0_hd>(ml`1`8o9saWC9lq^{DbEk^?R^SAqn;n)M?IGN+pDk5Pu#=QHpyc{ z@snR8#}VWCA$~MJ6vs^b6P_Q4Ki;3nzIuLuKYl)+>x@2ekKrC~0m-z#7T{h<|&oA3Q@%L*~-kJQ2dVVneVb728 z$2~vBx3#F(Tb}Ro2b~O7x^5%2ZT8F{Q$4T!(q#UB+TI^oawWO)#v|_nxB?oj?HQ#J zD2y;tUsOvYatYkYizT!+HVW+;m9f!!1zp9RP#lfj8l|tk0j8deok7)kDO+o z^x|LR|3U=_U%|gu;s^I_e)h+A;)g!3@{7;E6MylSxA@A{WzQe}9(DfrxxcV3>P>pV ze&439f5iVeSD%*O^Z6EE;-z?GKQr-To#VGrc3kt3U%fux=LbEx_`GVOUh1=)<3Cus`^8xGacHH8t&wKoT1OMML-+H?pxA^Mw9$&Vty}f>(%8GQ& zI%l7JhyM!-oD-Sz+Sk91vo{wTKW6bZpLNo>by?TvTKv%GRX)Y}uKwv|zWTgZpZ|*f z`q$iF*4yn^a&)ervp@Fp`$zEqnEBS*?YPB1$KB^sAsk+Zef>k;7q&mfH6QuS=kw?N zoa!^^$=LR1_J$Mt!en2j{nLYbRmW$2gym)$>dHnV@z$`xA zW{Qu;;w;|XW~SuoXmpdgOOCB3R!{8bapo`CLt}Fv$BDE)9w+t3(|Tg=k29g;<4ltC z>A7R(d<`I$_u{9t9X|k~KIVqb*GFQ^;-PJ(cw3B#ZL)8+n99;+&zE&u+mF5RrB8q6 zeCd+C3OtsH^g7*B0Dsx-5f5Mg!1|-@iE-KP@W$YFhyMk)OKD=BRh*dD(sstHf^njO zFqWhIo~XkluZqU0{uVi(QLobdQEjaG=W(7g z;Y+jr8DS!?bgj0dCu-@>qGyDeuP=9*>Yowjwj-9k7bo=3zVsZk_~&y>%;E7k!OR}= zT%5%}pJP&w#A|7scarmYrut`O?)fvze$8k9j4<~dCEu-i_$GfwF!ZA8JY@d{=IA^m z`{#U|?U9Z-#7v3=lijfeG`I{%C?XZ`Tuvi+?`Hgba_z31;??=i)5>`5cpKTk`)LljMA! zss0&>^9Sk^-|g$vC*u5!$NBY%_gsT>8}-jfoWH_9f1U8pc_w)mJ+6MG&)eR|b3d&I z&^q)tmi#pPp3$(cr@ns|FKKeHV|tz*6x+OiMwqky8DY-)XM~xc1%7jDw7ujd`%;X# z;gq(=EdKc%6G>c%6Vo2VNtMCHmyb(xwKQfH|BTFi%tTyEabmk}j*5Rq;@l~<1E%_C zgz46N_Rk2@>rM5~2ou{3&cU>Hpbyun{!O{-o!8Mi^oaN;*6;I8kN0{LbI@xmea@nP z4r8mBUXG6AP#{jXmXxK-`WRHjNyifWR@P{XRkn}p9cIptF{#O@Xbk&yoCx;~=Js@) z>Yq=}9jv7|`Ch}Fypx>qxzn+DE~VFzYjQz{yB`TVtP3e|BNx`{4>U!eg7WOGvB|%*Z;F4$m~;LaVJ`Y7=Z&__dT<&)uw&ahc5Hid%kST@dY@D2Ii5RG!{?td zrkA6`KLc@2`)7bTu6g7kE~VgCzhj)-fxbW9N&{n;vCl!bX5NgFx{H}jL+Tc&BH$fagIGi{VY;Tv<*G3@5S_a>w9?aC+VQ|MeESt zSh74({~U4_{WHe&a&)|Z59G+LrQ~W@%{@^{yYJ(m{{oZp*8fZjIxaE!-mjf=TFhaI z>3H%M*OTPz`@GhWE}L~;L9$AT#?;+ULGc7SkdB-f+KZA3hI{%C@z1|f6j4|i@ zGs2|Wphv_%wH9bQstNl0xF%+D-9HaGK0o68H#t>(j^~bk_^z?!WgT0^^l~KrIh=3B zob%5Zlg=5YK0gZRNqOrtQ9~)N=h&0kv~s=7=V*MMOs=&O=g5~#|0sK+md0_Kd_Tsd z6s^pC#y?HGGjpHv&luC|P4UkdbL=5t9dn(nPuhka5&txKJNCEYpF>XNOXInN^_}J% zV|qE#_wPrY*7L36ob%6EoOH^+yXT)VCgwC?s((hA*sdEVCnugGY&K-FheYEXG1Wg~ zObW9fr}p`iOl9fP_W#k3b$uet{<$|^%=KNi9G>ENYetnL=qpSWIVgA6ec=%o76pu53 znY!OkhJKGTi+@JuK8_RlemqVvxzF+c-1l>}G>)_Q=W|Tzk*D*neg5R!m8Hu$J)sly zx4n;6+sF@O&Nxru<7P-t^ycWdf$EeWvIw_0M@G=|hj0e~R}vwKYB7 z>-X*W{C&WwYJU9Ne`uZkGs5)lQK0@AVY>HH$Q}}5e&N_Lb^j3lO>i?Wm7Zf}@z3Yt zL~lMmce2lo&uyNIv-sz8OyuP8IE#Ni7bn!r{uyDq_sq%u8DV<&_7N7mBvA8Mck1^? z^GxbBdPMxw^yhC>yHp!g!gRh4&*cB1UHR`^+xmMWU0;{ZcE@Kzy1p)*?Zo%uaVGBX z=yq6tX*>0(=>8z>(*Cd=_i%K7>L=0du>R8i)EA=r!|bl_;V0{*I^USwuIjU??Hco{ zx1$Ei|9ZXIx;GlwKdCu%nM;LxkvRHqh6%6HzU?!c{eJXqaJ!>#gWDZ_8`=&UX&;5Q zGkqJ{4%#p6k8@^n+RSYu52kNJae}XX8`{qFZE(AzZ-d(%eH+~F=-beC(B(JVTeEp6 z>z(`Q+MC3uN4Gc8zq$^!@&^?L9eB(8kyF2p_}JzfJ^Jr)j`t%0rgzSBydMcL-E%YU zDb=88El-n1S3T*y$mIKxK%8Tydd8D+Vrq}iovO*!)DwED4?Q_|#PxWbBYov&du=d#NQAlVsO!CV?109PGmC#d7boWMc${En4|y)m;-Akk zk)y}sEdKdioKRD*hfnwZwz;1HW&e!Cx$h|XZq2hF@VQus2@mOirbb@H23Nit`!oN| z3-+auf1cl8Y5BMOO?@)vpY!~A|BNta{WHQu{h49R zvpGT>LuT>M=i-DekIx;<>`TwZS^V=kCbWM%PLfml`?)xwX72}$r+C`QECTF_0Nc&Zp~-^j4-|4)c5ZZ=Ga5Xw_H5~{;7S5rR(jqZ+b+|KO_8Y z^8I^^>E-A+UMA8NY*z<#-jsg^;{>+vONJGQGhseczejtFiAg9+mlJx9;{9a2vZ zGucC)WP-KC{98<~H+Sf<#6&FJ9FgACpRu_UZ^RV;3^KiQ2KLVw)9Xz+|BNx`{By`O zwLQpn?v;1_6IGgK{dt=_|BNxc9Lf1-j5+6@K_*h#uX**)7?aNH{QJp7nKSp3i8857 zdbJ7`d&rYa5}WE0{{r<%G4|tB|BNz6Ia2?OG0ATGwS?F7`e$J7Zq2iQ#^UsPQ~Wc= zob%5iGv=RMN65W%3dA1^O4 zN4~_fkoT~mI7dv?QI|9IPjQTxU~qg<=8S(vnH1{ac*N(QLFSZy#+Y7j%K2xEIp?24 zX23r+=QH(#b&fu2jnQh`2NfB=FFL-LAE^29+|iofi5-a<+c?L#rB2MW0IUJb4RG7 z9I=0zcxUE5<)1O8*PG&>G3MAq!1~SAGvJ>lKdy$fZ+b*Ne~<8I&p%^KFGu?R{ist{ z2h^rlONnw6i<3@2`!x^U7no_-@7UoIb94^IlMc^4@n(bbCH9b*o@1u^XN-w3Az3d@ zp9Jm3iI?*A&&2UgGQFDrjMu!^o8q6bxzG9MkQwq%(Q-yZth3;s z^L)COVeo#26See(^Uu+Dbk#p2asEIp4ZlmAeJR3BV5aVO@}d3X%;KNV#fjd0JWepV z&+-3y-ZYW-v7W_0pJO6NkH@Kf{^Z=1rOTP#=XIff@7RGjvww#4blw}Pe@2+I{yAWV z{8Q#VqaoH=@XvYv7Qdh2L?7)txO+eE>YtG~-QTih4~Z~0#ECcXCU-ya#0MU9T!;3L zGmC#d7bl{9JWi5;G|(QMsa34J)1#+n@z3Yxj<_C=ljMAQ?$AZgKiTu<^mKo-oc%MR zC)S<#{%0)jv;H}V)AV4keu`$|@#SwRf9l)b`}E%Pw%@mM|B!E#{~7+ajeq+O9luL0 z&BwfL-aQJ`KO;={UJ4>2eIILj?qA;~?;r9Qv-sz8aiVM)cE6Z zlAQ6HAJ-Dp%>EgfyL-=^?4J>)cW)nI!Ak-)k9D#B!1sQ0^$hqYa?ZS_ziku+d!L+l zZa+8j)x7_I&)zWJ9*ncE9-jdPw-cXp-A`JN9_Xx7U*Nf)xlVbx9p@ihhTM0jUbKDL z8K3*^_&j%x&z+yW$nek1qn88B?3rEW(dPkX_Vz9_X)gzuU+`hvpSii-Jr*a_yj+(&?tMTq*S*hr=5zQ?eIm}!c#iUW zjV|->#=zY3d!i1LywHskUTOQ#j)7%;+Kh&dAkjYQVL3FWey4|J79UoYF1f9a+|bta zPdLzt&f%D8$1VQxo{-O{%KonWKZ5zk%q$+dZFbz^AMXzx{=b6%ubE%`bldE>#TRca zarg9*ZLQ9|vDF`W5+RP`;j{c-&?wwwFY!?lZ}Yb|+>ys5^>8l%v|qAbLPmlqVu*x z-Cf2~dp-S;n^*b296s#nvlc(*`D*;&Z&Ii4#1DO54&uqS5{DS{v z&*A$2@93}pp8G3*PRY+(pKtb8_IWS4t#gE!W{YoCK&$syM^B!Ne6=ss}9`Syy&)59o^Y8F~IehpXK6K1J z{~AC0kNC6Cd;C9u|A)-~ z`owjKPw6%5^DVymyvP45_N zQiort8M!{b(dV0ZSbd7m zNBR2{AAw{aeus~FF7S7RH5Whl*@q+X&+`$;5})r+%6WJ5yTpgAQ~4$N^Z8_wM}5+Ewa>Tsc#b|CIPSIH)5rR`aD-n! zf9c=fTz=4#)#r;hG-3`i;X8aCV#wrrwsRkktq#!lJLwSP$9+D=w{>XG=Ve}(__=># zeDvO=k11D|nh)s4rpMTHihy0)?tIun1HG4M5EDY(_@;A5d z_JN(%=acr_vK~|U({|MVs6#%Vr-A(4cn`w;VmWc2kMZL^ALJwLbA75lALG;cJnq#p z;WMTFLi)qE(-gnN9ph6u%)}3VuA_JOlqjjo7=KnD^?B?iQvcKWC2Tx?q<6ADv0nZh z){Fn1&-?n^^Ld|t&*z7HR66S5_&$ss!*9RQ!+IuO=ks|mb8Z`+8DwG~`THXSX63`y zlk2gK8Fi>W-;cTCFZq0czvS}~{&XK9rz!VofWPGPA^xn7p=y@mr_F*sABumLZ+t$) zpVbHX&D=hnWp<-@hNOV76W;`1?n+~;HbxX;J<@UY4ACH46jABmpigUiJcf>DPHxKUAmC zh@b!ZHu`*lXDZi)Ug4`Qy3~HivTfW`H{w^HkMd{Vuc^;R`Lp$d_4s_==il>rpTB?G zZhQ{w^Y8imkiY2jT06~}3^J85WL9+^_xTtG;*>qx?XA+2?)!J)iga_k7;x z-}Ct)Kj_I|^XFBK_u$oe)I7h$ z9p$4y=iX20@1&gg@A-V0M^B%7KJWAI`TUR{^yK36@?NUxnM3C9z72jSmGjxtS+CShvc*r?$0Gc+@;j-3KJ)zI z^Y6sZhR6Q(8bABXJN)AF@9>Myzr!#7@)lpYx}5O`tb6{PXy~hj;z{ zoA{4C51js;l+$1T3I2a(zV$Tg|8@Mx?{9AWK~F9|k9qda4Tj8r!d$xdJ?JypCuLjF z*&bW1CM~}D{2=C>WpB z+p*8L`0%Hx`u~6E)BorAe9bRDKZrl*$;Ib2_J$@yrg#q7&&N^U$`~*!zxoR_(R)5% zJA5z5dfJ(+>zX`h0{h9IJ^PTYZYpzr%-*WgmWrk1~3j zpMCh9_@U3M{NnTP#82{zkG;iLpO5fuPuX7kf>&Jcqj>mZ_G9%UDXR~p$M%klttVKo zXz`D@1AJ_Ac$)RPnqPeW*iZicqKQA~$?Efl-D0vXv<^K;7ad!F!8~}|AN#W+qNTj43(p=?T{3O!ep|<3!s$9w(R^dCik?s{cO81ncoQ z)n}iK6Ke7`h8VN>DQ(9OfXFB9`D~0?JhaUeZ;LUDZ?>4q(xv)TE?b_D?ZKI`^*wNZ z=33)d5xU=a3G}Ebr6W%)?g$ zah7WzEhe5*zj};meDyIV^n5%{YTbB_#(ElGeQfT?(c^KFoKMdkYO1dW=3cJ-wd#|4 zEFR~+Z~1yIj-ZJ{5!F83vBG6@QW6Q zm~>6Ke_eUN?phAJ-f7oV?bAyJ;{Rv#l-^IboFBt`cY5^uS3KRXpZ@}1 z@2C40jP-hI@%L8z_&`8Y?xd5U|A;^PyvP5a`?meh?DJpPm)_4%4#e15d4Ks0V$PR2jS$2^s*%L)FDu%`K&)M-SYc|Ij-g zx##mfzxMOqx&1kh;`1?n+~;HbL^+x|U())B^5L&jeC6u0Su>p9ll~|(%z>Zxd`5i! zMLzr3TYPYr_~pLoV||d{B|hSs%CGu-OdqhP`Qr0F|DMnL{MyeWKJWAI`TUR{^knsU zRAwT-Z}x1EsXjksa=+j6d7ppsnNQ5Ed##?r`M^Uo(Can>O*nqbkNbQqezN(wK2@KO z@$G$C#y(T(FQN}T9;-)uJ{muj@FZXJ+^_j6zlp<{;Zve=9fkO_`l!!yK)s%A#9!_o zHqI~U7>|FxJ`s2R9M-F!dp_^$v+vvS*{kj4`uVdz=ye+}{(C+@j6dkf#^-Zx8}IRh zOyl!?CfDI@pLh5+cjNInkB83(_)9(?;jj37fWPGPA^xn7mHNgg;A0Cu{|evue271* zkMa2sf5GPi{3V}v__uxD;n#j1IiE*$I{e!{-{%KCS$)3L=5szjWIo{YK7Z`(l2ciy z?Yzv%N?JI$I5GPm+M ztkb9W&gX|QS3Y1pp&qw7<;s?QIZT!;63-sjhTZqM=TxaIRPe%$ASe6o)zA4X2uCu97T>o(#C*w4iI zD$cd%&$pN2r}@qt2caYTSX7@`zWRKOPeIMaZ~9;7F`@rF-^3l{qd>W@$HzfLqQ8@J z`1gF?%%h{vJ)iga_k4cH4|;O(`9u3!lOePIo`3QA0h8p*!oBLC|8%?{r$M^B}eLK9O#fLxr4Q5gH)8Sixv!1pa zpRf7F=Z|^R{GcZnpFd&`GXDuN_x}4B112Q~_l__3kGJ>vv6{5_>hm67wiTbZ@1bl? zTYUBT2;bgk$<}0xuRb5)e?cofCQ5C{ylQ^&`FHrg96tOGpBhN|=rw-!v3K~;=T(03 z`FG+c`CryQ`+OvRd!In-^L70f|BdkNHROFSKHuUiSC{HXQnnvRzwJ#KW8LHT{yWBc zK40^T&ky)RpKmgMQcerI5i_o=QmnKNJ?!{=9F_Cq`@3>rvpUhw>8Y{5k8x3-x`C z&H86=Z25W}T=(PhW4<~UGc%`sHNY&_<5ZvX+z($3Fw=33yT!zF>Q|33jjuk&M4lgy z6HN81$Ko`;`WO>AdOS|!tB=JAHPu%G%pb>RJgxdfoS*reEWrHw)O!cCnTM|inB}vy z7L%THA>t$KWc5Y6M3ZcCcewT5!Nq4=z>L#xp7F4qP7*IRt}&Z~UP z;%z?b^rAkm^3jX0@=1O^fjaJ6|7?9CzwF(<{{M)Y|HteP_Ih6N@mBpK{?EDi{{a3U zGT&a0ES}!xi>LeX{}uedX8vC=*88Uaim~2v@pl;i?%Sn*+24o!peGlfSMO}(bjbYU zXa9b>113%E_Wg7{{=Xo$f9d{4U;MKb|DnNmsh8t#{*(Mvwzd3nJ%Z~PwcO{YBwR0k ziA^}=+63zOIG-l%ulggWukwF6eE6OCq2H_VgP(ouo%o^8tNh~g@5E2?zgeG9C;Pk? z|DRCXdOzKA?St;CTkfq}*FWOVKJW4W=U(ooTdsr9dApvwxB3hItDhe_{$TH?yTi}* zTC(-|I)3Cg`}`pOpeGlfS1;40v>JQbkSU(?6Un1>r9Q6b!3`#Du>C9M{;$sYe2agb ze~R)_bxw?FY zUwmG0dgSC`N5i_a@pm(TEv&ns7#Pw~+of5TbG?_+!X z4gI_2{{3OR-HxR%Z2cFXSFSFv@!S9YhV^zkZt>OUm8;7u|KH$m|CasDdb=Ih{NnS< z)urJFJ-PV&)q7@{8~fW?XZ863lQ!7wwGL=^e2!|zEx!7^$NvlJ^NY_9_(Pv>GJld5 z#Ty!$1ex$_{_lYfne3DIeBS5Z^Ld{ydNw?{^89n1Nd97c^xmY8DOZ=+FrPO`*;7B% zG1Koj_4oQ|=rii`Z}AZx2l^tPee5m1`h1ih$nRqOdSCN#e%0q=@sml+^3gY*=deHg zxaISH{P%p`=il@BAwTHJV6o3@?>0Rl$W)&nG9U1HpMTHieLm{7d99{?zUA{Ve%i49 z)cKOuN0d+YKl6S;xw>rD4CmMCK-P^p@bhVS908Ag{zX3f0^D6-z7fc zn#!;Gd`us(r}?N0_`J{mam(j@{ym@f`S*N&$Paq5`n>iQmi4(`kf}aDWOBdXJD>OY z_k7;xqh4?Le2|Z{&-JPLe2h=$^Ll@#vCo+LV?V}z>Y8cze7P^nm~Y|^@yVYik0b1p zWx?CH|~Ws?SIDndK{2 zm)Kw3Qw@D)`Remge$?lqe9UvIez4x}=j!L4&-?M;^Ld|t&*z8ypeL)(Ywa{^GRRb) zA2J{Cd7ppJ=Y9S?pO5hqQnOF>5xDG=F+P13AO0LRB3GYYn;O7&rclEzFh zPn%8hbKJ4`XZh;$w0^gzDt$2P$@okEzr!zaNBJnwx%{%vm;E$6hdK9r-sj)*d7ppJ z=ZE~DCl{ZGXD#`>^em<20}o;7_vZ&p&g0j&@>_oUol^T<(-vR9KkxCk9TDwPd-glA z_PeqzzSf<`mu-drqw|?ji=VQOMfi4K_1NlPeEuCieC*Zuk+Zk?xlUix=T(03`FG+s z{?hjZ?%%o&YoC{OY<(iX%GKqc#Wy7F;T{V=`O;-kOC%N)M-2kQwZui$f% zbNu@K`C}fP_^rQLPqSWE$B+E}=Egtt`6g4(=T)0J<{|TspV!~roAdcTlk3FZKYoYj z>+gcCCM~}D{E^Q(X6D=b-|sv4+4F5qTYU9-k1yLwP1%K#Gidf zmq$OdeU{^hY@3fM;OlQEzcBvFzr$_u;ZJ-V@%Z+?|6@JP`h3kVK0n|GJsHgG^BQ|Y zlOgkW@aNxsBU>f?Wd3?SKVZ@Z+kax)|NJI8+xz@jO@5pJ3 zuNruK*;eAW@6oK!xA^Mw5&jqEqW4Wt#^-B(@%eZ7zd*d4=Unfqmponi$m%m6KMLb* zzSik0@k5_i`Niko$uG(Oa(?r9b|ilL9c=6Kb^TLs$K$v6Is7s{-{NcBx}2$htb6?4 z-}-#bFFrru2R&JRzOWlHZ>#rBZ?NF+v@d!Hwaj0ir$YdFh2%;+eHdTGEI!_5N?b8! z@$NP=C5ku3EPmZ$;d{ZeiA+5nC#C;sJ=K4ooI6;L$EiO1WSmfwy*0)xeoEW% z10d6z?58ni@z6F?ye-BozS&|bOP82J^ZmbWOXqFg*m@M!<#T0SB7fWuxh+_)8Kzyw z@^O67`wQfAa)*y&03B24(PtjM8emTQYJfTIs}Ux(I)9d_d9-@sIrXa`bMG>ZuRg}a z92Vl-5lTN!Fx9UDagLcJcJ}HJQ}6TA$nCKl-dFF@YTTF-J1Vgi1QP1 z@->K-p5z5_=Ga4MKQ42dJ9h*t>!;TU8Xh-1x0P6JpJUGKn`PNx(gwyWz44iUTyMzx znc>^_6U9$;zh}N4r*s}OeEWW=)LEOaya@m6Te;q_QR{PWwD`zrqWZvV0e!A~@v;`5 z8uLv)0>8=M5n?}nQs!R#V?HJ4E?+&mr9bj}o3Gy5;*oYzQ}euRibf*B5$9Kga8RKHuWwIrd?X zzwg`eodP=+X5W9*=RLkXcI@Aa{Grd+IR%q_zTpi#l@ACp_W7Ob=bT45pC2;W$7XbB@x|wT{*2GJ_~P?Ef2Iyw ze952Bhxl8{KA$i~|BL^Vm7IFk>aSc~f}!cmem_u~hjeaw%4jZev$(+9ad@|dtuiP?HSDDKv!9G8s|HOGzGk*4YpTFu4;`2U#&ELTN&DDSC^R*^mvd>du zh>e9V`A@1X&*!Not`h)nqAOD)asm~AjP>9x}2We%;8})AO3GDMEc2{$UNnGm# z+wnQ^fXO~Er$f!x>oy*LE{`=|uiJS1IiIijDQoTWIW1E2)TZbq@lP|}F+S^$oKNzp zKJ59tj%i=072a3P$BWZ^>%(O{=9gO3{it5D+Yb_gV@tehJ(iez@nfTHV}E&vPsy3( zmt$XoD0pPesZVv>$nP}2yhpR|O-P^AVn zSD(+hZD<~3ZpG*OOwQw)4#?y8 ztb@Z}&Ew(o4*#~#dweb>sd?K+cHGQqn$+j6&pYv>U(w3BXU&-6@B3KkAB@ax{agrOdebOtOQJwgFO4z})V{EEET=VhbG{5*5NvWPD%;FC_4?idZ_Vro5)raP*{CyZd z?PgA&HNNVuOUT7~W!bn-^w?)KImKUmUbM3Pr9MByFFtSIyOBQ0)Y4V|G^vlomh(ue zW@d8uay~y1|HS!xtqPt z%Gc{Q9)GqDul#Z>&DygslU^hr=~z6_dSicV^+!$*-k6X19e#51%!|*T<0q5I+|A=- zT|LKxDI_zm-T2IzkDw;`)GcI?dzP5naIWVd+Re>xjujWo-Bt? z`<8lG`yB!F{VqBTV&>z>>hB=b=RN)p%>BpjWiED%?VyP~FXOX5DQk?^q@QZdIeyDY zw&ppHJw9^!0RQlZD!l|}|d9iLASxN3AS%;pcTv2@#pZDS)@zp15J~gq_;X8cH;wFDb zi2e9UrhD;^`IMZy{NnSq{>A54^{4pNhig8`e=q*z@DG0s)W7v)@kZ%|X8g+4rPdQq zi~7WFJ2STZwdH%3K_`d5c3+p`^8e(IZVY|^81-KQ#?J!EO}}(#m8gJQd@1N=oVy>CGdH9i;3sBaN_rqIcAdBD@^s=mY#TSi3!QNc_%sJaVARbfGOS@%sXFG zu)S~n2>W9{jWNC66mN?$#~z|AT_Wy8`jXDH_`t)?ab|3F0QYCkmo6XW!ynaG=lC&S z4KTgj9ljc1PWx(rnUK-Gw;*4fACtFnzF5x$&y?>pP#y6j*AC_0_-ZK55fk{w;{zE=xg3&c6?t9>Rq zqvxkB4>ewwNQ09{Qz~-rU70*T%+WHHrAusEGid|TCZB_P<1_!b-k|M3IIcGY z_@VbhIo{*=G7sm;U|DD9{hT`d;*+)h z@Uh$RkNB9}+x$)XD3af^{-gMz&uu=XdXV4S{NnR_IP<~Nrg^kgu93iG%okn%ow;rqP2M>_kY z9OqE&e%DdEB#$k=`n(svY->5a@mZggHIDETuJNV( z9Ygft;RAL2MelWf@v)j;eEuCiCU;w(QT*U%AA2YM;`8f#C%+HGujli1ev8kq#&3PT z#m95-1^jdT;RkAd>HD_X=RN-F_l4n4Q}NsPAojh<*x!oJ58@yCe64x$dGVg&5z=bD z&+pXsY;Ux#%wK(ez+|8Q!ZA*-McBF9af`1$@A0=C5$)o=J)dv!MPJN|MQCcm@h9WG zqHXQ-ExvGlJ_(wTQCeQ&XCYjKPk6xLopXL72^Z7*kK`gw~vZ8tBp4u^7@CW$QRQzlHhIsXSz8^nH z+`X3GtQkI^S1ojT(qzb_7x|||rcTb+t(r{st{EL#{PX+0K7X6YV~c-2j`sO8b=cyc z{jtwS6&^m2FoYMdZgyPrm3Lj9a>|@-`~MD~Bv1Q1_+?!4siAHE=zgB!W1?^Kw>RTg zpI2RU+0qAdJv0yGHxR%2E#U)TsYZ3tLM+h5%GD|MVGZc%l*YZuUuW$ z{8fJtpI5FfYyO(QfyX|tTwR{{BzM>6>zra;_W5h?MwnEe=RAtf51H&Ub2`*~@p+#= zm&ckfKJWAA>agaE&-;A1fbjvW-|&PDPoMSIx|rcxpSSz6K7ZvaSC_iKQ_bY#2tB9A zrgE<-drYb0M;z?)FY?*P-r|Eh&9|DA`=%!V^q5}j1HGsDC6CC1sUI+ME!BLIf5Z9e zgg#iM#98>_GwS)*`oZM*eBS3T_ZR!T&tLTi@p+%W=5NRi`}~kk5)XX-syWtWpNIB| za*Mxtng85A@WS}NkI||Vy>2sLKH&4in8jyytRp7a{T#Lxzh1ZT;$N=Atg*{S`0DKx zr;ZbbrN4BFl&fatmrnUB|w;|PVL$CTo4 z&HS=XZ}BNnln4BC^|6}Rv6J6ve$jz6xB2ybejci(Hs7}limTLFq@HuYU%F_p0 zhWW`nm1%{rH2Pj5_A?d9BUj z5s6x0`@my-KA*70*=N+}hs=FsPpPwF`ylrsA&K3Vg@os1tqteW4yqn>n3o>Tm%uAg~+@pii}m(O{f z(PxFPTwQ8DvTWN237wC#R-ZB!&CBuY++W~L$6s`|xh8$|e7nvs#ffB5?eVf7zig{> z!P>{U!I;14bsLXA@jVBLf#f7zDQ?8iKJUjrss@C)Bi5N#C+yo^KSJwbu+=&oSyk$oIdNZe9~dAez4wApBM&x-pr$; z|8jq^&-?sUe-NMd`D^|LF8lnDAM|9f*yl}dYt0=d)#|xU^!j|#da0ST!KBaEeDV2V z%*>z5W6js=HeUR5by)M$p-1kg<8K@uteQR+^H)A{dho{lvmX+tFx4Mu zopXNG=Y9R5-_iRC6TpM>Qt$U%KUk53D1LMNebz@}QzosiV|$#s#!uuo`Ren2{2Ym% z1LKbpf605TzxMwOzvw{wDts`GTB`L)3;Ga$%lcz6LVe!j z|5*JUN7mTm<8^45z016ZO?dk7|4RRo!*#y#hl*c({vAFhcUzxP{NQIFdnf+l^Xq&k zzYoN(K93ly{!KUe*5_M%(S`Oq_6ONk>VG^wpC`z58=t@WJ4*F=FaEXPffk=1@PnQV zX7+i}rg((3+6TmPuFrp>EkDmXALsL*<2d=)>|yRFYCe(-r7R0D6sUwnR@Pf}S8t^Uyaf%w(u>->`ZoXBN; ztk1Xj;$JcSttVU0Z}CO<7+*M6b33;B<2+V>C*{=7+I?M+-``yQhdy6x0_IO)O6<*^ z9Wt>U=6%tDug|L*J_`ia`bf2Z{V;&!` zLtD||3uFE5F#7QD0a?fDU-Vw*7oV*8zmO4-q33!p`;({Xcwlqaihsn%=5O=2H{*vs zxA{(fZ}X9}d>pCsOY+~-$NGGWuRb5CPkU}`eZIw4pO5gZCtJ^N@r4_!f8o@9QS*_T z?DMjpW`6}e84UJ$Wp|j|x3msDC{`U?f5E)<^H+|u$uir@9W~4R+sxxL*8sERsm&B0 zr`M>S=i)52)n=xYSpg>cDf@Mcsd3S3^Kq7QEviJPVw3H+|vTHcx#&}-Wr>`Tl1d_HUEin;rG(*I1g_N)cn{(%$(<#)}uOOJiUFC z8vU7d;HCChZVO(|dgjd7@{O;~@!74%njp6Cp_rLD?W=(}-5OJG2{6-!9PoKetH$u$ z5)N^E>NtU~ydPb=pt41vc{9@pWa1)iRZ(%O;aH zp!ciC`|0uc%s;L-@OkeXKk|O!xZV)phu#mdzr^(Uf>z~v1LoX)zlfaP=2P0Kel$l` z|Dw0N?N5ZS7>c?I~wPS35@jcsL>hHt&>1_v&1N6B1JhAC< zVP>Bf??nD{kIBOKc{$Emrp5= zL!aCH;`6mW$nS0bsD4QPd-_B#^8^0S=WET2&x`joH5oE@zTflN$JFNsOxF49Te%j|^Z6EEect1r z&cQxWzm4%9}3#WU--p`Yd&@^4e9G|`1>h-hrh{j*3$>EAMwxgDN(ch z;^(4+>VJKn((;kH#pnI_OHL{NbmSL*{15SPo@vAUH!oU_^IrUG{#JZ`zz=$|`n-BWQ}ZDct&lG#P<|v|;`2i$`^k(BEx!1? z&!5R-i!VO!^Jjd%#h3i~d=gaqF=2?l%068BsOBqIm(83q$NnC@e7}U+4*&ALYQFMj z_{7qf^?M=G*7|(S$G*8gU*vP0zQu<=)BJKgO4z96xA=Um58|HYTg|cERQ+)N;lmU9 zV5%B3nS}CDJA?YcMA_$k{&Ih@&-?sUe-NMd`D^|LE?>79@`IiX7GJl~-qmGpwe15* z8GjBdIVIbmb*;}UOP41m`^=mU*q*JT@Xy!9`uw>(*8KDPr9OYI4r_i&q?2-WS?fcB zLSNP@(fW;Xt^c(?M*MPLlXTiw*>BBP-gViEAJaU1-g;UY*L-X;t-4So!JXz) zO>2IOx2LU)YkiR4X+GhVkGLA+nosgi*5}F33tyPB-xgnd-q(M*zu4z}{;EHS&-?r} ze?xxR=ZAd9=dmrzPxVE)RG-IR$>#Rdvq9!o?x)*lKH&4in3=ztN4;({&_uj<;(cYS z&J*k6$DgnYwwJjebvjPQ^J~8PJl1#gzn;(QHJpS^bze1K>u-i{eYji$p|CKAJg;j_ zDp!|fevHsdt>hOm z9(6@yl9P0mxYKO>C!fdGCuYtOuXE;$&tv^W`|Im}&*y#qwqu<=>;H*x8rOB}`rqjL zEK~J!&*z8nBV}|vpa;co$JnmY9Ix~FJYM76HZ>12p#y&(amb{^Pu+j3jv4v*o^|fW z%>30n9zO5zm+O%0+t(-2Do5{>aiZQhp1<}fayrSs?emU4{IZw``8qu~FBG1RTltm# zr^!>En>8ulhmjzK4_yMGf}UxRJ5*a zD?UGDa-YuV(BdE0ZTdQh5A2A@$zzLuT(@!fGj-VFCl=S&N48b(BAt6O0avFztG$lS{B z_WMlk_ca|bkMC~G%-bg!%V;euB?ssQpMKsbk8c9aA{uPgxi48=p^k|J2?z z<3yw`AN!u>7w;uxVLCoM&F7kyT$^JSZH`)(991>Xk$5$qnJawl{~7(QKGuh4e13*s znD&?sZA>m`Z0m>SJl9{A!>Vd6P5HbZ|8jq^&-?sUe-NMd`D^|LF8lnDAM|9f*ylC3 z+QalWT4DRZ!#|%-!~3Q;ncPRSI$ZgB-A3xM&!5fXm9N)rJpODQUinGH&HXfpA1|r5 zQ)?EV#2?0o&wS)`l8@~UpQo{&+hg7XzKxfP#QuHMO!nBb-=@QRug{--CKsQp4|rHd z{hVr6#}1!;Y*_O-{uMqYikrucpH|bDX(Jum&tdT#p11mF|NHS1Q|p9=g+Hnvj z-=Yuku`|{U`#koGeO}_nYWlrO)@i_>JfA=7gSgq}{rFe?L44llulXDD%RWEkLup!% z9;CS)({@+Q@p|@o(Y~qqkcsV(H(Q5WxjwJ&&yv>t*$38sM}T>J7v3OduD8|SL8#Ar z{2!S6((gF39v&aBL)+|KrsgS+NB>s(Bd53d)Uvr}D}Jew_4tjyRebFGcKi;1o2#F` z{v$s0xy>)<^AdyYFXZ<&e^fu}FPMeXzde1d&)4xQSC^%pB<&w~!Pef)*y@A$v(J0+ zul|lwect1*{SK5o+pW)_Cl{YTu4#$bxz$+nArsp{*R#(0IqZN*8*FR83&#Gk&wKoR z-K2Sf_ljYda zt552gc>EHlW!kZ=f1JnW@7s9#uie+B`22t$^yK3661(YPmdf{eY~J7T+k-}FBJSMcxOH@(jnZKdA6u&?la%(xy`_()Fn0g1uZdEwzTyg@5} zi#>DAu>Sq{i%-^k>{~#&pI+c+AA2W$#Cw}xe7@GF`22eOh_RdB;`6I~>+^N|P$&C* zgm2G{thlr4^$Y^=pS40iTfU7CHTT_(&&I~gk|*8QnR$H98i=#hR-2jF zo9MOqxhL{S?za{b&n+>LjV@F38;w(axfLh&w-l$tfRDIeTl6$=B2dz4`fkZ;H3Y;w-+|n!B=esXdU(b|e3?bDSAlKLPh=)`6G6 zaX;wdE*~Dr=gqnwmml-hxtL?V8emTQYJ^Fx-t|D}$oYxsiO+!Y=a<;7I`(NzMVb2f zR*R{5jxwq4Yz^C51ylVhpl8BHeI|(=s(+~^9Q*oA%z249$`Q>W9w!~5`?ZAE)K>#~ zx;6h9kJCHnIeaw`=d`c(nUK%cq8;11EH$pz2#_qCm!3QnB<&N+p)ox28$B!&f9v&z zylgPdwwBWypZR)SS@$!;kG!AI>&g*+=>1UEIKuye&U(E8$<4jd(jU3H$uFMU;$!Ex z`RYL}{!x5K9qImLw;we5s(!3Ki4k_4bN%3DuJKj<$9zi8UH(WP^=N1p=&!Rr>ep@k zF~3{-Y{UA5I(ogqiT~Gci`Vnm$9;Wv@K>%!{=>I9eeAu`?HJqV_uei2$!lGH(38Q; z#|rh%Mo$fya-2K&k=EaU$$e_Qx1PK7X^XF1T{dE7emMrinm*}anRa}RUwuBp4}HEN zhIM=nIurl4qd#_u+4fPbPx1Lk{FZNhzUHHeZ^n=FOdtmO-{w<@1Ag|gb$v#B=yRJt z(x>?Rdi=%b>-^H(#AjCdSTyO^kNUjFU;BPU z@%aHC)lKWsgW|Mf{&GGyW{~(qPgC58XE% zAoYb3GxM$Y*13~Bw&FjuaN?J3EvGj=>yvW4$9_8TTYkbdzLdWkX#1#+A343rw?1F< zi_fpdZ+*Vzmwc}CsU&PJ&iZ2ye}hN9uRoSS{S$A};}@S_kH7eQtq<~hJO1MHHJ{|T zr_Z=PAzt=*PoE#C`K9mMW}o-?tKSz^pZEA{-*+a@cJ&|ne4W$c^N07;H9utTDC?a| z{sRe=_>S}W%g*SB&lqIW*u;_Gp45HtJy=^XVF_1id~Z}ByM9zR*{Jw9vUIz}yv z548Bo)#X-e&haOp4!8oPetf=uhRWI-{YUx~pZEFY_gkcMn#wPw zcP@U(UDn+2k@lljoB7rA`IPgKm$LYvjivrq`%BN~9sa66sLy-)ulZZ?`2j!Z$?EgP z8<1q_F=W#}d7GHec=g;J^#TTFV`7=J>;!FM}_^5dG_JpDOBr)~* zny*}4V%<8YtpD}?Tl(95>+?0A8k&k@hEJ=i_ZH8=bI0>FU*nzOW1S|y?6=9^X5(Ms zQ*vhcMTdlqG{0kgD5hDy)g0S3e7>a*VwuY?_rBzpOhWm@?AIq=W1q+RiS~nkc`1tz zJTdR{&G^~peg3LHh|l}{HGcz_&*z7HlDm7|rq%@O{v@rncbl3!Ol-?(q5MeR;)0&wlcGm&5=VQgJdfut`fGjo{Iky&=Go`3eC6sA z+jaU>$|3hGN+W6iqTX~|$FIB@KGr#ymT!F?>s;y+8+kRKkAo|G+Gdtt?!Q(4MqhJ% zjUV})=9l+t&>K2vF3R&Q{nISp{4QTO8Z#6)YV{gFUSprf^GW_tq$RQNI{Q5S>TB*WiA!lw=2ouH_nDl> zIUQ=gUbh*<%>21L)_lEgt~6}*&h>e#KXN+D-|T-MqxAmS z=QSLPt6hKH__>X9&l+z}W-N2G@nbL3@l#03r_Jhdlh5<0_anQdd1lQC-(V&@tNW_? zlr)}rHIJH)7CiXn*a!B2kNi&aSMp0?PsYDgpO~^)`NL z^LY5Y!(XmL5tk&OMnCFNp8miS*=Lse2sxeQ-}QMfex9Dp#d?<=*EL!6z-X)wR#2@H zM&NQ?*>RJvTwNyFk1UM-V8;2z=UqNcPh&3Lj(Hq&spCg}m8(k$9NQ4j#(&f2J^oUC zB1H9hhrirk>hlhN+Y!s2_5VcuG(Nwp_21~b&}YZK_Z(-(=Mz>r>%V26_xWr7MxO2JkC3dl+cD?w z5;I=^NlYyJng^NCfq(xnWIo{YK7ZShqlG+*&-?u4I^??c`D8PD?xVz0$vrjfBXDQ= z$h&^_N;RP4u@7M9)BNIB2>&49c z**wD65RLW`hJRKK#{5~Izw*Pnj_^K+0_V$mt{>+jYF%dd`)Polo=a zXQS4;?D)#(3FR6b>mze7ex8iCpT|}o@N?Z@`(gdybxbwNr{oA1+Yk9j=)tFr%D&3; zVBmQhKk_@xFL^xk%kwp#_BR*5Y%BT@AM>F=X$#U(eCo{^;)k zzxe!m{Ke-bhD&~L$3Mz1`-J${qCVE=>-edr=lWN+wR!A~tv-l9`~0z=+z+z&Kmfv7 z{T-#8&zpI4`1W2X*yeJt13MQRKY6yRPtcQ#&mY>bDMp=g`y0dvuF58Fqwj@7^Tycd6uZ+*Vz z7oT6}7ayznCZCJ?Bu0pCP5vf*v>t!)`I=vRew{zk2l>4nfARS`{^Iki@sH~h$;mz+ z;ag9({@;v0*G+^k99uJXZ2OD+dai!f?(0%~eh`1qlZ(%5>?Rdi=%bTl%D%@mrs7@zv)e z@!NA_>+>zX`eTG|J=uDGi?3W=YClL@6#tQJrGLj`+h4`!2mGKXtIrp9BW9$HVx@KH zVaGN;9Ou~Ihb+rsYMHS6JwSq;<*K8@#q#) zJvtU=xz5sJVh&4jsuy>d8y!QUagLbkzfq=oZYxeaw-l%PY>P>Ah|j%vYnv(FO0SKM z&AP30yj$~p-W+3ky(!)nV~#yUS-RAE&1JiNP!n2TniyM;0{3Um7cYV1{5{1tzBBtyLx^tk!25 zUk$}M>8l~;q^|~;<643+d~G78r(5%%@tXH~^YGQc+^2oD&xCxo7VX&9WzkQs1w+~E zdv}nqUUd#iOnBrsdRQj@*6R&<*F2YZ;KB#Zu8YQJN#VZk@`97Gvcc+ujhBH4|?%-{OZ?j zebP<-MiS)jiM0GdyxZ63SJeE{^*r`*pTC2@ay=4rVvqFd$KEU5jztseb=Kd=Yh8ZO zlZ(%*cQ!m{$du!pjkD-GVA2Mg_1=2!qC<vChhF^W2mX}YeW7Q+a?jfDe3kR{cKu*Za<1y| z_kCOXeu4VDr~hO3P1k%BeS)4`d|th+q4|(0nxFghIL`f9^lmU|gXiv>UhBYo>%CIX zw)eAVw!SZ>aqF_fxAit2pY=&8>k{CnmG1*C@~zL;`7J&_s2SGZYGUJuM;<;|^HCT# z^+}8vqpWvssSk9Q#HT(#V6qQkz8*(CzC8!FxwGRIU-Rejll5LcURZCDaf`29U8-(kZy)$mwoMr6dE-X*p}(0k z403TX5AoBe(_=TY}te4yrI#c96rs}sLGU-Nm=az2*#gJcbfYx0%% z3ZIgb<8}Gv_fI?SS%?Ssg*^_|@fV->@=M2S{cSFB(!n3)m$aLU|D?I$ZzMt9R~JRGkUi@qRR(yWI4|=lteDQ{(MoUi(nUvGE&kvc?KHuVt&-?tD zJhu4a^FDvZ=UaTq-vl4Y(0)l6st*uTpRf7K)g{)|zAZVG^X<$1x6~6(=kry5@dWqJ z48QoT^&IPCb^M5SnvWQcV`A~N#0c@sCZF|~iGPJp$swU<_~m#8Lu`cO=>e5(nz zYxsOiAH*^jKi7upT=>N7*C$?MpZE1y?l1OvpTFu4;`2U##^-DO!R7P$AwTHJVEv?= zYVRTkoa5YT+Xwy}|6U*Y#42PPv@Wr>{5kB98Swd64+J40vR0N)2-T|A z9~*f!pW|QQ(>AmGhwhus`^&O%ALhB6_iNAtQmIzue7>cBnvMUd`=)o|U+ypVdCWIa z9{3+G<q@Yno}Jln0$peKXLK3~_S$?1@ps28{u^mwE` zKV)(r&FIkLAJ=UhooDjc;vd&-9R5rlw)ly~_4SeWU+Obhzj5wV^VR1k_~smMqkoO} z^)(;d+4!HjZ+gxH?{>33OmobBjss!JV~W|1ul0$SVX!m$tnihqOYE&1fAM*Wr^IZ> z*!t98>hm-F;`4OQ*E*k16y1qW+Rf=B+p7M=$zzsH#nDckZDPCuv$1>LK&nGL|5AQ8wwkY%bS$}Y6`KS;5?3HRo$LZt=*Zd-=X@2o5DiigA zbn>(-AAe8tNkjD+>tlo%_{>JdJ)u9Z6Xk1v&hSf|6i@NtqFaI-Req=AzvJ_M{1Th$ zLviLYNzkoNyr!SS@;vZ&UZ&zX><`QR#Xj%Hzv>U-^FIHc&ky-13A`Tmd8#)Sxuv2sznfbGMyz=$BjmMv@!z({YL60=&_;=&;*4ynEF@j_D zNB$@I*skO4)^o0W_4#4VaQqZT@muR%c6{aYgy6$7d|IdYd4Fv6A+pqZ%FFUM?e+tY z8Kzyw^3~`4__3cOe(dxZV;*Kq&s%=!|K!BKnPbP9Kgw^3+vDT)BTnM0ZsYpIYWezn za^hd^FZTH|59~45(>cG}j#u`a$4{)^_#757Ui9C}eHNYgXMMiP?{6BfED^#r{-7tL zX83#_B>ik8$i#No*480((BIqlnY6*S_B#UT{yop%;jjJ#!Y<^BSg0*KiBwr{1jr3UwnR@ zKhmf8{5pS>Uz*#S^@-$Y-|8~&PtyK@6|A;1l4Yz{vP35PZl5R z=U2J9#2#fnyeP*Jyngi8cx>yR{CZBGwfnjhpC7~@^kguz&ui=rO@>T4HeGbc=ko(5 zZSdTE(>r0 z%i+U#jr%9gFFs%MLA$9>VuU?+vhm}^TrcbKQ;0o2^tsI+=~H}uJ^teJE&bEY_^r>k z`0DeK`0cr|_4yWG{V~F~o@_n8#aFH_HQ!RUAMk^otUh1ZjhK-( zijUTzhaKDa;7RQ7Lzd+*wP>OIGgGe7#F!;dZKn8mj9F@{%}ku+Ad@VCKd)*r@!SHl zcyx=Y9vzDlo|b*B#l#$z;#9BfFgH4eMB^MW)qkVR(cHmWic@{IJ@>T0EZ*8?inqq* z?$$iNABr)(-V|?(F~=UFEM1~rS>If?oBA@nP7mvEy|MKuY{Tcuy3{&*if??C_v7+o zz8YY9xjTF{z;tUYWgiGI$*-n-HNfPm>3TKxw-6_lA!0ShL|a$b;}Ub^S3C>x)zI8W zOs&W1`sW!VL4&!2MdFbEhvJ;{)esY!b@Ptb_}WA;PQF&#&pY}oJa?}*4_^(;ecD(1 zOk~;4(~fPetA6TrT2m(v1qtglJsR76qlaZGOP5V1ZIHL6*u3$Xub&^vdG8!Q@_ypD z-oWS8bNtZzA@-M;K3~vTuQ$NEa&M?^Rv+Z*CZF=5-{-3Hi+$hbtN*s*$G&g#)#Ez+ zjrts~1@de4hd9|oTl`Wl@9>e|+wrSkx8f)H@9G0_*}L0(@ov24=>IEfe(8E1`?$~F z!C$!^iJq9MAA7HKJC>fZzIW;0-&}sslZ(%bca|EJR{NlY4ViMBvvI1vsF&{)Z<9$I zJapgmKEE7;5z8k%MB93Nj$eJ=i{ElWpKpk`u0EE(?GS9w@sp;xk7OMifART9{FYC- z>GQGgoAHy4BvcjcrjDPUlsaFJzxZ&IPXW+wociqPPc_|--_+wP{NnTL@fV+O>632j z197|ciP!Y=Lr0%4^z8lnrki|l+CL~buDyNVmcC!0KJV$j_WcOt_cymbgPvS`Uc9ZT z$&e}61+32$pC2$;XL}A@ALAq!ExzcBbp4t1XvWNZ>%F#T?YPBPpZEB(t&OucKI@aR zk45;&d>;@VbM#RifARTMK9n8svG1GllZ{{woTEB^?E5yq_;8a?0nk6Eeq>vTGa3CM z&LI9$kMHn{&#&`~&$skRxAlRx+2>n)JU6BP4`{yhecR7D{_6LI)#p9^*S_yue15`o<(btbZ+1|%^`@Qw9JZ|tM?g_s26L7S55(TY&RPl??yZQim=H!^G=k0L{JCx#Z z^GoG`SjEpdPUT;pw|wk;l21A)e?Rfd^CVT3UkZ$N!~4Ms`ZquQfj=eAHNN4w{G!8d z?wgMNAM>i?FFxsbhcyC{#x^R{U;SSmVM2KOw>fxN8V~a07@AGHsu*H}BP4FpUxnG1+{OA0wciuQ`g?uapwFj< zc58<7O9ht>&$RsFZwb5Fd0HQ|SN7j|K82#1SiaqFgU|b!(PxFPde88$amrlIx?ST3 zcRK!}3FTMsn|{vwl}~e~JoxcrJ>)LO4C5($yl|>pTc3E1eSU&JaULZxocVaaJ{A9} zKZwu!@vr$CxWBpa2R#`~_Id4Ht(y-dlNOAdd|=WBjat}Zvy>7+U9BXd_DBTjE@^*8nB@UQ)@e2PWKwf=}hxw`Dc zznS}Q(W+qayl8bD*L)Si?5E2o*;JFl#B*al^WNfvJI!z3H+>vG@;lA9$8p4^o_spK z)AP1|D80FFQ(p4lJQ@cK7Y>VukowT5BW$L ztw#^i*^Wup29tdrdFgBJFe#_!I??Mk114=S>GL&TuiJS1xjfc8?2=X}2AC)OIz z_cdpIPQ8QFoqI?7=*maVXZfdoFP;FR+1Hh?^@r!Z_)k7xymveK{FSd|5`%<*CaUR!nz&yTZ9UT5@ z9uJ>)_{(*eCgZo~NT!bx^+vakkn>r->HV`0P@VMp6#Jg$+w;}pT_h{!z{j#gRl>s$ z8kzo~Kk4sgP4c$#THz>@p4V|A%9XGCd4*r%_2Z}MYWyYUas0^dbo@7c-q9x^daV;q zQ?40$TAxomrgWM7s?U4;sq=Z-*O@Qp^R#29es-*}XZ=4>)={5#_-p<~o}K%k&&QOl zx7#tbC;pu@!RzevTARAmR;JvHuiFsv%-k;Di)}I~F;nOBwBD6}T({}#!2B7XZ}E@o zHV%Kr=Ue=gZ2k51L9bx$#RppBnva~$@@eBnZwgcPTk{dqG@t87a)Bu)NhFYVOfk?Z zv~I5NX@2oZKn&lG8+_i6>aNRE%^xx6;0Q9wSKf8`6d(DWj=%W4J%>M!Ykkr*pSHDi z(i>m$%RcYxv)o^wll`?L{#|0W-@&tEtdUEg)Tf-!`|;2Ce9b4%cH>9O(0cTs`0bd9 zmzeQ7`#hGX+@5MO$W)&nGAZ#lectEa^Ld}YT!)GB=<{JM$LCxLdhHF*Cmqi|3GOT( zF_h0My&y{(7-tw{UX+Ev0Oceexww`>|2Y+vq`eVg7U;BR|ze{}O z>QeWYW!pYLRZZ^r{0yIVrTZFOeSRYT9Wn0`zx8%I#u`~p(v|84 z{>ImBeEvP3AM%l5ydL&>su7w)Q*)P@PWN?IpC2+qK7Zxwb(=xV%%Ao7D_^hMc>LKq zyz*0$dhz)1^~2jaH65Qn^O65aKK6g`!7x6F7fk=2`KXa;{@-HN+((#zj;Ykjm~a;# znC2HI&80BQ^LV=EQvm!tEt@sZ^#k6)OuW8&T6tbLHh#++^J(8D=GpkQ|7m@Xf6i&y z*Y$ZDzjAeH=R>l6;GsIuI%RC1@7E7D&)03d_?P>OeSRYT9kJ}WK0mR3<^HPlFFwD@r`+`U*!Ru&$(}F=)==hn zuAlpSayr1W%Yp< zY;DYp&-H`z@u~P%e@Cf4@9DGlJJ90u1Afqx!OT7{+B7vEGUYwaS!ewmcEIEwU;AA! zZ05V<(c|y?w)DGZ^?8r~^@(dw`5eF=Q%?1db<*cqpOk&l=j&l#=^RkZR z7oT6{V^4?A*Zku1>-^&LH6Q!FsSkn&Lj0l0&px&u|A=pTi2cU=&1GABOk&GEwqxFV z9uMO$KEED+@%ffM>9#(Yi@x`4)W7%_)iwz-r;qhyx4)PhBmDm;#@7*lA*uQNMs{0#rpKoZv`=Lnn_uv5#!um>57&I` z`!>J$aFb5~;2&Na`iyKVz4>MICvWP<^DVykV=TYclf`?jC!h6^xMO^Y(=zSY@{7+8^a*;h`n*7lQ3u$JOfpVjznoa(dDI7fNM zYkUnR$ULsgbmHXm<`~oKP4TuEbL=6?(xuixF5B&cgflfWGq(8x_h+tEU2;u4#W%h> z$B+4Hfa&G#@YMiw+E)Y2gpBTdoviShytj_IVn*Ii9M>E4 zyn2EkdOwt?A7c7^LFaP4Vaq!L`_ZAkG)sA9ZOAG z-@EkhZ!SOR$*37VRv@?EiCt<)T8+=ehfF!n**GA6l`NaonK3==2kM*%8 zKl}W8{KbcBe)0Kt_@+nuJzLektshUHbXy-MzuD(KeZJ7MOP|kwicfm{eMd{>p0Z=f zX|KQFZ`tQP{@V8=kl)|j_=BDd=1*ZB*90`j{Iu`$a$Vr;lX9McT>qIMrY;MU>(HJ9 z_k6y^7kz!c_1-#nlE)Tbecp?|ToXYo$9u)r_^eOLJ{I98@RNQw5WA4;Cb}=nhu$~& z*5_+|iqEgckEoCH`I?W{9*AGhx10Q2G_4DEYt#Jld-OBk?w54C@HyU@ z_*eMq^E3QwoGsn1@q;@Zf5|E7^IOB`>->`Zlt@2***3?F5Ag~gIUMDeeSU&J;q%S- z+2?)!sy~R&`}`T7uj2=oeSXLfdNNq-^QLz>$GO!u?pcS4Z7+Q!=kr4*HQv;HSrQ$b zE`0HMpFfw!nlC=@^XGiN=BGq`G{J{P#oLJ^JteiF<11h5!{<{ktG5$V`RC`aeC6sA z`>Sh)^GkC~k~}Q+JB73({5$4y<>R$UeF)R$TmNkEIo_H0SNPyg^Q}JR-Ug(`oUU3wtK3~U=*VyO%_?P>OectD<`h)nq&!6*o z((saB_W2GL&TuiJS1xjfc8?2=jyQLC)OIz_cdpIsKxiAkBB2Zl`z!jX?)fn`I+UPe7<m_oL5ImfSDT{de{^r8Ab_!N%lbM`UX*SS9N434w-=f=On zhd$H%67yM~l8Z#NQ~X5_KmPOk5j}Qz`e2_^`bcb9bDFl+Duz0ibuRkr^?67C<^E!y zM+^>s)gQ#?eg2%!lU7zAEYaX>5CEH=bYB$t?e_&wKGB=p@0>@)*;^ z?Oe|BpK>EUmN=~JY0ynQlb%1vZ+zb6(^Qpj^%?O?ydrup_-jU8ier*l8c$7|DkT2*6i`(&*TKLdZ9(4Rwz z@|CO0W=~0dF7cH&!!JH>&*9Hw1i@4MAYq^jX-dl(K2|>EQMI~0f61?2x8eQhd~(`1 zibFWd{lz{%5&w=|E%<}@yw9KUc|>s0AA0cl{E!cYXgzw6R(8z9n#t$$Sg)^nkhzuL z?f02n=W9Bk9==l@4r6Biwqwood6y*M3KU*uHacE`RlR5bE<@ z{68@FrQdOgxNiK|Ki0{0`2W-P#>kT7$hmdYyt{x|0d1_TjS__sC_JfeR!Jjr3AK}o zCA3CTX}i`6Nv&4URc|LPQk$Yi>97BD2Rz&(fq=siz|fKrl{e#r!{IoAjLbxvdzCw$ zeuyWF{G(5A@~LhP&li04yqBM=_z^yoko{2b@wW-_AJ?oJf9tEC>-g3G={2_g)$`-| zY4Op&OXH{X-_4KHzuEJV{Mf!I_ig?WfA+k`AN?Jrc;4fW{SK6z?dCt|Wc7T?jn+^a zYIKch-=9y{zH^?B-$`-4t4umz8~a_bdcF}e^B)iRFki3jeu~*%$ItPL=RN-0D?Urk z_x$ZO#nxdu*O|YkdLDnnWFQ_t!aqD;^6|F` z@r&oH{4I^6@%YulC0{+ihHvscoc~t*>iO~bo&J^id?0@7WOsZqSA1{s#of+MV?U(6 zv*YM$|2%%h^Im?&)^$O=pWXUwdOo$w#ti0<#7wbQbJAquxa)Py`29_l$$7SG``G=& zOgXRdWj^1CnfVXIHnL8Uc;4gx1pfVX)35WB+Me?8hI572F>~^N#kZbMudy}r?(i`F z*7W=}Up-Lr)$`+g^;ngkJ->#J{4C{by{w5}JwMKO`Zs$%!nbo{>v=E=|0Ms?^ZoT{ zooxMI<0o#6pE%ZOcHfRK^l$cjBmSV1!DP=1TWcsysq%atRGznerq|hh8z0*J|8ibA z&MM1tn5yk3Ha}1#bY5bi=Dx<6+D~<6@;LpiRR?k`y`MoK{Qm#C?K>wd#@vBT_g~~( zHlKKIfT@nIF~!lbI1y%^f7h7!+hCk&&V9k;{*T5fey=gbzcZO&O^;JN8;#THBe{n< zv*ustkIlnvfjHX^F?sA`T1Q>%KaJBLIS;&*{>#H+V~1XFtWWH|MFuT1P zV0L>o!la?j_l2qN`GF_onu33euL8{d_$;l)G+qrcYeu zHNZq1jX05yfjHYtI$yl)#6&Tf@p~SdsNZlt-I{-mGrh5Scs0;R-Cn(BZfW);^?j8` z{5>;{d%@gS)Mqpee4#!-FVr~1gd;!DpGlI>nH&9RnqwSVRx_ZxWLEA@4Xx!_0M zPaO9f0{qbXp_JS_Z|{r$4SAOP4d{~W*;@Y5S2y|U+!`Mzzs(o_*7#`KZ9XAvEuHHJ zXW;iZk@~dxM?E+A)H(O~1h|eL{kxP;=e{353e=3jr~J$P24{Tzgqk0^pT{0YZ8`i0 z_#^it;k>T;vG-8zK8}Youku5#b@@RjgDKaFuZb;vyz@U_P;qU~r|aCgACLTAGr0z= zd&{<`JkiJ0gmTx^@<{u}&89y9$c&y~3ZMXS^xXKUsTdsAdK5fmM^V8x}=iK8H;5vTw z{AmBS`E>64@uNUZ4L^;q?0GN#x7WeX=U@Bce>}FK?-z*Yz4*tzAEBOa@SC15$CP^h zaGUfor|JbI(e`|Lk96)w@qB~HHDKq!SDvr&rTre?y4Q|byISkJmT&>iN<90N>!N=hyJ*+&Al!8gRJm%XNVeh|-l{ITyltLGd1rsvBsrJmpO*pfa@|9qkTYBQ;*Gh z%rEwB{ObARJh@-e>0YG6wjF!v^GkY4_fMWL@{cDZZrNV)@ml$Q_la*jU+@u&aAkYJ zxA}RT_=K>zviSjDcuV-ypfnD4hmRPK{GcDSF95iXUp?>hwNEKOyYxkqPv`E7-{yaR z;-g_aM$&7Z@-OpwFF&K>OXl+qf7B1+c`yHCepAmk_(3O&=ZzbrkGZQ~P!Vm%A`5HgPCb`;zKkEobo1qVA#{js3;kQq`{VRGIq*ijvsM%^KDLWT*dRX{O_IobgcON%tynH8Y}Y8p6|$ihv%#D zv*&&Os2`H&eg2r=!2RrwucqhAoPha*m@;;$zUbeyrOgW-p66-IS`Tdb^N%KzYoIR= zB|mxI=lAtv$xoj5`F)-*`8y}q=To<+=kX62r`VPK9WOfPU+T~2Q$47AEz|n#nJ-+~ zR%<4Yab0tZnv7WU^Tf3K=la1Py_&3WET3X(@VAwG>YP44y-ee@>!!EjNB?&7ZJ#18 zsUJM8=Y8&9>Cc}2)qVu~#K%8OA3gOid%lC;<@rkd?0KI*>WAccpFid|@qCky?9%J# zL3y_O+_&gon{)h~J6%%+_%X=Uh@0; zv5a5ti+TJ$&zJl?C71qim2=L|16}=)v5Ea-oSOX|PoMLHKJDb=IOBQicDw(~*ZT9~ zr!e-@c(-F;_MiFOAkK@=r(-SWYX4lHIKx6dbxt3j#+Jsf`vlPEpYwzM?dIEl)crP} z&es<|UU$Tarl2_~|Jb8{a1HO+JJ%UXd7l5!yxYf^EgFObB)V(KhAU1Jl7|l zAK)9$AKZHV)7aAZbswiS&(pq*A7i>Rej5Mh`)?^fZ9bhZo}VGlJNX$NU*dU(KkA3W z^A3N^Z{%z@|AU^_+LS)t`BX0`iMHoc&Dc8J^uEo6Jk|?j^Kqr64u{Z~x3%dssyu%Ol^qG&7ck}JNh`RGj zKA#Z6_4BjiHF)Isb$@4sJpUX&oso)r6<@frrSqq8%W2zQaC(VNW2ShtEp&{$<~e@x zd=KCDqup=u>2H1cK|@Y)+M3ihKF5!Pzs@<@5M-?6d#cm>+{ zY z&*PE$sNnMxUQP0`6u-<@sfJ~LXGDX~weIJCj8C1@mmeGRd7n~z6~DwSTY4>>FL%rK zf;~A_bJEWjUJsvME9auqntk&;@`yiDTq(}vd7nQ#zS#3Vf7B0YKJW9#{08o4w|ly@w`29P6>tM>5<0{>7%w!FFfTRecH*Vj+O6V>?coJKRoj(sOPxl z-{<%d?-4V6fWuN->^_HoiXYE(^YPl8lbsI}J|S}6@ccPH`~(Gx*GSy5eU2Y53iGL> zg!jCC;?paoPqAxbw)^M!(PvBfwY*3>D)FE4Y;$h+&wfarubt=2A0A)qd7r;Mkn~5c znOD5Na(^DL!2iziC(rx*F~6aI+4D_4vQDp~2gPsqQ^e<(@%QZcGWSQ$+e~~WzWw}^ zhx~iv29plh#(qbD_J2)v=kZ5>2O*yK_}|d>q2F<2k9mCj9l6bQXuo@4onPc1eR`9> z8|SAOZ2zj~N8^XX)M-WhX!Gs(36VWh<7ZEf$KT?s=STT8Hm>7G|K5zh&8KtsjjvQ2 zmHMO;wDK>X!{)7=FLnFN)3LT6ul8+yBL3`oFaM*zqZH43{ITDGlC$0X2c4{*m)ulx z-ejhGS?4?-^ZA_b3X=|)v~IfA<#U}p9=KdTQf=6Md;hH#zj(fp6ORAwb?|rDDbS-H zukvH#v~v$=62mBuFT}9FQaCg|s6N#5Ui?>l>-qE=%U92j^VRbuAFa5VpPdm``N1DK zPn5Sbo_6^+|5H7aV#{uM;HX?ncs)YA;;ZLJ`M@{$>iIQ%I(N>?V16im@qEgmtsneJ z{2t(2C!ek_Mg5z84e)JWm;2}V#q(bN$JTXG&o}r%C#&a=*rkuP=9^3$cfF2TUhiiw znUuKAuI*#@6ElsY8eit~jhLDLKx`xH6p80O{!ic!t+TYJapdvw_hY@IH|&SkF>~^N z#kZbMud#Lhjzoa#3B{JS`$hj=^VRbuAK=@3LR{Am&TupS79aV!$tS>d{ObA9{I~gZ z?tA$mzIeXczuEJV`0d=-dcMXNKSuc0$=35VzHnu`=X~v)wwI^2+d913x8qAa-{1$G zES^_(C1y+?DL#4)J?y@X596Ni*ECs{!_<_=Yv%Ep>*tnJj@X!~{Upzy<4hip#i_Mb zXYSm|K_)4I=jAmfo*Q7QqialYbSzFdCwr&HL>q?U6qj8vH|p>JHO3~-mt#zCY$mtGm~Dp$OSY0<+S29zxrt4`lpT?`x+KxV&9w()9cH5Cn@oJ#$ zI3|A{Q>#zJ`8p6M#%B6_vCcfa8i=#otJloVxg%oE47nGa@|uUh#*RiUO52{jylwA4 z(8GFJys6s?lMcwo5)-clN7fQnhstZt{NsKD&wFuj)%$X6;@kHV>Qi~mnSb1G2=MLu zp>Ky<>-^-_SbpA+AGzPKA6}^O(O2xRReX47DIfj0n$JF3n4hJ5^zTwWr9aJ88cyIb z`<};s8ejeOspB=mx8F6uc+VcM)j#5AkNf@mGvfdGLyF(7eT(C>)9ZY=D&4Pg{P1`1 z|DO3*_fu02t$)b1Ezr5NwHNOoe9kBg7^6>9D4_BVA@r5hf zO3chp$EJR?eP=yiYi^f*~4#W zyUbB-+wFY5#y{Hsd%I3fZiI*Bd!5$vHU1H|!%xR1_im>4zF}X!Cs^Z)=a2J9-E(tZ zP{gIr?YYW*n}7BE8a_OhJ-mjG=C9^wkFALx`B}3KEtm{g?dcMIAI$1rx%h)QN z(`2TcpYts5#~MsJ;Pkz3+jg6i8ecr`@$DSIUZZWF*7%ZNkN@qW_R8na`4O&c5d+sv z>Vg+!ro47+q>p!Y?AX^>zIr~&e{}KH^K1BMXRgHv|ADaj;s-x_Yz<#MALE;~8Bka0 z^AAMIPJ8O#!T9&C{#DOM;@_z(I{8Pv=YBr^&BNdYjkdMjvv2c*IAlKW@V~$6dvNOq zyI{gu+WQymT%n6?N`S(2U z^Y3}y=bt@~*LTgAq&}j2^nDj!xU#L*4EOIjezX3T&l( zJ-&%M#HZ%w_dd<|!QXPNFX2;1jqrQ(Bc8`uLh<8EbDjCw2jcIqPsE+;JrchiU*-PO z_{#TfJpMh;`}x1;`6fT;WaD}1+tN8frt$nWbB^a7{%y}Y{BL(X@9&s`GNlBc!T_~ z=Y9S?&-?s)o^SGlP6mrVhb6C5?c;xC%>+gjklEX2V&ME6Z?0Id6o{tpwf=7z;p67l3J<`leMmXCb9lR7?kSdVZGj)$CoKh21aXNB@3y;}1Gn zJ^!2=6LXXK3-WWh?!i;O4U-CM`!D3-zj7WP*q7f0ThG_{;`v6*%>UbC+y0h4|G>Wd zuK5iyzvcd|@x}8V{|h)@GRMAm_+~s`iIQ% zv@;dT@q3r6aWs}6@V7LM*2IteEaj``*Tk=$U&TNA)A7S6jIU35e0|5htSf@!59gQl zPrmN!U(3faRnOP>;(0mG(H=gnUT6OmPWxBK^Ce$B-{1$Gte%(HD={~j@6nd`A4osc zzLZ~?&o`KK!1g~l_J497>^eWz^EJMB-s67+|6}Icb&B55r{ehYMR=jW3?}`03c>^EaGJ)`-}7j**@(`Re&K{C6Y*o-eK8qcB$UrB3Dd>&JbB^ZWX- z{3Ab0`Re&q`QMkukL=`pd-4ARYW^Sc__FsvaQxxlI!m$+ps z?MY=z9!z7?^6}bZokqJ~^40SVe$dI{d1Y5(-sqE9{@m&_z0U5FuBlzt?@gBFFjbvS z$MNIDOiqt6)#G($@_3B-?QnOUxpODSnET=D8WYb=XNsd|#)yc(mA{B$R@ir)^;3|eM-mi15fC9Pd<$?)uDA}a$Ah4-mEc&C0ofwE?aJobz0B9 z^&YrCa)0p_TzNmiTBLmSFzstBAJ+$2U!afAXM5nflJ1Yxa)KDYhGI_42bhoRI1jG| z;?(;f7jcSP0?Z9@rh6YXCZ3zlG+vz+C)zMQPB6tS)8aHdI8y&tJguk+!muKM|JjM@LL+)uTxEB#5Xb@@RjgDKaFuZbP?d~(j&!$*FvnVe_q zF5C78@*|%m*7)N2WBZz8=gkWWDfL}CHtpNKdpyABc{5&${q1p%Upyb-+uF09ukrVt z1I=@Ot;_UuJ$~Dka^J?Uo{z*|GHnhmUp>EukN#MiAMmrs*2J%#U&B|=ui>lbSMkO3 z5xyN$cC1y$m-xW(kFEK~L!Dqf#I2iA_)_2X^ZZBA-@X}`y}>)+eHdpxvHYkc9#wsP&`_|vi3 zhsQm*ZL>95|D1pI{2IP`ehnXO%bs7x&z@hySI@8EtLNA7 z)$^w8|q(vWAPm|FW(s{>mTuFheh~rV9Iw2tSf4Kxav=+(qr9pIbSMUb|(A5 z{`Y@=g6rhJ(QaK=^40T=_=8RcGkad#Q;E6BOgW)uQTtN+kNJEauN5Ze!M<0rZMUAU z@x}9vn3->Vo;b{1ivhB#v17Y>W5B`?wG!lP5pE_!Uuj{7U>v*+)hxkZqSN~G_ z{G0#zg6^?nr)U4{2l2cYzr9y%{bu*e_|@|b ze$dI{dEpKCgKzUTR7%?U@;mWpJGu*%D_;vlQ4gDhbooeGKd43_E zJ+_Ju?hs$sO>gH1{X4`*TwVPuo{!}R>~4PYe2^dZe2jmp)z==+`}}*JZ}Njq7SE$H zck+F8%m$g_`6iP+aL@BTzw~)zKJWA2P!DoX&%Up;_vdRK+jFiPIp_S?+9S>PjZ^Ww zAHU_>by?b;(fW(TzoP+oaJ$-kjXTDt67J-)C-pqYL#ln=yilTx{O|no9zJzc;>F_c z&5wAV14?ms#g8w|b>?Ruh`+x+5qJK+O(Z{deD%%egZaT&KF{H84Ny5yU8H`M`!-(u z_dMT>A3cdW;P2v7oOYibj<(pC@pqojQxkHnmo*b)8qZ%dDTwX1=N;`ZXV{2|W=;ve#Sh(F-@C4A%g5P!h)A^w2p1N{E_L{*CC zBmD4uo`!FG{GRF`V>#@3hkx7i*ZiQ9#q(O5X#4ZrCdd@eH<=SW@AL0@-sivF^1RPK z)gcX}uJ_&I`52!^MHe63ooXb?AGmLGUFTdsHa`>(t|k2Z_CRYM*YmM7{-g2t@`Wo~ zo?ktWsT=X5e>pEve$?|(KC;?XKX@H`KFAMyKE}7TRPIxEJj_UIZ%;IfBfe0uLE>!!CoiTWGj2Rtyu z@AnuYfp_Ei>AUYC<8u{XxU#K|Ssq`ueyF{D@l*GX`$?v3``0shX8Gq2p>iHx0WloyR@_YX3`395g!LFxk ze@F26fVu03R5LZce1G2K|Lvjc>At<{+}rxU#+UEUd;Bk8%6hurP>1q64*NN5jlb`y zUOav}Hs5~$|M+hXpj~obqU57bm-1ykj~HaUmNmouI~G5X%h~;mY>vI`s+T>r?)IBVLPoOJm_Xp6~jdlvAIUj~J@==gaY>p7-LvyPj@?A9S*M z{>XJXW}D1(?WSREu6O@0d91;t1GX>l`Iqc->vp?euOxA$%S)$?ok>iIQ%6h`*^GJf{_8oqjd4PQOKhEM758^7(E zv~_Fi6aD+_-_kkkhd*BRzh7b9ZuhI>OL)&)ZWehe$A&%GM=qb=$Nu+<^J{$ZyvP3+ zF#jbp?Pmdx$98-Vr^Xl0d;EU}|DQA8uCru4U*n7CJ$^bi)#Mw_6<)_o-d{>RYM*lc z$N29K53h+ILoa)N89#e$4IlYg%2&^?iC;axiZ7n``2U2O|ED~@>^gzg^VRW{>)qr3 z8T>zIzP-m{onPY%SGLFX_Gx@sK3-e(e92eOH~2v(i|3VHiFq4cH@(7wU+7%)NYn?~ zpYGAf^Q0iU=5o?>ec$J6+$pDWY-T>de2^dI`7`tQy=#D}?yfVFyXkK^?p$k0S=1gI zPl_{L%kA?vPO$jknap?Dp);9i+VnWVuC=(sBF% z$c#;{@fcGbT4yG=#hB{Q8dF%ZMSk03(|E&SZ}LakS0kPjRTc=FC6tH(bYTVoQAOr}OWM zYVjZU8v=Z-t!-1cUc}FSiRCB7X>)G(ZGO;KOZnp5Rq>;!mc~z2o8}3!P8@0v^9VVu z%p0WdY@V<7ZT`i}tMY^XT^hgmdR6>LbiS_~$-f;_cC6LLugo(ee4S%$n{`EvFZB}P zTc_dpa=)?__j z;~(`HsGkR1C*OU;@rUP2zIwiqpP-Y~^WwIn4V)@=W|R3IF~9#{=QHa029w9p-*N2U z^Zk3<_V0LJK1;0erTrfNXK;Sb{43Ab_`;QKB_|wzIyPNLP`fx;+P8C$8ecpg;qT`A zfNyA*e3n@9)$?ok?_}b8tQ*~vpZ@rf$9x@J6F>Ob^K1CX&r-g6eog%9`Bi-Je1!iE z^)KJIwVp5QUp*h;zrA8inJ$&=;tXTEse<3A9aTtlxsUyEPz>+x;hp?0gDuknQ|TfF8^BnOjo z&QCfvUq?tE@6!Go+9jSZ`Re&7Uw$Xr<|B|4=(dJ`BqGFrAgsRlDbqRMxgE%%oBw`3 zb<_x7*G+HdUp*hmKgGXy)em)VJpMhv7tcrHx8uutzN~-5FZ208|5`s-&)4`zy#)A) zlg4kkZ~dm8Z{(-x`7&nlyt?6N19$ZcN|wIUK zYW}t|e&lC}AL!p9KKd)<`B?vwBzpPD^Fh9uNA-C=#*ceG#tUxp>Kdm~e^EZ# z-NhHKY^ycH`9H_6>ul29-&qw&-`!+aFfIsB<0N>V9 zxqspLYkttl;(4u2#PB?~2{Og=P38p8`~1g;JD&IX_dM_OZ9QPF8l2C^_&h4Q-q(Y> zQ;kIV1NUvN>zwPy=7-`zj`;bv53TnjGXA6S_wt1+Ta1TtOx=iIJRjvpJs;&GuU++n z*Rkh={IKU^{J7_1d|RvKK9$1@6(+_N`j_v|H~B#)i|3_wsx=v8g2D6oCX?&@-hCUN z|M+mn^FIHc=Y77dhaE-m=o&}hvWH`Qs;}_puptkl0bTLqb%XKu-FE_C##1Q%UQf#S zjOV{Ee&NctI%X@^k>2XC+PJWI%7Jn~aJRi$HTHP7Hj{ivf{d|o(%143r^>4m!6XJ(GukFA%%JoE> z7d%p&c6`M>ALH9|mHRc%H~DA*>fkdys4aG%9scwkNc=r}UhbJya?)hJ$C!Qp!N!U6 z@O&QW%>7wmay|SHj{TnxDd*OicAj73%lGF!{zvdXX8zkN+>(C>VSnRXj`tNGdU zYvMI4ro&Q4~UwAEilE#AlUS(PTi2t>(J}v*s^EJNsED}GC zseTSy^2yn5{6QzH=Os7NhBVap+Sg?M74iS|!t)I#d;WiMtgNT|z`lHDYCT`$i|0N5 zzkn(0={_FdKT@4o&)4|kd5>?`)3v|Lww|x?_mteD9xFNL{G?-3%p2mzjT?Uc4eb)o zmwffS7ylUl-QnRie6(|Ee!$P3ToXU?vy`u%UlYH2eidK*=<)4(x^`U=>-n<&)$<vp^UhSxm%=h=@}{9kbF zFPU%MZue_^;XQAk^G}6PyGMlM4(FGA^?ZZh^n8`c_iakHiFr$_eA8>_LEe#l>leh% z_iLIgb8Moj)9cLRx3BrVjI`avS1{G%b!PH-EKYTIow;*BF=pzIt9*hro%t?1bY`3= z<>_(q07=)ZK)<*1iMDU#ubFKJYdTXrJ2OtSoZT8@s!!=SegO26^N2WkJ{x1IL+i{m zzGF-rlf7AE3QM;1+H@V`vgP*JG1#+jy$7y1RJOTh4c~ehKDEaiZ?=xdQP0O6ZVVoG z_%C?e;keLo$PXvNNJ zC{8oZgU20XIdmNI^0}*h7)111dQjzvm+)^spBY!o%Voi@qq&D3tNXQa+2q(5=wNaS zxybO(%;P=k(_D#5HpNyjvokN5$NSO%GrRqgnZ|mo?Qdv1?lWF6k?+*VVxHJ)dz&ea zm>DNJaeACo8OeFibL3lXpUy-dO=nU%XSW^Ml=q5(n$L6ii~2;IukkqZdyPwGa$u}J z^LwHTCV49w=i$01x5)F>QFt!<^O#@U^k;+f6c4$R9#;-QAAL=2k1)}%bg%XzpQxqZ z!dYoWphs=u;ZJ*9WA5CXc zI^*@(?sv32`!kZy{F&u-&A-Oud^}L{mo?8m_!FWH)%*hvd0aY#oEMFgj-kiZdqWJn z?S;Zbta#mz#6R9=$@%zcdYv8PcHeT)cD}aZ@eNW$Qx~Na&Z#q-`8EJbvPUK~JoM3Wo;{OL~sU4^Ka~>0YG(ArB=e#(P$L!At z^Bd|D-|f4oPsEx18DYM?;yqVmZX@&02s3|&@*+<4P(PE7p-0T0$pL!4G%Vu&Y;X#P z^!hWx?Dc1aiTdmEXNXBd`rTE1q93xCqRhu7Q~f!Qi8c(xi75!C-dAl0GkYl#XPc@1 zj4^qA7C=jPxOTvluJ3?|1rGfweml(jU|V=I_mA0>ar;_UNh zjJcD~F2|Adca#aAT{49wTdEVvZ&u(&o_)UNroU0FSDzaue@02+HFTIeRX3im|h2EN%fqv%@u9%eU5oW9H=%XQKtB=H=v3w$xjatIr zE}n+ zoWgbOwxgEBp8=-VM~6QHOt+R&vXHC(Ye&20(GLU6Zhr>iB+oTnHxy^5KSOc0n8u$W zW~=S!BW6*z_xF3dkEjjV^8seNmJprzGs5h8|4vO0wEY$B>-qdBz-&82ebyf*9Yc?Z zKc&9(d^>kz)Spexpg&{GK7YoTeg2Fw$w~hFGsfg%BoocMy1q-BWjlij2FDj=_RK${Oyumc-|;v0XOP+D&luAi zn`!7d$L@oYYA!gelIAgj8B-^qki+-oJH}72t zOSZR}rf;S(sf$M1?(`A+)5P1;_AYQE=$Md+RDCvKV zeCGG>ySTZB+2zkzoZi?>{){o(4zc;`ttC2!9?yA}=b;?#hs^tt`X|lt?fH)W3i-3a zDO~r{hi&`m!*#zO_dn(O+0pNBukG*Xia#T9enTxaze}7Q5@GIO?w8+BMn6nvsz2w& ziBg&#Czw3W@&5z;-p;4`a~>0YG(Apn$IP}1OSaW9UW`rT3Hfh~%~#hO1+&+mkv{76 zXFrqjLywq0(YExSsdQAxpAAlt&jQhDx@#$9 zheVifXnWWCA=mv<}jNuSA|^Ws#0&SR=S=P@arv)hhrW`9QFbl1$u z{){lawS5w6qjfQ^TvXINUfWnhgIpNR=ZHV$JhGKxLGvN_jsFj!Z}jgR5C7g>UN2k! zxZ^V+Zdd;?d$G5y*w%&1g-OzF3C^?U8z4IZfL+7LJu(j5EKJkgXUbbGG zc-_$Xh&vJ|T6cO6-y0{+$KzXGFI%sDG!{qV6#nz}bUqqD`F~gM4Qp$of%zlH#9JVK zhF&%vn?WYpC*$^-Ssm}kxD6h6jN9OGyNrj>amdxsac10x&WCOoIv#b{vqc*GmrNpCkNm_?aPAs?_mCWgL%9k2{7Nl zyngS1n&UAQYkT`W4)QUbiLp4HiN09D+-yzt)lxg3X!~>~;+oE+bk1%&S}yNL0yX~| zYW}yzI7;)CSk3m5a0n&+`h(t)1J@`RFn3&whTt zKO@XvUh&^2Xnbc|{25_x59H}_m0R^^gxS8wjy~8^zt3Z;Kj$%#m+5hWnH@4OPW9(J zCi-Z4oa)bcaUz>?Km04z6yoMN8$EwD_VM3xdeEa$^RMyx{2Q2mYcR#1k+y$?lRsWM znOx?^8S>}({Z%W6bZ&ZFxfD~s?FEk%Uz*qAU%&VF(R;MLXZ{&s_WCoz+?(H>P=7|4 z-2Xp?rJ9--r}}dq6MZy2PW9)!IFZfl&j@qFJY;LkLuCFL zVSWMgOM@x?j4<UsfAzUJ&)@A~iSYY?5A9x;FR^8@qG?wD!r z**X6VFnj$OX*+5fb=~MMj!)d&(_cJJ8cg-)yf|^r>2ZR&rJA1?r}}dq6MZs0PW9)! zIFU`6e{x^-)skEDGXD%Py|F3&jI_Ny2P1#EwG{9tc-`%#bJHW@&j`QQpE0J_N5{3T zI}fPouK8yy&OU$6WQsp$GBGwKkFw3z>Fet9_P#_aQF zlNs@1HGj>M&8R7T(Gsg7#DETwSbZd!o8e{hPb0$-2XeLuwvhArWytaAo0)J;O z;s1BnDqh=UqV3a};?J3Jia+NvksJD;D3s6Ld(XxGj4{2jDevDS{od!#W}Gp9avk;5 z`Jg|$`2l|hm|h9f(eeKMI-ftz--AU>d)MMU zzuycn`}`Sedz%T?^f=+T6->_Kd*Kfm9f5vJEi;?D?k_pZg+ArU5Ci@Nu}|2dDT{+!1|8>Y7%%|hf$nk2uWi(luw>ikPrMrcyQ)vbnf)1w^V93Led_uCe4y?B@L}8jq2u>Q zjW|R8OzrN;;g~=B`RH=A{pZWJqmRDkc^&svPt4o)e;@R??sxHLB+d=YuHSD4;{1+U z`hHnUXlwRTB+fQd{W*_`yiAW1%13u!4!W+ zm~UWqtsnBCcW%FJ?e*f2`|PDioNXo?GM$OBxq_L!G_~#1ndqbGOiE`Om-E`L{){kx zMa}=(7)QxRo33Bx`efVw70iEaFjIUnX0JaRZ4da9oOn6LdA4pod)|I*FGzmwPg%RA zeLNUHaEKmvtOXD}E_u$4w>;mT+ZQ^Y_$qonaZ>a+q-ZEk>W-22A+jgO|a9ep%CPUEp@aUz@IxB&Av)I8QhyQoj&zW_6@hjz()o^$j# zB(H~d!6a|FwFFn%cG`VlH0vpvPx+*WWvYjTCEK%?>1g_2;=Bh3 z>-aF!?$`KoPffV8edhlH<}aD44yCmvd40*t_>cF8`Fe82&+}vEs87kO;?{b8l3U9> zJ;!f3>Vj>v`(=L6PwcN%{CC-ptN191rSWso@n@ORudW9x+*{D-=%y?Klx=< z`~c^Bd6IY8KIi{8jHBdh8AsMRcAtizI1TZ?_Qn4N{4d!L>Tz1%lGnJr^h0vGpP#>c z#A`mLIMwOfX7^JYZT#d}H~yfL!OWh2cBjdClljlc$v=OvaccV;OwQq-aqOQfZhw#G z#rZY9aAkW{CzhW-d*<_6&)4|kd5`~3i1VLv{P}Yf=3774_~Lnw|5xz;n)!K6Oy*n9 zmwfg78veV(!)y2$vf1;?_}OD?_{h&vzIuL5{FMIWnN@u8yvI+qojjS>+~oRCZcNXY z^{<}y`2T|O^)GpR<@Gn2Z#`e*i|0N5|APO&ng0>{AM?KTe92eOH~2v(tLMdS6=yb? zX)QcTk6up?#_#9rlDT$pKJ$H8-nVYI`!&9_zY%l6zw&&IFI?Fk?K#~iqVF*9_ZawG zd-}c+?_1B;_~LnwZ}adC{BJ*}+P0oA`Re&K{C9_k*YHtF+4IZz*<)+?$j?%~dVWp( zl>RhsSMkO39zWG~s`>2|S$$3WzhT_TJin}e#GmK$9{(da;@&UdW1UbQzt;0LzIfi_ zTc6vul+V*?#h>c=20!Rz^}M*J;r#2xPRVYaz2qS`tOJF{(J1p9NzBN z_~Q8p|H|_C0{+ihX3yH@EShanLWRZ zpFOsQkNhmh4>l4|@_ieoRQ*Ec3x8v(Kj0^F6S^tPXd*0(ezw{J7^=@!w?+ui_*B?3aan_Sh;u^0SnWxR>(9^Q-cM z?6Bv3ei}QYp7;6pJn!@GdA`XHIvFg!KQCif98G;eAH}@jL7(X2br+w*);#tX_I#5$ z!SgYG-19Mh-19Mh-1DpW!j)~cW{Uppj~^w+o?pmkPp;yFyOfWyxRfuRUzHzZhduA} z?|I(m-}AiBzvuZTKj>ufyo{~tm<=)wgU74+w_ZC654`^nzi*R#(8rH^zL}FE{*1^ z@!#{j&%fvSCO_z8TfAuJijV_@Yye`_%c3M@r5hfYft{=1OAr3@6lgB z;`w!a#L`ut_dM^%f6wzi|DNZY{6Wu4-&SiT$W+GeT(4~%zDG@lzgHRH$35T7NpYQu zdp^eRAE&4f_V6mcczzWh7G4@ZX`Vc@Dt__&D!z{YJy8Gs^`mjG;wR7Rc`9>D9$)u7 z@AL0@-sj)*e3Kt^GHNFO9#(Q+$$68R{7l{Qf=3!Z%6R_w`F-n^+so(AeEI%-BWA7> z%enG=Eq?j_e1yMW+@G)U_w2CiIQ%^~);0aAm8$xb_408camn-#+N~=gay>{PH`g{5ilC|7UQpW-&8Az4Cg{yl=lh zU*ltb%JT#-{=B9qGwp9G?f2(PKKl2w%MUtPJukVb^9?4qJsq3! zY;&I4o}RDq#q$w%b%Kh~<|`u`2%OMWL+ z)<5FUo|kRKY0OE-CgvybvF<-VZ#`e*i|0N5e)(3*4bQ)Q zu=TH=kMQ&Q+RV3}ukjCVp4V5L$((d-iuua(C0{*%oQHppgmIyt;|HBAo;U0o6V%Z9 zzWIGez5R49deHB$=$^dXmzU=$MS9IhPH)C%V`HXzyv{s+?;40x`>f7P?vBN&zOFIx z9Q$r26Aqfr6fe(=6HIpTOeWesor(CSGsUwr+m4pYXP<$ZSD#WW`~b*|O`bQ$;#7y$ znaOQ2rrrmsF@+`D?O2z^c+)zhV;?U$@&N7+djBI^^xs#x?_%#m(fR3db-Ai%Q?=&s{y9o2dOg;uLhX9=3|YC=fr{2n8vHqm?*L7ae^tnnii+= z>NF<$XnLHK&d@mJns3(oC@thgSn}e*7Tof7O`uoEzts zW_fb_mE-XD9GA=)D-K0})HuYXwREr7(`_*M*gxagJL~C2_&PVmTI#R#xQ_q0-;n3z zm7H+=c0FC4ry?m2dR+69Tjlz4bq%2V^}3#}&RMrj$3`vx=qvWuD*n6d$5njfZfX4B zvyWEAkNhm2tlS@s-??#?fyW3vw@6JzlGS#Lpi0gHStsW7w12F-itrgcJh3C|Lh;}yvN@k zXltI2S-0E$a(uz>`F^s;{{p9d$$qnLxBDeuJ>TF5ovfaJcAIf#llcX%`|^6uv&^#_ zOgcdRo0zlb*YHso+4IZz*<)+?>iIQ%_52#XdVUpO=JOsu)pqjyhOsQ`rd#Ki z^^f@TeBR?*pWAbl&(m;!!6VOOv*$g&eUD(*O}Cye<5$l&_(3PD=fyo0r!|>x$p71g z=NnA+MEBFZt^E<2+weeYWE7=d0(}@X=1mi)^RHPs26OSC{bB^K0^>o?pYK^smeh zvM=*_C;zFoQ_b7)Wj$ZkKaKgm_#cmLdpt@%SkKq^$9&$2|3Bfk|E&1UdcNeV=NtVS zbh3EfxSyoxXL`GtJ;@G8EH&sBWk z%Cu zlOJ@ldOlra!7gj2$xPo-q_TR!Bi&CuekUd0lP#HChjuN3_aExNhpq87#`gVN`~AuG z{yBd6{(K`R9KU5=dA=I|p5l)1@!IP5=Sx2NbSYmwzb1aPb7}lkrYrNWo?nw6_52#X z`ehYgxU$vp{3mn`d8GVKJ9U~oZ@)iZ)<5EZ?dxB=#`dRI{Y|C){(Oxu-=Fv5w`;rF zbrwIubszKh>PtTQ_p=*+(8=m~$xS8aP3HDM`X6Ucisu_l_T(GdE9;B@jD1MIyTje?bDRo^n8sko{#YDxyt=>e)jCK2>(0k@O%D_sQsN(8NYgd4Ids`8b9i3 zH9vcPS$>xC)$?oOr}QV!tl}Sj%s!U!{QNsUJC6Q9{r{2c-+I2RfAxGM{!ie4%6#kj z8ecr`@vYykJYVwF^9_E`$?Ewd_HypsWTv&Y&K?ubH<)w)){fWpEyFP@L^f5rHcbiGsg=w$J{ zvMVufeQRHC`a9VCzN5l|-|1ZRNK~D>%k$@JMq)JME12r>I`jCwYamW_cb%Es9g9MS$7u)c|up)&-NCoZEhQHNgCKtOZtM;yLl^G^X+DG$!h3dYoX2ucpOm zygH4EKAIjUr86{6c^tKC3E32{2HL*8;yAu{P^(YG`5KS&3z%OT%)_gJICV{~TAcKp z8|T(HcLXcPCHDv_4sFhDQ>`U!1#&k9;hRpDHiS6TJSlHQAqk z@$#ztpnsRfFTP$CKeEs6_WA0;^M7kuJzlGS@wm_bh%qalpkoYQ2coYXzvV6x}!y`1;Rd2QYF8eh1wt;EdyPp|r!fOWgw zuknQ!;p_bf)Y&nIra3^l-mrMylb*YMTztN7x1kDqEg-IvvSAE*zEsWe}|7+*YJM?1cz>$!~Q^ZWnve+NVFg9tO7 zw;W&a@6)>JSA2Wzu-6pp`I4`mZ^R#TvU>iAwVYcvnJMR_)fYT2=1C=!4#4LD`kBC$ z=WG0;{TKW{P!ICi@-Nu0t*2Y#7rD6LQyb(vO4jXmzs48O7w36em)&x{8MoX0lCPd$ z!&lF*;UlHl^UL_TPS^0&^K1C(`89m?{3`zT^OJwC#uvt{_&n8la&Ng$I#K`Z+4Elf z_S#{uDR#dcU+Q^}{~P@FTmIgkb-Ud!`Re%wKj>ujeBmB-PLr9ObI!B8pJ_1ZfX#mQ z;mY$hzIfi_e@C6jcj&G>U*k)DJwECc??F@T?Pd;d_iKFN%2v+zJm0WiIQ%_53P6Y8ju4<2=vTb9D~;!Pfb1#+UVcS^wb5 zeBR;P_sG@{*7G&~F`sw%_FkX$oArFjSI;-{6Lhk8Ufob}PLPS~9sl=0o6HHG_xblc z@AJ1?o{#bExl(O-o?pcm&#&T(=NIzX^Q-vc`Bi*ym&PxiUll+4mp$+EZJqC7&-?s) zp7;6pJm2I8oeb6wy0*&LMIV&!p@K~De3LoB^FIHc=Y2lv^~QWY#<%CP^`G`BoiBJ$ zUrK$f;tN-{IBQum+`l$vyWfrS;`mBuZmwhzmAVu=KD73dXDp4)Q_$6J?wcu{(GMH`S(2E zJTJ9b<~+zWp1)?!@w~&o?RkffdcEiQ0NZ+@ca_K@%$3Lsqa;M;mWqG z`5V_MkZGx`1V}3{?mTV^Q-va?)hHdbsgUDqulOJ@lcwTC!T9ZMhc)rP;;CY{a&+|SX z^?JkeF}^*Qt^c%N^ZY74>W@9YijSPG=CfZ`#V_M?6<@frt&Z6n*AemjIzDPSeU7x$ z^M3sIJn!@GdA`XHIvFhf99H_aS~EeWc)rP;;CY{a&+|Utx_3A84ZHsh&wu;bdKg^x zSd4Gam6+c5ZC3Hc^Q-vc`Gx%Km)-G<&AHug=U+U(Dt;aRYvR|qSMiZczHj64ZJu{C zzPi6x>GbbC&ugBp-ml&Be3Kt^vU*-}Ux~TNO!+^1Ouj$gV6x}!S^@7r)PE0K^CO=3;o?pW^ep!+qWM8eKdb zfBx0;Yx1L>U&E*LC%>%XiytHWKT!Yj+x89n@;lkG{2|-I+n@R3d5>?e9rl`% za+^F{i(hi!@ok)MxK7p9F{|iISKQO~d8tLIno#q$yVuNYslZu<6$9?Wy^vi{Zc5x!k(>kIfYpRe(S zE8Cv>x$=C;SI;;2K_`pnm0gK>>s$MB)8E0$`;O{7iOxljv31ic@nKA!nd)(Qo`$Vn zhZ2MScKN=jVD86z$T~B*JH}LB*O+*YeK(USj-JUxYNy8uCcAiMoZ{b^Ot7ZMDW07f zC$jl7)q0GnKBeRM0g#TPG~bLd)uDA}a$Ah4_d#k*VaXOvXnVk>DJ8a^eakmq?c?*=()Gih>ZWr^L5nVH>Q4aC{))c_Nn0O=B9bPGh1C)8hnFd^Igj=bR&aH3ms2-Ag1Qmy(Kj@tFuw$F{x9z77^f)_CShB4!`B>xzYf~nUw)wnX zc#VJDZ;<=fJYK0LtoMnne0z^a`>Y__A_kpKSp(T_{xr>dp#vnqb%XDJ{3yOb}!UX>qYhu!V-)7VLV_zmMr)+|(y*Xkef zv&Vh@1I$PEk6ruL^8>unRX^Xs|DO4F-Sqc(Ue*pT{Xm{|`9UXxDc7H`iCuAWllk@v zzrEHyFFvj?+4KK~_WqmW`5OP=UdPOQ^f&rE)rsvpyIt{eEPs2Tejn*v zwhn82$w!25zq@2TU-H%SYxwUD53k`Pk2&AV_}P?EfwAdwvkld-4A#{Pv&OZy&M$vEsVw`2Fn0 zA9S*M{%~6!W5#Js<~RP%Lf!KXCVSX^CS$L0cE84#{CfQF@cf ze#vpZza`!`Ip_RXe&VEamCxJ!tLG!}_w&{BYxv0N()@s*J+>x(_52#XdVURGJ->>N z`sMks$3N91#By)))U6Up(*UAANhn^F4gLX28RHXMP^HJl_$& znYXvc8kNHf9@MWWPxideAN50;&-?s)o^SF8JuhPyIpQ&lWa(#`L8f@V$(-PMpFi4< zX+H1s+qGxsAy0M4IrjNnvtbWQef020JS<$6$K4Kl^^O(u`cu{%xUaD5W^$>zD(}hc>H^w_w%#!OQPdc zJn!@AeO!FLt@Y>S=bq>N_{Z`CE_)3B|GMV6es+FIH2=s?H~&uvA<7reb8uHb&%6Aao_F}S zJ@4>`$Cr5C;g9+u&F8g_uIlHu=da@*^t{eNDlrF{GM{fUCwSiHkM`qn-{v~c$pfSB zD|fnH`|)G0w++qrI{93w;rSlo?&gnp3{iFR$MPfNb5;I@D_b;&+k^A!z0iCe8Oe{# z=X>~fJn!?VgvaOeKL4KQeg3E)lIMN?J6?$*1{z{Cz#@ubU6Ig|8#x`BnK5&#&Uk`0U}2Ry_M`22gG_xZ!)i|6w`f7B1j^FIHc=bQYXlfn9t?ggd3t=3GCDV~>lsWK;c-sg|@ zqujS?UIPohuR!#*GF8<>xY=X>~gZ8&}e)fqo|W{A%o^Wz`mQ&8@h z${rrcj~V}Ro}91p{lZB9n!GstvHT!A^1Vujf6w!#9T)i-^+WQ!&%fvSCO_z8_56|h zGAB(Yjzhmu*}mYB>RWyf-(Yf`+usqq|DeAGw)-{y@j0y2OBpls?e8G$cVg{+jW3?} z;{S%We{+5(RpakRyx9lGzcG#CJht!2C#HRk&A)oyi@)Sprro!Exao*@Mf^y?YW|ku zUY4JweD(aA_$mD>^Mn4)<5sph9vbzJ!*EgOalM=Q6&Qtoj^9Z+e)#^XzoYzweOXV} z^MiQai{JhZ)ULDG_8aujyyT{m^ClC=;rptT{uk;9>L^|JB!3=KVbTHk zO|bqh*sgtR^HAf9=NmCI|MA$4-!)&Yn_lCK=RN)#+WwZ;RoHMY`EHM`!x~@m;qlY4 zskUuRrrORmj~LGRSI@8EtLNA7k;gsN(K3Fn(=~kLXDMGjzb1Z4|Kj|MzZ^fHeW>kJ z=YL@TkG$`WFX75I*HiI+$M8R4zvlTA!w+=n%h9jmdHjuiC*%2zLK}QWqXS9h>Uh&JC>ROTK!34gcNY;Wc~|My|nS{OqwceB@^-Up>DjeoBAx z*D5~hH_Zq0dSEgho;`{4AL|_cihWr(-FiN~=IkHwVX!+Nv{C zTrsBly2iwF?7Nvvar8{4czH6DT{Dv@{+-DLYkHjG*_m;okJzm-rd#topN%oSv6 z#&9%+vb;#0tdh31k)7KPZgg?G+I@;b5{~NA_wfha# z_%kmOzx}LLy->@)#=C|u&TZCA(ZBui(?E>(Z-~FGz`RL!Jd`kby{2)7Wzd_!& z?&*BSIb1(!?2vP4&GgZA({(&N^B-W!{mAik)35pVe(LzT=~aHv$zWv9AM?*L=S}9@ zD}9DWU7^>@1P^EJMBz7aF?aos*Xf6(jkw%Pp}U+ybM_}c?1c%+)t z`2^*r%+H>49O2vVyjahde9iY7zIuKQA9-AwAMm&2l{N9J=hyJjzf0q%^smehvY$Qg zyw3A?IQIU!>DPSg+x>X2i2gDA z)%YdHPW+aiIH~5#=WYH?yi54%c`yHEoIUZQUzg^GDld6#P5kQlHGK5%()cO;EAxZw zXU}{2In_MI@>cntNP3N}f5iXV7r&i5eF1-L-E=eFPWP#|&A!JRUpKwV4>}nPna}gs ziZge1+Bwh1eEynA2TWQwy&5y~?Ht?A;q87c{#1Xc7bpI7Y&nN7pFig(aeY4JXh)CI zc0-=!zr|tq)442P^Wnu$*T_5TZ>`~@ot$?+Kl@Ppl+5G-Fa9yUdfw;bwc+1Cp??GM zkFTfe=l?;M{BZope)hbZA2VM{b$&J0Z2cpq?0Jtr>W6eM-p`M{mwPpjt&ZQ%ZhbaA zUuClA#SOBhzQ9y@d%=V5^y7K{JcIIV_tDl%&kIYoCnj~wP0tHgwk3bGAJ6lQYks@- zY)wAZ;pzHu&8Hj&kj@q^pVzq$Sv=c$$dJL|G^7$e$do$&-?u0@x`9^`J;YFp7;6p zJm2I8os2r>`8=3hJJp&GGL7f2nR7hv@JIXc@VvtxuERZh#^Y13gy&194;}t(&%6Aa zo_F~p9;T%B<)82Egs&sU^KSe%J@4{wdfwyT^}NF$9$(^lhd=6v!}AXRw&$<;K_`pn zr8bQt^j>9+?tbkUa16?|Ht-4?0;q zFSS#x$skia-(*hkyw4x)$K-jRKRn-Hk9F{e#u2!keDeJLb<^d12v+9?*<&Nu5pcTW zANhO%eDI`%&)OG;+f6-}8J&{J5mY=S%3*oNqV& zTb}ph$N2}|kKmX<{PFiA6cl-^C;kx+%RJ2IQw&4*HAp}2Mu3}BYnri{tm)^XWs7D_~Lml{%>ge{dLo;Ip_SO*xKJ$ zDdV?1>JR(xbAHD7@YtUE8OJZ+qx)9#bDgeEukN#X5Kc#nxUh^zUak|3N2%Df4;$?4s&~CKEZu z?-G6>+2q$0pLjmyyUL^kCas%(&3`<$<9E&D>!x4x-_Z8A+v}!Z^HXk<=WR`<+DOlr z`B$Eo|1rLLehnXmv8Os(#?N)ShOeGq!$PW}K^E@yeo5s;6@N1q=uQ~I@^B&)>>vHA!l8<;lyY(M*GMGOS zGsRxbNt21=oORQyOiJ9ObZ5^{(e)jA!{HDa`#a|7%7lCSZu;lCphAa3gS74ZYSnx8$nCVu2+DIfj2luzkj+`rlLk^GOZo37*G z+4DI6u`c`gy6JuVE6=AG>~#dZ?D5a|9ZGkx34l#M`V_HXD z>_3guA2|=al`%#+r|HlO9yC{@IOx%{Z~4ZneSAJ!J154g0jAe?hgSnkx5mVQ0cP8Q z=!5A@>2t8B#fh?+9w(UMt7&l>uTEnkkJIBcUY!;vvMF8-Fx{Ge4f%w}yEiruuLk05 zJA_>3#<}&)9cA2z>tsApeh-H>=eFrRcg>qkCLJ(o-SleA1%G_q^gjOEhx+}7T7J@; zHI^UyS*v=sXWjI^`1|?FOYb}M-==1Y{P*)w80_Cw`Ju|A@w1ALd@SXQqgTZ*zFx;q z?)Ldwm+y&q{B&X+;_$}G5gi{v&X#rSbpN9nlGQHaO66xo?pW^`M9o` zB0v4{qbW=C1Ag}KvivONtLN9mubyAUNB#2qDUW}u8I0wv@;#CC8e9K}|Fw^A=T2Y1 zA6qxwj0e33!u4<8!;Y_;UgZa!jGD=wPjk#Tb7!ZW^PJw#Bi}q;t4z*=z1MN&`5Iq5 z@A2&%`)WR4Zui+y<-TePE5Wjlfk00~Z@VY*f{^UuI5B3lrwalLP_~kgd8f#DE zD|_DKkNP3qi}%OxnBUO9pWXa4J)iPsb0VI{mdBQkVe=j*$lUb%BG*iI*H|8q->;O1 zX3WWr4~)1+s*Skkeg1GAa$bBsqQ`BoQP21AM}F@vHPXW;XGG&in*;e7;%}Yx!=Xgu z7ti&nNGCehJ@r-sRu) zyvx7od5?eB^A3M_e2M2B{-_@g&pZ6vp1NlT{E_?!SGLk0D3;>=&K=MD{Cl47;NSAR&mZ+e^1RQ#=lLc-=wz_? zb66TL`5Mb(_*64Nrg*-|oZxw%KiZFS-=>ihj{lzLJL1O>9{0S@-*0)ohd=Ut64YL< zK{x-S*AcGup7=*RES~rI6h{0yCF8$`k6ec53Br}_^>u_iACDg~$@eO`9~%5yp7-M) z^+WQ!&%fvSCO_z8^?b^GHRnwxjzhnl=d1Gl`393cX@5uX{zLuuurD$&wKoDX#4$j)2lh>{G{00^VKqb^lA2_7ylUF#(Oz8xDh|WozrHk$=2g`eir%M~sDkj^9Z+@qd5S z-%)~`s*Ut~nIHAM zm!C1d#=C}(j>|Q;jGsNchL8L#<*Vn{#IK%T#ZUesZ(Mqe$1nbl*Q7fC1N(neeh-^o zLocW6Gx3BgTdmjU`&yR&3H+MpYkcuM{)Y2i^XiGsg=w$VLioF_hlZoS; zbX=FEreE_Ph)vch8ecd4ns3)xdc(QK)=j_Wr`)DGw{rvQ`7;0NdHk(ehhuz= zcMYEgY8tQ0_}K?*_{h&vzIuL5{FMI1`R92md85BRf5rIvHO~WgGoJ^e@K5q%j6c3^ zx{inE>qv?%jo&NJm+`CT8~F)3Sv)W7YRp^T+Ly@dY2EZH3x20_(IZjcqo3Y$|H<=D z*XFNO3(fcnrrx8eGmp<%`TbE}oLXCT=FV=4#i_ooG4b4VrnGftoZ{ulOm@voCfYuo ziTI{7#j`Wpj+V1qV@$W^c|IFsdSf%WEyip+L|C$wF+e$?=|8;>AQ#i$>Cv-q9ff0l zWJmE9I3BmN_{OV!d~QuUCkXLtC}w7QeRp^@5T{#XoJ+~En_G^v+pB>%+f1pcnQ=;6 zCo{!YGuu9$i8fDX8m~@kJB{)9IC5+LHO}oa08$3%>oVRh?MNKl*7YUz{7ue}DX%?=|_Mo}=-zDt_c=DIfj2lrO$s zl^v>)%wVnL%8^+gfmHQ3V@x>nZ<9~oD_an#GO}~zR&bsMUe$dIN znSA|`&*UmOZ!+Ir%XPtJd^VWuF?)agJ#t?2e2p($*;Zm^KJG6apFimJIJ$0nHO~cq zd*F4CRFgWNpxl)C*>hb-;iIQ%cx-9>n(sC7gP%RQhL8L#<*Vn{#IK%T z#TUpj?{hDvTAMp`>`&gONR>v>T;}Q1PG#{zN zA9S*M{`d}DnUf~-8-FK`wD*EXic37-V6rFeXJS{Luknxe|9+VV=6{D{@2{JF-H+C{ zyZKDR?pNcN96Rw_e&VE>FQ2#hSI>L-FF8GY_52#X$@h}{P?_esS;AM(ugQ;kehpte zzlx8#G;XzKIDY!B)Q;-GE9kxY5wqPd zWu{&)0m{CB$Qc`yD4n)-M*kpJv?kDqEI z@!R`P<12gKL=kEzkS>;qk?u_xblc@AJp}1}=NP$wyVv z>*zt_%kE>$6?1R={Rh|82Xu{+5hY+3J|h{E_!-q=L@)Z>_WF z=YM#7vFCmMs2~3F{C)L{{EzvKobBd6=w$IcDpO*Wt=3GCDV}dKCwSiHkM^V7w`t^r z;~%a=$?@}6bDqX2DPwp(-;tl~&VL`HhkwWOJ$$@o*z>FS;`tu_NPaM8H}XIaf24oK z^Bw%5`UF?*&pY)$JigfT9q~W#nn(Qoe)7D}zvuZTKj>uR`RCeE=LDI?^ViHdo_F}S zJ@4>`>u}HG)Zx?HtXrP<_;)?;@<%*o>f7bxwRb$fgl|0W@<;MxJn!;vdfwv?)hD`4 zJn!&_$Cr5C;g9;^@Vvvn?fGkd(8=O?Q=5Bs&~48*nG-zk^GEyfxNmcvXO4fk4mrmi z@ejQ(MxXZbZ+#Bi5&zJA3GsXnpI$R?|DXGH6<@frmG+R|$m=f}GY_?B{Nni@{vFTz z{2eWc&qHtwd%lCu_nA|E+GCA|Bjq)@D}CR_=a2d!dEV#W^L&#(=y|CfWQrYut=43a zDf9UzbAso6{%AiY&-?s#?b-T#szc7P&!_qPWB9&J2Y=}M7znC2el%bo@o+bv+8FgD z>41FDm!CLa#%B+oQW=e3xUxlSIA7T6nC0;`_W29p`tpO<-SE60|M2+Y`Ml2`^+WQ! z&%fvSCO_z8uzuugAonf$t*n_KQ#>#AQe{r?yw4x)N4Y=0U+0A5AFjikV~_v1<#|6p z`z_D+@JGHksP*FI2Y(;%Bo4~`x_kYL7sfp-p7-+uNe=LJ{Cn}!wJiR-mzCYh!vM25D2;P6F{~or+m+#MeeEU0ytA4EU#q%Ej8`^$<-E`#dst!4~?fG6A zKl=3G<@!GU{Z!{ee0c2Ot>D{yEaGpOEBA?y_DsspQoefLtIt#$(fTodS&|>}#X$aX znD}`|-R?izcAfom{7y>FbJ4%wU-fsCpRiwBPdDZ8%oooe?YQ9E-+^AOvsm)czn|Uw z1f8s&KXOyX++^Z7{Qm4I4|&~+29plh?C*kqhUdrDO$VrqnfZ^$cKoh+eBJbG{u|o< zmVcwS;aoB|uyt6=&z|G;@{^8D^=xZ0)kb>0#R@A2)rE?1r} z`Re%wKj>ujyu@C~Nt21=igk-+KHp$c;wG(|4$zh75u2=2G`?>7HUB5@fBKN>6Y~tIwf%SaJSI@8EzdQ21hOhZv#?KyJ!$*FW^40Te;-~IS*TGeM z@qC2;E5_H@y6IX^&-ZO`{$m}*@paSt_*b4!G1%*fdcKjLpp(V(%C0yQcM-`o^cs5D zeH$Ng#`E|l%W|0d9=U$ct`z>6dHnWO-pgc1p8HIWO_Az78hQTAJU(X)FxB04W^y%9*efCuWL*^$8DX-goCCtrOs!@2`0N{CKGL+&P06Enc~@*ZAZ)b9!8Am*8D5g zdW`9f&E&Qiv+WRJ$ricbF+e%7_vz^G^ss)r+P6NzF+Xx1cndDq#4Nt?Y9Bx5)d17$ zyThvirdwm&SCV5lx7_w_uLk05GmTfLG11oPZI}Gb%%}0{w6-HY9z!$ZG+vz+CynvY z*ys9mYyLIP^v34l)j-?3y?V{u`sR+>&vK6dnI$<}M^hN=A_`iA?DishHCummso!6XRYeQTK>^jOZo85 zQa%b}HGfMr9;u)H{3Ab0`RL!JeDU?F`b2i}=XzfL)7YW8Ag!5xW8L(euk*Zf!@Wp) zB>t^+(=Yhb)=e+@K_{!{#hp^4CMQki+beyBMqTkj-NDxg>Awb(`_A59w{ExlHNJ3V zE9W&aGe6y%PyMLZ0COWpxl)C+4q#ENc{FYFV^!VUp>EuubyAS zM;@2v2mIWhYvNbWui>lb*YMTztN7x1kDqEgjj3DfreBQT#{)w)kJ(%6reE;w_ai>y zn({GUQ`&w*|9*D;5OlJ7{`d}D8FQ2QjlUB|+ABTZV6rFeXJWSPcE83y>f`s64;i=5 zp8pQVPFXj-%n8SDeY>0QDB1mL{CkeuiQn=QC)IrUyv@IQ-phZ<>EWyA*YMGsOY;N1 z^yiZNtLN9`M?JrWubyAUN8P1+22TD@HIK2pRlX;ZUSsPY@$-Edyx!s4xziW$hu2M) zdOF>wp15v$$qzbNJuh?2V+?4_P3F#iJLmbB&&zl%)Tt($(qw{z^P`Ft&YsgFiZ zIR12OIfpNwKj%ldvaRGi@$rZF?@QG49)IljAL@CZKl1w(ZZvzq!yc~*PuGNg(fHM z{P3&$>W6A9%oor1#6NN!q?kJEAMsCFH~p%9Zh79%&+zzS&-?sQKP1ol{4u|Q%bsuY zgH8tP2h|KZjK`LY0c_O?L8f@V$>gy)mIs8&p7;5q{g^!O^M~t@bKSwG?ilvG&mUX2 zL%6c7)=a*RptQoC#37ye;kq5+v$uNU$7{lTI>sGSIX{!uP3QCBtU6{hA77vd$4}|+ zjDKi-IEu56KRmwJ^Bw*BKrD|mPl&wVPoDSrV}29QH~HvQdL2C|e!GwUEAFx2@9cTB zccWhJ#X#d-*4Pm`|P7%OA-P#%wqL&N_=|g_ob9`UE%MxAFMH&Rg**^1c-M2w(!j)~oAMqHdduM()gwgvpd~ovpW&HG-DBpNqxU!v+ALDu9 z%C_L&^t^Co`^+DzPoz{lFI?F^@rTEkcwV@&ed3S$A%`@Q)4dc@t$AGt4q@zc$x z97a7X| z1j*O+S>ua6@5evthva#mf6wzx{-EcjcB(lKGR5;v<^<3C{Ly|qK8Kb1lkKcJ+^McR z;zw6M!s7_sUjESMbO@@OKk_*vYOtG6IV|04om_fYYP=)=+(%KqjL#lEH8si?u56_} z*gn+%h9)B!9NNT=s?oxM- z2QKbKl;^em3y&@3qn=jtk9;r6&r-g69{tqz{80ZIzbxV(aYy(l3tSi38#~$+S~vaZ z4@%d|!TJ8GzoYzw{n~oEX)M_K-)Oy-?Dcm3?e9RZ)>$n1=-uj{P7#IGAB(Y zjw{wJ7SA`Bl(>28rk61@|MA$4-!#&xeeNX-9eh&*q;UD43wkQ9ez^Qq@#uv|fe7mm8mFG*odcMIAI$1q0u~%}^Wa2n~ z-Sk{H&vkCs`T09IfB%qb-p=Q1e3{QTV*Y`4oYpD2wQl-F{68V)DeIiISKL3Xm|Bm7(IrssS;`v>Qr zvu=6^|H|_z2GZ3_t{e4yBR@eWi|3UsHEMFQ^{su0oIS6bUTr^}iyn!pPM7Cxn^ALL z$tlhFaDW_}n0k*!o&spXDQAeEn@m{gc-1m5#>gyU4&rN5Fqv?Ff)s_A(^4X3P zgz0fo$<}&-q=iTi!s{{5teMFwkRib`-S{U zb1C{eJ^p{%-WXeM9NE*S>Rn^ZTERPgbn3MAj5fxuo42eoYYEzkxCD9g#;Lhe)_a~- zP}1x~W_zvn+WO!B4*>)tG65nGAfozYlS(B&1_ObQAd?A=tZScOo3~P{wB$Nl#aCV( zSuYJV6v~4#mV)~{eb_BJ+=E6 z)u-7;%i~mDU3Tp07+rmzj@_*JXFt>Gn}=5&$KH2Ha-|vPHa2$T+F{ormmmFItMuU(AMHf`isB<5 zp?nlZG@l$7n4eHS+BcNXzK+TdyW8gL`+0w$fBiAqzsTb@{|4sudDGD!N_*U&cklll z%70>C|7_e(&BypKt|h;B<99k4HACkgwC$I4?r6r`WxhVw^MdF54qYaBUf*ATk376@ z)e&$7czUGVPJ^2~uBOjsh zr^H0&CuKg8FZB|WfAM?_Kczo1Kgd3Re|YX3>R-9GbN`*6H(lD}(Zjdfc06D3E7pI# z)vl=f7yMhE6S4BYX5RE>{7xr}=kq-QKl3Z@w|+f)9`MgpFHI)3qyA3p%=0aN&M)f4 z;D3LX=Y7sR-{NPk%}2eWX6rHhe%ymjxvBHB7mr!-YkubBebw)$bUxvg@-3c^;iEl6 zOF)no{x!NJRikJUTK_T@$YILeR*pmTtykMZ@` z<}>(n^QNozzPpdMYTooFzw7xrC*t|+9zSy@r`_lI7|&CGZ8Fmai{?!~=WjRcq;Zbc z&Tqw^>ksu}#GkkAd%nfb+yOq$kvm#6W{AXx-n-r-cVDw zTpQZ$dcDpGwxMyD&F|NquE~cwq`VC9Q%7=pn7O=cwrS1}+TH&f64PU|C;A*{x#2c`A#Q; zMV{xr%QcDylxq+tlRe*MQa_r@1Nt6$-saD?<8eJnzG>!!;=ks3JAOC}s`U0FRUbzD z>HI$Lc{~1XyEy-r89#<7)1DuRe})e(d3c0BlOMG2Fn^|f)44632krRh>J!-^&kyh~ zdEVyF`XP_!ZT_6!(7qqd{5ze@o=5J_`;?Q(p6@ajc;4pEwjEvXA=Lh1yG|%Dy z|B~lN_%j}3E-%ra$UFFd8GBIv$wkwikK(I%&-+w~f95>Go*#+-$~=oUf5%7s;}C4a z_velLOpl|UlPB??!JqX*_Pou%=J_t)>15@3>PxCdrB6AT%Jb*UHJ&&4v+a0z-r!Hy z;a=*{;G+*s^dq$CDF3SGt@tmE=Tk>5;~HAxPg0X>JRibWeaPfr^t{Qx=y`*`rxtQw zZ>Dw}tN-c##hy3fpY_Axd4qr1^XGi0liBlJo4ibIk!tWMHKdcto@W*>@0bfb&s<*C z{MmLq?%SN_nc|ntuhOT=d1@wp9?y^PuXuihk7Jtlyv?8PU*vh4KkJ9=d7FRD^Ig8v$?W;Z z+PSMqCzCzjWiIf%&7W<@?0K6%U5Df`n~ziM#PbZ`j`A^{_y7CG2x^!=^E?S^Zh&=ATN3y{{wWkMpZjMNpSir`{UO-uJaWbJBYf<0+VeJlx_^=9ZT_quvgd97HP3hX zPA7x)MuQggm$YowjFZWpPkr!|xxn)_f3_X@zKs?CbRCk%?D%gO&*SAB52H;7`8d7_ zK6~Ddf5&~BDGv|FKl8i_4w~w6B>ow`^r4;hBY&MW^QJd*-gSG9S@$oUfAPE( zf6dWMy{`F)chBt{!$%cG^N)Jzk3**O6UrCQN9BJHjUVmH_velNdzXJ~hH)tMi(Ng3 zlRu;D6XjDppZ9a#zrH`q?u%Z~8g^C-AS&n|{vExy^O1#|GN-b^gWk_`7Z$&hZiN zp8Hb_9~~r`UwjY~zqDrzUpybfPw5YC-!h)}#6Lf8y0pjR^*;8$VBYjG{+Z`<4Ej7J zp6}$x>16givzsw*V{>03XLs|aH(5BKw6FBa)c45s`ZeZ#fgkx}3>gUU}?bl518nxt&)s!CD?Cdv;}< z$R@ef$24o6#n8i!3gOn4fWqZO)`)6cbI||&l;wWBHO|0T8ua5EQ zX!Q+=9kv^-Ab z)n&(yY_eA!Ota>nT|S|FT7C2Isw2+6L)fR?cHhRvj?7T5t7{0ynf94pkB)B5+s!Oq zV!N7|M80U=^fCVYyy;{7*O%FO)5rMwyH@GLt^9+xm+M8oE*QxFIG>&CYu|A`3L`ZB zRC&Sq3FS+@9M^qI+n0SE*uH$f!KhDtKkpCpuRrK|74fO>ZSrUIxDbC&9=GGafywtH z{~PQ7UHIbkR{sK*?&H~feLr=6-gIeiHEwn~84NoAAU9viIj*jmF7x%-nm4@}CwX4q zUw@B0=lc$6DeEmhKPS?OnfPe$5?zyN$RJ! z+jcx(Fh6hlIe*Q(=}o@V$zT-EANK@G8>^gjnP2IdxRkahymEcyaR&bMXZmw9PRg_X zPE5O9uebQQK5YK?XL;U7yIrrh`0RNre$*>!ws!lj#v3jEzUMr7_?eUUrT1I&k?&Bx zcs?e6#4nzY;j8{+^sl;3M(RgA9}_>aUp#N|b8VNH(U-Tzb0T&9BmOd; zxA=PO^cnoQdDB&U+})>MHE(*8?{qR4Jf5e%oM3?T}SBitl}E^zvg+hpW+2oGdcgW9_F}tdCH&rJv!1l zRzKSepFJOyA8?1`zv6j2{(Y)Gu@QNGfUmBL`+ZHQ_I#H~9+=Amd*0^HwqqX8+x&j*Y5zaeA?132Kh=-8K5YIq&yVnDevgiW z9?TCuiH~~EgK4Ye`H}c%_}~unXYzyg9p=wm52j-t%MWrtaXo_Ukmv3EPxmkKyv?8W zL-xGQpYt1gzRPzy8O*oTruc6!V;pMZ)E4ROC%n>=J89qPmHL!k$7Y@THXY^y&v#=c z{%kw)eH$zO={lrb55$kA_FosHeMb3c%PaS7to)?ffeUh5sA~}PbJW-Qc`$Pa@{?+D zhR-!lc}k4Z2c+h6%u{?c8uLtk>UQ4zsCZ5O%=Ji$$#eqc2cJU|d*jD8e1G1Ef4YB> z=dmAyKkJ9=d7FRD^Ig8v$*39jJhiQ=A*p#Mb1V045a&6Q>SQhtXudC{4h{ZnJ06}l z_|tW`55|Ah^G5vF#`AXjUiSPz{Fgi*!dIR*`4>HJ@-KSc;P0sfu6W+!U%GEIP@gw^ z=9bS>`kuUA&wV`U>L~%!;P-g0GXJ^h%nN=4@1yAlr<2+9T$|09olN$8mw6!%?0K7i z&GR<@n&)jkhQk-e^8@@#_%ohNJvH^CC_Zy}+3ZtP|0$3iy(=v@b&aFf zYtJxmgnz~JBYea??RlF&-M?r&Z}VsUkjL{je{LL$_9f4E`A#Q;`Ic&)YloMq?(jC9 z!)EW>FpHOW%mtojE-!2TY&+)hJac(j^QY@@H*=o*K5m$OboV1{Gs?&JjD9}qZ->G{XDz00|i$>aGhbAjh={x#3r{OLL*kJ^I-an z_j)9`C7nlX{&fE$&)fW2KjiVe&A;aPF5l^7v>}b>Irq&r?K073Xt&htPk80_JANm1 zciv8)OU;`;muo}+7XJN<{03I9xA@2Xd4sQi2chq|>Gc->xIb_3zv9@h&zs)NdG1Fi z*YY`L-M@7H!7HA`=aBH#eDQn?ALS7mKlr6iW8xRj$MAJ~Mzk;c1z8HIALjB>AJ4rX zuz$o*>Kv==jUDgr{62j~*FXNQc;1Tt`?LIx@&nde^XcXo?)mI_i?4qNdN$8u%||{y zW{-CGPA7v|JbyfMdh~%K=UpbYLtY>9K=W2`zR%lH|1S7vc>d>?+@{*|Ek1j`6LSg( zziCdd%$%P${XG6x9Q$kejoyZR@ipMC>aZDq@t75V-ZsatYckhHe!u1;-cY`HJ|=$T zF*JVgOO40GFP@L#OFhQ$Q~I-KqWIZgwjZ#6xFy&5H>`ha{2n%cCUy5Te$;XM_#eP; zdA`MG&*SePNokMAajc%#<;?RnAH3rE4&UiyFpKAN?9G_FOl*hmpYQX`AY1vL;rC6 zG>-4GG>53~k>B@}-?SaQPzdVW{H4?a9eXpriYe{XW**s`E%|H8@R^L3l>WFjL ztLMzYv7@vJ-y_(mPEoDmQ1oqlt{Q{p>wtXCt-ZV*zwhZV(+25!1Fy_^kM%qrO-osC z@sIlrH16g4x{JBu&(E7a#(zc3t@{nl_{lFgc1QgByH;^xYhGuxRVe>m@ncl{Xvfg_ zQ{|<89u+_G6Us;XhVrG}W9k#x;rk6n{pY@u{qP6+*B_1h4bA>V9=F@~1}5K+oS!#c z@}-j|%i{_`dOxxu77==Zu(sZo`aF7qp%iTHZvyYJ4RA89sa7=2Il@{D3xVp^xB1sR-{ntw9`&%N+UGXL%4N@Y znbeQw@_-m=Ja6-7+mY|vbaIkCFk6Qu*B1YVrk)?q+xfZX`4Rq%$AoL;XQz+OdS3Pe z4%NP@`QrK1AG~}t8uQNk6!9V92|jz?jz5j(XRddSd>HZLa})7nBfdXx@n`!Njpr%2 zGpFVJ-|(4RZeM*bSFg9m3EA^Df6i}cUmDMM`SYGHwYit2s(B}KJDwLrq}@Ev!iP)%IXQPl8?Q3h5uZZD(6&(mpyOrFMHnPU-Z1mpY#mpJA|)1Z}2aB z-sE5Oyusg5(EjrvHe%0P{HvZf__KaEJa6#l{H8pA&UZQ)OulckjLDvtdPhBw?;kxj zmk0K|&7W<@2mJa5O3vHXScyv*)bNBCDfZ}X@77mep_{;VIe=WYI+-`MkA{-o!@F16UG zNhgy%-(`{~=kmawxB0W}m_2Xvr|XbBX7kf{es|wr1$U62#`E*@>DuvQtOu2O?|Z<) zj`(NpOJvWF#6ROn?w>Y)?!F3hd7096b{?6DpLrwv^x28_ANK>RmU z!Y#+I@73t_9K-!MEqmVP&-o2px^L6vJDm&`jpw;-WvRyAP9}R^SZD1xmj`gaKMA9z2% z?*FIpPx0%xyL=Q;+RcW0Ec{y%z25R9{vOwZ^?n}vZ{9ZZ`|I}}=I7`4hjxDC&-x*I z-j09HZ)jige3$QZvUvV6_bMk{CbmQS-shR0pYJfKHuUcZ-oLbe58L9i=Pkbe9fUqd z>-84@_#XD59#u{#{;xRpug34BTKv6u-ikkO+wVs;A8i`ShsQ$sBmnY2On$&G{Xd2; zo{!;+=VSQdmnc4SdAT3$k(&JpuSU(|U4DO8_wB)`{KKBN_}`!9ca$Hn-kMLh#b?i3 zeEmDnvw0S4zIeXFcRE=-&$-#_oOhYn&X_k{*Uf!9>fZ(b4A0Nan|{u}-EdiU%QZ7U zZ~8g^703QsextWxUwjR?t2%7uhdtlP`5S2IIbghU{JJJ{ZRGcBzIZ-{FP@L#rvoqJ zz32OJ-{X09E>JiY!kKX3XN|IG8q!Gk}=^PT)Soy?vW zcEdSap5;4zCcTn(cs-rAo}{j6{<$toZJVibzoyMRe*5}x&+5L-c-zdB`!f9geVoVl ztPbXWjM3Z7?C$h;J$LiAIZp94zpvxOd*suVOm_52CYpbFoT;Qz9#_W6{$0rgYk8dP zjg@gCoBZ9Uqdv`=fA+VL)i<--e8=8*2(x&}`As=V!-?cC?X;2ghkp82@<2<@^(sEj z1MJl?J{?UzC&- zm&eKd9_(dtBAe`050jcfdq(>NaX$O|=7(p#ACWvqFYG0`EwSJbx~B9UyNpd+%=Dfa z=QcKWl(-(h^HYxQj%~B=?(@hjUgow!GVZ*8KR>#7v-SQxpT9r!@XzK=Z^h5wAA0z& zFYWscE&fh^+2nUn<$KCre)M;(;#tm>&JWr&l+VtMiXU|n8h`4QrEk*t9e-MyfA(@z ze$c+5@w2a^;+K4T`qv-mUw^zLck_RF{XO1)|Dx-kJ#NSUGq&aLvh=*^;`CPk0+*a_ z^YuMcJ#V`By~St0clk~yi|5&$jhgQ=^BD9#&)j|;CbgG#?|W)5-FA7s#b+)r8!;1K z#>e+_rPuG@$IqVk@V6W4@0MfUk9!lm-+MlL-ow|=yx@3IplA6J&&TlJ9UhM1U;E)R_&jgA z_I!)ap11hgZ+hNz?fIH7p6~FTP8QD}?%_6&dn{ch+6-e$?HRe==rE~`^u35P&$syO zd5f>dz-OLs@j1U1|EqHEj`h9q40wyrTwdZcx$Y(Bl%Kq9uIK)`&cAp*hA*Cv;it}< z^AX19@iw1NmgZkP9}~ZLK8BytADsV^Z%_QY>R+f3{HObcu7B~o#sB^+&wXn@XwT<< zch6_fTYUX&m-d_Xe9afnclb^xv**PP*zcoroJ{t7mzff`UGu!nzvg+H|MimRZGNr+ zUC(Fhx(=DkOC-8(Q_BAwpFJPNN4(_UKt6daiqD>p;)5F+KYKnZey&F!e|LM{=3n!? z&A;aPF5l^7u-=l_x$kltq-E0m6JF^XU3{*37En7!dxkyVWs+yEdEVw<^SsUfddc%P zf6l{PA5nbf^0HYo7tSN#k>>;X%%mtpe`PV#e^RIc{=3n!C6kpXJ`560IdcC0Hj^dLi)qa-7kNkx4 z+4E8Hv*+XZN4+@OcXyBH?f9>G-sWHPe3w7(d9Ka6=ABF)&m+!r<{Hl%{L7v<_+KxL z=k5HUKfs~-y6J2^r88Z7rE4=D&!<1~Jvd$-=WfdX9A9}pgpa8A5^ofrxxB1v{#t&R z%gd#F<@pf4@_Y~gXBk^o`QK+eZ}2aB-r!&M{5jw0WFF6}F-VaS+x)MW zJa6;+eP565A3Q*wjN+sILiz0ZsQAGrPe$>%e@5|{%S#+h-DfYHN7(am{2Z^3zq>te z^RIc{=3n!Cm+y2kSoA$Cw{5d#oJ{t7m$|_6HvgLEZT{Cwp11kv50~!S?Bug%n_ln$ zdp;_D#7pOqKz_+fSbjqJ(*I-Pm%K;uv*%?${Acx@U{#;H+w(U6n&)l)HP3hXPA7}! zCD(kSzsLIf@_RA8PWT5tKR<8r^>64tJ*VHM z<}t8dZ}Iv0d5f=qyRoY})axz&UOZ;;?>J}9ryc10qfJBk;`x~PaX_K*Q^FqZ3s*Hy z^*NV+Pr<>lcV%0IOf?30)2|IgNS{Ud(4K_We#LvhH&o!Yv-{Q09E&i{!ZTt0>YeWCWS$n?4XU|*w&!`jr4c&%)wdOr& z@!9hhU&r|!`})qm2UO0l`QrH)zIZ-{k31I7hw+PtWBB6v7`}KuhA*Cv;pX8dDg^)Kew{z_hCe^0HZIVI?S}ersww2bN*=0xA^RNi~kGG9XzLmo@+w;v&Co6 zTYUXn=2z^iHE(*0&z`sVIuH695N&ka&#C$1`53-G>==umYdib=cl0kF8z*6zb!s~SA+ zKkm!4nc3YwCURYT-D2WB^4&@%J9;G($FMxk)Q|n`-p?odcjd8zwLDJt?8-QiO}dBS zWKuIE-=*#7g?FCPyK3C*V~RuD%>E<2Q# zXus#2pL_3fY?^bnuKCKVV|=>O`5EWMe1C-Zd(S+)>R`$}kv8-2s)M=Rkjk6R!$X|x z76()AeYE1ld&`;1tIOg(Z+V<4o#mXeEKX#Tz3O0od**u+ zt@>nt_}XaLtByE_y?V|Z96QRf^4y3Ghjz!de}nJ-_HyqIX7RGYOdDXk^hyrm`GfPi zIFvtg&p+-rRQIp-d4;#lOg(q6_>@0$&p+-rIQXwP7QWvgZf)~-@(Z6|xbBdIhu=5o z{OD)o#j`Cw+BB38?}YM^hiLwm#|fVL9M3=U6Us;XhVoPTBlCmolyRUZ|9_x=@x1Bc z@mBpyfAaA4cU3gf<_ZA=R`_at5)5+p_c4x!MU1oOLy(f?3 z|B~ZvFw+L`qPX!r*7-RR?fDk}h}Gb0-^x9RZPT7_@!9joexCDjJbGC3`|J1lVb6Q` z`q@V9`8s~_d<_5H;o%rQ3S%#I<7nUU{G`f@AeizJAs~d%neI&s%)$w_o5l{*Fs~zUGVPJA9{;#q)>TYNvIX*`N0wW6yV(z`4*qKygWNkY36?1cSarG(kov_wD|0K5C1FpJa78Q-{Cu*ES_igG@RCD;`6v){)R?)!YkJYd%nX=8*KlDbKHL! z_ib8y_PoWv-Jsh$-)8q}|F`%@ev5A!IidJpaqO?<8ND;lxA;fg20w3`V@BV=I4G}w z$A0_gy&`s(aB+CVRfiBoANnyv@Jn zd7FRD^EUsQ=cD+{{$gZPK%9sDWJJNQ$cH~5!5f6jM0nLRJHxz6)l<^s>#{A-@K`PV#e^RIb6iVyBy z?)9D5;f3o3SU8$baR=rnl+T`zil03n$IqVk@%^6n@%^5+`PV$(4Ek8Lh^l06?4zv}-X@vFFl_}TMnKLh#qd)~+Qd*0?>^L&@@bh3E< z$bFsjF7v~4de$^`izmGDxq_dc?=Yz!>E9Z^e`)_7w#Db?=Pkbejhk*q{rr53&(F_W z{LeUc{%ys6@;j*(f8WdfVSbLd&N<~r$BbB-&(GI65R{QP`f|A_zKosM0pe`$VyJ$+pHtvo+( z#jodX)X&W8^*VmE??d`@2{usE*@sy16TzW9%v?UFLt_SpMVXArHm#9cJ2K`xmzTSIL8(H(h(a#b?i3{NKR; zt?>063)=H7K6~Ec|4;D$XW_qMy)}vTFP@KyUpybhXU|*wT-$k^_B;9)&zqjznBTAKAMuy*yv6?!%pXht)no4u za63D{#b+)rd4I~8V#$(1Xa?BA74u$ITk zo?RIy+K9jVEcXOP`sTN19#5xO=yl&W$)~|1dZE%E*2abE}OqR)*m^=CAnzwhMzn0%ZAwoS&(d@T3OJXZEGWvtw0 z9$p>G1I77@b8Q|Ux0#1m9ZVS$x0ra3y}FF4yt<5u(perSnCz=%aVoDaW1@|g$C=XU z>Zeqn{aQjc*{hCY{~a}-$E>aTM4Zq5IAxsLW*%O3#5wHMbLQaK5iv94;U0l8!GCdfsm78~ho~N1KwrqWJ9GC_WB0H2##$)X$^hXD>(b(Y~Sav#+D# zN8-!(<{m%%0ax(6>EiKL{j@t@6`o?Y?Ke?OY_>2$Jq{%~jQ zG4Ufmp?vXtO#I^cC_a1M z!`I){YtPs9FP``C^)qGK^DRF6#>4*werwH}Uh~nu#q%A$)5+p_b{ijqa%PvA{oM9^ zhe;mRK0ot(i_gbz@qb2c`Pq{*&$sx@*=U(zMknY zDG%SV?f3FMZ9d*S2G;&>@!9hh{|5f8@XtKo;&Xm2{!iflRQP9}Z}FMSOMHgzBdBvL z z{Y!hku7AY;?2ljjL3_T%$9vRYJ@IS5{X4wz@5LK6Up(L8JDtp)7dP-RDCant@c#cx zdFV11c;4pUkk5I~+x%;uxB0mSW<4LpXU|9R+4F&X@>mp~Js-sfH#C0sd{q2sU;b`& z&%SIpryA$@J@1R(?|C2J@A)p@>143zdsyzfaCAMkbTZlVUFHJM+x%;uxB1sRZ}YEt zK8nv=UN&o{>Zj=2gV!VM`9MB-GKvpwC?9<`l+T`z%1^3;wdOnF~B`^RIc{=3n!?&A;aPD8AI+<`|FpJs%Z6xa7$w zKJpXFXU|8)&z_ItXV3fie$V^(e$V^(e$RLLPA4nRm)e9|9`6-9nacC$%r%}j_?JCz z@GpDb;9vH92w!-hoksBo)6@choku1Kco1}J}^z-vAzQo(_zdHW@y7nj9_oG>#PA7}! zIX7|)=@gsXo#sPK`%bTvXT6^0(mkI~x5FgQ>-ltl28VyUsy*N0v*#`TZ(#C#x-$3T zwrS6|`0RO$ujkXo>;lDdP z9K%N*L*oa(cs?e6h+P#_wV4`bYf5^So?0 zjr{W?`YF$+`vH8OLsxsg#b=&}f9Cm`pZsd(-|1v9-!hY9=jG_{q<%-Pet$`6OXq~b zD&u)(@lr7<&wu%4+y3%PZb$8Qz24%p=b6jPNB(ET_PPA-OuJpLxA^RN=JN89{|ERy zx6&)t+3kA0#b?hmmzR%x&Czbx>os3I&s<)v;lDdP%v@fs;iHOnvnHv2URBO@PV{=6 zpH!xieB>vTFP`VT^Kw=G_t5x}orik|XYuE@%YNvu-}~p$zi0eUsGm>858CZ|y;VQV zdt5%|KNSN1`y2m`eerK#^?J=0&v*D;&o`Om`I@a_rV;)9I6i%zUO0|Nzjs+^5Z*S= zn=Vf0_aEBqOX`z8rg*%~%pUhKUk|6Wnc3YwrueAE#Cznsl}tEjITIxi!6er#KKA8I z#J8N8(&?}Hel4Mm_`A?2F{t)DHBz>+jj8zBUqvwwXCDA5*;9Vls=D z7+W^)lk&Fuc+b|gqp%%2l$RyPD!1Cp@TuM&@zA(faa!9a3qNd^$GiUR4*&JyZS8L_ zb?Mp;@l9=~T;=P#Y(UZ@#O?r98Gswr6;^8`G72A0} zkLR?`IhE_)qm3}1wc;nOvfDW(UP>;M+bd@I&i<6i{_GrY#oTTP>(+_0IK;y&b5)b>*5rDu4AH&mdBaWnZ2|wPGpn6Q*rdoGMDs8eIm|hf1G9h z=u;;9({t>*7QCgx>6srgOrb^Uodma806o<}@kCJ$!MkH?v|NiUy2vjf!rCa>Q+oa)#|{pn$j z`qRT4^{0o4nnqop)e_pFcxfF|{JD;aV^|(1n8i!$;uL?bW1@|g$0`0?7bmjG<4aAz)EGdYEaO^z!&q^{u-89scZcs{Y3=G0j?{-1(Se{#?oA8d}L@7B8FiQ?*h5*uf$%tz_cZmoss!%bD!YmB$WNxqkQb zO|$07pT0P)zRB0`o;b(+>4`JdaC$lYNwv_df5-R}ah`Lke$+p9)Y6wSK5{UvHah(2 zV4AhG`{V381nsb#sr>0U_I{jPm%es4nH1kjrt;^qV@De;k5l<`S)9lt`_sYPt?x|P zpAM$gHxGY0n0<#RpA9q9HtFT@C)bzS-_-cC%bE12k7>2has57=Pt>$kOMAKAbTIo4 zK|3sGB9F_N>`z}C^^cvsxsu5&UN-Bzs?UC$U{HInWU@ckGI1RFeu$$!cdO?4`rW~_ z`sQ){?qH7j)059s8|mfoC)YySu8gIo{MqGH_1Qmm)Dn$9eN3y3vOj%HvzGRhGau9J zo6DJ~q2)~W=gMPef39Sz{^RJIW*ae!mv!H%YQE28f37@sWw z_8kHiwTXwBwn;CKKUKTcHQ>5_-yOBoKX&$KH@2!itv2H8cTb#VE$#W7<6-vu5!!D# zll|$-XFpE#&E;`|Nj0=GPWI zOnesOg0ttr(0CE>0EmeH*bqJfqOdU!0r?GbLA3KUE) z-~5L9#GIHX^(p@JFruc8@I_ex({OMtq`Or?8>`xE#6`miOKg4nDWe%&8IMIH^OP)CUO!4PBCYoz` zoM0A*tcz3pxsECRT*nlDu4Lx%oUd>Gj+)1O@h9~u{`ACI=0iJWW|l9`QGbrdIpfc? z&8hb`WD)IDcMZ?mr}x$MQKLTZ#~b6@-S@N6?f7$#%ey#J2P*%ajcr)KBBTi14I&Z+%T8K4onZQE!E z)o)#KVn5t(UE8UC>)h_>x6bX3e(T)s=(n!zke83TZ*hCv^|3}f$mfppAno^VJM_)O zPp{Mdu0E5x@>42|)VYuQIph3oEB~g*>G*{2=XjW}Fa2wW<9dXDe{AOA_%~Y4t zIgni6dr#+f+x`o2{@3Yv51(DmWM{056AiyS&QwjhrdH&WJ+$)J5!doKQ#w~4JF;2s z=Xm;&HTPilo-d!}-^MuYN7;!!X8CuUPME3BnfX-Po?U;b8vK%Y>d$v$o3y|5n)m1Z zxTWXkaesQ4+YR+{JIe$9?$4Z057WBGz88mhm^Z|EJB<@n!SQ~bFuPGpnshY$DtZL{VcWPf_%+;2F()0&4j>3%3a0w&Wc(6Y`%-3g(lTW`}5r3{@ia*ye z(Km}fmokf&)-lDO>zLxtbHGLM=1`xXPU|z(ZW-4(m{#9pe|nC+e-9AH%Hz-TI34~3 z@0lr|LsyAICnsE`@HlC%p1` zDBqj*@JIdWV_I#L{pn+xwM5?ZG5fCL_FlHYdI77 zTh3&Et~_=eIo<#CG0mEP_P3GMH?u!|agO=3%XIh?xukj@={xw0+n*l(s6Ty7tBtZh zeN3~KD5pN=m_JuCxrSCUnZ?VIx*BjYd1)mR$G)7&{#+R+`*SUmuiwY}{=hXC`O_Dt z)i?S2-4o}SKf7`I{7H2*Qs0nxIbokT39QLP!Iqc76Oy$pIOs-2TS2BsU zlBxW;EKcRmWlZJIh0MdB4yIZ2>`w>N>YIl@9n4{Wo--Z(Q5ijY9qdW-yJn?*3w>T+`;VEJaWIB$^P`^ zvma;b*sG5nOv>ZRIN6^oncOE=GMU9o?8EG*`0S8BeN40F$)7%^)i?S2eRuSuF@JXB zboui*7n$uc=g)EexIaBitBu&79;R7K#UUPMzvjiC>zLxtbxfFU`LQQ`W+$(UQ~bG( zDgIo?yc9<%j zv)CkO$2|t~yvE0P_ALFwvD17U{2Nx;U+=!n-*N1JKRtG|_ZOYlG3G0ny}1W@{5hV7 zZTsI~{_kF##UUQ%e}eg+r%W8{a^}0#IaQsG<+C3rDnEj`t&S7NzMP5tEoY{5u0D1g zIgJs0ebbtIF#E{I{DhkSbXxPw;^kO&Of;Tt#D(!mzId5j6crD8)={Eb=OB#f4%Q_ zk8>>pjgEc2nA#F_kM#tB#InDn}i53Gl{8jb@g?K8bJC#|PrPcO|B4>OCG_g+q0r~fiX zym{PHJLMnOgnYf(^nMy=(pZx?;?Q($NY{s_{Nwu2;FtNni6cHe=9)a^XSddQdd!cG zQ(SP&J9)xKJCVPl`0t7zqxdL^(DBYgU!vj%n6E{R z{QrS|`Ukmn+r-`X>n;Br*QEwOZ>v3aww}7$qtosD{N)#X=9kPAr*E5Huj5aiHS_Ou zGML5lkM2~?=`w#qTm1I&kcX1r4wD@9Beuo;OL_gfTynFo{Bwewqi_PoXao65-z@ncR*;%n#EeDQn?|J~u?7(Uvmcs`6@ zJQl-8enR=;`Iz{{^HF^Eyu~l`uTjmHIX7utJHM`f#Q&TL$qF~0V>-dFv8+AW_)#Pgl_olX|dv)dZZ>@t5r9)5YzamsnF!=!wce^-Xq z{{~LW^DRCfzlVS3`4*qKylmv8iobkcPVZ~axA^RNi~k-ud0)!;D;o$7(Tes{Nmx5_>rGbzIZ++{*?aU_ATRiEB?Qt{{LF)|1;_zbAwX-YtPs9 zkNAt{Eq>lMGs`@o#Mhp0@&8ghZ}I<$`2Shr*XJzl`I;}D@9>>Y7SFSL8cypnZ#b6Q ziRU{^$|v%Ld8%`s&phAav*$hhGtam9oL>+B%=0Zib9vdwd6gg3ZhA(F-q)V5`QrH) z{=37&F?{iS7{7QdhL8M&^2PHp@r&o9_{VsD&*zh~`u_=j_^J3o_b=`Fy8gxUR{VL} z+^4i3wC7v=zwmh8i2pm{|K9MM_I%A3&v)W?I+;B$ZfNA($%MP&*-Ipruy^obsg&Qe2bsk&&T(BK8g>IQGG}8+4F&X@^BO%`3dDC?od8^ zJ}N)R4u7{wb;Q0%enz+3p76?j^P1=F_;cT!^}Nl$=J_t)>143z{yg{HX3m{VW^|bg zJn!TCJ@4cDJ@4cDJs-tqE-$&g>wfx|7yMm0pN_|mZchC_kWZeB;)5H?N1qMlr}U?B zPE>x79rC=*zvg+Hf6enY|C;B!e5aGy^T_>vdJW}dO26+g7kIuKbH(?2-pBWQ-p3#J zq>KYR`5)&?{l)MlFJXN0nCz!<4O`WZD?g!p_Iya_nPPJ_^)~1=3n!C zm+y44@_ebyM$J2!%Jb*Usvr69+aM1P{*>n({3*{n_~V{Yo)6(G&xi1(zCG%bqv*mpyOrFMIx+?{qSIUTU*Z^G+sv zzRRrok>B$^zTfjczTfjc{iuVMDr=`!2E>r+4E8H^LRdv zf84h*>gSs0?f9>G-sWHPe3$QZGJBqDhaHW!mhVKIOlEYMl?VKu_woIn_woIn_wmO) z2`+guijVpW<+JCb;s>An62<5K8O3KVFS)16Rd=f07X zF7xLX+-`eGX?w!!{=3``lk)r?+w$*#&OG1Z^Yil_{+Z`ne13l3!$0$Ui@z5Sd-!Lb zsrlmh7`}KuhL0)=%}*-Ra(}+uCvMbyRiESe7thD!M?4?H7r#XDnaj(O{C{|+IZUZt z^z-v|{Ud(08-}Bk?9{!oCVcbIhSdE1-^os)d*`TZ83J@4V`ebwvt@w4YW{4&oq9hd%{RNmJ;pFQv4|0nW{ zIj@PYe-B&p#q%-zcZY{#_$Z~~`7nO*SPUQe3FV9DW8zQg&z_9pv*$hhGN(4xzxMoV z!#{@~%ecGYG~(oKbD#PI&ZpA9K4YE7^DX`nw}by9m@UuOeDVCTANt)X+C}b5JDtp) zSL_y(&U5KA>6P-r>nUB2e($o>ws}TPaeAAXo$h1i+?~gH{NA-(AGPa%P~yZQb5 zW6$pP#VNjSG4USxZYA?wap+1WN?>`MV3KQA#))HJ&P066nJJygvn!7sM^5(`d`$6a z+KyfTNq^5i^)bbvZDw|xk16Bh7L!@LJo`S6x7FS_Ti1Ob+r5?cq9xkz3tvy587W_9 zoU`{epX25In0&JJuvf=oCZ^mI;auIvd3e>ql=&aq%)_e==IyqXIUie0ytljBi;lg| zR9;;cCrW2|oM5tBmc^;Ox{Qf7S{`Rg=jwJxHrcC=W0yG@TlI-JpZ#&}H*9y)KDqCk zhgThO{`QjQa6DtC*v&Y%JbL2e?668)$5`x3Vy9fBMLOpsQj3$AC-Y5~v22G)+y02- zRC2t;k_2|* zc2fU(ZbBIoZ<~1hq<=k+#h=}hJ@6SW;(HAH4LLaNUuf5tF}{qC@8?R_`_1dxZ^^YL z-|1v9-!k)XO`Y>DGv`Fd*{JWDNuK0|vmg5F>ElmFyRzr4_&>vGeD26T z*JDe)U(FZKclb^xi{~r1iPO5woO2zgc)r7=JnQcS&OG1Z^YL5!56|-5@^(WrH9X(q zGnbdVKXr{m@oT<*PDFdY#b?i3e9e5tvAmY=$!|Coc7Dwl&&Tk^^D%t1Q}KKlzj!!? zFP@L#i|1qb;`t~(d*0%IM$PkF>3TiaeD-8r|KfRzuQ~dhqMhI3v*#_oz6R0PCffNm zUp(L8JDn_^XZJLm)@5erB<-p59pCRL{k6d)PwHnM&OG1ZA3TGP^E%G$xgIvSvE}&| z|H!X{ubr$t-{K#+cJTGFWM)3DnlGL|_H%N*qnUcW&lk_f@Wu0C{H=`lLh>)3kBMJA zAHx^VNAcP77XKCfm&Z1`e`!D0^)H^c_`1$F<%b>Xdl?h9`0RO$ukW>LziH3ceDQpT z?{qSIUb&%mf|JSP`7U#T=WV`rmu^SBUgsH}`7?RI$Jcc@=6N4qA4`te@_ZDZJs-tq z&j<3!^HF^Ed=wwt(D>Q&QSqaF`MXu)JbTUacKo^@ZE!n}19z<3p11keJm2Lzoeb7n zavJwt9N#j}cbN-3Z}YVqbvx?y8`|`COW{1>m2!dq$n!qF-}64cK9(G_<@qQ+b9vdU z8ERi0vtIAVkNi{r59CujNAbZ8<)hDr@>BXvCtPb^^1Pk@*XJwad7H26aJ!+^${2pf zy6t(Jf6en<{-oz|jC*$6I?s2RR3}&O+jL^C>QJ|%UcaGD+n%@M*Y5Ir-pAMb$}wA> zkK#-HdGbFVzr-EJCy&W~8Z}?l&v^XEPbi-~9~D1)K90}#ZLIcvz2td2e%+6>6ZYGP z=WYHq&v*Iro-ei8sCg%o@7o~GbLJY)8+_e2bvx?y+pXhy2Y<@*4!%B?9P@zZL-@+` zA$(NLp2r+k{pg(N^?rUpEphX*QS)m&ACe#C`4GPHd=UTeyup9H>Uo2&>tws38eHRf zeBR(+_WU{D>11`^W*L(`FXNiCespa-Z}WBE*X^j+b6clw{dBb3ao^@VCzS{Mp7+JC zk0r-!c|M8{?w&jx#YZzl^Qm2<;%6=|aX9t8(5il1?Hd|@N`G+s@_ifH&v|~XdEU;y z?nm1Vb?5TD&A;aPE`QSVGDc|Bq?5^>?=q>*uX*0)>%ODgQLpE=Zh79v_j}&Q*T<4$ zwmcujNB!-|15teTd?26v62<5K8O3KVFV8)xYeuj4>xVrb$3MP@4fVVozs|$v_Pou% z=J_t)>143zdsuGUX3aR6?D;Npf#+?$u5I0pdOf#w%kw_I-}64cK9(G_<@qQ+dp?TK zo)6@+UwFB6yv?4EieL5rkoZ;HL43Y%vm5-^=PTdCs^d6mU)_(i6LvV?{vOumU-NvI z?{uXiulP)tqLwN5={=IaENuJkp6YA$n^?HlX*BlmKyH~fPUT^XF`FRgt?@K>d z+2Zee8V}mTtykM%FzPrrfxt^C$zzkzYf16Rd=cbYKE;BnbY3V6-AnHHt`3{pj_WFYJbz`mr?fDj8V$A!KKd0TNIC2~1 zZAaGc<7dxX@oT z{(b;M{G*j%@@yi_)aH_=a1Oyn7hpE3V~WSy%0Ev6$R@efckJTRv>m+wQhk$r>SKyS+sy1XAM-aj^fwwSx0uZ0CGuO3WwnJ>d)dXnImj~IpEbXzR#-;=CD^COt}xzYCE(QyT!qLedh0VT1>pRoTNxh#sLwoaSF1h|=d(XfnV+l8 zJiO|NQ|9DqG1GfyoOmi%drhxHi5s6wz$$U^J%WZqLE<l z|7-Dsp0iLq-l~7ZPae1H^B3@cDg4h^|6JC^>1{sW2e9hrpJ4v8F#m=1f0cFddyAi3 zYv$kSWH5{8*`1A?cbWN`r0w|*lRU5Q70G>v`+py!#b+)r8!;3A!?S$npxv(5Tl|Cf zCFlG2^WF7BVhdmHN8tVx-v3m-b8hk3^H%(tbGvQFy=3kAnlGM@;lDdP9K(kP_MG=H ze(_igANdL8i|1qF7tcrW+4B}(`#jfq9$VJ$r|$kFc`u%~_?o%jaNM`d*PgHY7tS9K z_mj{3pwCTmPh{J)=WD)rz7xOG$>MpAm6vL4*=6RO+~@i6Jl9~R4YuELj{Ciwd8n zqs;$t+qVDlFi#{vYJw{}`Tc@!9hh|2yjByD@Kii+|+x!8a-=6hG<}HJj^1 zyIrrh_#8JckNrJdFK9k$7xh~^zvheQWBB6v7(Q}Z@*c)79*g0N=VSQd`51mmf4QD= z)c<&Wram*q|BC+gwb8${=j-}U{bY=vx6OU39{c6@TYUDsmH+<>zy05a-?ZmzzIeXF z?|Qz;d`meIH#D5%Wb%EnE^~qBZT>aS+kEX|?RLFh=NxrN{l~{2??=q#CHmE$rS6xU zN7(aGeD-`GpF9@DXU|9R!3~X{Js%Z6d*0?>^SsT^eRJ0HHvgLEyL_jU!6MId-)%a< z$z;!WnF~B`^RIc{=3n!?kMH+<6rZ`gY}O35ug=eS{OtKaK6x^V4{j(QeKwTOo{!28 zvP0u}n}5yoHvgLEZT>aSclk~yv*)>QVOfv;oJ{t7m$|_6HvgLEZNB!H9>eSP^YOfo zKki924%qWJzR{)^Jgn+3gs<`v#V1dy{nRyoEkB`r_Iy6QcO+`9MC^dK90zyu|S=J&&;GqxkIkIDYoL&A;Y(n}5yoHvgLEyZlMdbL}*1 z(#d4ccbN-3Z}YEt-sWHPypQkqd=ww`N1l)3v*!c(zW9{{V#2v-Yo|pZc#edE7HvgLEZT>aSclk~yi|0A_jhuIx z`MJ}i?I*nQ_kR5Re1}P%e|?d;2+n>d)#CH>^AUT_^p5-^N zdc7I{UcMjwx&J+>=AU`K=A%tR`Qmv`e#YZR6@|v1$}}?n;`x~Ti05PY$}b`HiR?3% zmw)E=c>I0JuKL#p^e>)I_cPY>{54?R((AteqSk)EyRx4Xe%?0w;TxFzn@asVsTQA~ zpFfV{gs=Uk=S|no&)0mk??*F!r<29=M{eqvyUgsg`#iJfJIu7frssq?^L&fXp11gV zE&|=AdcDPG&s+SwZLX94`h9-(;xP{&pKbn5s*YbgAHx^V$M8`Yq4`Obm-|sn{Nni- zzIZ-{FP@L$vmZVD52*i^=j-}U{lwqCR248?T58X?`0RP!kNDyTY@NotnWN{}{_#cT z)774@`QrHw-|1xWJjdRMxyyWy_}{Lk6DY)Ik5P7+qzA2+vWFLeD=JDujfsFMa{pK-^SK_@q7&b-QnRFKDtTqd>FrY zK8BC{g!0AnG4ZGLXHQ1)+4CO0o(tYvB+b^Rm$;&~7M6a2vQrfbi)_{`-c`{MC> zByXENaOU}%FP`u4ola)Y3%e2XHa7R=wq?I}S@3)M`}E3G8OQVc=@gL8iRGO9B`tkS z8LzjQ`51jnad(@U-R)zFuUkyKxBHL1&tylhj1w)jJkHeo0mr_ai99Z6vS$~!(a-*T ziceE4^g^?!zDYjy#VHPLGqc-#Oc@`yn9SlO4xzqhp}jP)t{nyLTgfdg(SFn)u)O>I zImec~Z>?*-^6D5L=KwtyB=75FTFc^Zj;5HrcC=e3~`??2psxn}=5&arVb% zXrqs2oP%RWsU5yY&~RvXY%H z>$e8~h}Gb0AL_Q#>n%Qe{@73P&i(ZR`onX2NMD}LrV;?HsBed+zy@r&m@ z@sIQ2vC#No$!Pvo>M|t%$WJI=JRj4(DgBZ8L3U`2j{O+obO zdLE1auI9n#dDAznZ)IO~{}Rtz@$0eKZ*cx^jWKP_7teS2PA7}!54Uk2lY1gvW`1@u zY5NJUoL}~Qhe@8lI-jn^|BgDjGM}!+N4=tE>)O+G*vijda_r&jn%ADM`QrH)zIZ-{ zkDP|)CzWZg)0p_h^D%t!d<;LOKQceae(}5&|5r7i?q~F6{?5?sU&ZqlKlh#7f8~BR z;=83+e!uQt;(3d&pZk`3-}m<`YQA{B!*@DaJkRbqmV=(pIcaos3IZ{?qM z@XpH@&&Ti))ni`x&yV>@N_EFiNBu+ke>46me%dH|(&po{?)b&?HXomL^TqQPe@FQH z1fM-`@@M-OkLS5=c==dAH?&moxyKKD-^Pl6&TnY5k7oUJJ>PV~TVgicAUSa|`My$@ zNgkWa18VDw8FTjJWIJZh+wouXyv;`yZacD1%V(^YdqiWNAK~L4tabBK=N`;I>dMcj zgSKii=VX>o9=7wdPx0CFBm66#AK~LO6CU0N^K-l8`GNQ^dEVyt-Jbhh?Mxoe+x$7d zflHq6@|{iwi#*SL7hSkM_c@vD`7V?C>0BNVBYEED&$eUsyv@Jnd7DpucYB!YV}w8B zVdnC(Su@nW7_3g5r`Yp0ALqb1K6xyP5AHDk-zMTm`wsIr3|GD5gmfBD=W#nfU{CS$ zc;4nu_pj%%_-Fm_7y2I7j(^T?XkYStm+y2kd!GANv(Gx2?D;Npf#+@hY&-IO8x%b1 zy_pk=f4U9}*W}Y7diyDRejq=y_pxtRJ%HZT>aSclk~yE6*fUZ}6wY^d4r$s*ZJ?O$T-7_|FY+e_;>0GUJqlV!sTV7=JRLm!JqZR;dz69+4JXor<2+9Qk#vM zcQV=YUFHJM+x*#fJnq|^=Q;QN+53lkxvsSM+su6l_WVG8lJVT*J#Yu(PlxCCB*_)$ zKRbS~=lGQOC_Zy}*|{E^$`9IiIQ}c1x8qMuG(VoV`PV#e^Jo2#J#X``dA`ecI+;Ds zwbQIgCv%hE?NdEAnF~DMjhXnf?U+4p^QY@@Po5v(PmQ<19ptAN{MYrUzhVB&d4xS5 zl^^h_E~EI|KS%h8#C@J+E-%mfSNa~=-@d7N$LjN%=Lh1S9Y@i4-saExA$#8DU-NvI z?{qR)Z>deWZJRaYWU}YG%mtpe`LpfF_ib{$H*-SqU-SGx{7D%z9v~0fd>r4zc#J(i z!pCRb@gu0g_>*U*_~bD={yBaM%Is6Qe$o!y`BD9!_rv*;XXFZhrhQdj4E|hxkRAS= zl)<0wU**2dZt!RQkUg*RbdvvTp6~LVP8QD}xvyjHGQU5k-y)^5dcrH$_whR^ZqJ%Y zb*O(wpr4u7>n%P%Ki`R&`1*GcXKmWzv*#`TSBy8l8o!fj@%NGsi;urQeut%>rPS*+ zA8i`ShnqtAIOb^nmg_Vo|Kj-=zIZ-{FMf&QGnbd#AJlh()PM2!NBw_zmicr)Vf|D2 zuB5Ji#LxHV4gchA^Y<^`!2DL2+7&H6d)|s){|;2oo8I>u+V`VbpH3%>=Q%fxoOhYn z4tae;gFNAN@A(chZLsOz1?ywi>n%Qe-s0bG8|Gxl?Wo&MuebQ@d5iywW9Q#x>)O-n zExzP9=S%+l1G19x*#GV?GxcY5{>AfF{53~2^}6PZ=VSOd{NnjAeyP(KzIZ-{FP@L# zr}US)00@NzrIpYPAR_xT^^!#kxtWBBaf zZcSG8Gai4cywuO5_{dKvAMF{+XJ1F<2iYn2m96^u34NCD=grTXeqR5%@29b5nlpWN z-t=?+cQCKdo8II*oeTz@E6}!IQteMLZ*Wa_-t;Dua;xu^o_fB)XU}(HCcgHeoR86{ zVB$eI`pm7tXU}{1^Yf;k=SRn%$_Hqnz&!x+(=l$hz0CM$bVm0F=59sG*&OG1Zv*#`T zcht%CdDGA1$GGHpUP-PM)3ZwQyizm%l4C1=&DS-rJzw)B-Wa}kK8BB+hUN$S;<1?c zk)KdL+BcLho{z~7vQs>7@xQ9)Z9k(=&CQ!G{o(O?Hus%8cAB3z{hY6#cb=a&y~%ev z8I0ojo%)uana_Q1XuPMRzVr1M>gAl7Ho$!pxtDV0`4*o&Z}IhcxxaoNf380}{vCC= z8_#_=m?R zeDS=MAG9qVL7Qk_NBr~i>Du*qL-@NpezYu)=dJwD_OIu$_U$_%w@cl>FplN%yb=GL z-_UAB5B|0m5yDni&BV{1=e+Q;l^;an_9S?Y_~$*(ar3efKg2M@&z@&4FKhmE|02&bmzOnv)(_e9 z%;jaxpYt1dvI)k4%mC2Kn3Ucy*XR<4Mj7FPk-4Je-_2aULO0M)A=n{JY=S}`a&zt<@ybGQW;VaLZ{EMD9`B%pCc73MX0GB*( z#6R7?*z*Q|)(?m04gO`%pYxqgMnB>EHp`god9HWyj=JZ+!1FeLwjGcAHs?9X9-jT4 zXixsNxb-lJN|2)@A4--&$ZL6Nhgy%-(^zY zoXZ3H-j`J8Hh;Dqv*&I8^mv0jHo%|iN8k?f=RAP=bMXD=5gha|f9CrI@VCMGnZ2(y z%%3^Ws=DF*P`;2hd3J*O*IfIi^pE8SpS$3BbsQ)0PxmkKyv?8WL-xGQpYt2IAISbM9oa=ex`Wp11k4?a23SP{+s(a#ZJp;-9WV<{A7nocE8HRJ;a%pBnG6 z=k5F>e-qau*k&+4DgLSR2<2rY{uw@x!)$&^&(wXn!T7Iv-j07d|NLB~RiBr}^LG5R ze#oA;`PV$(pv9*F0N?5 zmLJ&j7GKZn^5e_wyy?0>|9}|NarS@HRObYY;`toApNZ}8`>^{w^LW0)q@7MVeo|T_D z{yTJ_?8z8D$~c-|JQ))|@)OEO`-bvU`h(lIc;1u$`FYc&KRjM9==%SJzC1T?`WXMr z^En3XPw+mP`R|VBn@sXNvzsx~*(2TS`}i@vl3#dT#|Pi@{Eif7lcl!Jv$2cQ+sxxT zR|iwh$8F~EJ*$H$WArw2-&5P9zbi}nGy06&|Ei8%eBEN=z2!`H^vXEd%Zr)hnw3oU z?@A_E%j0Cvu8b3H#P?tv^=a1pv%lu8zInLc5og~aDvx7K-A_-}@%HwFS2_MSz2rW2 z+V@YG174;5n0&e_>E{HoeR0K{uXJuW;@f$ghgThOnl;7_bTEg#x{S$ff?8X~M6Q<~ zJD7Jh%Wj@)l} z4B4zp)MDCadT9rxb!h1&y|kB^#mgp>w$0<>%#maE&YM2Qe?^>g^QMpS=jTly6P1eoR6XkjXzaw>gR#^3FV`GL-{HFk@-R5 z`F_LQydIC|!gMcB?&rtD|+WmALHwq*PgHQBc8YNuj3!*OT00Ba;$DixZj((HJ1m};g^&Ln?Ku*+4DC4n&)jkx+zpS>-iD>%z0 z#Lu3`re^+U=9Nj*fU zZ}6w9}dqO{L7v{=TCZ`#~>>`-(@cFyv?6&$K$@ud7df$={nqtUo3v|nESe$ z$MXaEx%55k2!F<7u)yN2c@_CqHehS5Z|2dE2N8+F1bN?LS&*X=>yyW(1ou{sN z-sWHP`~d%w=WYJ1AF}6d{x#2c`A#Q;Mc>1wdOp2|bu!uWUFHJM+x*#fr zUY?&vlIQ*LBPRZxl-0hMJa5N8>xb-ln}5yoUB1)F;`!rRiu;&c!*-eZw@9hmJ>iwk z72^30llrOt9l_c2^DRC7$L;2G0W8%j#hsK{OG}mcN{Nni-zIZ-{&wfFc`2I?1kLteGRDCj+mr_qX z{s;80)_l5k{Ud(9KX1gJx6Rjs-@yM?exIUU(c-h`t^DZUfzHpH-pr5F$>RB(8$T1< zA+K*}wA%9>X4+uUyy?xDiGRCcJbcUTsM}7jx8i5dTk*f**k4O+e8T$Nyy@rh=h*u9 zCF=Oa^H%(Gd>wD{rT#PiNOdq0v;ItKE~y{(d`$eXKFOmaw>-po(e^L0+d z^Eq}u6WbZ{rZ<_C&+pil=lS_N*5~F;Kj+`TygqOGIbYASG(T_pIX~w%*PE`H+>ZJE zI{)H%{9V_>b9{+6hL1j0#*bnA;;|S$@)ODz&&R|so{!?Q=RN%SdDEp{AFmg%|6`uL zPgtLuH+_tM=J^~$(jkv?(7qp2zfG~7_TR4Oo6NVwVs(r403uj}{_7tMFj zWoZsk|Azej?d6<#{PvZOy%}G{l=Csid>`lWJ*$H$WFjLtLMzYv7^*@9z$~N z-#N59w!OV<#=PlGW)gWCPaorbIcD#?>0|s?>}zh`^fCVYyy;_nJvXO#Hs$^?|7cV4 zET6wt^WPok*-p(=?K>X7#2dyZ9|h(ol+TWiil2QQ$3N~jlzIBviGtrW98*pooFBGw$tmk2LJf}@XPiCqCdQ*azgQI{`|b@WBeRvu06fq zI)3rICqLtS@q7$l<-?Kx@%U4N=5~#VANdL8i|1qF7tcrW+4C0v^;y23|MfOIZ#r6| zb{h5HyP5%iFK*wkes~`1mEVfzt@!oW<~KP1w{jlQuFEl`aGvl=b&2-Mo- zTO%i3W<5u*I?w%?<83f0&-!^8ee8O@#Xs_E@V}!@uFso}?4Q&L>h*YDPp%cc^QMpS zb?S=sg;%{^^TqQvfAaSqr4}vzTz=Bg<~ohxi|1|r#ozaw_t{cEGr!YC9Sr8@ zhC}uL{tVeKo;UL|+rOU2+PCin?TwVqC%lT^csy_9f6i~{zdW8l=R2Luo)0G+hSX+*{7as<^E2JQ$n!RT)(`pq zyv?8U8@S~8F5l^7u-;OeqQQy_czNCPUFHJM+x*#f%$~RT({)I>9^gZH^Pac)*E~PM zM`_J?crZUyw=;b5*hu{NjGLdfG5b_G&t9B=i}HlMm8I&lg+Ft>#-1O@&!u@5ZT@us zBG23WSwCdY+x%;u@A4--FSXLB87Gs+^Ihfw&)fXjcI5juoC{t)_M_=KeCVHN{B-)A z_xwP9F8%u$Bm66#AK~LOZV#tzl85o%LpwaSFMY<%PmMOppUDr#X2blMf9HxlKaiiP z`UIEn&l~xl?qB5jf%tFu%uU~)Ia^PxaYh2LH0>&-qR#v*%T9?p4h@ne6#4bAjh= z{%kuQ_ifJeOz}_GA?0`={;BI?wCO1S()X|f@lX9bKTzv%{3(W6&yU1E!)Gop`FLXAB_|eoicRvD`+Himm&-=fpLr}x~neQ37 z2FK#R^gXQ6zVuzK`#i$^b0q$h%305k@UM8@=I>~#dCw2ED6Q&zs)lJDse?^PHPH=Urxg7CLonb-pW}Kk{8O$piX#!P@P5y~StG zTm0J%r|Vn)eBI)+=Pmv#YUBF6>CJYe{N&jBp0DE<&s*`&@x}8oe4UT}d1Nkr@QdeT z;up`y@Wt~neDQn~pU+Po{s;86xp~udJ*8oN@>JcY@aFNp9up!)oHtT;RDR>%Nu4{B z`mdhX<;R!VdDF4$+MiA*i|6@T#LL8XnAhha55@BxCgtHfw&i(#{*LvzdDEMDApQ-^ z>+`0c^M3;Wr!r^7{JiPs{G8idle%Vd?dA9D{EO$U{Lk^<9d#GOmwbfri|1qb$WJI= zJRcK(YTkT)jpDQCJ^cB3)1{ss$J^NdF^}RWtbZzfS$jTz=D}~p^Pc$6JYVzCz8}r} zcRk-^z9puxo1UlhU;0dXCBN|c!|{{fyDYVBo{jx)$nW1MzisC6+t+gJjrc02v{RdT ze9!7&etPDA=cvux>7463cJXzKiT9Q>;h^PA?nf(+9ZYh~N+yndITP_MXR>Ek9y^Yl z?qT?tX3amF?r`_b>`q^teTOiMm&gV60W9vGe@cI!UfOSG>o~0K39oYe>`+>!x3j0$ z@Nq6;ua5D_*8QB|*uUu5&6tTf>{UmcW{pu>p_b}*>CrhPJhi?%)_gWV>fI5*&nCXHxI8m;_N#lxzdai-#~jD%C2j+ zH%Mup>GjCm8uNAwi|6426=U7U8p7vZ(kn6V=Sr93Z}a)SvWNeQeNE4sJ`n$7~ z_4yO}EZ@)jZ>;}!afNt%Yx)QMgX+=Z-@xSik)N^txpBWCe@2fxle5P7-@)Yjsh8$W zultwN$*7rf{$Y1=A5dfEKJ$iL-5&Bl<73pzmz<9VliaTFm1?)^^;?6_Twb2>wGTIN zTF?Hp_{aB$M*Nz8Y2Ng@9VtJWpX1Eu#QJ@mfAPF0KjZv&hlgYMXs12bO&Fi^?Py+1Phov8>l@bD75Ou|e~IU< z`1RQ4H#q;d#+bI|qkTV`_3w1Dc%I#cBm4m`eb1%Ktmo}kE~s%+x2>j zf8^KTe@C4xnK!-83B`|kMa||q(PIp~-i&`Qc`@SGd|mU}^EF>Q-)Yk-{&Bu|K8Bx) zFET&im-dW_ANdL8i|1qFPw5ZNfAPE(|5x?A?Pv7m>3P%3@u;yY)qn0gx&L08H~oaK zpLf1AZ+gvlI$1ow@25`gGV{4FrS0jcZ@ymYFe%UaUW#_RUT^W)^AusAq+m6}uHvgLE2l!|V|L>uh%gY2Q zbuVp7`M)-w?g&3QW5UB!-y?i{W`ADzSVSslgamOy37ThxB0W}m_2Xvr|Xb%J-|=R z@y_c>t`D1k&GRFCl-7)g2lGR9JHsbWj>M18xcO-tvrm=t?4o(oX@BU#)p;BbP`Kky zDj1A^YJNCmhsN`E{-^sFdEVyF`XPJX=3n!CmycFW=Y#Z0e$ea4?=8Jji9O+!+7f?H zp2wf|^k@2yma1l)O!j=2xxn)_KOe8Y{yJONIRTgNo1f=|;-9WV=JImOxmP(Semecm zdww84SLf5U;-|y%o~KmYCLf=j@EA7AwI0GxjW)_pVR-X{K0D06GXEArv+^@lpWyQS zd4oUQzsU0g@!#;7+nE#e`}cmxp8x-8JAW)WawJbj)}*i^PtdO(U%inju2dOGsYM=v zH=!RPwVhRJb4%GCjVCB_Zc<`v&DL6)+#mk@92Vhl7z}__zif9V!@n>X44=b2JV2d4 z=lLez=w#t})=u6E=NOs7^XJUyv9Ua${J!OJr0}ObukeTKaO;eJXdIzWd-=1TSMrno z+Ul`med9OL%c3UJc@TeL_hdXMd0vfwgfBd=@+Up7@+Up7@rUXYIi=?n{_yys=N0~_ zA9l|x{4u{_{C-jWV01D)f2>V0ri@H_zR6tRd7VGnkNbTar5}gua0~s|5&zJ2F+JbG z$Mu~3x*pu#_*bo)p8G-6WcGY$1};Gmmx ztC301vt9!2z+B*Yoj=--yg$F4=VXEB_4uz-p4a)?l;?Z+BhL+@S~j&NQ~u*it)9d| ztVgYXhxqioo*zhZ!t*`+k?Xa>-CXj6q~`lJDu4F5N+teLKP1nWJfTJR&YbWYoSg65 zH1cC~a`8NKUx~TNOy5Nc&3eR7YA>IkZ!lvXO@qZWJ<9K=E`dndK_G|oYOL@}x_%Vy3Cw}zr9G@+$isum{_jMFs zu>X?RpOKzVuetLZ*D=dm_IHba=J_KZ{hROGH1cC~GCg0|m6&lCF*qf>Cj7|#yY|QR z%bG07iPR6s?}wOQ@^6{@cVBbcEAbterJw4|)7^yAI<)<*d_7tyPIe4AGdOs(&BuNs(Yjcumf#@}~A&E2bpIJ>=i&g`5! zvUcb?*3^wdQHyw8)zO#gy2bnbhUm{KGl)E_KfKTPOPg=kP`~0e*JtT{#P%)pQ#0lR z{}r6t{e~KUzu#bpe|+8azWm60@WqL>{G+d;zij#G=ObQMK04N$AARJQA6Gsd?G=AW zzkPi5*AM!a_ZyV)CGY2rubX~8zS7tabIq`3`sljp=lmaF&aazZGv-#_D?Rmmg-_2nVvc<2!*V`Gr-I4v>0T>*dfvhxUpM_cKQjIlXR68L z??ZDR@e{^p@w_Geem>&e!u#m`dyKOu{s4C7XOFq%$CY0^?-PGWzjOZi`C*)|o!9^C zQ~7-Uuh-Fa)6e-gH4pxFP4#)fe#;L(KlkNFp8GyMkFJ|ujlb=A#DDAL;`!t@JM*}1 zckz6K89gkYmpSu%ji2fpeep-gcQxk7|A9K0UpM`nk9o=dyk5ChynP<98h`ef7Qf`n znwS1O@{8wv_{fKA{K%;{KYPqAKd$`Zd7t=;=e_ux&ujee;(6Pz7|Ubprk{`BGyU(o6!e$si4_iY-?=wW#;<;?RnK0UAT z<$1Zie;a?Qzh+Ki{2S_Ue%%h|z~=9XBHmaldVWGV z*y9h4O?9Nj5B3;8*QpO*^k-~``18%@NvWCk{1ngY@sE5@H^kMK|1ia}f6o~G%lW*P zpV9I4)EWO3u~g>pM_1hXVV}<{@sIfp{rg3Yzv=m^6QbwohH6b3nV0gprb`}Bhu=aT znlVQ=9{cNfU3Sa~`aWJK==?d)ckshNGJBX@ZmWHo@`D_XuglWIAM|jnn;w2}lJz`@ z{=Ib84_;{JGv7V&kK_m3?)YasugAY3KjWV7;7@s8=a2d!d0ywwdA`XvIvK3!dDP~) zlZ{MzzR8T98OsAbuk%Oyalf8C&q<7b&hvWwaLk0~b$&Qkj(fg`Ke8@(lX1n<#{TtFA&VzdV+faQXJ8?eW!JqQH&L8zd^1RL;^Bej% z&gYwaqm$`*2Y=bOw0p4a)K{mA<^jhrm-d`J9K>nwKgr##=oAMqHu+@jv2 zcTl2t_dTMEhCT1aFY#*ilbU6{9--%Z;-6V(QRi=XiT!#L$K?AqT7HJ-QBUDKh5yc- zmgWgpyykj#jW2&6UjB%m#7&;ZpA`O_=bL<^lZEGF8%m9eF=b>5&!02bcwXU8dtTuW z*Ws4yP~l??4U8l7X)k})^IH5<>*7E)-wuZUyld5u3cpAW$)^>f85W<0O(r#*kpH#(V~XKiwOGj}pF>3Ooay;P!y(=L5l@Cj_r^cM zXFl$?wfv9p>G>Z1jOTm!$fUV`a18I;-1NgSKf~iI&gVPgzao}l&+Gg-&o}u-C)4xy zwR4kmBa@zQG8cGW=g)aw=MUFm^q9^M)77ha9D&=*$9#T%-E`LDP0i%__RRA(9r?j9 z-A2wM(Jx+n=EI9mF1LKYTK;D|-@``-nClbAM9=H|;qetcuk%O!knY>){5j7z`9>#$ z^%mwfVZ6vW&P~l2ne=>_vB}UFT5MyNBp_+`GP$^9RGU!W1q8=%WW(E@S1_^wS3=ZQ}Q!B zzViKfjX&y#4q^==i$nRld>5#q%jQb|#KPUPHGZJ>Ou40~W2DUX3~Ouh+|hb<@xJuW0-H zy6NZql-suFkNGd2*YZEcN4(j?K7160H$QvQCw|$VZBLHnAN}hZe@K5i5BlT>{mc1$ z^s&qrPAkzP$D03)u~zeZ%3&Dp#Xl)-w8Ov$0RN@;m2<)xf1l4Qe7Ua6yXVn$)2sPu zdj1%5@qCKi&ct!by6IJB=$J+8rl0e#h;4q|^mD#kXK8%h^mBg7ZK^$4GpQfb?~nN} zp2y!c=VN1h#G5_r!$)Cw^Rvf%;xGN_!!Mrq;fM4m&wKIdc?*Ah-SpBQ_tztM|9u_B z7wnI%o8HGi^L&ayo~O{iU)20JJzr(M1t!_mm~rJ6oDyCWe&oK44>^nL&ox<+6RG8X z4f(gs{kyNR?bY}W%yK@iGt+$;TbwUXyf0H{ZqZFPX7P26iQg?}B7e)7^zzEKgBe}3 zlF8ax$pmY8ob>Fd zAKr20BXDniu18CKn)2hyFZJRRe@MS){h)vIePu2FUr^ipcM!+dO)vSnop*BVgt_L- zy6NZqABcZ`-SjHo=wvYBxdMIrE%faG^NM^m*G;c7V{YZW(sFLQ`}Z*_d_E`Ah&l45 z56k%&oeCzO>%Ug`d``r|A73~9JU=r26lbc*a0}aJpC0nl&o7?0 z0{4tRWX6+^{J8Q(y_}EPiT(}g_skEn!_NU0*><^KpISN=EG_>ukWc`g3$;(6Pz7|Ubprk8x( z&*#(FN#l2X-Sl(5eBOC{-SjHo=wvXm=eIbv?96oTljn}&`35t3M&3)2ZkPKtK0UAT z)3K=^+xxfir}~3#&T|su-%yA1>!w$8p7=ON+Sfq@FUGCMAI`z!-{b7zV@!{H&#yE7 zZ74s8>5@FJ_U{m1%;&ZG36YrdBkD!vkMuA4wKG2#G!@@LOSSrh$G(q_cj&91%Lt#I_sS2r-SN+OUXOpQK9T)6pYPyLd0yv_`XPB<=a2af z-01lxf6(*1764rVummfPHofbXW!yh?Ml`*R4 zf8=^3#1uTK$B)-dc)o)_HJ{h{qkc%9*ZFgvZ}N>!7M_oNTWV;D=g*mIJg@La`;qtO zk!jR>H77CtY0oSCY0qo?SsLQAMMBeb68i;Gj47x@ju}2%;N~h zY;qpc;Nx>fJ0JDe%^&nYH-F4yi0Y?uoz~8e{d45|@wu8$-u<>xKSQ4*hwkmo&tU)Z zbJ&~rImSQd`HuWt5&u=*hd@ykD97OB+u*lne%*;Z*(&Hke|ce zoMZ7GrB9p8^j)O8^Icqri~V_CC-Qp)@|k(LU*q%n`BX3GeEB_yvp%iy_xtnbIf-@t z9iJ1;ubX}zKiY>e(Z2tDj32!0Ni9EP{Ni~ZKHBUWKls`6KJgdN`|wM>`0(i$WJ#%i z{QW?ElFMyrk8n;pj|l$fr}}!j$NCTMO6PGc{&Z{_Uw?u>wr=`){PKIC#$ zkv*SsV`t(xt+95^O@&s@ze8K{I6*H{JQDq@u%3@ zoQzCLO(!NiQ#E# zh;KQQo?Y2?w4C=~47H@z{L}iexx3#GXWJnnk9|z(sFQvC`tn%n=`H6WZrOj>mV4hP zoN$f_@r56`FZnnZ#d$Mc)5nijCGDIbwr{4G)0NH@O}?JTxqHo3tIOJsK3X0p$E9r?seMGR8rrVb{FA+pv^mf2RYRO@hait% z)Hplmj-^kM>)2P=7Kb+Hw%6y2vTk~n8AKbNtJ&xKrOkKi=~nps{IC)8f&U85*t+R` z@sF>Y-p7|~bC$6Ya(|zH^l9`L&tI$g4*?i%VCM7VYCgc;{OCBZ_>mu1KKj>{U;5KB zzWVDE*~#~nHU2NC?fG@nOM8UVq94-ON%tGR;=R7+dk@9wwec04)mQ&Nz?@$a*>YYC@%QuLF;_mC;>~A`d*#QKUp&8$1HNCGn;q)EzkfwN zy5tA_%g+xL{_9iueEzQ(r+#!RCmg-Q8U-D(mOV1zq=u=mI@w`v`$f;}m;O83mi68lK7_kl?i$B$8arwHj<1`3&X>raV)Lmh64 z=d1CP%k3r4Kknumm!J&u_hX9Zwfvy3F>N_sBgpf}G5+FtosZX=`3Q=6;dW_$z$edz zA381fr^4St2b=R#Jg?_}q<@81l=#Q$6WQT>Uf~aqFV5!`e%lFYTpa5k^VodfM$7-0 z-_XBb)cP?xnVuJJxa9XJ&M`8P2Y#-pXtr#{6vfjCy>X#U4J!wAo`grZYbwe*5gJADp z){7qhaQ^w(YV2peAGY`PIXaJup4a1_^SsU<^BcI)^G&|d$zZ(&ucJ24b8ckP^G#;- z%vc@}YV^F$AMM99pV#?wp4a(vp4a(vp6}sLuD^9&lleR~xQ=7=WKaAfd~iGY;boZ9 zr?xx=&mH%V^GS@^ZayM0pGSfUR42^kKYG3+|5KjV`J;aLInL*G{+QqB`6l1!WO^R; zu!X*5ABUO?e|*GGc%C@CclZf)DEIN#*YFd%J-jwCc;BYMjCC@W2gDXVk9RwdIr2yQ zk@syh{+#Fa_^;^d@%g;YpYwbVf5c;jtL8tx^ytR+eJ320>(qyjPV3}{u{G{_yo*-< zgV#G-XZ(2GK>Ro;-?!1?A0A&%$wL}{)DOw?vGGBYc$@To!kH6(3w~AOH#!;2x6EX$ z+^+CES=<)pL>`b=dY)Wv@A#wrxO<*lZtwWRb-1ZHkNKJQJmco}KK`NW`ZCWzi8t#! zG}G>}IB+6Y=MQ=&$L+%xo>%fS?Rk|ya^Ij*InVd-XFT7-A3V?Uz759}x2wii^n6GB zS5(3^T@SWh5r+FCe!{qg-+14KadUeY|D5NW@f)4Y`8>9amD>`tkx9=tnF~Cx^V@wV z`}ejVljn8*oac4^6)e)_kM$Yy zW9M^x>iG$MWapF1ZAe%0&+$Am!Y8kXA6`3f-z<7w=MRss=y{z#>WAccoj>RKCg12} zu-n5WkZ57Ju0DmG`-e ze|UW5`!*Zn=Jt+1>WAccJ^ne*H~B^<7tdevJ+nPGB_~a0`Yuw?(qpJ9%p;5E8_ei2 z`8|TO=jUtu{r>!U%#km@2XWS?H9kGB#s6J=kK^Tu>vP?HPpZb>wv;E0kH6o)hb2E- zl>0|M`qY(QJns`f+Uy#Cs8G-R7tj0Tr+D6nU;N_5CzsnT_s8LSMAZLhjIY{yy2tuQ z{MqvwKOLK{NB#u=&-}cTbVZF%&ue`7J<#!W(@TGd{1}~FJkQ)za^7U(IOO#WL+9xE z1~VM6Xx;Q`9wPsGy)0Na{ha@bw!h}uc)|WlWxtjmdS1&9;`|ykBefTJh z?0Gl-?v>>GZU1wari41~$+>(@C^y!B@w`v`#q&OVS??bCL8>@EyPtQLxn&%`Xy5*< z>1XWMJfB`8^B<1MadX?zzlaL|r9PFOukq>m{e4dOa$T2q&!g+6%l_Ew)9B>l`91by z%uOba!{-vWdFFGK4Q4oC(Yoo?JVgE#vCXfWe$M{|e6F)JzHa(CKjk*no~)Tvd+GPb z{1?w_`5)sygn&cAmG1=}YbNG@j1RCkKga8qA6I_yyife49=-VVyoEo$ZhC2tm=7Q7 z^95shY~A!e{+Z{IgFAnsf4`{X%jjf!zOc9Bn7xdxn|{{*@Lu6(WZm>WW;q}8y+XHg zzJ=XCLLQrK#sNGw#aZU-{QWI+i*B+pi?3@;{BAjuj$Rojy}Xzi>u@C#ZC}nre9M`v z@s({y%i|o{##C!Q&X;XWZEPm@+nD8^Z#XXgpursPWO2*E?dQ|r6ktA;q$8lwXZ%xW1^0hw;fFS zYFV7ZtIL=eQ_JHF>9p5;yOxkmdezYO&riHJLC;8^1aH{m{1eP{-?`4*y=sWF+-t5e z!|&8MJLisI<+yl{fY$=T(apK-ug~a;v-=IvpX{rUUrhfl;rx)UmEYso_s?m+c=LAM z^ctU^A2wnR9Se5hzha+jeHEXE*pKn^^Fs^&Y~A!4e~W(M`2~UQ_u0<#BiH6EW1|*7 z`qY*G5C(JzG@l<=#}A%2|Kb@x^5e=!|GM%+`aSc5?Bsg4jIaO1IQ`G;isJEF{UiS9 zalJm%*i8QU3O?6OFHW!XlhbwnKfwG)j`?5M|5x5Gey{QA_a@)yw#@RRyf?$`MAyoGR|8dH?g>JW!6`zoP!R zZo2gRvHpwawfN!Kl@#%SuFXw)r;CZf_Eu08o3NMWpZk{cSn2sAzj(gEZ+gDUjQ8h@8}>dZ z*HA_#?<+N#(Zh3|*ZFgv*ZJS4Jg@U*olCdN{c4}a@#Dp(=e_v!ydyt)-iuGqd-1__ zjh~+Pia*RzgN-cd7Yoe&Zy^g{+#EVe4~@Wik|1#WgmodBD&)8h@bF0 z9A1~6;e(&$ewfRj&F7m;a4wfQ&+Gg-&+Gg-&+Gg-&wKI7$x^Bi03gB6}{G8cGW=g)aw=g)aw z=Z|?3eHuOK#TWI*_i^#OSNz~cPkQl@A6Gs-?-f5i@5kr7Af3{rOlb&xf7kFOh&v{Z>u$9 zWYY6Z<^s>_{5j9-{5j9-{5j8i@#%RlK0WWqkDmA9)AL^ZGXA&Rj^s_eUwL+7f#<#A z7mhK+Z}+?&|D5M_{+#EVe4~?#=UFSmJnj`}d^s_3#;Ae)l1LAK~m7s@wSQzn^f%zo6}x${M<|Cadvpx8LtN<8Qbxv?>%|IROK<1d~km)kY@DV`^n+co^7Usm(UyWif&AA1V+ z3ER&YYg|uP?jP$P@jvyAuXJqUxA$-Tz~|?+_O{I6&`zoRGJ zF86EvEqhGkOAcO(`b{+{_mBMIc^`i9ybm9R;hLXNd1)N^#9ut`!!Mrq;TO+)@##m6 z{~0x3bNli4K__LNNiMhL{q|?Y!vQzvj__x$yY(mD_s=}m(tF+V>3NMW*8qM8*S)Ja z|Hv<%Z}5#yE}m!Xm7Fx0e?k0zdA`d-_I!gG^ZZX7`_J6=zhnRJmAQS5PtR-ok6?bx z%vbE!)-kK`>3NO+?_mCW=F7Euq@QbidS2td2cPS_ovoXG*$`|vT`vgh6S z+4DYpky_^Nb!Kw9 zjalaIb!PIojal4XXC`;sn5f4*N3SvQyXd=>OgefclU`oTjILbCq<>d3!CD?CJ-aea z^ijOWX=4_jhU4PT&3I2fwK0oB>&)af8?)R8sWHjombnOHPtNao?3wH2@1e2XdpItB z#>s8q@_KOv|8iJ2UE$lj8e>;uj?8Ya8kpT)H87E%KCdog3a>6>qQvO`l}!3-8B=(5 z853h^d7L4gVO(~P(^&KETB1vA%+ILLbe{spwY+M`CnCXrXO4nHp6zWfbJJR!;dd&t zbM9F3x37WwbZ{tI$2ep=!#>wI54-pCQTj7D;lLEfO3vB-Eq}k?aCiUu_PoN_67%)B ze!n5jgKzo!{RRVHuAN!j${23>Y0hfP&)K@^$N14#(O+JCI@gPjQgV$yRBfuqM$I4U zvp@gzvR8i4zpnAq*Iw}>`}uQ!OaA3&P{rdX<172d!v6|CaNYD+A!+7yIgT&nB|2Tt zkGzK}*G+$i_u@U~BR{xStxuzq!Fa3L>Da_<@88Bx&s+F%4QA>2YW&$_7XI~msji!TYvYKNzWhazj)rlzj=08c)rG`=QX~3ra-QnE)cZHJNxl&Y!m)+voF~mmSX?;ed<07C!TQjZe=vVvhXlwakH~+vR?Zzvowp z{}pY2Ri68<@%OkDemXYKH}GCt<$1s(zj%IspOgHL@r&nu_$UnKh1;d^hsw*>e=hvu zd7u0g&-?I0`aSc5>~sABL;jNw(^&Y7v5@Y+hcOX;-T-~XPmY`QV&F?B1Q4GMtnul2 zE&uY_F6lSv`6Iu0zQH#-nVuJJV2;Y%)yU+1t0psa%%taa{+#D^{wr#1-19m=)xfCd zz4-LJ7axTY$EPDd`oN1%&wKH~b&WryKlsuse)KP&S&97|JWW62ZKJP`HE;L4Eq=S_ zb^e^^n|z~_!Fmfh=Gd*~+{mQoo6H5C*ZJ4$WxuC=(~tQ5RBvfMuk+_T zuk+_T@5LvV+iK0k{vC@Sy%5L0BR}@D7av?#KE|voKcruE!d(AG&)f2E_q>gN0L zuwMB8RKsDn_#w^bb^e^^n|z~_>G{y0`ZP12*ZC>8vfj@2LpY(YLY!qDpv6DNFZJicFL`m}$2^ty zK^{WK%9@Y;JDeX^K0WUhe<=Hu54Zg1`!*K7-Sf8mT&{S1p8H`B|H-i?#~0?Y`FR^H z{yEPhgpGB{?e3p(&*#3a)Vz_&`Fu=P9zTaT<2ai3{CUigf4!pX*mv09`%&ztv3%Q) zyg!d4n(@CrO?qD8k9kIT-i0qb@4`pcx0H7+|6}<9HOI{@IJuw0<`F+~jQ8xz`aynN z`NH!~`QKdQM|S9WL;ORYH}Ef4#6?$N_qGOP{|e75{Atgh^NmhM&G5d>GA2D=>iujS z&3RtuU$5vo_8s>3eiZx36}SDk-?ur>NjL!a=4U*w$Dd-edWN3&;)A;dFM9EjSZ{vp zSFiZV@?-bBEkAb8>-;&-H~E8}XYEvTZe-H)O=k4u zoac4^oac4^oac4^oaepxsK4l8FFrl*$d7*U;&Xg@@yX@3I%ebe8mphsy}|Q-{QYxS zSI^txw|ida&w0MdH#!-tIG<aVe&KfMe4C#4ieHR>m-t28PJG_CN#_&1Uq}A!^Lf#Z4!+&hLSt&hKu>I+Xi0{m{WB!ZheezR0 z@53*C@#2%q?b-NBwJpc#*?!Q;W9Zn}ujE%HjQte;-zWa!c^`i9ybnL5pX2p@8`2h?5XbLWeFAatBj4wi|0imm z?){AY&)LIrA2j?I!YTea=B3V$hi0F*_iy?1{PBHm<9~tQUMg!HyuAB8E3g~(_n@JF8@M%|CRIbckI{JO|S9kd5!-GOs*;Miv8NU z=`}t*ukqz~ndNt!rRQt>EqhGke?ZJ1a(?7BAo_oI{*hli@56rxA_&E?KVMeraj%)! zzhm(O?9I;}bIXq_zj)p!{*Zp>{>`4(;+Jz^IXC`{`ls`c^&iGYU;OFVG;e>wSfi6e zZS#4X8lQ1<%l8w{qR0A|{Puo$`D1uf44~rq2H)spFr()SyApGp(WmzhuM2qz+xR2m zqu-k>aco+R{lo6EIx{)l#=Kk+*7ZEj7e4_2knaJaEW=QAiT0+aCTW$UR8TFZb8jg!U0MSRGcI|Njfd9_N zW^$V?&f?HooMds!xWiV?OL(k|?Q9=IdCvomqeJ6X&VN?$g;)FdF}r2n%y!9`(e`h- z?+naWxH`?1>&)G&24nhOxIgpTeul+KxV2 z9%o4B>b4`B^s1rlWzJfwPsI6TkMjj%GtE=$%-ySoIJ>=i&g`5!B4#r3cQ4BvcXw!W zZkyb6>p0$5-naRCPq*F=PNUbj{&DbrxbINzJ=FO7{f6_HBS-Sv`?vA$_Ztj+xn^W> zE8BR>Pj2P;&mCEz4AkM z+xYTXgW~a8{nO(%{#Q8XYreNvoL=YuoPB2T+rPl)z18CP8b6#z!g;6}ztPFX^Se8b zPHr+kApQ@}(laH#1~VLRi@$$<_$~YF=$z;W zIez6cU()l(`Y)ch#J^#DZFzjXz-he4T;uP)F~t7~%ukii5|8}i`9}OkCl}AtZF?Ka zJ(ni)J>q|V;`s(M_TxWr>_2kbQ+tn|ukqP_jsGk7zh?fK=WBd&xvk_R#-EN&F_-(! zmy7g#jZe>8_^(em_vg>arRR_Q;&~tb!|q`pe(}5;KYQ4RkNmjui|2jfFP`_})AJVo zSJXeBy_KFn)_?K5g@5zR7ra5w*ZA~-g)g5qcnAKw?4={Wc)r0mI=OhB?qM6m+_=fa z>+!rm(B9)--@Kk_Frz1b;MgCE=WBd=UgKZEzbc-u@tI$Z{|orPWd51wYkYFK#cO^F z$rCw``ANs7^9b%K;_uVG^!$-uJnzGQKp;8Zyj>fANQ5&#d)O^MuKeP8pZG)io%7G< z0dqh1)Q=or((}jq597ohznllYU|iGlHU1v2A$~cJm7YKHi{~5tYjiR_U)->_p>sZe zj1%7fuaM^^bAjh|{&mXpI)BddIzQ!h)bn0^dftmq&pYy?$GrH+k1HQ>yYlIIulyi8 z{A|_WNxSE5@!LIbisr^SN-^^G)Ug&+Gg-&+Gg-&+Gg-&wKI7<+fTg zv46+nr{^8{(UV?$a9#Nr|E_#`-YY-!yp3=7yp3=7yp3=7e3L)ud5*2>m^CsvpKmf3 zcwXnvd0ywwd0yv_d9us{Z~>0%s%oE3c(~M`55MHajUPQ(-UoS(d0KPd4Eb^8)AL^O z)AN4({r{mQ^XGh{lj->~ z2dUJ&kx9=tnF~Cx^XELT^XELT^XEM8#Rqo_a{@0u?CZ^s)L_H<=4Ouk+_Tuk+_Tuk+_T@5M*`MGt%N z>3K(f^t>0J)awq~|#=s4^FLUgytwUgytwUgytw-iuGqd-3UcM}GE8qvj_(NzZ%5U&g;r{3UKL zKJVLD_;$~ic3>Rg`V)UH&z2ne*Y0^6-|qP)-{|DxdFH;7lP2>o&zH+zPM)7{Fk_zo ziDUn%JU?IK^Z9v={}KF;%JcIzKA)f0`2P<6zbntr*ZA9(KNHE%5m#~^^Yb43_nCk8 z{QQxRK6T|kgaVA?M$6Aw{9!;k^Dmx!4=jUsD#%tlrH6!1F&+kbc`RLy-YJD1=Ts+U* zunpqe*JP%cgO(oglj8e1K0jabU13I#$u%G3`A)8HQ{&U~jhG|<6Y}{<@qCR>&ue`7 z9XC1Okl%-`@#%Su{{iuTP&|L+7tj0fA9fG>@KHrusv|dku2UaA^5e=cp7)7Aq~AIJ z+4EZb(v6?t;k4%Ct>=&RU%aF7)3ND15;~1*=)Pdw(epKa@mcoW$@PNdxA&z#i{~5h z8=YJ{&)B)`^?b^Sj1%{1vggU-RxqQ7fBuNqeoT3mZkPKtK0Qw^xA*+7=&!HYldst4 zy6JMi#;51W<@TQcJD9&`zI40Xukq=5a=E?dzlxaUcVOlIkzYJdF1Ks=54(rS<#r7p z!!3KBTyB@~v&YEgb`2l-apf1!Gj49z#9us5F1M@r_w(R0{%@%N-}3m9b9lLbtpDP9 za=E>aKOLL=)84=HTlPA++}`s;A@JPs4sCgt+amYV`$~TCJh|Koe$(?+X1qUtWZy7B zEo-IAeHkD9-egHmq!y=#{JRHL7KSP|K;LlGT z{_Kx4xHJ4nXUcs!_VK#6l!yH~>r2kd;QX_}8TO}z+3QaWGk^YlUQ5{_7Ut_yTm$-q ziGEqmEdE>bE;Dg=4~xbf(Bn=-r(HD*?;|RVfOmd z!tC{@g^BYw&f#bEiGIjlTE{H@T*pKiEsrylWBd+CfhIFoO zJF?07ry-we%|F@W)W#0)IO$ItQ?2r~ZA`W1qd#p-ZEPlg+L&#Ju*NOSa7_4-&XoH#e{vk~ z{m_qPOd0&y8DRjoJ1R`e8YfHMBBLvbe3*&!OMjZ3ioQ zX(bbFU(Q5Zmow?lm2C%$_djDz_4Scj^U-YVdrsMqHc1US!KQkN?exx(y z{)sn=x8vma z!FDAxvQ{#MKbOUcK3X29@aM8Pkw^N|z*K9V{xmSPvAO%xz-&9DjK%)?49A2Y=}fs_ z^C#=8yx*8Vo1B9~+HI#lZA`6?_Um^;AE~vp1%KM&Yr`wKf#`&j>sn&e-r;VwN&E!uTv+WSDV*V`5a7_4-&XoH#e~NxP_Lsq* zP0pY{ZA`6?c>TT^YF@3SEnUA`nCi(2{#?oAm|V#u zi`y`cb8VH+BM#$8?W27CzQw%uG1Z!n{7WAjfiv0mpXlm4{y zQC^4cgjw3!&kVZ)kg)S^T*!PIO}S=Thd)811Viwe8E9h-*1Bq*EP_hjG+yJNk(8PeUzz zMtx#U%o8thoO9dPM~DRfoipiAOD(;7j%%Ww#3|$I^-?${{77fYeWd@w^9Ww|milYI z_wa@N2Mxy8$@a>9$>HBd^TpUKl|Gr+!cPLGv&VY9$pvy8D1ayjoXl)-Fp|<2>+AE zp^f~$k@2|wJ4MFh_RoEc$0fJ1UEFHz!|OJgkKW_xD88Os?fp>WL+^*<;&|ixaI3u^ zeZtpss~v~e4ZUAz-bg;tx|?hG-Z(=$#@_FCob|pRUw6N~$!8cq`9C=xZ}ux|qk;LB z+Y+}Jd(ZpWG&04wJ!fL9AIJMXZjHz7pRbR6=+@n@`<)DXCkiUO!{kOzoX^69x>E>{&(;6>k$L9z4jp5 z{48D4*YEk?^EinUj4vuv9E*9xTR0~EAaV3tiRE@)5n`5e8y-9E&whTtKP}7;@Y07< zFCis=qN|gGql{m{%~br%d!i_R=~g9I~8=e0ngmmzK7DITL-foLT(2uIt*0+?)QiFnh53qcbpHH6@n?f+@F#fP-U#m}@g8aoXr8A(7c--mRx-g_&P4u}GwIKjZKpqNOtt2tKW$8HY+_8{+SSJF z^JkN3@F(lNXYAlLW`A1vz5cW@wLaqY`z1QBClBG?XXpJ-1GCScwzjvKtf7@mvbgQb zXFE=?qL)@O(e~v`v~@X?{#@C1u=3~cOKU#*(-x;THc=PxSsqKAuNa#>*Y6Fc&7ZN) zd+Hpo8S!T~-{4OJQ|qJMp9W^PKMl;bLy-F|*U~bk@aHln#}BqEnUS@UDg3!CPT|jG zOySRk%-x>`rdsp#r-7-B&E1~{X171jnFfEdj=cP7;rIH}#?<;~zkWZ@CvNP@b4Ty| z(-vo+KUXrr+Vb_0q3!KB;W!UwjBjzDC@AapRsr6Cvr;VxBQgn!o+4d4x%bBR5W!uHPGdd6K>HD-|{48UN zHZNn+pMpKzcI15^T*)MhTfB!l zPPKkVHuL?@%`i6Anvedp#i@ zPfMI?EoFyTn7#g7$1MI_$3)*OZ#$UTpX=f*{#?gIJuZ)v?mz}OXH>^&zdtR^zdTr_V8F6NRTA1y%2V*5<3AMtbcoafo^ahot6 zm;9cd|72eKT-QE#fb}h(J7Qn;F?;>lpNHQ2pSHI5`qL6;n_2w1j)@Y;{#?q;URuX2 z{#?f_{#?fl>9p5;yWi1AoPQd|QLjHOZGQ*Xy*qVX@u!9P0_Mvpv-q>YH2D*`hA?|v z6y7`h*!PR{6246+K6@5xt6{AF zSN3j<=k$0mZs(=@S^&o5_Ro2Y$8Fn4oM_L`adeWJ*F#>?ylvpPIA*QK(I3|1@cN8OgWKpmiQXX*mv)c=XW{J(rI$P#wVBCymu1e(}6d z{KfNLe0pBv=QZ8pnEHsC|CnoDdj44di2o^_$2I;ZFh6Cc+)vCjmTP=^UgJy7SG?EP z{9e-kM?U&Dd%nRpI=OhBZmT%6$xJy9UBUBF@qB|B`!3%vj{DN>a=*rB`z`zr$aBr} zH9ooAR&sKP|2_ElyeIx%dcMY|=QX}${sKPM?u`5&*r(@@{Ni~Z{=@EJA3jPcd)|$o zJ?z6req8y*^FHy1^e0bx@#%SupVtG8H81y5&8M+&tbfFxJ+JZQxkH{)q@QbidS2tp zIDf~O<+X|Q{E=Tg-{2daTs%+rRGijiCg+5%c--roj0Q9I9r6`Ew~qVL?Q*}yr{^vF zGtbxf%&&znoh&_H3o_0;&~rFJeED|!$%o;^Rvf%;zxd5 z`Ni`-@rU&1`Ec%swe^YY@EI(H{|oA$a~nCnq(7_Ui}QJfe+8e{$RDuJd7$)sjgPSy z@B3-_m*eym{PcMq#&o>b-59@|&!5L{bTU0(+)(LLBNOe2_vM?+1)jI@Wk1UM^R<3V zp11L39rk(N#4?8S!%VtqUEFJYW|@sS@_KH_%e)AL^Wq33n}oac4^oac4^ zoadW-qm#jU3pLNNOGjf{?sXfPWHgxzJa6OMJ#XW`f3DxRshvmCJix}cd)|vrF1PIO zo0>WFZ-4ysydyt)(u)tSD<5Oll~2!m<%gcv`E#Dv`E#Dv`E#Cc@{LZW=Q*~jW7fzl zj5IGRe-`JCg9l!p%XN+1uX^%Zx^A-Y?VfMu~?#7RvEbmjfhCTGJDL<}!dfqF3dft!E`!-tt&Us#s|B5j?bKgdbf6nvG_>E2$ zp3k*esd*!_cpZ_(`&bp`VH~}Vc;3Jt^1OjR|aQ&qsb-`NH!~`QKdQM|Sf4dFJUX|G&TqGxz5;{uTTw&nx+#_WU{D=wy1n)Mh2; zMkYPqWG?W$jc@n7jc@n7jod%!=&wIrWe)OalpX1YuPcFBs&m;7_A3x3Kb^e^^b^e^^b^e^^oBTn~vu~?4 zV`LV_7ROWhb89|h_k1(v!+FH+c^m&d&QsR=^OpSBJ#UM@pHI(w@nPY39&zO7y7b9E zJ?|BN8UH@g!+m9d`NMcKQ5# zjgPSyKX=sPPsgU`|xA5hA$>-;5e0tu(Kl6NzPtRNUXP!Uui|2j##q&P=;(0fI_Ph_jc;1I! zJnzFVp7-L@j~4!!=a2PYJa6H@gNNVc?`%rX*ZB0j#!ts4pTB_rlKJv`Qb&IAe1mUv za`8N4w|YMLx$gM}GkQK9oAS`!zva{O7XF#%)BE1?>3IwP%=0xqJ#XRTwflF6e_)^M z9vu0_^FI8CAcFK9Ri4*WYUa?t{qYyi`@|on^Pce|Kd$`Zd9VCzuJI!~T*u5%KWCnQ z#aMWKz8$~29}WC7&)4{S-VOXv6kM}Wdj7~Sp5Nc+zgVwf*gXbL)ALnkyl*4eH72NH z4Q{c2o8L6vn=El`h&A*PKYtC!#h=`k)VAbw8?&58>&*T8uKD_??kOId;w;x-{QYg) zle=wk7GKwx_+9krN+un>l8NqG9w(U5H7nz!e^)ZWS{`ReXQ=&^aUz@1tu|)4KN60M zKL7>K8j`++x0Tbe!~3$G#l<;L@RSi~jp|@Nx%JI#%)- zFW*Py+q~Krb7Ypea>!-;xv7WUs|IGdcUEWaUNtbUIH#oNWou0QZp-6q8B=(5855~p z9%mT34sBn~L?10@hIFoOJF-cy8v6Ys>hoi~wy)JE;(W5l`3cNV4d(7uL!4j1{Cdg^ zv8!>$8L2*Z1S`iyH&+}A2QgpLm0_Q24A;C#f1Y_W+{Y>Ra>{&E&Q0t5J;r=K+5dd^ zT&?7nxoKEu=YFl7+xYkU4GLd==1}ITC{6IWwr)D_-tv=M_58>&pcn_lXt%rF-LxQ58li9fcN^4@88S)8lRrm_2|q)*$`|#1`E!DXjKYPrFkNmjui|2jfFP`_})AJht z-4*k|T>l?2e$yQN*7L{uFP_)<8~9u1e*&M*m-{t7J+JZ8u}8Nbe=q%6Jm26Oom@PB z?>6DgCi6d$pZ|Q8aTd=vn9;-k3&;Mi?A|la*Z6F|#{Uctf6gBMfcL6-zQ!k)TfU#j zNsM3e--FNRzNP1De0pBvzaajX9RDxi^SjH^^GAO1ybu3j_plEimdu`a<7W^1@R1)^ ze(}6d{2~46JnO}$=QaLU)c@C9|8m`Q>HK5;BmO*}*Z6>G>nScz%DMZ}~d#?!K0czn}lG zd)S8$OENFqE{z}jOTJ!k;Uhn;{Nj19{BN%DBRl!NjTZka#_ww$zjAzi#8}|m{#gIT z^BVtpy}%nd_!Y&mZ~4^9{by$@IK%!*NU*neb7(@7824 z@Vw5K9+Ukj_m6o-9sUtKVB^a=l=Jx-KlPuD-|t~^xkcR{`!wcX=BJ-e&wKHa|L9*w ze)O0ZpPu*PgXm?wYkpoP38j6>-;&-+xT|R+xT|Rd-1{D^1Z(EI$SWH z_liH9IXvTM+}y4{Pto&Ue0tuGpFFSg=RB|T=RB|T=RDu!4|<-pQ>{rOlk@o|bAjh| z{+#D+e7omue7onp_^7|=c`rUJ?9Gp!_llq6(~D0ox79H_b)MZ^^Mn57=dkg8&f}l+ zyq=#q&+Gg-&o}u-CxaC~hYdsP^cva7r01K=1)kUWbDp>H?Vh*s?Vk7I)AL?@dft)G zTIY84^GM`!yOb}+zYAaF-HFfpHVx-QKg@YvwBscIbDr1vbDnSVjZQ9}-*bP=Nt5~i zo-ddGck=vvgBknrf8*Hytvo+p{4>uV z`RG$ue(}6d{KfNb{Om6uKJw$rFP`^_zxc(APcF9{&-dR?k>mF-aK&G;D?VbM&(9z0 zAMro+jj#WCy`KKl2I$~QW> zc%Heb3kiJJ${cMG3D>W%O68#V}8kN#2opTD~`zhDBUji zYw^?b7XF#%YkYd%!v7h$`Z?Fh75n^mcaQwyc_02m5JBn(rGI7q`{PHSdGlFEF7YEj zuKeP8pZ*Q$ckW+)Ps))0GtVFEAMumR?YGpP`}2sb&vzJ8@ACMPp0Dvy%U$)Kj!hnW z0sp1q`6Iu0es9Myexs9%=l9r+%;d~l57YAvX7upi(e}URw#%Hz{TiR1*ZAq!l;`&T zZT$4Sg@5MxYW&$_7Cv5E_56`vJnzGQ*gfpSFP?YfXOH>tksnun@w`v`#q(Z#&Vw!d zGtVFEzj)rle~0l^^L&j@F1N);LI02VIXWj41%Lk)@AWl%@5nEnZ}6L*uQK1lxv8)# zF<;Wk;o&vmC$xe4w|?Be2m2+T?~dmTaqQT->6Q2n%+${FIFrYlZ9Xu6Mc!ROlQ;Q$q-T$l zEN+qCHdE&IWdDx;mh%v|cU^OOwx19NagszSgb>zXktd0|HU(Q4yEoX*wu5LS8POlnjzO2<% zt53xFWRJ6~&sAscUNyw|JH}C3ldHxIzfSLqj46H&Dc3kJPUrjH@{`l`{K&Q5<+|y=<9(CgYkc~>$u~N=c%JU8 zIH$=xt_NA-YcOL!&aS7c@jpM!t*2|@m-`W6UEQ*_ZY@9byvCQGlV8E)XNJ=AM}G0V z5C38Jun!-W%$|4SXHWX@ksnun@w`v`#q(Z#-dEQ6ay{LTsDCD=@c{B%zwIKFuP$S{>}4wE&dC}@1?SCy7c_9{t# ze)gCTANg_R7ti~|AJU&(;KkqP^SPhT>i;{&*Z0c!lAb@-KjP*ex4u4(+r zxu5iWjZe>O`ANqnzI2*&{*hli-{2daOwSiLRB~=)((_H`0?+IGInV2S>0!I)ZG5}u zz4-LJ7ax|4d&Q6bRKCg12}u-?MC zn`0M!@JBkAi@BwdNzXT#3p}s$=RB|T=R9xY+dc2aCzso5%}iX6(DRP`=t(a=xUPJR zSyw(i@0A~9CwgAz&v{H?Vk7I zi~3XMV=_Pe@r$^<_|cQ%eU3Fhah^hcT>138SN!z6A3u3s=g)aw=g)aw=g)b*$shMT zYx7w1MkeR;i1VDe#`6k)+Vcuuddz;`M$eDr_j?i^*z#vBhWPvW!t*YC=vGe#yo-()WEyw0EVyw0EV zyp3=7yceII_u|v@j{JNbvbkK3(DPpLm+|ite~H_RpFCgQ=j?iC&ht8d&ht8d&ht&a z(aFX0%zY*2P3G(K`FgqyX7qeI_V|41@%Q27kN8RVo%#H{#=l%~#P#@mtbA6s7C&>K z@i*~3rnCDtHU75c`{%#r?a6h$AARN;Klr(heBv*j z_u&`M`|yQdT7R{UFy(m(S1F_^4$(qbS;O5`Q{2 z`A2>y^mmM9u6uCgqkq4se4~?#=l9$kV{S6jzj1Nv;h*#OVH?codAWYP%!%Bu@#%Su zFW0}9ZkPKtK0UATU!JfQa{eCHndfVKdfvkS`NZ=_e(}5yzj)q*ZAq!U$$ zZ}5#yE}m!XbX@QA^T}^@&o`LS^K$L4SL7kB|9HEOS&dK6Yy4lqOl#m?F4FCCzs4^) zXwSFPv8f;1`?vX_=e77H6R)k#=hJH>zj)q<|FC=5hhIGJ#?PMj;Uhn;{Nj0^_>1Sg z`1HJmf9CmP{TI($_-CH4@yX@3_#){45kE&KgreZ@f5%wneE!HUo^SA*p06_F{rSSK z#C%Ds6NlG?pU?*GOTS$5dIwFGI5tsV(dMr8eR(Z&yxur4i^uD6rZ(E*Ou0L6dvdpp zS=KM8#fjg=dF@Ij9ler?@?9Qh926KdE90bpS2DqhPG8BSXV)^5TW!p8ei1f+HK7PID0bDvXZqa{nJiv!H>(4Sa>5#L1 z$roPj=8N9W!?a1b@cBWeMPj;p@Hg~TY`l#&?EXO&H&G(hLt$R7VNB9XYzP-m#+8@|Q{(irK_pgsJN2cVTt(#us z@8>B4U*0=;kC?d@SB<~t!@y6Rlq=b;BOiUre7Nu*vL8!7@9ilybI5;x{3r(3_(QdY z@#7Ug^5e=!|GM(&Yp?tuJJH=bzg(wreeqQP@3rw2J+AYw;9RqR_s8)C z?sH%L+|>L>9QX0)x+9-{Z^mzQa`8OfSsAlU=HHN$zdeUx{dlbJZz&%YX7s>+;Mo6A zJYVDQu_}Drf5&IWDYvrkG>nSc;1Kq zuzT2tk21>ncH?JH`tXq-SAOxlPy8YMdE6StSATsXJK6JE{I3|luX+4_#F+Y+U7?Pz z?0JoUy~6X?g@;=1bi{i5dI=;Y%0-EDb{_0H$hvyFAn zH<;1$v+L<<{MqNeH9qPUHJkcT)}Gw2<%gcP@a5b_dj7~Sp7-IyW4T6r_{ga@KYPq4 ze&olMUp(&_W7*Dk&ph(o^SA*p06_BZs*)|P_O4x%yrL`#jRjQ&&&3<_iy?4=g~9% z<%$uP&)4!CE%$5j-{<#?zfC^(O)j_h`3b_{XUjjMHh7Oq?jPeXo+p>vD*qwXp=8Sa zBmZIdFuB~W;iJjf^W<`S;3JfaIsTASwdP}eUWWMLpk6*+YmUEoo_XQ+m>;~>%rBlN zm)m>(hVZumK0Qw^w+H^{_{yFqm)m>(s2?ysehQsTF1PpmG8C3 ze;l)5M$cn=H@3!^@KL-k++;5Byv`r($K-jPKj(R!A8QFc8n&n{qvw10Z*OmAei+=L z&b|0y0QK=V#9)s&C0AvU?s&rfBXI5v8|$qWbF z{5#d{oZRx$d|u~|_G9wA&L6JBm}8wEa7RA_UCO-FsPR*bAjiZF(=Pl@tSMOr@U7q_fublmp|es#moCP zTKvOxnDe6Y5s=-J^n5(Hng4Lkw$F!4{b}(BSJ>k(aclf-C_gxe{jAjIh8No7M}E5b zKMnBd`50WYf5Y|8)3E1t{uNCfIgcdI>-^#I6+N%>=RB|T=RDu!8=WjXpKEi=wLd?f zN1W%(HJ(@aqy4yhUf~bdVa~CZpA9dtdq#L(iGSMjDu2@R3V$p=NNVPCTdDb2pBr9a z&%f}z8vmr{RsN*s75=p675?z}qUROt;Xr#*kpAM|{w%}UK1nVioznF~Cx z^GEw}zi)G%=j4IW&xy8h-Jr)0#|(Iep4a)YQqA){a697<>9czhQFZdi@)KL_n1AM- zTQn!O2jimL3(e<|k^FEz-@~8ryv`3LJU*Y-`E#Dv`J;YFp4a(vo^SGvPUd``wNtH0 zBNO$^&tbzr55xAP&d2fq-nYPQ#vI4dXg?;;>-^z5jQQx`58YP*x04@oXuqyU{dM!v z`R4OTD44$f4fiGN_nksTdh$6wd-@lVnDav}x98(4A^m;%ne%){{G;=zIG@+~ zqkc%9*ZE_91NV!Xf1{JZd<#tWZM9~MOnSb_Tri*4`J?^F`!=cGt2tRPpYMo2C}YF} z(UUqK?Hibn(epigyw)5)g6fPvcxH$nJ*LM$#t%WMV=B+*NAe^5!uQGfI$ke~^smT^ z!XL{IvcvC5Dg5DiRP?-P$4P!h{g6Db^XEL@>KF26@`mXjKv&(Akvj(qt&2>IEo+^_NJd5!-a^NsJy_oQn4E$2hyny&yGiGf8%_<=})7Ri|3h}O3s_i zw01$=^9^S7u>4-IY`fgA@#%Suf4yQpb8SCwQ{&U~8vpgFd@ozpp4_kTnPZKQzu(tw zKy6h$f8-a>`|#nh>|q~%@w^*9d)|kS{J8Rq=Y8TYp7-MKe&oD6*VDb{@&0@LpLzaR z|KXT?J;iMY{~gBHyX;}<`5GT%G2H`E`03c>pBM07DxN>`i|6-t9OE}Sxp;n$-N;P- z3EF<#>zniW1~VLx*CO{B&%}PkUeHzj)q<{}4nF>)eNr!tmx_JmW`xT=~WGUisf#<41P5jv0Nq_jf3( z;E`j^pLsrw3t9gtpX^^te%@g$*F0b2lgn)x&*$-@QG2^y@m_S@kzYLD;5R*AWxj=) zFYHRpm+(!g^qTNGxqqAA{qxr^X&hBpk`t+=&4C?%kdM&Unek1H@4ze`uQQX!!{7DC zS=?P`rncIcsXxy030AECl}tK%B@;chJkHSl_I_{Ylm1=VcCePm8Pd7B?Z{?ytF7&7 z%|F@W)W#c(#uac1Piuw;VIKOZkYC&$aaN zZC*7nwZ7ZEYGA507IP_b+|F%md)otGEoTa^8rt5D6D77hPB1T~TJ6ZE@anR*qmP!y zDZIKYPGpl_H89nhf3o+HHa2&!8shBs>N)e$H+SUt7Oso6k3W}ZR8fm~UDeUNXCS>y z7PlPtH_UJV-Xr`3*PnlP{|8=kzb^ZJzkz-}#(d!a9h|>c?i-97Uim@ddA~uaA9+9TpBTUY ztlZl>)<5Ep9@pc)g30@l|HA&iI{kq0*Hu3^HS-bi46U0k#`Ca~!HDMycWTrfTX56_u&`MyYaIpefY?aE5CT&C;rgA&i$J`uf_k0 z@jJh6dKnL5?i&4YyX>Rrv{I8kc_8a2;qVk(_@2V5B z=l6R8c?^r3G?~XWdW+{9%$R5Syo_wS+^_LdeleQ<2>CegNBO+ZndfVKdS2sWUIMwN zew1#P`!zm2Z{f?i4eD(7{E=Vs;lqc=a*g=#kyCGe_Lxun$d4-@{p-pvp7+U57&FOZ z8vna^-gbQ5^fDfV)1rUm^TOlnrl0fE*i3%-9b@+Qis!52H+#O3AET2IWA=PIaO!uKG-4Gv&X%Fa3r-%bsuK z$LM4*qvx?b?^7caPP)18Ms{#jNY5jFdfF~uBlCdT`WEs`F1JViXg}VbN6-0lo+p>v zO8m&w#XOG4yWiIM|2^PIdftnVHs91D-)B|)A*r49a~aG}Hy@FV^lvx+zb8D;ymMR0 zKR&n{IgcdIlgsUqKRmvo=gH;v$RG7X@;tfR9{FvzpZN{E=y`Ivz2O_33`X?){n(vh z;@If-^DvOrF>I!*v)vrt_nbMm*5XAM{u^KPWrZGseb#uSxEw8n``= zC(rlgXNVs?>BR@Pn?Je!R_uqW2jch&bD{BdSvvBAmt4*DiR{GtHadTJd_~Xe{82xk zet*IV`ffgQ|MHJ(@aqy4yh zUf~bdVa{$x^Q_I{h%8CI1^bV0=EW=V#9II)Bs;$@4mY&ht(FpyydT)tWRiF`oH3tWqaqdBE8F z7V5kia~en2Scq}o{=ALOAFji#FaEJ{#6HyHAM*g}uQUF!^9cH^n?LgT0{E;;ZsYrf z^AO7F@`#^wZW_McA(z`z{>XV&^lJxy-1FjnPU7E?sd3MD@JHuSaXzo}=RB|T$NUEF z7u63&CxiJGm|vgoPGxDDk8 zt>*WnVxAiODbMTikNV-~_&Kc3AM+dX5k24J8=VYh_I%2HHRny{aoykI`35tNBl$go zvz*lU^t{HG--9@t&)4|$yvF~II-FlOy_)lwAH4tmJuK8#^}fe3{=(DZALAF#`|#1` ze4cXSXAk@Eksnt+`q!0Dzl7R5o%>DHC%N2~dc8l7;QjadKU-(e09>o%Nu{>U$V=)*6b_u*q~yXFV{ z>`9;ai|2j#=wH|Pi|2jfNA@|Nk3KH-dhdC>|6c!RoQyElORw{wCT`(}zcGPSpeXyL#K4&fP&!;sI^VyD5cy(FZg;$p`g;$p`kwVf{ThG&{P0^i-<|X2=MNvA zN7qg7`5O!^5e=c zp7)8rc;1Uo&ujeGr}FvyN7Ves%IEXP`bYdv!3(;7u2*>enmqpr{IPY@%XqlGzi_#v z*b@IM_+#s)SNToPA9GSXpY93Rna6d1i{~56=o$IEjC8x)ukllTpdUDo!={@?f_MAwKpYB21_;PL|J%8jE&ujUS@%Qsfjrj19m+W~re)g~rANg_R z7ti~|Up(){r{^{Pck#UK_`2z(Uhh3DpBElqH~pNS#%A*T@6V&_rdRn*&sUw0@7pBz z*qO=6LEDdeeW!assFyfitIX(m>GSsfEuWs(_?Ig}%IE7d&)4El^{2=CFJMw=SoV&lX9E#-`u19;CY=t+KTQ z4}au56$BIN+>swW=EbMyd-yZ!>Gtqv)@AA7qp2h3k>q)uKRmvo=XL(5ACl*Fe%tNR z|25Ay`9>#$6+KTEa2w{1;gt0lL}O&q^JH;*!(8Bba=AV7NBi;idh(nHz+arI}56Sc7a(m>@d7fNuZ}>(h)APvv zCi`}ViDTn@zR6tRd7VGnkGyZw$VrTUxDI2k_4qfu#6FHV577B@^Z6eBjOTm!7y~2c zk?1imeuycICH!|jreghEF8_uXS%yz{kVHx;Sbm0mOY^H(bZF)SNPMOSNW5kSNW5kci{`q ztNcmNtNcmNYy4TyEBxW{Mb9hzQ9taSSNPMOKj#m6p0&Bs^G)Ug&+Gire%$ZdoaZ^l zKU{}fzIM|17qoHs{(MJ%rap)5;g5Js%wv@N#J?Vxui_nW0_ur>~dGS7{{29;d{B5W{k$v8`QSvi9zIfk8;g9+ud0x-YoadYTLC^DA5bR^k7@3^U zH<=4Ouk%OyF?n9+57%MLaR(nm;yUbkogY5yw6Ckp8tLJWJg-8}_wYlxTJL*+AIHBJ zpX0NKKawAExn+M~+?CJN@_A&&^E!Xd^Bw%D=WTTUs2`H&b^e^^n|z~_!Fo$`jqUv0 zXJpdzyw7)DhhupF_nR7Xs`D#G^fh^4=()=CoJ9Vd=k@%A>C(98b^bQx`5ykr^CalA zcpmKGk9ZRN*sorEdS2&;Fzn|kj{hD$T56srkjw4)_zj-7$B&ru_hC1$@s;n}X#6?P z>-ib;8~XQ)>Nlg4i|14Bt9{yJ*48cFKZoV@Ssu6d^9}hug0q~|`1E`u=ICMhJ%}^U z*ZBMWc_seu;(HwLpX=X~s`0m+4=sND{r)|ypTVy^KY!$-PhI(?MttH&n_c4v|B}X$ zPyEP_E5CT&Cw}@1tx)P8e?L&4D~{Lf40uzvHlT%_PiFq{2t}_y6NZfr`Xaw z^S9^GbH^U*psB8vpgF zd@uXV^EEy_ukrEssM+>?i6g&w-iKdm#D|aZpFQu!&mQ*SBR{VE;(4F=i|4)g$-ne* zsi%9-kOGkN@s@blvoGeu^!P-xu)5)=jVSo1Q=Bq<9|l#h-AIhvcNW zj>vhFndX^6+mCyF)AJ2xIAGDb>D8Dc|BBplouae(d@X)@UW@-1@aNY}KaW4f*7p1{ z{^EHp{xQCc_q1kW{>S(zjJ*b(_}Rm5`ElhJ&-=t5(oY9CPj zaQ)jK|C#4&{KU2KgYV$iI4)k{jn`*6u4Vk_-+bSu5x>#N^gP*e3`6_T-T0nVj4!+< z{Dk*;K=I%CTaeAG(f6f~7S#9$n&iCk>_pxv4%q_af7AN{K z-;1d+@w??rwsmEkD3j%JhA|Pw=*l?J_T@~(x134Ou53G69^GnVsx=?)kJy;n*i3G- zG20Fyi(8I?F!pxG$?@K?kC#L@<{EvITl`fV53Bg#(5vx%RDQH|J0}S7n{gO@;ofezsnq4?$`LduWaG} z9sIF%)9Hf{t2}Sr#y`GpdLKXKL0+Sz{bPR6r_tSrFP^_v^B>B2)`c(P_2NgzIp)We zPe*&jPhb1-d0$zp&tEWRc|UJ_-E>h;cjNa8KJQ2V3;Sd1rl0d~#_UJrb7`D>aleFAfA-Sl&Q z8k>p#75uSv)2n==lZ)r+wn|Q#%;Orp#q$kj^q72JM!H?@*Z6z?{n746`Mi&GyWFqw z_qY{4>UDn}O4gp-ukp8Bcl-OC)S=|dxsCMvkzYLT!++SvjSs)nwHrTs*oTk&xblnV zec}(@o5z)*{`>0_*@^dJuvPfq#q+k~>!#yo+{+#D~_$V#2CwX4#;o~(U{OCz9euzmOQ~5kQvOXEcY&U=8dX1j%$j{U| zi#mUJd_~Xe{82w7&+Gg-&o}u-C)4vBTV*@%`NFE4I~I6e=a2Ry@7pkLZbeRF{KIt^ zJ>L;Ox_W#*-@%{y_c40-GoJ6^<2A#c_u_|63!cY+cl~@{Kj~%G>m7Q&hyULL_vPsM z4*pPmg3J5!N`8jNSH5qf=KqRVt||ZWUas6vt`5Wf5kIM4ljrd#CH^_jH~Hh9&uw7r zq9%<@&gVl~ZtGnz*LYsxPkUbB57*(A^P=#>W!9AEHU6yURsN*sRemTjt0%)To%xS1 zwep4M`92%{5b_axk(lYPt$g8ml|SiujXzYMXg)o!@Q242J+JUb{jhsp;ZJ-1oNsh8 z=kuaAw?j=Dne=>`!?r!UNE2Uh=1t17=0T1u!BGKIcyJqeq> z!RkpI68p6${t-U8+~VD0doV8Up5KmPnB%ACd-yY+*ZEt>r1|qB91}g?!5@9jf%k1v zg3t4RMJ(4;KXMK)_mit@^Lah~InOuwMkmwrtR1xbSd&I3J>O(5@Vw5S^SsU-;dEznaGpxV?OM-u^iqg6igve9p)k?8r~}EY<8u@GoI5q`5wEO!RyQf6DVZf7B0YKCkoVJm2ISoeb7nn!lsZQ2Y2Vj^Ue{F*51- zfI4L^@Vw3+?ML39*W#b^ydM8`%JVvZ?72I7zK1{Z++e9eHUIIYR!`!fT$h_tpZNO$ z57YB{ejv#Kei{E-{NY??e{QzKt?|e5gQVvBHY$J0^Q9dXr$zsa`XPB<=g)b*$u~N= zc%Heh)9}@1M(e z^yGexzvXkO#>d}dOtd|A^zvTJx zdHhBv7timxImX;%9@pr-?CYvDn9=j{d%?2pa=*r>=QaNIdfC6%EZr{mYkYcMeHOBzQ${Ni~Ze(}5yzj)q@ zPtRNUXP!USfAPG9{|@8pUG}i%2aLsd??dCK*pk~{z<;TD{uqDpe1mUva`8N4ubi8j z%;cY-?MM8i_H#bpU`EgXK-+&*+Wv~)zvkc9`1HKSzk+kE^quU-8lRrm_`iV9b(W;t z<$jG%&ujd2Yp}EenL^Ou3qt8=YA`mZ}5#yrsoU0 z67!{R?MvjF--G3K$L<3;e!_c&pF}Nf=I`(N>|1b3Gd>)^V-vG@oWH+iCXd^g#ocx0 z7TaoLq95}dy~f1vmNOr+qgTd>@?9Qh92Dk$Z|4(jzu0T3%|srTGebI8$BC9lx7zw$ zt@(I=#KzRdCh~3W_t)K@g@9AQqt z*n0LQ9~^qMk00NyofFj9H&e`!srB9NRYRO=jcxWg)iJxADZFZEdpk~)&GIhZ|+#? zk@pBvo!--UK81^Q_jxdxW2K-B#Kh=Hg{O{sa3z?yo1lg`C>>e+OrH z-Sk+$Ay#=_xs88n-SiHA%0tSP%-bA<41OQzd^~*FBr4DpEtE`I@@zMey{(Zwll_(BuCD46q&+`eFDCI_4-k6 zVFgN^ktI>=Bg{?8k5C#(Wj41Jl3Jahvv`vcM`KePX={HN@H-IcaF`j~(DQOUsxt6} z!C?3t?jG(1KF>$~4X>x4n|{K7sF_a~ui59OANfuvSI_fY?OvlbCqw4(x!tw?2F$c$ zxV7ikTer8bdwg=a?Zhm6oPXc1zx|AH{JC?ExyR>uWe@)s@TZ@fejLX`{B2GCh|l8w z@fd&gyeED;|HJO#HGGWbmiJT3_$A+K_{h&ve)asC_*429=f8Mfi~kk#_qF`H>tp?=Id6;qeuwApdF}Kon7eQ#g)_ZKP0l6$mfx;zP-na6kNoQSHT(~|hu83t)1~gLb{4Jgz ziOM0$C!uA?Bt}Sr@g*;zGlD_kF`D@zkcM?^BVtlM@aXa=QGdu;%9y}{)RdX zd2aeK=aQcd;cv)3Ht>3Nd;9trfAzc;|J?l_)$=-k=KdAwbY3rQKFm>;PD_kNK1u*8q|xcT(Fg+H?& zOfebjA9KY2JO+B+5dS65>-_2YC7##$vwp~)*ZFgP16Mph=52ZSn~*ZH&Km_4uar|VF1ZQ!TjnD)HR zzvg)hKh@C0de4|2soNR8c+wI--s9${HtL*``oG;~o==APXXaz#y5pzk4f&aRJ{+v^3&J-@{BI)By=+4DMo&Tq-DYW-kTTMxIddrrph#q-F$%&kBsH#$Z=(D8Y0#|v z6oxlHn6qa7mFI6EG;MsR>J!{@-bUk3&oA-3A^tnwbIIb^h!) z?&odJ^DOaC*Ws2tZ-{^DxELO=@^KE%e_W5a&HS1367YbTpK|D34<~mU^PhLLGS-;e z`*)n$*Lg0dw>-V$8pc<4_ulyFc?(E>xTXC~X3kxINio^#2k*P!c|HE=`6Zs$`Llk=p4a(vegjuLKjb@|4A%EF zrX1V!D*w5u87GsTA2P+mb9n$)Jg@U-$C2mfw~~uaP9*;6IuwuT@!v0bUgvL@Ja6I8 zd~XohHs%N8GvP@zD&x9oZlb>UrkAlanFy_}t&>`2kb%+}=lUmXjWz zp4a&8eGq5YS$ceWUgLjj?&J9QQt#1gU-$T1@tDTP?=dIF>%Ai%W4e?Nk1ge+&#U>j zJnz@!zj}TRzj}TRzwyhv^XLapPSt0sX@CCDp0jwYf5cxrzkf~{@AvVy_fcMYZu$v7 z$Cl^spW%n;=cXU|PA6B-@40a@kI((Bo*yv9^X+}XXP)oz>3NNRzu)%zn$JAnjMd=0;Peht5Reht5R zeifho_3+O;f2{xNc@O^w%&*?_bbEZv#e5Eg`;((H#c#Q7_WT#{zr5tvt?Q0_jPGZa zKlFT;`8_ikJ7(GYW1Jx~`zLkl2|uN+oS#o#%75Pf{@wY*KhXC-I(={R(Bsqd8vhPH zpHp<^`5vF1*Z4ny&*v<)Zf{@r`1HKS&uz!+`6Iu2ehvRa5<#hv@%YZgk7`-XXPqkb zITt_jvy@*wzh-<>`WKIHSDRmebC;c1A1S>pF zdNwjnWK-PgW2!a(?5}xkZf3Xn;v74KEN)p_w|CdA)9=$yJ0H(pw?07|I#jl-vnW0| zvTo+*sC=>YI47vFw=#CNn1!j0-R@NfQ>`(&#lbXtHH_JKHH?Wm4evW^-&afHe6k)R znPAbYf%)7PFn6yy;#6z?IeuAmTv^=Z$cbRBC7f3D{S zhHKkDUXIT-&)ys|QxNHV1b$L%yvOwTy2szoH;A9RF(3GU#b?buH{Hgce{Q;spYxFO z)8_4%AB?y7%a?yUAMq~bqZn56#YYSCvy_kVUCK}CPkvdIAAotjL7Bhp`Mmk(rk~HR z`^#-VANe=Do_lWkIsai!eL_B`o}1p~JDrT0k^K+G_AQOApLu-lFY9B-6c4xO*XzFR z(fK_-JwJ$9_&C3`Uw``<!9$S{5rTpsoHSt%^ui|q(ukpV%-?yEAZhF^g;)nM8!t>8fKj-JUnf>q^ z{P0`H^WFJdJU_^f)5+EI**)Euhs^Bfl(r}Qo}&>6y6C7>Vb4UK`)p`SqMV zq~&MU4;UX){p7LB<2!!c`VHgD_568$oKB|au?=IQUgf;okSVo2?t7b`HV>#jIiAt^ zv*VaOuk){Y-oQ^2>BEEvWGr?5+L_&+Gg-zkw^BAMz(X&$-JQO>2v^%X-33x}uvt zJN=|N)xPGr^hXb8&kvcY!Nb2(Jb`?0KC(c3Q5h{GQft$**euolXYxdt&0ht*~W`BRoH3iihX&fKX*Uuk&Zek>_m& zIg$9UdEOBJrROXf_}FLrJ;3_5@MkO|pV4o%D>)QOdU)$>~XQ~%Bn z>szm%IS-S|ZMWtx>_;jOp8%29KR0u#@Gp8^Jh|L< z@{?wod!B-4jsNzPK0tDXxnaD{h$d$Kj3-m4jrmV+bH~qozu)%qKf~vG-on4)c?&c@+Uq2zIGmR?qs4Zufrm=Z7)p z_0r@x?$=?J_^0b|O9C;(kD%?zJ@(Z_f0Iy<@Cj^a=6@zxKrU(U~K`I(+y;(0^- zcf>O7d7VG!H+p`^cRIOxKIgtWrbA}$xyAhc{D3JQZto*F%Sn$<&ujelK8W_(O8dIU z-><_y9A6&SOW*K)fN#ouQa%1wJf_8u-(yaU=h2amFjV$G(&#U>j?D;kMuXAV( zzj}TRpMFWTm-1BmbJ$N!)hD^!+W2SBSv=N1;xC@p;&1PxoPTcmdHgxHJb(ZEGW*>0 zF5l_o>iL`-KlAvE-ex^7`R+2s^X+}XXP)oz>G?s-!oT0KyH@tsJw83J@n4_oec2x| zjvrt0n6|Hbe0pBv8-4_z&jM;+ANkeuYxo$?;^8%X%>UK=;`uf4*Lq*WubyAS zPwCJ5!Bzb1-&EV<{Rn=)*Z-O4kM&P3w{<+;@26V+513y+l=<7P1ABbTzkCivi9ff^ zPWS@;m%?vdcjRMyKdbzq=ex}BnVDnn=48ms&PiH*!cSqz`T69f^ye-!HNZ2|Bc7Xn z&cB0y{kiGq{GY(T{@nC)e$MT9J%7x9^}Lqbo9$v#oVXWq}PL=wc&d*YQ_57;* zZ%gCH_?GiFp7_r^pU3FYKY9P5`==e>Gtc+8bK7(yDv+j@i_m6Sz*I6CR zj~JW0UhgwEag#63TtjF11S_10F$rg)d{;1UX}lxz$$E@rf)yTTN@sN6F-GE6U*FZ5 zfA+_z&CTpkUz}ryki{+QAbC11%b)Pm&OyuT)+gY8FL~fr#xIHwj;x!T&l&TjH{+b3 z#@<{p3sW1r-K(}d2ve=G%^#=PtByFw%*Lx>Oq6AK-@%mH@zs*r_i!fS3uiW7jT|F- z)xlJ2{@Gvi+T6q#=KZN7&es>NM=>6<_Iu~O&noklS7dD8y7e7P;%Zzc3oJ_27Ff6C0_{4C`+^}_WDKd;W&L;c&wm%d&&zC7Qc#NVFJ zn}2S4ldpIAxx)!OANe=Do_lWkIsYN&pODX~=caf0PA7v=Jio6$k2N!79-sTm`ar$B zmHp9?DRtPMU$6VNN9XtW^t{GzuMhl;ah!W@dN%NW&Bc)Yxu~|Qhu$MHSt%^uj2E(vc`XXh6|qa+U67H*Qd_)`D6Vf z{%2eL-|z7JJ@bDB|JTm-!yX^=Pu5Xd{JCxBe+B<*=lbE1kMaGi@|{iwvv__#CvbG~ zka>LWZ}t3uDV}VF4}BH?tpp!<_xC|uoHv6XbbvOUU_~-H?QRVfRQlE4D>Uk~y z+f;sPz3BXz@x{2_%6d}C&kbF@&x~(5Z==RPJHMWd@!v536MjJbn(8OlcCP>N>(*}= z-{Sc}ewsr%jO`BnJ=*Bt-M_|o%w z{M%H0q7kpHD&spnzr^!;{Ih<@p4a(vegjuLKjb@|43>BvwRxU%CzGBZGQ|UPd7$TY z{_HsB^}NoXu0zSSfj>2mSRXq7n&&P2nfuYvX=8ryPQ2B-A55*1=PmKi@WD0nXYzyb zHS=eV2UDMI`9bdIj@QKVdj6;9mv~<1&-x*IUgyvG4dW}GAM%|}rsq+aTUq1C7{k@| z+O(5N&kvaap4a)aUoWS)$=O_-~UtMOm-yvo1md4<2F6ka$#kJf*e_tj~8+>cMsFM3|#&-!8ayu!ci`E$P0 z$@DyHGt%=zW`O5){_HsJ=WWjOd~Ln4rMfo6kGIUP=MDTzp11I?JWtocpYdceiZTCq zqkp~4xVi1lsj?rL;ge_KU-7(!j|5G7Ugux)yw0EXL-xGRzvlTNf70`;9c~}?txhJ| z@;a>I$+I5h&j)rJL>SB*L(i&+mOrckw0CB;(2npJ@QlHKfC7<+F1Fx z&gkc({>=PI519FL9z#^N`nh@?_Th6n<2%J?y}aK>@zd~H^D{ZVybk;DImh^?=a;PK z4f(kv{s}*1&+Gg-zk&N%&A-#hV17@`_hb8zb0-sR#q&dEzhnt#n z$^#Myej$EW8t{`=omOt$1GJ^bQa(Jkl#f2I=HIgC*W|x?eht6Q(KUSfCDmTaQ~kVy=cnqETyAarv*#=x>mTtK z&uj6w_fgJ2H~l>R99ur0@Mp~5KfmPHt?Q2QgD30xVSb!W29xV~$xS!rA@lf*-ex_2 z&J@qL_XW3oZ(sNL^n4!AZp?W-e8=wkK0a^L9-p4q`1t+)-00Tr z?du~S`6!-T!>^uS!$*BDjUW8t`8DxZ&#&RvdSAn@o?pe!{-uv=f8Os$@cDcFpLzaR z|KxIO-#O4CeRD%&~WKGGu1w zB&|N}^M~vC0W&oSdTx3*X5rtFTRx|#9lQ2*FMfJni~lF^uRk~aJpLS8u9NZWHvixi zPipaxneFGc{12EwYRyRg=lCd$)%@c5W%*gkZ|fzEL;L5XpEM8Kv9r8x$2X;a@%WbW zHlF;Sc|OG;>4pC2%nd!Fy{GuOw*py0ne7O(g$KI7%c$9NXc=g;YmuhYq3 zi08>ZVM=`IJ?SUK%GZzi&3;e68|9a6^Aj~|pZWKX%>A0HgIPV^XJ(K4;;ifSK64W{ z`Ivc(&+-XYIFpW!j1%P>9;Zx->@df;kMoJXi@zfK4pummo{fwXJ?A+XM?Te>e=hUf z!PMsF?luQ=?2smpHfH0uc5b$>TStNaz2rf*9KW<5X!pA*j`Y)V&R(~CaQM9z8((Za z&Iw|CbHyx7ZR~chI^tAojBar-#~#2KgfknjhQ*0F8y;s;pnu%Q`E0xz)_06ic$}P< zV28ztY|^U^rdspQ{xQ<#CdM%DPaScN9g(f!e>?v}3OMax7x4jJ&1b!=%Fj|h9lb99`+QoGAB->0Hz@p{FlTu_Z~nRI=kx0h zKF>$~4X@{(n|{uJm{XrHUQ^Fa@A92aZuY%zdG79GZ1nu`xxY>QoioM5?fLcA?d|Ix zpPt{hoL4nw;kVZxe#SWd+_^r`vWAcREag|vuZh3b<0?Kqukl}>>-G6hsQFK2{(i*kkLC5T{t^GP ztv>H}c>bQ(PQQZrtI-dbf2R7+v1R^O@V^%RD_--w@-cpludL(Ik8^(xJ>O-1&oS?A zJ34d7JU;igdVatZkG0>IY5U&3?(x}wjo*IX=gjjxKDpd($DBy~s8`56k7HYV?du+Y z+ti#N`0d&Tb+&u{$giIF#Bb++*ge07kDM;e5BOy~*Tj$fEag|vuZcgUe`S3lJ7qnu z#s97OzU};T(`$d4a}+Ya+V2a`KR5lHpXX-w!*7_gzjZv{oxjENgZwz1jG8H)r+YZY zO-_c)?BtZTC;a64*v}Vi`Oh7u7o*%?4{M#K7-E*GLJl~6d&#w~yhC00d z-1PH0xg}+M$npP(I^i0=eSM6-dS1&9#s%r|@(~pC!tJe$`}^am)B!giL6OVt34bm> z;1`~jpE-USv{Ls<{M%H1s^_)%Hw5Az-&&6ve=a`=s(4=GPtUJsTmEPLfccl#^UC<< zxtZtJ_;u?yjBoM$AU{qg)ANlRN{wFk{E!*od7VEyj@k1%f4UB(K6HMXNB((AF1K~w zHe)LJ-|&5(>(5Oe@iC{TJ#UNOe;*`bk{Vydr{{IPMB>g5xW@R?_qqJz%kk9XPxUjE ze_mUadBD%RVI7n7`GlYB#_9Pbp4a1_^+Wc&&L6wI^?%RvL;j@aQJd#EcQP?va(!jU z4Dh_ppB=~Sd7VF9hmvcZf6enc|C;A5{EN@uIHF^T65{MqAW@x0ET^+Wc&&cEjQA>Zj_>@&XSV~}{yV?4La z-lQ&59bJe4_%C~2=Pmpzp11HZ zzBBs~@%$=2J#XM6e1H7M`F~cQ3Ge40;~w&-J%9Y1u=!Qa&ogdr-}A3|UXTBp=ZAc! zldI?Ru~cO@IT#*fK-`O~}_d%RpXX)|jc`g2L&3zmn zU+O)2?du+YE1uW*_&tts$LpmdA7i?dpLRZZZLlVO^m#S^wlemHw;*ZBDT z{@myvQ766oq>lXR`8E9N`89mZ?c(`m{NnjF{Ob8N{Ob8N{OXle{N2Cr*4^(tiO=8b z|IG8p`cG~0eth4S@gDJi!2IexPq)X%T*P_5=5tQ?xo!5(7x2Hl#EXP(bB*5)7a7tee6XP)oz$>nz2$NRi~ zQcrMGS<&cE|Nxx4&GtW(LYp~7fBeOc4 zfB#qq+2iSVqdI2W9A|Ym|NfDg-R)!MF-{)oG4Xd>iZ7B$M@KSIzTt7EIkBMc;Y{Q) zoXHvw9wT1+jI4R_sV`1#Zf3Xnn6JAxQ#<)V`K0}ITSI1MGauWz*}iV)KDgh@=g1bH zy6?xjj&kxFuiE&sN*U(_HTLF;S(w_`?Ot`nY4)mvY4&Ouv+-&e6Lqxt$7tO5G$o>$ z=zBO5b1IzKcr|j2=v4=^u35!Z$yrDteT6um{bN+mJNKEWi@cU_#97ZZ_n7JLROZdL zb_A=$#d8E5hYr`a`FY`wc_fS54l^~lRR^W@cU^OrCVt`m#m4^w@&8fIomAJ{Zbv@GbSWR+S;|K~R`YLZ{;bMB^0SnW z@m0g;2WQX&~F~8d9rdN;m>YpCh$M+Y^DLw=HZ+Ok;rdOx;`Pu0@zjeZopYZaFK{d~&(%#4P+T z&p2oQoQ@OHGt>LeP4DsPc@Mv>nUDCakELHdK0WW@-@)WL^49Z5e)aqs{)gSeYxo$f zEqi7ezj$m7ANg6zuby8MfA#z-KIf~4{|WW~sm!U?^T+zHp4a&QbidvH>7M=YEBL<_ ze(U)jpPtwFxozfu1^;W|x1K-ptLF!Nr<1Ga={Al*b4_)~%uY@!ecJ1LUuXZG=WB;4 z?#*p;9>%X9`FsBr{te?ebD!3p3x&VU-cMXSwto)SH+A1C`Dyt-p-yiISN54(rg@G)jf^OMT7)TLv5?fFN3mh!9TSLJ_O8b7jA>fIB6``q-_^T+zHp4a%T zAKK@px1R6uG5_RvP~+#e*>AsL&i>Z%{E=ThKj1r^Ts_YG=UuJa+Ya z-x~kw_r5j$w~OEV*7z6;%!ynlsIA@Y?dxOytLNA7tLNA7(dXj%W&Gl?HT>%NHT>%N zHT;zR?6FmRI>y8Qi2CO-a_jkH{a4Rx{Pug_?eTu=`5qthPdu;jbKB!Owq4I3`PK6S z{?PMXrktOzZr~VP_xz9<;CY>Y&GS0{n&)-?HP5f&)AOtN^!!4;cx)A)o?pcWcWM0e z{HplV+9i3?$M<_)=U?-@&cEjQA%D{IoVy%@w02CptS9`WE4uj1{2e~{xqW@R9rqn* zE7wQ#~1HeU%mB~p{A-@q`PV$J^XEK? zF=gJlJvskB$8YLy3BSq9D*i1WcWd=Iou8$AdcMh1==jp}>-fm4ocHkL-|u-n{%fAs z`PV!@-=k;*ZJ2xKjb@|OwY4+x;5!!((^-Rfai7oHP7q(Yo6En*F3+9 zkNOkOui~QySM$a5tK#SUT*W7s+wPpbupgo4*YUIGeSE*?b^bNa>-=k;AM%|}2CJN( z-=y}tHREK`^Q@OHGr;pY|C;A@{x#3*{A-?H#i!?2@lh}0`Gx#a>w}uV;7NLZRs41S zuZh3Ly^5bbUq6R`ZmtO)^6&S&&cEh)oqx^qL%!3=)$`0Xw@uE6%=}%@G%Qc}$>*E* z^Yi6+wZoKg{OzUQJCN@eIQy>YBY(e7O5y)-$1^hTnc03nwtd};|NZ?5XYt>j(c^Nz zZCi)!>mGkA9wV3ACg+l$4d-n(<@@tTKE`w@zj~f=a~l&sa=J8r@JpRCZf;}ZubwBD z+ZcZJJh|M)@Q;3p=9Bk+`#yddDcC1%{{gP}htB=5$NES7&yUx=_&M+Sf5H6yOPRmz zcjnvIJwCrbPcFCb`MGV5fBZUik^aQ^epcgmI=OoOeQuhVhs=LL{{Q8rjq|o&haE6w z?EVvN|FewUndf_adS2uI^Zj=FXT|e9K0UATzoJgQDxUB0>3NO+1$;iY0kze=PwL38 zo?pZNuzPq7A0=Nrzl>izzlM+eEag|vuZcgUKYL~spI+4Xe?tBLsm!l`K>hbTf2@DR zUp&t(Kd*6`_^0Ln0R9ifMXl$1e0pBv=eF7NU%>y;xgYk(ubv<9oldTvXY8Gv44FCq zDQ(;zRnHHYlIQl>M6bvLpC#PB?(yk)jsFQuJ`b8U~;^T+x}{KfNHep>#S=X-o|xvl-#?>Q2`wfs~Rd~W)mF_-yoA|3hF z^8>!q$@F|>cVfP!JEb1)k4o>CAH@FN??YD05$Y@Yoc-QsW~cj@)#H6;_PCE(Yr4X+QCjL%*7s-T!!kH+66-;qWaNon3h%cO((wY1h*>{YQxYft3o=WZH=V88Q zpZb_}t=wm3xA~aWn>{93+%gww?zLWK+cVd-f1fn|gr71_-`g$5Z{N>E@DZncPaW~e z=cs(2R~<~VR~<~VR~<~VSHqZ%SHqa7uFX|fGVbHPr;?3kqVM5M)Ot8Gr8Bzk=sCUW z7%FCD-};{srrkd=8?=On;{`Z??4~Sf#JL=GSp3>YH)2E>5r0v&hrW zyFQoudj?EtTfKJv-1HuQKi^P3rxWvmfA-w;9)CaI;NZ8Y5%OW3`kI?=0mbF{}BvmH9`0mhv&aOZoKms`^BBc)r0=|LwWS>hWIvBmQUq z__ohYuTJmtv(xqbw9aXtn_m6i<0sdu@jIOiX7N1Tx#y^^#fQvS_~-S+^8==MIJeFF zi}CC9_NRUR?A*7Uk50_OzunQ~p84%QrG4FtpPt`8hjmkPa^U}hJn&ijt>=4udfvmo zgWr2@`jKBfzlINw6%ViBW6W0biznB_kNhmmTu#`Rd{S3jVKU9rXiV|4?4{_&>hb@{`+U|9l1WYhixD>o2GL>iI$ZPA6B- z?`}IfZOF|3#>JzDxlSE0#gpyx-ip^p4a&IJJ!JW%xvA>zV7k&{1)GIaw74+ z!t<|+=X?A;ZiSD}#o8ptkJ{>fPvpq2p5H&`xbK$u=lCCX53k`@&oAQ_53k`PKTG-5 z^K0U-o?peM=RN#(?bLeySpU`Y9)9bD*7H3+J+JX|+oRLIU@mh#f8=`10E7R?dGMopV@+_&x87-|u;yf6enlzSGHIeNVaO-0eES$)x9p%mB~p z{A-@q`PV$J^XELw`dGy$m)ma59OkM0c!Zu`$QMtp;)A=CkMUi~r{`DYho1NG{hs&n z{hrtP*E~PuJDp6=b8dC#tdmL4519d;*ZJ2xuk){YUgux){3?E}znfz{=J))n_`wxV zuHqvJe6@N0eJmDFOVCa)bY6z&>+-=k;U&TlLiHBG5xt?Fh7Z0!EbAGPklgn*)&R*KjZcFon@#S?``5asPe$V^z zYg4WJDFV1519d;*ZJ2xuk){YUgux){3<>@zlu-KFXXepVX`>@WgV;=L5G2PTLmHf}~tLN9mUp>E!U;MR( zUp>EuUp>EuU;VO*PcFAu&&YL{=9-|?=bxUhJx|xeug?Wb_ejl3oek=FGYW&vVGUJaf%$lk*`n$DD@c2|s1L-aWUX!<2FSivE68 z?vv{A_xq$ueVp;PJ8JemzE7&h-|v%B`0c;H(XKbz*FFALJj}ScZE`O8xgmZ&x8cn5 zM}GA@x!lI^KO_;zyd;;~7(V*EnqTUaadR6JKk~DbUp>#bxs8cGrGN4G^0^1f{Q3(# z&wsz7y*H|TeXM`P|BlN)AM%q%3U*8X{{vjadtlqwJw828F1PRbxozf;U#AeBQW%(5 z)$`j_HW4T-xSaH`1HKS{}udS3;$=l{<-tI$EW8t zetWNU>-P3_kH2ks9%=kGX1uq1KkSiTJ->$kVfXMFKB|3be$sSWnSbPGDZhGtRsOf7 z@gqCM^IH7v8oPCS`}$b_)$z?0hoc;c@ZGNKWEBfqtZn}l}Gnm=w{H(_~v&VgLR(JQA z+1)-S#<94&$Hd=>?;@EWibErrDBtinWm0t4HceeNb(m{uoKN&!{1w@Eu)>)so$8!) z_8mRvwa?FaA7`0I)u$hJhsZe*AM*?5QTAppPO`W~e#?6Qq?X#; zp1j6i?|A^14wY@1(>XseeDLJ_2tP;Vi>=LGwZ$woM6h__0`fipN&_;`i}U*<4oy{t|erXUUl@{>{SQT>{SOd z6-!>5%DhbT6Mv@v)8DE2yv;s0z2nf~+BW;HjgQ`Jwp}luKPx>m^Kn3rzn^aqKjU)@ z{Pr2f)u)W%G5-C0gM)we-1Khz;ul|j{(!IlD90%1?|$y#$VYuF<mTty`^UFE_gS6Z_XFmiTvy@qWcNSU zdm@uiaD1J9vd7xzrl;TW+`}<``hA#xr<1`f`=8yN>_d%t$jr`s^d$Q~U`ifZ_qI7{ zU-$Ura{J>kX5r_yInU$QkMYy<9{w*F)82E_yYUx~dH8qmd(TZj@~h|9@Zqtg@nZ_C z<`>T|%g<7N_57OntLIno>3I+T6Y9VB-1KApSI>L+zk>hk!@1tp8;^dVZ#?|3;D0TA z(YzeNr}Luer{!1A5BN?eSI^UJ>_c--WXSx8I6pqbS@%N&rg*qr1HXd9eP8>!$7laF ze(TmHw6ZaX=V_;cHqbN0F&N7P~Qn1}xp^3!{6`Z50M`8E6xyNB2CtLK;T zi-*_nk)Ngf>iISCSI@8F)AJtw*>ls6^j;kVxf_yKe6hvMWOpFZ&Le*=@xO>aGa zkbImggc~@w(^v9-p2c#4P+fm|O#& zdA`SIel>pU-aKAM&-eJ`a*OxmGG9IXSHwxbwVprntLF#& zq363yId42}{E!*od7XbpZs$F(^RIbc=jZX7_53P6JSO|^ReXAWAzwVaijVv( zwv+S zUhr_Ozcu`tmt}nMWc?iESzS+#$0DWk2|s0hvy@NIuZo|ZU&rTp8_)RqJ@1R(?|C2p z^~HbQW{@AJlN-;M+U(T4li7IwoEhVJg?~qG=g-?<92Nd$&nx_~TiWwEt!Em~FX1ZrToV8i}JrMjUQPr_i=jiKjnExex^L{;J?mz{+#c0 zGChyE8^)yPhs*%a>-;-%JMVd&f6encf6im{{3<@U+vB=5)|05j)qJV-h51>^r{`D2 z&-MH|e)hbN@Atfq@Atfq@Av$WKk0ea4jg?vhIKOO`5`mF^E&_ja>esH|C;A@KE`6d zA8P!%x1L|cNBxP1SMlljg?#bwDn94uDn7Z~cIWJc;}Lp(9e=+LE8}2`|0Cu?zOUPQ ze%=?q-}65HE8_Qk-)6{nIvFh9Cv~24ClljV&d+b>%mB}`9?$FKn&)-?HP7q(vD@|Y zHd_AY`1Jg$`04qD{8E?8^0Sm*=l`1cYu;D!dEUmu_j|tf19h%mfAM?X$A5Kue#mz^ zxq6aCeF6CFxuZjPb3S8#pGJf&!8b0!~lwUo+CjRP|ReW-} z?KnsLkZU`yXU4A|{lo9id-&}$9e==F<9$-c`IY9Otv=hB{|qLdo1O}U&pkNuF}|Nw zzSGIo^UMwVVEz7l&dFn*_x1d9j<>^=i|7!f!y{$9b*T?!t{KY%mp7|%Y&HIt@>vw)Dp7-#-VE%sTJon%jfA#!; zKlFT;ST@pt$WQV7n*3mVm-18knUD9|i2NWs<@+{Te%du~>-P3_O7?sI z9R0|CJjVY8bBgZGZag}_$3Mp1=jXPWIey*xGx?Rg_uD;wr<1`H&-d636Vyk)r}xVb z!cY5x5|8+O$Z9!4t#hf*%ue?)tH=Ay>~SBny1UQJ?)EWJFU8$GCjM?qd5vV!(UDAy zet4Xzq!#o&oQXV!GwIpjG2%U_2Z!wQ{4h7GPg5-NgJG%jJ^R!bXZ2~HnH}n5O0_&V z3SHUbB#YZL=jhLF-`hN#yne^0L%H2^yz^Tx-#&EL#fWdz9c}1dCm6RGA{i2;rT@A@6%6S&%I)wj^ov4zCSYeW7PB5 z+J2?RxAMH#Q|5kL>R^^<3!XCbT=(_;5A^+y)4n4|GA|>UbVMW*2@j7mjpErFd9TUC zxR3Km??m<;V-y}IeH9revdLpbN6nY(#OF2t>>s0YP2!ZfuQeQTmh)dH%;XwxoT*Lv zu^h+Yed243+gtja=JTren%K@=w_n#e=NxL@>d!%J2WB}QY+}Y+_WcE3{+{#cVg3Tw z;knhPO#0Kqyn}f^WnvtPm*SY!pK(m&GdxZ(iVLu1B1Yd+|~nv-&fRiMbgbXHs2R+X%Z`lZRRw z=d=1VuJ4E|JkILRxHyqbu0I|5RBN8=PX|+*oAjrr@2{9g=jQ-x?bw;AP5SZp6YoFI zLo>(E<~v-#a~9{EL(Px-j#_$4^Jo~`fvJtrzHf8Hsn!x%+?IV_vkyANIiBxLpTn5+ zXT!c6C*~&O<2HhM^N;&DpY&&B-@yuxlm3j1lm7HE)tZ0ykC8SvF^2B>K6VKDEcNK= zduo$@JpOFv*0KH_{v2`+4jK2I{`4`mG0Oh*G1XcUclem&`Ofie0s>JA^gvVWu|e z$Ky}V1AgAaoO1Yc$T`f-ao_1rA5$Bn>`xz4ttIiNk2&@d#vz=^8j6gQEN;8?a~St= z-@y_uMKaO%a3=a1&ZIvh`wkY*e@ac+#z?Js@ux3NZEm72WPiRN(-`*eV~5nf+L@_M z`f>VGYN38!vnKKR^PF>-N8`RX{&X<4G1~pJ zSdq-epJ8!gjKbq={23M}@<@L=m}!vaNon3m@DB-`ZKcc^rw%h z);y2jB?nz^9Ok<=H?u!|aoYUpVWz&MACEs-3*9_8)}KSpA)n*Eqn6&1mwZfZjIuv{ zOtqFaf1G32A--@XYABpZfBNz{?mL*AliV7Ps&xU=u@5rXCKYdKK z=Ea{rrZzV*hVJ?P`eM2M?uircb^Eg!x8ry@{5j-I`qRhM#)!x7o1^B{TH4aM`{EqW zcZ^{;lm3j1Q#u{o_ms)#eA1thednBvWRk^gn#(yC&GF!29*t`W*(}HJTV&0PKYej( zb2IzX$F%v=!<_TyzK=SNm&>06&SBigeMg_)a_xAS+8EKF9;Vfw9_F~_t3TtI)t_-p z%+2EYP-gLG9JBf}j#>Q~$K*Vx^J4w!iL*S9qM7@czPBg*lzm(Ar-xad8F$L0KRwJp zzsNH>Pnb1-c4lgmemuwT7&pmB{k&#>*TklM|8vNh_U9nB1JmkH57X*T57X+;IA--{ z922vt_%oFGFh{#Jc^LO`KC3_D;zV5Gai(;(ev0Tj#)#|B^ErOVr`4aHeEtB}{cw8E z$Zdbtj)(aL%rB?Rnm;=;wMjode`fdB&ztqe--T~B7S$}$%R)2b!R)2b! zc(3XHqd4Y=-F0!y>d#PSaY!5!eGg}1u7oqIKjZpd{pn#^{pn#^{pn$*fqi^FFEn%G zI=S^(+Ap<#PN$vH`_4Rh_V@4j-&<~%f5WO1|7+V}?*G?ZyZxHb=e9j~^*h}1Y41O8 zzwYB~w{7j`So??fO|_$=_&MAf`Zx7?7=D?<{2Xqz&!bQHer~mPc;D3L(F^<>Zne)t z?|ALQJMPajM z+vljW-F{5qY`4!*SG#6zdfUnSJM-yb9wvVJ;okE7JT$k5Ct6n0MrG~C6z}JDKb9ej z=dur;m|*2O9MMPgUFKN?i*r4K#rYq^k~tc|q9-C)$bDE`^hrcq$bC775>l(rX}=m1 zS9VbZE6sT|t{d%Aoq%@5Plx?>e;x~?t}_@r#_R3fdZXWd=oI=Xf<-??u;{1jtm>!h ztm>!htm>x_R`I}fR`t_$R`t_$R`pW^i++k=<#kcae59YQ$5s6_U=96rI6mn6<$Yl%==Xef|_wmnBxyP}QoDUAF`_F1z13z)z zsJS^=KbhN)bNf~t7cfq{rvq4f4PIt7dAiJ^pBmj)MZ++K8@cp!p>K8CUAr--=drx+HG??P(zIUh$w zuy}lTokc$l^ELL9)PY);=YF!aAA8`f4Iuy#KMu=exg0j%9mmsyRU&RGLLu?}YaWNvTpQw(cAzB|uH8%z5d zdBPuWPi3y67PsW5h`8vd2o@M&aiOb`EXjFLAH!JmQ$$=TT~RfG+{^j#ptxlH6vNt& z@1(D)8wPU-ZFzim&KmfMW2eR-jN|v8%L+9S;W*Jx5iI&Cf<-@FXH`F4 zXH`F4XTd1NPa&-0r|Ychr|Ychr|T@vGvtkHpYgmI)_rEgu=ev$0dei;pDweip9c9F z`f2~(#5m8VeloTnjuZV9!J?lcSoG6%R`t_$R`t_$R`pW|i|Z%Zm!r?)ni|wZ_0#pZ zs-Ld2s-GfQ^iu>YGZ5e9+~4Z=GcU8Mp9XOa{ghp)*3zk;jO_=th@8IVwP^&4eu`kx zPuE$^i%$OKmXAFdpqyi z`J7GxKjG)$IYi=s?sYNY7}_^3XgPUJ!g%I6yAQ6$!+Cv)gZ_kY8c$q`2g4Z>j}%km z>)G*Y{BfyY$TK~1iPQMxBIoh^#cX~M&$DxWp3JY^Gne{>JbzZ>x$*ATx}SePue%&`^BTdtwFe4_8+OpH-DGo>@S@925)pq9`7jr#oGrusyj&$c*! z1@l)UlOELK{2Q2mGcl_N2h5Jo(C&NgAAM2JBiTGSXa|qnZspnDty9|9kA5jmjbxI= zZKr?!I5#zC!u*Kw`)D1%aOQ{ISz6!iabiHj<4jc&olo>VoLM~>na?dePV~HZP>b^) zQJ?>4s?X{{jrj@8Pevv^s4@Qs%>OYls|N?np$E58-yKhM+TF@|cjV{1owxvf#r03i znij0$!AK_a5y>Qr+fL4$eaHBfJjO9U?9Pf~VvdE!3FfV=HNt8MeGg|=4@Ty53y%{$ z=Xy}d=TDfMKUwD{*Mkc44(8p+qzAQp{sHD6CT8{EfZ6dG+R1vb&cn`}?zE!^hwYp$ zpa)}_*@Lmnoa0C)S==`HeRsaqzF&b0q-GiP70P-pr*s5AW@95OpT!~4a9oHO0|*J;Q14ckq6FqWA;7|YBajAU}$BAH}y%Q3@e zO}iCyY)kVtm?O zwwv@|ER)B@dHyo)Yc9whjEocUh+iU^wH6}#P8PSF;|KS+qu1$Vba8CN7@_asOnNXf zPI@qw$>U;ejQk$dr>;BgSgZKF^LFm}!1IHV%-w^Lac*Va zhA|rthA|rthA}ZR;eAgf6rIn;gJFGdJQ&7oJQ&E_J*Y6JJg6|IJg6|IJb2FR_>3N` zb>s8ku-&8wW10JL@p)eSac*(CVq)zf)&n0 zErc`a!N|VTgON+%|Jy+O70pEOWn3qRdUd2lY7p9@LqB4-T0fpW*#-orL4j z9otSjzHivh?JOP_Z_4=n_=3+jT}Q_p`#m3XMKZGoBm0hV5NAa)>A^@Q@);f{m}R`T zuyLmcBl}+GR$QDlzDOpIi#4X-gEijHaih$4zXx@u--APD$7j`p%w4B{op#lOgLaaa zk8qalyTpiH)`PeG`%j%%+)R2fG|u9JIA--=9J6{bj)}1e?>m^qe{peE55_U82jiG^ zzD6?1;x=L)@qQAG`3vUzFUBu2=Ac5hkrU?h_sjAZWX!RMUwPR^WtuO5tx6D}yuiepv}hBAu>opID6c1|5zrrDZb$W2X?D(vDkTG@o*J)QhIA|v>ctsyxO?{{y zjAYV-kxY6pj#)hz$E+TVV^$A_GK;g~nAL-E%<927X7ykslOBv@?p`VG>UhFE-}m^! zm>8q79^BdgmDVch@6*!r2|xKM3y=TS5`O=k?>k-F>?+xDLGFK^YdhW?QXgh590W&`a&GhUpvxS-F|f1)%R!5blasx z;O&Q(^mDqV>$s+}clSJa)W_V9p=Hf^9_P$6y0pIA&!f^udf)9#x+#)LPX#l@5s^&# zE0Rf%)dO}Zhv{UG4ooC@o}5>MeQ0DA>PxEg;_nQ z#c5|&55_UkA6c)l&)i<=JD9}y@HkUC)B1&Z)96P2IgjD@_e5b=T|u7tH~iLZ)%(!pP^k@hd%n^VH`T`ss{({#Do8WKKzTR53B(c z#qVuj9%2#ZpWv)N8J$HIw>jt6nDn5={DL^YnBqh{#V>Kp>cKc>ny`6nLYc({am?z$ zI3~s@JkFHP1^Fx<)cXDv_4(CQpNO+~P-FfxJowK}4{FT+ghT$*g+pw9F-D|;}O zna3@XNfx)5A1AeI?>jvh$)pE^nc{*-COsI*1S>pFdN49hjFEUyXZk&;GyNXanSKur znH`_u{o+B+neP1Sw4(=y?It~_Gwm)wO~`sMmYF>m$>g|2GRfk$JGL@Lu6)Y=GMFiT ziDZHm&cqmnGwH#|zSDy`)9*o@>Gz<{^m}l~?D&ixMDC=%yK|+}jvgGgoAjX0bj{mx zTs-KX+XdN!k#W+4k<3~Pk$oqN+w1FA^jZ88-1l%MJs24$Js8X6^1-51zN1_n^X@@?aoy+wwUGWc%;%6L1XMcrc9Fcrc7v>npDB zDTC4ZMBl@ijRynsxrN7xo|p53%t2>P%iNsupwjm#4=T(l51unSKBEU~-E?x+X-5wZ z+f8~Z01%Nv&my1lgGuI!t{HviT5O*eh=zQ zzXylRj?XZ*a=jS!UCt@^)`P=#;;esrx!wNF^xYrCF1gj2_U|Wy#p@*J{gXI7OnPvT zGbgipFpgP07{^3Dw{k8oFrT2}_#OX+F}WU$WL6Kx#aZWTB$F&|J9FAupNR9>Hb(z+ zzuo@H`TapH&VPqP{@vsdjL~N`&Y=g{&rZ%d?V9yq$xo-9E!N@rG z`|6Z9?GC9P9K_l28QOi%{@i1FOMgzhw2OYiPw&}Y)q{g};;g^IgSO`_BG>ZSV9RrH z_~(aMglT`)K=oiGlOBv?qL0Ndam?z$IA--=D6@Dlj#)hz$HW+g$B7zWz@!J``i?k@ zt0I|XaeKCwvd{PAiW#4w-FJE~x9`M~O}IZVC#fj;v3%bC?7-9ZXprJdKd1M?HSc-k z*Lc?O_xnvs{_5xL`++95iTJk^cO9QtKDbNybm^-2QAJDRPi49?|Mcyu{D8YOetLLS z{K&qX>sZIneqP7Vj$Xwlms^a-8|(GVKT^~9Kl`%^tK+&%@q7D>!ThWq#3cI$e3Tqh zrx;J#@B4=FvkGT9d%LUg&^4Dh$U_LHaqFdcFg_viNL}T9)unhECtl(p&vf4_HPWmg7NtZ=3 z>9ttqehgin&v{n!|A_khN9){twvEvzFh3cYJa*O`@;_kykBLbS4)b}lJgcyivrfDE zIeE>8BJQrU((}3e&*;*ae|q*mqbrh04{A*N_3G-uIOd1lS#eB^bMas(vv@F$iN1$3 zs|VxatR9SH(t{dv<{4cYbLJUc8gu3uT?1yvXBgXu^<&p(op#lO*?--3vUdA3Josmm z%TW_=d7q;({{jzMpRfAJI*${-!GFeeYjMFNJMD|wV{P>3m-J&{Ru9H8s|VwlNKts- zCGoNzjEl2+FpgP07{^TMwAH-5mXJ?5e}}ECO}IVQ=MD4d=6pt%#`HV~mg_-{`5PSa zo5>-mk7_nEHU4C?3?9e_;InFpeK{tT9nL zs2_{75NB}#x1F3x-|bA~JDgcP7#AmU6dos-#RYM3Ru9H8F-GBWRu9I-iEI`RYRqq_ z`ES;mf6ji|Aj;TugM|FTWXvgpP`+2u+GEIobI%v2Z!w@J*YGN z9@Lq3XVHU^OtQE|EuWlcu*XRcMlunXcrchLeu-q#gON)bqi`lY7}Gz<{^m}l~?D&ixMDDisxEg<7&vkX$(SyTw zlOEKWeh=zQj|=v7{CUotexU~=<7{dnEY2prNan57UKkU74``LJ3ebX$htX>ZKqx1!SikP9t>kP9t>kP^%cn^ zi`!!jI`=D$2g8_+2g8_+2LqYA2NmX&2NmX&2NmX&2hW)upV5O&-5hJM(~ce-wwv^z z&h&dwXZk%D$)pD(nP6>cofXNX2ZNbXvyn`)xJBH@x^}vi9*kttgR#u)L7nOMpw9Gr zP-pr*IAnHwMh|j~yY}oM4IvBbl5B zkxa6h(;^I&A0$mTEQyCX`Reh=z#`aP&K z{T>`LJ3gx(WbQg++i6!lIA|vxe0}jhqf2An?ig$1ca(B}YHf7-Cvk4(?>r;N#RXcN zc4qZp9J6{bj)^>m_Z>{m*D`;vk5TntT;Hn) zJNty`nVb9fsFgVF4oQ7f_gN$N$99ry`|}o26K}Z>8q@P! zNP19XetEv#z8JroO%KK~F%HEqam?z$I3~t9JWeo+2jk+b9*kpRjKbrr9*m0<*(_d( zWRk`0*?jlRBYIF{+MoMeJvd-?d{#Zkm^%IIw5uK*v=a~h_si|}-=^<^R}X5;U%>pu z$fO4~=0`AX&qP3+#RYN9>cKcBTo4{7=GY2m@k?mm!*?;g_Cowy;;xDx+@*ZFbXEMQqNVYtGF_Q}hZl~otWDSP zv!B=Tvrkv?$>kQ+r1~e7T>8)ctio-dV^EQ}`@xgq_tCQo)%N?oVf?JZS$FRY!1U~X{5-g-UF!{>RT#m{-l_3MFf${PNgqWr z>83~~22?y1%oImNGU=~KCS4ZEq}O7Z`!RHRR^eIA|Ae{ulXY%B=VL2vzTd&T8=2XC zdf)#5^A8h~9vm`nmS+`qa@J|re9l|WPp6%DaO&R!RhZZZ;oo7fxs@K=uh+;tPWfur zlZj_%=DycK%f@!-rex-{m@ zcMUZrY6taWb1OX<$E+TVV^$BwF_9yw4{YU}2mW}h7a4a?K0!-6r9fu&U|gKlgK^B1 z&gi})kHv#poZlv%(WNnGzH6v4XTEDVV0L^~J;=G;sq0R=>cK%fnGdfo{_h%U%-bDf zZQSQP=HqJnTQ$y(&(KcR zgV>(O(rHHz4%g8MvZVR}7iVSX^iDIJ0bb!PI5t?wyI z$%Bzhu*}TAH^zy%VrJg3B(m)PQhnI^4xX8r*Mo+9x;>~fJ##aAP-pr*IAo&I(*Kg4 zo=Tn2gZSf?#seGK;_vG^q|@%UUtb=yoAlr?7GZjF&EsM%PQM5BI5&BVWj-L^CI4ES z{`H_9XL69)S;jc+eMfw^TzgvI?M%!AGxP6^eWwROE;-m_`!H9eKGVAO+2ui<8^!6CEbGmN3E2hpz7O=oO7?QYeB=k4Y_s4zXb-aV)= zT{W?ld8;vHIGi3-m{T59nG+sVn47upcw=F4+o{3gm!u#|J{u3JaZY$pWlnfdVNQ8a zVY+Ib9#oi~xw(5#VNQAQoZ0aiJy`3eQ-hs$^x&}Fqz84TC)fLN@p)eI9P=C_Y{`Rq zoS3u5d5du{GQ}FEwFcrdGp#PbryH5}zDtjS^U1N{7GX==y|tUQ?`V6oj=R@`dYq}; zeCt7->Gz<{^vuodL7nOM;E;(_o*fr+jJx&HX?H8@!C|{e59&-$uCoVqrmH46r(|Aq zbC%s|zE*(vjLftiv>kJy7R*ez$mCXf(2!4a-|4|fCg*{LY3(~%+>XcHHb!ZPl3R5q zCZW@VI@4A2vL4i#p1GMls5AW@95OpT!~4r|aUPHE*ml~{gB-_hyGak~Oi!+PTs-Js zc9wfRXoxdSN0VPL4&p4GiGCR813hSA;=QIg@!`fe)4Vk^#RYntc4qqUs|h^xZQzvj=si--AOYQhBx>Y;t$( zU#H!zo*!h+kL{!;?B9Vz>~Fbt_i;R7dcLbk4{FSB@SyqMeU-R|Ig`HQGmYQPt{&9l zv@H%4{7Ml#9bc9StX`WnAC)+gfR`9WpAd+u?d2emlu z_hO_zsIQaeKCw!tafJPu^1Vc{@KYuI)RqpOW65@KZkT-Lnci?a?6d z)6c29n)f{Nvm1x;HEsR;?8$Zfnva~X`saN=b0L1jy(R9d`03JBd{oiW_*0oK&d*Xl z^1hT$4=)^Faq>ET_VYS^cJwMfx!htr_W5w;2dQcNA8g)rGFabB&2u|uir>$lRS2He zevf1HtipND?r3X&&f;M|E^(TET;eoty~IH&g!D`5D(_1!#e;s`ob}foFXTCd(>U%@ zztAhX>>_7()tBrVTk69w7B_Q0 zhK`I=`WhK0eH6*0nUbXg>mUW;Y!$Iwd6yUrUu+s5dQ`EEVG zmEEWJ-F_a99vm`n=f}`=5a(m!?Q6JBJATfvojA*WK9nqOyRirp`yk`B3e2!_E^$8= zKk>DPnb*0Iak8(G%<93&zSD!D%;Lc~X7ykk6Jrz}C&qgLlOELi{)%}t_pCzJE4I}W zGB@vcc<_FDF6-eL&Geuar~SHYiYNPe!0h-8?Y`%B`|;Y*6PbI)Lsv z&$Z_|K0T<#iQ2J$-#~Jt$7yG>uaV5^!N|VTgQ3jgf;eXNU>p-;6dq^wU|gK3j@3CW zbMu?$du3%ksKx2|{u@20G40>e!x$A04wxOEp!q#xX;P?K)o?OZr{bZp(ZxxGg~z#qJ%aq`$qOvk276A@jas}k|`ZZg`wxu z9A~1HeK^O4+xKH+W>ybsV}$X+>1pE_IpXv^qf5`{9bs;!IFZfbLACFmnlB#In4Y;w z4{A)iLz1`DS{ite^RU_08tk;Y9nUA8)ULe`80WXthbD#-rYF~j{lW>;??FSHX@;9> zx5GM#^LG1xP7ik2b!_u~#mq#17}xvl73R%2?&dh@K}+8qW8{d_=Rrf9xR7XNW)JF2 zSIvtDb*5)-W)JF2yF$;B6sIw+i6D+4%*KWqXOJ2MlRO3XROw7iEDs#evDs#ev8gs^j3e#2d^q|7@ z%+1|{3UkVX=gf}JP**%IcD17iS#O-j*uFbPu=fFT@vR&qoW~-5@#K0xE>@VXn%Hb{ z!Yxh@>iP6vC$TWCE)ZeD{T8Oftui)|OtQE=ug}yMj1%fA)o%KEc-?%@1HUuJ>Ghx< z=Z4h#)`JG7`#Oov^vuodL7i!LNE$zNZeqmK|B_0c@RQz;cH%*fF}5kOZXygnRfAt!i$KK^<<=90V*$3gOGXL3Cl$pkArPB3M@;{VTU z(BJoPCdMtC$@v=Dce1#Rs87WCY@3^&dmQLNZQSkmVx+mH#@X>1+7%Dxes*)#X;(cs zXeYI6zbB@8P-EWjH}kza^q|IkeRkYqR9v7j@q6R_f6P1Ujeo}W{qd2RSv?pRC+1do z-@z-N8iZ6f}y z)XkFk+jvLyIh%jFbX|V3R~Pc7PFL~i+f{sUm&Q*IuZo{eUdP|p(M#r6PT z`M4AhhBG7{aOj##@t|KJ9OOBK(>U%@ztAh5x4p>Oopq73uk|i*8V8+o@*1%F9UC}O z)__et*K=5%c6>j#-F9gac;Q)vG0goK`n-SsIAyLz_MJY8WHNt|Oblpv-&2*e$03Y6 z)pWbB^VAX;;Y_+LHlJH~oai}^p_Q66jnVz(Wa)kT{eA&I^R1!LpxbNB6s48ZvQ&%ss{({#4q;iE~+55~ob_=*eSnCN>r6Jr$4tR9T(J9=I`s4>5JzE@V(gBsKG z{Wp40W7@x`S3Njjc6?SnnCCXy}ryotFRl3FmHE^wQ--5^MQI3 z&zv(i)WqDg3eTB{656o175SF<^f=SL)%M+6#${nz??aOgrNYqjiK?;nJ<-ZOTpJ@Z z6MZ)`|K1oU#>mV}qBg9%uSr=gPCbP zcaf%@F;2G!(XB19yDpG%ch$UjP-lAPX7-@Y^m}l~9D7j4qnoo%yIb|(c{|Cqy$=|+ zw^9=d)06Ang9_7C6Pqp04a4E~pc3bl2URAfi^&Ceo3ZaQ|Ex@jFC}X{Z|%&+gDP{v zgDP{vgBo+jg9_7C^Yoy?^vuoOg9_8`khH&5=Vr%eX!pI;-gzvYcJv_Yt?SQ859&-$ zuJ_~O^ZxnwjhmXY%tYpV9yIjbeVxR@w7P&Ev@jiR<=Aj5`As#Q7*F^~>$UWsmD$9n zGOc~*daz-i#_9E-&fLtkgfz+ZVgu8CokVAP=4SSw&h&e5$n5xx9&E<=IJTX3w|CDf z#OEH{O?q$`OP&vRjP>1eEQ9yS_knb#Yv0Je-iiwrh?vm4v15NRq^-k5PJ~jmddnVOsl67Pn1)-;KNdnttj}sv(`}_n?94_Mp!6 zdr)WkJvd}`e1`YSdXVGM9otSjdT`io(t|qFlWQIq=X&e*PvZ1@&=4m+?ru6?j&Tsb z=*-RSK?~D*%~V8$d23->{gPUXOOG>sxa~NAEN%z&iCJii6Q5na zKe$N_228gH^*B9qGp`4Arr(1@X2)mMgZo-~EBmLqkL$Fn9vrk2zu3P6iP+!re9)Ml z?`qP68uJ@!V(wXm=XHk9G=4X`dQgkg&SYGi7yL6mtB!46Uz_6uOX?$-Df2awiN1z2 zs|Vx8i1RhF?__ZsGw%65Vx8%^$AKQy@@c;pBh|L*kdDvLj_bka)V`auPP^*CoS$wx znPc{QVyXu<=KX#%-@8K(YRuPX$2~^H1sW5-H{Sn;aR_H}Oi~P|V=H51j}!ACJWeo+ zv*O}J-@}>JgK=@Dbmn;*$;@7f9rqkxER!D8`fk5Bw|a2E?D(vDFvrBXlX&S+PL%`#sXg@msD5jd_2$neXMM2Q{Yap7Y`Yjfvk+KC7@h4&p33lMH=~>`atH zc;CS+E{Mw~`X0`#9*m1KrPEgPt}!ad#i4P^zBIO$a(t1@>cK(ZZ|BchV0+G;jt6lG zEPoFyO~>TNGJf(*i(z{-VB6F4=FNK^`Pq%@_}P=|_}iB9w2BYzQhr+xsUPj1_x)ru zcK-3rUR{-+RHiHQPv5SJAKaz!)5ELcNA|_Z>-c%yw~n8Ex{6OOx0d-OHI4tXKC2LK z-5t@Lv$9_}e^#NP{l0H_e2&KM?(cbDp~i8-*&Th6v%B~b2V=#2Ug9)keTmbI&s7dx zbBWV9@e&7l4vD96+@*MsXS(bnXLr^`&hDm59J&YFbIxGxc&p!`=De^TL(AH+so&Zz zEdnn*t1yPSA45mRDLESE%-MJPD3VDxMKU=i!Ax;PB$NJ%WYT4kOnNPr$#aSM`J)`O zDe>Kn?t!`xVK|Yq1({e{Gmzw8mLI7#C;tU>uWkDzfij77xb7Sv?rXtR9SG zB9GyHM>fm3L@mx&)aTr@3h^1T7C5@~euoE*-vg!xwK(n9Wvd4V%#P2{j_b$bi%$PK z?WzaqnNBTDE0Zx^S!dN9@OIWeE*Fe)R^|~=~WL7m>r*05AJhY z=40aRYv@k9>cK%fan|e0?6V3np2t{(dAs9x#(fU+p~bnOCgz@1cpm2_zdF6n@OZz! z^tEy9S>JJeX6{*q=W(Xm^>A_(v zlOEKWu9}cO8<=T^yY4;Fnf_-oSeR)(T6~TE82g^@D>E{0$%B?S@g7s0^q_@l-3O%4 zw#R9^Pm&%q#Od~+&UDqhcu;5hJ*YGN9vm_|KEwOvxEM*6`flpnv>qI`oAjX0^yE6P z2X&^aCL~t|rrU!$)9*nG6B;u4h4o=!;yqTT_$88=K07(f!kl;}!}(mv`)Tu3%ki&UDqhcu;40=4M_G>P)`}hs=QoS>N2kk0uZD{oFpZoAe-A+#Z>pT=Tei;CYGD zRTB^MU=SyU!?zwJi`!1$-Op?#i`yR4>p`-(?J@B?mj}t>_6jp4K6w!TJ&aY4Y3)1O znwi$;i_?RKIL);L7S9hVeRtJ-IWAW7dB^A9ZN~xGgL>cn9vm{q9()+%hkEI>yVdX6 zoVT0zpu(K;pu%+3#8&2*!bIZy9@LmK9#olD7c}*yGVxxo2g8_+2UVuE?~Mml=7a|| zrn#1oc6v}@x@w*tRG6N*xqDDyPI>U0+3^|1mdC}ecJyFVZ(DN1gFh!ds53pe-j9pV z`!~5BG{k8>mOyT*aGhp4;q-BYlA#4&Iv2E)yd}_pYK`^>T&u#IAjhy$T3DAwu8?)?dZW_ zyGak~Ouq+prfc8G9BDOy;jmrfLwr^yJZL)yj}JF9t=9^g`q28G_K7YJ>SJWT_QH8! zVWu>BJZNEhJ*YD`q~7O21Jmt6o#~mIc|E8z{T>`LJ3hnvWj&Z`A^8vgaqbw;4-VQ* zdT~E`9UpCzX$a=?`{w3%+2jV3)A}D5!Q!=ncidZ3z(($w(}a4amVkCOnOj{ z6LK*!>)g`fOun{#x2eXbG3|XvlK8zDEuU@=)_6OfaL>)`L7nOM;E*}=AamF0U#H!z zo*(47h@(FxFZS<1BKEi9Vuk7Xt|mP==%2*-4K*?MtU}b?N#F6As7Z?pFvo;ZYxp{o z>%mAS`x?yTd{xHXp3mw*ZQSk5>cKc>Ghf5{-i%EkGv7ztuup2cKtdC%L}gZ{~Y<=s}I?y2q$EOJm~q#{2)O2jiI4 zgK12 zxz&RM=Fo$TsnfqsJM^JEw_wmt`e46D8u@t3`Ouj67kKc+vd+Q```yNL-E&@Cpv8&b zPd=*Y;h zMKa0aHrLjbny(%lFmLD2S*YzhvE+99bEMLAe8Nu|Kk?zPJsPCnr=L@IHSc-kXE(0n zXHTx3_)$em<4b5(uHuu+ zEvjjs5AFIV{XYHVwNNU$bYA;I*U5O__fqq+l{Xg$b(!M#;j;?&8a!#g$Dur{aFVk- z+S;G9c$nKu9OO5I)426gJQ&}Qc$zx76i?&COC02x^>T^RIPM}RuP-^jntVMRtKj!} zt~T@Y-Mn~q&d-y2-raPmUnyQSp26DjwjUECBkw)aX;!nV+`Z;u0r=2*CCOsI(tR9SGRu9H8G0Me*q0Hi!I40L|wWiMM(_Tx}gK=@Dbmo0PB$MY7HRkK{ zg=ZB?+z+0R`F_8{gZI;OWzF-L;E)$v-|g3BQ#>lO<1@7Tp4-tEoqFlCs~#M*lf2lk zk2f`2u7h-95vJ!l{vMygMC};A4}&<13wHKNP1uOq}p z{ob*3C>2KC7hLXpqLqDk$wB_}Lk;FJ!Y^$3tRB?*o<7pXL_Fp=t@j6|{@D6{N0)5( zF(FCCgKFPBHD5faF+FpW9@Ln2hoqWO^EvQforj$o?6kX;^NGWDlOEKWo?K@S>P)`} z4NN4{cHb0P+@^+UJn`qcKaza6x3^gF4gi!6CEbGra$M8e1g!yaqe% z=)qyTNe}8wPp-2Eb*8H(Bv%Gz(uC`otvb{1K?@TlV0D(U?^07%rufAYC*EUXruV6J zUG^*1=TTs;n3=dJYKoH{H1ys4d=KiD5W1QyNMIWuq84oIb&%d_S?qkgk#z=l;WIn_f!E8ME z!0yzN45cMbw0&TW;+*i{1G^Kaxt0(YJ*Y5UHBS#JOwZiR>p|v`+hgCSJa`^w$7lFV z@!#-qf z)yz!!vG|4cZ^)PlgzX?r)-F8XX`qMmK%;PK&RruA9@@@{6PakMxKOv$5R+|yh(F*y$`%+w`IoMds^ z#Qp9#&VCLzeYUNZ@II#p^*CKMFCNsHeh=zQzXylRj?eIZ@gT<|CA*AE9otSjdT`io z(t|qFlWU$I+@xRK{z;s!n%Gi~^f>Qs59-X#?LiCE`rQ%fw5ji#yw&0tys?bUri~Ha zXmb`lsP`RmF*57i(&9{OFWZ{E#-}mydt;nvEXnKR#;QO3wKH}iV1<^YkSwvgxQ z9;ZW6TXk-Bd{#Zk+;w8&@E*=Z9Q$DZ4kYsNmisV>Me^eLt|mRGF~51fQ@YvW z#Al)=EiORb!kJtTrWi`RCv|3z6Rhw!!IZf0|6y@f55_SuM&WTb4hZXelgB`2e)d7b zKB*ham?z$I40&nc;CU4+DW-OtwGuU+4EUF7{{z0jAN#BM%NOu zS^O6oXBnGFCOxPz?f2$Z4-S|epH&Ysrd*SWmkxiP@RRRKPEVOQKAQ_ZuCN$>#Q7|EnpBAH}yo9p1{5d7Xgk3OpoDMo93hR^(-+NICV?K`pLb~xqn zS-u0*wnu#OOp9TAG+^6PCp7PQ$>p}K*L@w@xH0*Y|5=|^*w$#5DSm(WUMHO{ z`vyb%ec$lznQU)m-*S<&JNhDLckv|-#){6m#A)1miGz9wiAU-xuLUl})6~l)4)RR* zUE(y3yU5vHc9F9?>mp}&(H5+fF=ZU;ko^-^%(okhvd2 z2QssRhBy5bXT{XxWIlslq_z~nb-#zuT@~){+`D#J2r+% z55_U82jiINtE{bp^SOdqJQ&*daAx&jT%2i$;_H(h)Z%=_JbHaTJ+Jlf+>E^L(`)H| zhX;+{1EvSHIPKSEs|N?nj?d6e){pc>*Aty~)q~kH-FD(Z`}J|=co>T?J=gK+K`l;{ztMvl)BZiZG`@MiGGKOmhIYk+d5zPpmrlFt!9hEzv)32v z{nXWi8uNC?SR3~_IUiul{O$Hn;@nUZbI&RqFp)XicZ4wx#V=Z%=s7O;TYQbU%*=`J zTx_g#9F)O_)v z#`MfhdQfB99a23wU?P?2e`(r3;V0#v9^^b^{Uly0&Gf$9>apFeUQ<@a&)x^r#9N6; zVR~|%Jvi*&qz4U5X8LGLob;fD>3ueh&fM@8+pz`S$Mb{A+;r7^IWE@bk!NmZ4B|zMtENc9R|?i`ygf|JQcL z$d=p28m69S0a}6UmCB{afddDQbk8Vq=p}e3!zCzlIZ;h1aXHfpbhQ+R&SYhd-hDqB z_yO=95Zz5Srs|3_nuCvxM&lz$9&$X#oO)iYed-PPYfi;&#AHm1vp|VC;R( z&X`=srTwL!!!hRY{RunM>X+0ZYn)al`}%%6%BPiyw&pm!9<;=19d~?AJg75WH81Ny zo#~mI*@HUM@4+c^;4_S^tOwtZ@u6M@?dZX2yNe#wnVwu{59&-;O^9D~CK6}7whfk* zX}%YUotv4~d#0FUW@h^6!KbJP^fP<*=+-TH(2!5ry@knn5XmHq+io9E*95#Cv@pFM z)S0fD7Z2)8&)m!&)R}${PMHIr;q&6bRI~jt8UMeH?Vue!IBj>)gF4fbYn~TR`X_O^ zYC>F~$BFxUP7mr#^ux%c2QAFs*qvqUI~-_dO6^(Vv@+=^or%S@F;31c3)6d_#KKIU zu^a^a%(-Lz*gZIDCw{Si2NJQr zCKuz^VO@WSMVOxNYSM!m^JiQu`PutDY9&tW6MeDNF8WyfqQz-vHV?)z(Vy@*(}3H? z-PQMSCdMe7$@z*5gw+yR+z#io%p-d~5ohtB7N_SK2YOIr+MmTpu25@f>cQO4Va^8a zwtAmr(oS-1e56OzF(?Hm>jJ6xV~|u86)fkKD#E=|QdU_GfdO z2Pe#d&(Q8Ik3)`W*uO!$=D|rjsWbaC(#Y|v8jCO=AK^jMI{;A=KiQbBXU>ZYw7%o- z?eAC%XJRbFnMoYBeA@dC<`&Il9jE*!HvjzWL3^BN8y;s$XLR3@&Emnhz9UX?YGgji z;x=fEKB@UcHB6o-k@mw_aywk|$k(`&iay|{>`&flk^XL0Z)|&djtD3}bL7`&OcwF$ zeUwG~eNTB=l^<}I@=*^<`KY4R{B33a`}wk>{xQBw<4@^dnIDX=IC)k5BmS4Q@#ka7 zs`$y}wy&rDye0j8`pM@o$SQupZf2Cv{%rHQ?}Bbv znDk&A6MZdyiDNbo#xar4@HmqO^Bjwdvw1L%$$E^f&po{F$Y!~gsP+9b=Fzox6*3pt zHc!ahd_3Sma)kUpB>~*3!UdX!n-e)$=tOmqY&s?V1NC?IbVu`{S%HjH9>< zF+9g2OwWCMdQfAcc2Ga3*E$d1k)j9VnCR=Sj)U~w9%u7lT%5>Jc${F$IOD&{xV!ou z&SX7C#+lL?J?@CFcu>pd&z|pv5+0 zGq(5OH4m!!L^^HH_2F~IIPHB;JI}SN#c5}D>p`WK_Oy4?GmRW)eT-6^wlPZSwDld6 z*Z5s~^oQ#~t?!M--8yW^*J$4EY0lyh zy?ww>zPmDhclEU0MGxvsPp)}hJn5gr>8c6Il_5?HhtGosrh7eTVOm{47PoZ6pryVcOTiyD?6D&gnsXUh0%_KaY{C=F54p#`Mh1>_I(FzXzwx zxd&xDhB+Iw+v+oT*dv5FYOqC+s);@IS$<9Xj>P#rsKn`C4;tb`pjdBU zywY4rKZoBR*KXFnOHCX&J^#p*K3n2Ub!K699#r#r!GkLEf(I4mp3-AFx4`FkpG0H2 z&x=zK^ZD+Xo7IB~^O6V8nFF7puHI6=SU0K8N>T&u#IAu;e$T9A=t$%}dTYFA}`QWy-yXe6#h7+bI*V%(Q(^V7u zyJO;6oOnp)lc{#`IV*GfKO+;hU}iezn3-vJ0rrk#u|7r{`fj_QGnfb5$GiHpGY9eA zW~L#s_T4c?yif9;{jTq>nimfaa`2AnnVZ>zI@9mLDRba6d|uXrgYjtn8?>Vbr|m9! zP-l8_&GX`?dTaf=xE|Ewd?XdQJg77Gs%9<(s=SrZd;aZmHs!nEHj04|tG59)Cy z|JvNjxfRJIi(Bpk+jsSub8fjNfKQh5;yv7hhBzPC|HBq%_Mp!6dvMAe_zd|j9?ZEL zj>Di`^WdbN_{IJmNW}h{=Yz)dd{>hm)R;fxTFJF{6%KPIeaAjgla`tQqxeOO)6Q%j zjANod;ce^I#m4dJY!T` zpfU0H#^?W#zi?*rU|gIihwwPTEFO%Dvw1L%$r?{%dOBC6=JEH&aZl;Y^EQ%64@NRG zE4J_Spcbe7+1%tUHJ?)t=9oCviD&cRq@C1+{TXTG_%-)IV?I7^=4ZL-L5=Bp=DfH- zW8&|P@0dWo!DmY;!wYM)@S)sYpYe)`?|*e5Zx%f7l)k*!J`svHQ%CU!TEV z#Lu2g@y%-cM*QN9ReW%l^6Ao5@uP~C#-GZxjO&u|rEgc|2i&Fc)5ELcNA`IQVM+cG z|I5np?Hs)%{x0ukzSK1SV|`a)KgM-!+xeDn-x)alEjxa%HF(m#9vf!wDm27#!l{nF z8xLJ`i-R!>;dE}j6%R@wBp#`&yuP~?Pv^v2oX&l>I9=V{N&I$r~Nt{Jvhzh#??|g2Sz)3 z^YwJSG-%iD=e(WNuKju_YJx0oWqzc-^=mhL?j`-4o{t}&Yxt@3E0DPt57u~Z$B90M zGn)tF;%puaWlH|K@xPtV=E1l)F-GBWqR$JM^q|)F&zMKo-c`uBpXcV|0S_AQchZAe zoc8;&DIRsc4}6ApZ@C@UO?g}n{TsAv9-Ooj58CgKw|Ss3J@@g+;&#wKi4(PB{5}lg z+|`^pnaFoIvw1MG@AbnYABZE2iz!)2k zIW@<7&d;EK66cPZxc08XNt|gqn!d}7J~BRTpT{A`DP6a$g_{SpG1@W0wm7kK#>eeR zoC#@W3IpgcX4-ifZ-r^^JI2V&Oyy}ABi2r2-_i5pK`o!InlB#InA-#UH_lCZP-EI1 zl3byV`@m;tCm!tPp^SCn)pOB7yRAKgr_`Cf52%IL)Q4#-;sQ^uvj=sit0tt+Iy1Sz zHXq31mh%IDZsSlqXnhYJc5aMwN9mfKWoF_=(Pnc2_HG*Y9kpR&(t~M2g?{| zs$tvvB)f5zymo&cjJvJx=#O|%@4Kt!#e+K2GdHsbb*9}RV2KB(%z@AFdGR3U%y1kA z?dZX2JDIokK49PCL7nNzb@rgnbk&5^tj_d%P-i9=*yb2n+z!XKxb?z28Ps{}c;Aiq z#S*8L36_zWK87_R@{s0G`Z@f*yVi`qGc&Dj<(NeFogOqWJ?B8;L7nNDo7sap)9#Qo ze(9JxWe$9XcH%+gZcptwE{T`^_yIrjXHO>WE_zUcIEzJ?+XJ65uDy9)ti|c~pdRM~ z!{J*G>P)`}EljHm8cWTmeDvUy-ZhEwUH72E zyyQWJ>8go6A2X2cX-!=6pu)W5L6v#IgDTT8ZwpJyCu-B^g3g0VoR>VPGB0>gVcPqS zB+-K!)4d)9TVZpotxJ_ZFF+0??jJw~17N*yO7N+$W zfNY8fb*Ags&+}r*<0PLC?BBH>)Z_GfaLSx`5cP51zd^gL-6uJ3chQ5>SaR(;a$WC} zC~>-KVlQ(_VLmV%yXn3m`fOyT^`P$^U3xxoUI-mn&NorxjySF7hM;CgDfvu&w=p>n z^u8xI+L&ZD_zJ*SI*F2jiF+ zqwqM}e2t3}*(|lr?JjX2=Css2{@z%hh_iT5V|t!(pa(Uk{aK9EN7W$%pP^mxAp1GU z*`QtX;G~`8+Wt&T^Pt9jJT~*QJM^H&{QTm0#;CYJW8&|P&;MZ@!kNv3adBeagvSY{ z%+og4cKP%3ytU`Ec`&Z;h$lSGl+LndFP^#IcVv^t{6J>SV<3|rtn8CqQm%4d_vadvakt0WJQ&Ap9*kphoFn^=Y!(lO###Iq$s~*0 z`{Uj`IALz*?^$T=2eIUKxSagyll&mjAMjILAn%Hpwnq)K?ddsU_nB1kjbEQJq34Hl z#fwhZ1Leb21BO!{Z01u&gs_nHIDha3e`AH zIMva2vn?b_%0ez`%rvpu#7s_6YiT<_hsJok=Jtac9JFgWp0pDW{vCbzyQvQ?295dM z%eH-Y@m+<3{z;r3COsGzXY*hj6D}yuieqAqtzZ_v#KnoehclZ8m3YeTNB-|MXLDa_sTJW_E%WuL5H?9ArDIA-%;920pD?>m^q1#xjU55_T@2jiH{ zgOSWU7m?M-nlB#In4Y;w4{A)iLz)LC%&7-=*7x(A9<=M$gXitUSy#SmIEh7=SH5eg zF@L`BT|% zeAiH8Uiq%!ggNjT##YvYZ64+v;?Jh*gVS~wJ*YGN9@LqB59&<62P2vEU?h_s3}%W4 zBboGIBonOgIO)O2IMcB=o!iAS>-~^&9IX3jo{;(O_n;o9--A=;#DknOT@G9S2JN^W zoVL5@L7nOMpw9GrP-pr*7|A4y+u_*C7}?{b2ZNd7mq;d9;Y`e}a3(z%*>{d}EHish zXZk&;GyNW%G6z1x*z)?|x#tJ%=t0g4<{rG}&x;<^nSKxIOuq+prrj^y@#}mXoX+ZM zA&lAeIg+`RYtvy&^gWzO4|X}=y6aud+sBD zod;Pr&tp4i*Lm=~-E|Kt%u60rn3p`LFzxf9^I#aW^I#aWtFK5VS=>I?p#K;^7Pq&V zod?61od*M%)q{b|>OqBh$%6{>k_XS31E0}@-SP9eUIy*x!D+jT9@LqB59&<62X&_3 zgONP)`}b*A5gkxbNrcrcPl4+b-3ZbdRV4ye_pXe)J)iVoWZ&D|ii@+w7s*7P z&4Y2w=D|27aunWoFc1F2pH9wU z?fGmTjO%;zU>x)Pe2wTk8Sl5xe!(a3%kuqJ#3}1Rd|a8E|H3@_mvJ7|?@=qv@8OW| zO%6$YEcb}cnFF7p9oK`0ejai*XxBV=%+H~nIP0J2!#_=ZK(1fQaqK)6VgC8CZGU!p zP>b_NjNgyO@uLSd=67J)p8rGMieKWG&4Y1F%!BYa!7Lt(i?ew!j)^e}kF$9&E>2{# zI6!0m74`X7Yt5HA8OfvvHRj*okiVH6lKi7OWZ*Njd&}(@Q_f-HrKR-;{N$&S(;E@` zcW3e0=t;ZOVEYw)_|?>h=0T15EtuaLnOqNQ%&)=x+Q_5_HRe}f+TJmNd>6mOF~6wJ zieq9x!{baq0^pS`P4ZC~RUy+4fc7~(kLR7YF; zbHb@EzQsX*=&W0u&aJmND20%Cq^`O(!PW8N8uaeCqdnbsGe3I}r_Rm0@x1hFud8{+ z+DqPX9+2lxYCPhI$9pTOZ~fX2z-MUpmOW8@@sj?Wc-1|FcFlv6cH%+%`xaY{HKymikYsUt=4<ehBAu>q}xpw22&4Y2w=D|2-^I#;C9*kt>x!BeK`OnEab-g5W(^E_Ipcdz)e-HG0 z9u0g(4`S)O_Mp!6dvMAe z_zYuP&Wm$>59i9D9X-hP!LZ#$59&<62X&_3gF4gi!ANGSg~`}n^k8J1V2QILndo~s zlOBwWlOBv^^1L{5+_MK`Mn{>pWQMCifTrzn%9F+I1d0Z+G2;3iFZ& z73L)mD$GkB3}bd43}d$X!teeEKLO|OiIQ2|4r&}B=adsXIV|E@4WL6IbGV_?U zvARD-aEP22>�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 ZC+{<#eSeoZ%HtC=NvHhkU3B*Q{|AD=rA`0< literal 0 HcmV?d00001 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/inverseSqrt.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/inverseSqrt.bin index 731c62903cc20ed648cfe9e95f9cbe24f964211b..5039345ad0d219c54ede3323eb7db09e2d5fc23f 100644 GIT binary patch delta 17688 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ldexp.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ldexp.bin index d441928d1cb7855ec90f293257b4b17ab3f0014b..bab78ed2af9d842fabebc75f61b887aa132f78a9 100644 GIT binary patch literal 33096 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 delta 17 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 delta 710 zcmey+#d+f}8zW02<5ot-Oe;ZNLskX`21XEO`p=NIKYqIZ3`TXvJ=4o)Fb3-`G(ndA zwdeDm|4`Ko%)F+^atrp%oc?_VqqA;+8M1K6?%dr7EqhSpKJ0oqJ$)u)wctVvWG#g| z0;bE`FggpiSs@Fb*yKLleHNp$r>PCHaH(dQHo}576uCHkeFKEtbriXqhEdc1+c3s^ zO4%VBx6tg78A3}oid=#DMstMR9uzq#3+w6Cvl-uPceiJh_MLvtj&aNOq#njQ+@k?Z RwE*4@4B$vM7GMHo006_Bln?*_ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log2.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log2.bin index 7f6d35346b33628496b0e7ca5269695b3817f5ca..00641ce119cfa61735b37bac238921ad7c602bb8 100644 GIT binary patch delta 19883 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 bel$qI>4<@uq#)f64AO8mHbx&{`eFb8nEH&r diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/max.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/max.bin index 63704eb2330096274b364835f34aeed92dc3addf..3861a94acac30d443910b1f44e11a761a09872d4 100644 GIT binary patch literal 37944 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 Wcs%+3iFNY*6YJ#r$J3Ghvi&~_t0heU literal 2202888 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

*d|AAHL7k??=5q-s^m#CwX#o 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 z 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 B25|rY literal 8805016 zcmbrnv5zfTa^9KUrF3ju=u0|5e|KVeKc?Aq^(IFT7A>wG8Uom-eYH|pm3WtEF07Hgz?EaxXcKfD2cHgUGG5_+|&$g{R7G?UB zv0HV%m_vCi)>apEY|k&31h8~b8nt~eCknVH?ME+u&G5MA zqt6xp^1?c`YmUX4KYM?TKYdu^Ss-_0nQz{#@uy2`{OQ*ke>%6yhleBndj1R#D`UgM z`?05orLoP!^Pc41!^&9Cjea`rb+ZhvWQ6 z{wI96haTtrr-y6&>ERlWwKWfy`R3soe|osapB}F9r-!S2c&PZ7e}g&xn|2}M6syD&D~9F5IC3!QOa8(-%*7n#?; zh;FbF^@~V z;~FgZny=$^S^kf#Wy{a_FLVCH4fB8Z`tlJE>z9Z#AHJsjq+?*`o4*Vmi?=xQ=(orl z&mGV0!AE@IH+@_=a@!JbapuEUHGlHhX6t8+>2$tfTOq&uM*2J9tIE&ZsGH@FIL{xu zjQ2=}^#fb-b&?+qd++O*--f;x$C|IHzfxcH`wd@fW8K&B*t)NpulcI^myhVNJ$%JA z?qfdQQ9H%cQ5^H%BOh_*gNtYEFV)q34Ia;b$vE@qH|sOSb9?X+UwHFn!oxS8KX{8X z53az!{8O%r)BLs_W5SmKzwvn5IKO{N$Ca7q` zeZZ#U+V3~{S{QryIvD#&z6!o}eMJof&+B8!*CGE2z7Bcxx;a|#b;#SXJ$>Ez{iR=x z!|RH-O$A>iU-VV-MPG+JUFDr?6as(9Q>9ll1K`yF-ISwqER`$ry2@Auu}%!9k*|KH%TFN-seZ8yC6 zz9-*@zUukU&lkbPbKe(Mf4hf|{B$?ZALH$~&-n0_=Pt&X=kjOu=XT^UU&Z@%aX)PP z8O*zE*N8KZ+E01x_uw(q;>>S1e7nAzuMuDP=+k&k=i&1n-skUg$$aV^$xC-(btb&Z~BS{4s!aLVrLEKeB4jJ z^*wx5d|cC+KjNI<5>NBL*g2;4i^Uh-`b6bNk4*XSb;ff{>$ z^X>Y_UWc>HA77XCx1V44fiKoSC0|v3I>tv^zr}t2NO)i-0~ zTKd$kzp1YM*wam43-V0HhMSeK;bvuQcsLqs9^@l`A57zk8!!;g#@=$*8 zt&i98pB}F9sNX~R@cuVZf7ZRR} z4d(i0?5mGG?wKcU9eDT>O^g?r~G`98a{n*oy z`?04F_hUKT`Z10^FYVX*3+LxTKlqsOSe_}d9S`2@rJpNWAK&jE^{_sU-sksse`{A8 z>wR1s>wR1s>wR1qi!s)3m9f#sm9f#s#j(~ym9f#sm9ZF8-f#4AWxrTk+^<;=ftmEf zaZW9aJ$mtWY?|j_tX*^3&qZC&zsCJgbN1V_kMnivWZ=!Wn(5E?sNskD*rT6qPRw)8 z<;{MhM{mcXF6FVQpKte@`nfVT`tEjY>gU_BSX+6&sh@B6oBFvh_UPxr*rT6s$EJR+ zj6KG@?c;0j9QPI0$9d;Yj58S~qJLH_^J@_U^5@IlXi&W9tbe0cK!Z#}=thhM9FIJe4&hwJ=t z&on;%AOGtQHax6ZJ$Lq&u0X^>d@LKWTf4^hl7tPBx9&3A)Z(gkB$NV4SPp{YVbNTM|Dj!}e{vSPW+dq2t{_{8= zf8=joEB=q*^&d5_J?{DNTJSrr@p!mD9%ugadc^mxVr*QmThC-y`mv|i;YS|J8T@x# zum5|yUVEJ9g}Qub=i5Opj{Fi{f7!hDxaVU%D*u1_uxI~ zIP<61W8SuJ?>=Y#|H+?W5oiANdd%DQ#(($v+n--~6sXm0%yT>+zJ8B$e(=qUH6HW3 z<$o>Z{~U47kNVv5xZb7t|FYw`{CWTU66+7%yGG*P5?+ zt@)bQn*Z{v)9Ww4`W_s=)YbYy@vpDH`_(Ia-f9_ltTeo-ThM;`ZL6t z=kj^I()0iF^Un|7Na_Ik*F zg4aVnTrPM$t6f-ieL z;Cokb4mGdOb8)@~^kc*8@z}c8ny-1S`I^^?$35IvalMW>dlA=b#gnBO^aA&g7H1yZ zPM;Ky`_?`9h%=9EQy%xw2Osf;w|-FhgW>!m&U|q3%zntfza%=C$T)UXS_S)$lrM-XE)eEVr>Q$75NS+VxuV zHLo>a^IG%2go|+>?(wBB%`3&@eID@cb;Oy+@tE>>pXuNu&OCNKInC`JKn_h%C$lY$6owC{@qvjU0s*| z>_?rSV}i%;3cK^dnOE_69VK$!n^FO^_GfzVXYi}P;lu0Vah@0I(!5suFX8nso7W!q ze0Z(+-v|HujrX|c!)wLkyoGa@&)?(BpI)!=pRqB`t2G`4ew5!H$&dLz#GhWTu77_h zKV~1->*iGg>3T|K>yoO!MN z*wgFLSgzn-{(pSR>Gc|adcDST`F>tn<-=>iKmX^y!RLm&e_DL$pEw`9Z}aHh zH^gU_(6fKhu4^9m{E=7i*gpS!Lc3lc`$_qGSHo*O2P4OZ*R`?kaBZynS{v(bR>oqC zc~BV}&Q->SU&XQ3i`l=mAxRQ8Lt#ouHV`oXUowf%Z8R>sDdcxK<__uctA zAN+;w_4l=S{k7ebe7G>}-|;w^)X$1(dH9~5=j=T_dVG;T`hJl=Tv+09S>LP#myT~6-FY$DWuHt#XkFQhVENYkh?#G^E;(en$ zmIlv%F5|xAx;;9VUs21L zc_=@4^J+DJc)iMp*Qb&W@XALX0ZYxyz%hxpU$wftQEgY}E| zi`w<&+J9f;`0LN7vNz`WpP$ix&)&Zt_x%@MtM$)6w|sg%;(J$5uTN*r`|*D4>GfzV zSMUpX{fp+c$NjouK8pX<2b`~(*BTTRwZ}alUMv1Tyx+F} z(5}}WXa4kh#P_bAUhl1Ea>jd%%5J5dE4Ij&A#@_ z-y>k7U+?3&%g@}AKjNIgUte*%h5B*+jQjcTH~F72 z#plL*-1FhJ%nz^k=JjrI&xhBF-<~mXOn{WfJs(~x{_FSfr+Mvh=1;FjJlYQ3GI;-N zQ0sndc%AzD(pNRFHDB{u^EIzEzx@Qqb#KSzC-}GN_e))^MvBKj_Pt{pie~>E3yU+4 zrknCm?%*TNJbGoyb9>~E_`+|HZBz3H!)-SIh%=A*-}0#0!86W0_kEu~yyjfSUQgza zDLyx^H;Z$A%s$@ZwmPC*m;QB^+j&KLJ<0!!9GC#JYOgh4^Losq>;tc(=lZqwW5et5 zSgxh!wdQMHYrf{S=6kR43xT26il^7uhN8LGjB{TF7tejIU)k~pA93cfJL^Zqb31dk zzOwkjn^zNlOT5LI=Qd7q#`Aj7^4ql|^XSK09yLFB#+m2xZ}OwJfxA~0_q=pFPGnYZ%H=g%n~UNi1__gd$#d9C^F z8QY%kyw-fp>oJdYqgn&6+cC?%(vMAE55}^BWv>Na_FC{|uLWQBddP>%JgyPvzDiyX zd9>_~BBJPi?Pi>Le7iRNJQ2RzC?@cKMv`B?X3!|U-_uAt_% z=4)PSzUH;!@%m4&2)kZKoR3RfuNBYxcJS8M5oaFU&f}?goNEt0;>=^$Q{ML9@<)8( ztshkWVAz)tXFj-i#&puXoil9L;2CE=yq@vlHS;shyp?BCKikgqm_P5~IhCIG>$S=c zzVyDC=C^0$e7^Hq^EI!>Jk~w%I%g=OK@xv9CPNJdVed=lgWQN1S-jt5^MA`nKh5~? znsZTJ&-n0~yz*M{EDyfSYrbd4__F?Z-^}XJ_c}+`yw>?^UTePQ^_cHn#TdKkvzqWg z6ucgfWnF4sYrf{S=4)PSo-RKpub+RC`vSExuN3bt@B8U>|9*OSt$6%iXva3=BhLAG zaCp5}JlWtQzVOk{@tn@#969I1YmAdT$N2S%`|8gtsUIcJF~Q@%O?^2pVVCpuBjX;t z#h3NR-=)NUuIn#dul4$CUTePQ^_a)92iI#9A=aGM+K-Lv^>{2R_#eLI!;g!{eO=@C z*P~n<`Mr;PIPY=KZ{PTFRs6?q@YY-V{k6wEk6yFBP(1cO`MZ|W>oxxLdX2~29-2S+ z*3WDCPp{Yb)9W?=pBoOZ761Hk+n$@(9_Mu- zLGxPiUw^oxxLdW}E5 zUgZy;2ffZC{fy)P+>XD;`S>G$aPfTUe{7%p9WwlBULX6p@c$lO|NG{($2tG$^@#6X zJ-t41rd<8l)9cY#&fr(y^5I^1oaco#fAI5-;-A4kH{Ro(53d#fJK%q(@gDblc&+$% z;4A;0z#9J<8`JI=*7(!wWxjd6#$)~u@u$~o`B}aP>({Q6D*xSoKPh}t{D%J7TK{?6 z_g`@FoUfrAiP!OPe>~3o>Gg>3T@9~KCgzQ`Y*FY<@yOMLi^=KIm-h4aXs#UjZ=d*Z-s7HkuXX;f!RycMp;qSA zDj#02@>t+Q`N5l4tNFw0RUY+wD1Ugpnjfo=`|?4rvs3;8$Nw){|9H$-({<^o{ahgU z-+JD*-+K1`^SI~Zep>bKzj(iG|DxTOdz^XH??vbDT|K>ypM|rl{n)dfqp_U9KmL{v zUzf*uUZ>ZJ$Lo{#v5=s7E&0C!|5u)WxA>C3d7=3EdFAwajX%9!Gc|adcDST`ElIi`BRP`R^P7ID*rop z{jPcKaX$XY-@I1*&!4vK=k0p$anFa>f`9(K_ZuG8e=W}Z>GgoITJw=YmMzQ6GAz<<&GoyF<(n78eX$B#sB_>HgG&q`w++wtZ3BhK@;*B;&E}g;+_w$RsJvF^%u=+k9$76R{YPN z(7(-Vk9$76Ry@4kn%8({ocYu15szgL{!ZoW+1%^>*zkHhmNTe%t@)bQny-1S`JbUN z?!8ugxP0fe;=^U~5$EHI0-M*0x9z7_SWE8}w%he?!ef9wFND`K{ouk~ZMH=oDOV|fH?*XwaE@-?qDU-Me?z1Nt}e(B4oQ9O5E`t|zs8hN_DOvhu$ z`!(A6h;#ll?;&s7={C+Q@pa+1c8nEonBp=2TRwZuIOh+q@v_XHy=I*G@LKabHl1F- zJuk$4xXNGiTIa8Mt@)bQW4?Dac^$_r^=dyhc|91*BT)8Q@MW(BU-nw?Wv_?)CwM*N z!{zfny!Rp<&mnKyPp@}=-+O^qC>y{0IUQ?`^sj=~lIL!NXPomVuO(mfTJSqEmb?~x z*=xajB@p8eXS!aXQxh*zkHhw(hm&YhG)<=C$H+--gEUpRYY0U#}IPz2>zZ zP1f}_xSc*J9-EAz7r38#!((?--u90{^i0&NRj}5QKV_CuKefVzu)#oB#^IGSxd9C@H*NP99=|#l3ufl7^hs)$6&O8ca zUMv32OYp7kyQu&CybxZ`@^eg_7nIjCo;@49@>=s)7fR$jtel*@g`N2m&AAg_G|NX&y{ioM! z^QW`Tr=|Rgjd-&b{LGXe?)N``=;y;PX=a*B@~I+r0KTuL}vjne%@Jum7xh?QzeC*D62u zj~wl|TAcaQ>oxxLdX2~2n%B#G^Js3B{QvCey4UxZj9naYnb_!nq zq|akt`G5Q#e~0Z}etunmKke_sS|jrX|c59bB{0{*4(9%mlg!ucgWIlsgw z=U4e~Zi!FMFY&0~L-~{QOZk)Yg8%9Bw*6^4{vPM!kNi*V`Y8Bcfd9Jj9{2p=yx@QM ze%pRz_vo*$9%ml)d(rtfy9MSLdtk9w@8g=i>b>Ia^-ucjc7NW%d_M4D3utj(HV7newl%zm5FPN1S=Af69{$ zKH>{+-eKFf>>uo|JMRbM>-T+S9`nEDKWp>1c_7X_>UYa;+n23=%>QM_bNN1RHUBS- z@%ek4^JDhyy*9;Td+9wl#pAqC`q^CZ<$L(y@eAj<{)qGX@mid3K8%h(xAW0>i!-14 zX2{$2lK=30*nfDv6&iS#i`J?hX&o^j?;zuWw1x`St&`O|-uf8!KC^ZXw7eE2W< zqW_Ao`mgw^|6?BYec_||YjIvbw!M1)#&xtm|8qMZjkh@Sr~hNV?!V%(u9E+X$Lo{# z*0JyAui~-Y8i=d*IIkbInew*1eYPs%%%A>`^V{~uN1S<1YIgiMcig`;e>}eM&A)Me z!zVoDy33zGTgEu&M@??|^KWGM{?qtx-!O~#9nIzbWyhxbzmd^=_4+UKKj9EPwez3F zdHwL?{k(ov|Ht`JUvvK6|L|bd|1n?pU-4D{6_2`<{8v0)hxhIHA@2Wn)tqkkEq)x| z)NiLFt^OA0<8Mw+cy13q;>=^$&3`q2{;l!ccdR>}^ZQ1z+3V*+bN;FFHtN!nTFJJ!!U-f^Szv_SP<6J+yUb_A(e&f%T zh5LWa*ZkLf&40zCchF$>{wv;CNO0%B;&E!&!(TjGeCc278^t5_!AE@IH}?I6-y%PF zi!;w{cRWvT;V=iPDrP}Uv$KKy5#`|mt%W1jw#VgK9M3y*Kxaf|2v=MUSCF{eL$ zerz{?Y#c?!eDnPuU*VVHF{fKT`_J)t{ixq9&m~5Fj?X-|`E^UJAMC+nEaIMz`+vn( z@BbBF^WP>mtbfga#eahTt&aWi2Vc7WBma>91pftJ_FwR2|A+i1_&?<76HCMXMJ+AP z{g?b7@}J=UkVk6f4F4_8`LV5W@!TJO+m8PW|M-38lm9Be=^6aQf5~$R!B6}beA$1& zm;D!f*?+;8{U7pG|Ig#tAOEWVim&>w`I`TlulcX|?0>|$|IKMgs`%`G#F+=TxBJ)O z@yq^4oO$Rto<7gkPlo@C{2ZTo z+dQv7=IuOE<7<5V=e+Dhb(ue2t=|6&zUIHqU-Mt_s248a_rL#(e%z-mmiE z{VEUcq5R?fYJSwuuKSw*G3x*0cKkig$Dh~qdH+0te`>tPJ@3A&{P?W=Gd?H(?EUX? z=7Wo8%;$RFUiJR9t>em@^URMN7U%rQ{~^!q{G7kf-{YP?{1^QG;k)*Ef2_^ooxt@DXP|`9I{jJ@|+-pZp*4+#YDG_j`|Im(e%|t1ob#i8=Do_#?fjfR`G_-5muKte z_TVGVJPJ4Exjp!ZFT8o9<_`w*_W4JgdCcjS$G%(rIC%bff7U4fzK_J~>+c>sMw!Du31gF^~E};EMmp{d0Hz1#8aV`#buhw7nU-4D{$2`_k^dEih?|*gm2VeAm%-8)_ zeAR!&qb?=?6_3~PGk{-z7~^_~NBa4x`8Vd-PjsZ6KP}F@Ic-1xjCpPkKH|({*VFvm z9(=?XzWG1S4`xfe#hK@}cKx+^4E(XpasB2}Gmr7NJeL?ed48}5?{Uu`*MBwt z>h)jnRsVOvSN$LJsBg)C9=AvQSNz7`3l#4EHDB{z^ELk!pMT$uUPH6J>EEMnqxz8v zf0%=D?mv7#<>AZ0bL^GJ?xsAqlWG2p_$}rg&)4g3;^{@J`c*?_^cm7ZKE%6p-f4Gg_&G?G{GoGz^ z=fCFN`8)qLU%UU;e9eE&*Zfy})qnQM==@prU-4Vff6dqY*L=-?#lQ6*zYoCRxA*_! z`q6(3xBjKuj58m{4KEMtPyflVe{C${%;Q_*;`w_1u-EZ_;Xl8>@aFG?$EJg~IP;j( zEua18_{?Lzw>*~^{&RfhtvpQ7>hN~`U=Mz`VLc!B|6a$pe9iw!{wGYW^6&lGaeSM< z=D*61{gtl&;O#hE^W*!{^+x?}4*&T5W&XE3cOU*v{8#e_UGiV> zW&Z_V_FwR|>p$x{y8gnS_k4K$JkIsU@oK;S8}r=GN9#X}FZ^q}e;eipTk@aBRm}fe zo&(zaEzbGr_AI|`FZi$X*Zfy}_CMl0f7EBcng7nx`1<`^ka^^t^4b50Gml+QdE0-> zAMu5^?W7pIC=!+wN#1}s19nWw4jroswycS$Mzu_zXtMz-%d;b;B z%vMulld~n*W-w`LFnJ{?32J%v=JmH&>%_FJA~B0uAtKl*l-pJRe&ocZA58QZ(_ zkG+m%llQOj^AuGujcQJ_y3S@{;u(-|C$f~@pnYK_Fwa;N%Qyq^ZwWR zh4c6RtNeH!KLa%0;=cayds_dh|0;jg|1pnx6#e&gTVMl_y8e&z)BT$NipT4v_y5N{>Q(Zehy91oihsnE?Y=+aOa7;M{wMJMdw+ax-Qu1!WJXZ^$bh%=9R z1Q*Ypf85T8_rJ#%{jB|dZ`!LJT?f>)j<@min<8Tb6*zu@sZ|8(7FoO#smMX&$3ZohEcg|mG0ll*nv7>}}*?)Qhh?f1Cu zBL~j|C}#Y<9LoHGc~ySf-md!*_q=sm|BA=!CI1y)^%xjp!Z zGml+Qd2SCr;tSvW8P6ZgmUxRZ&uz2$$L8>tr~1sJKDRuV7(C<5^ZR*zum|sP&xikV z{YC#3U-e({RsY94>Ra^RucPd-HUG!_#`}tr|BA=DO8zSzua`dWtN0xa1_$it29I<9 zoc@pby8mOI$AgYBf5bUIHtpX3W1icCkNCnje*qJiNQ0@ z`T6}kKiGr!xaY%vnZM}2;;a5EzUu#&ulv7SAK`c|`akBkvj2*&`mcD@rR2Zj@p^mT zkI&dw*MFz~W4`YHnCJ1JWB2}#d7uX$@umNpKaz((o*z#ZXP(>KKh4wm@K^hm~6|)JDKL+h&O*!exO_8ExyeEmaq6f z%g-go`GaxJ&+ljTGxp%M|C9VB|21FpU-LEp6_3|T_y6oI){)OE{wsbf`mgz#|C+D) zulTC}ibpwjY_tC5F=CwiH*=%@s&ky$CJ??qG{!i9l@?Y~c|21FpU-4D{aai_I{lMFM zeyo4Qef|9R28!Q`{%gMGzvgTHEB>wj_}w1{$L}vt6RVrzQPv&X4*wZvK8_n+9@d}! zlVSaBEaJ@L+nf9+Z(}k3!fz(1$PdQ8PXGG+nA0tv{pa|cAN9NCIkm{o@tNng`TX5^ z=P?%Jdp_>}u>lihjr;RQ_5NS+HUDj5!~8Y>6_0wAuK(bzj@R{rulhgaKf!;&m;D!f z+5aK`3H}dxwA0Sgvj0#^i*x_6-mQO!{3rN7txAtG~U=Mz`edYP%h4%M;h=%@^{TF=Mf5DgiAM#cIaoiPO@?Y^) z|21FpU-LEp6`%c&IQNe^?R_(>U-m!Z%p>pK`fkW)|0B*kj@p#B{bLaQiTJ`t-gxe= zf59jo+k=beH$3Kjc8e|{%gMGzv9Dr@4tOV|LnQ{!0qfm#dAD*s9nE2 z&ODCWln>{bKjO?|*Hhm1-||O%;jM4g{DTSqxR%Ug`z>Gbf1dx|f5o#r=k=eH9s95O zn*W-w`LFq!|BA=!5cvM@ep#1x9$oTZ@m2pdU-Mt{HUAY~^ZRGuH?7!w~{%gMGzvgTH zE1vH2!SzR+>xb9c-~VBq=!0whxSfy2Tbz0G+xlnB*Zo&~)qllT{U7sn|HnLz3mfqE z`i~*Q`q%v*^E{rBKjQxQVe91h1rz>pUzx}DTb^TrXPkNT)-BI5!86W$^gVVvtRG&- z*WT*yanC!4Es8JQ|7*VLzsg_rf6Sv^MgK9+hx{M&b^jG#^-pFGAM>1E&40-k{Z~9*PoMi?oYxOO-p}f1 z+tcTM_7zGjGeY`c8UgdddGWk9w7^{~X8Tfa8<=_p)J| zodf#1`|th79N%j`|L#BHo`=`Sr}$sz=ZV_i{YTvM@Or|(!{7Ykc-!awBkuX#yixhF z;J-xvoqZE==D`(s?|bL_zGt0h^AG0C-}6}8qx|+retLYzb4<*i@uhyZJZgOKj5E*W z-{t3+$j`Xv-FtQXKfb>H0j6x9_m8;e{d%u>d_MgNIiHw6;+}V36_3xyzYp&t&U|q3 zjQS>T*|TNuUs*?dU3s+N{m=azGvYD#Z~5T*BhK?jy6|7{r~ft<<9q(_U+|~@n1G!N zdVb$q{|Fx2oBw>~BlB4Il(+3j?ER;I@2~2|;|bjOh;x2yn&v0VFR#DH7e4$E>vu-+ znA0uKF~Kv=`LXU>o@0V%oOvscpZ~@DcVyff?{Uu`{tF)4oBw>~qvsF*1z)@FtK(1i z`SA67ob!Ww(f#Yo<`{cm^6Br@+I-Ky+grTfx6d16*WGy|TyOLKmfz=jWB3O@UySqH z_IBNmxaZw_%QHA{VLr!oKjNN;%f`w4JM!*6e~cC0tNf@p81MUtbAEU*&2QTqA93cf zY05J(e(ZF}LmkK@wL1ATsbz2v{* ztNtr~N7GdNAM>ako6h<#;#@y-+Ri^?-nKVB;>=^y?)^XJnVVnX5915p{8{7a^Id+9 ziTsRne$?ca=a}FbXP(QS=f`%8ao*#e5C7%*i~cLV>c8Tv{*QUotLT4RM|=Ok7yTde zb^jHQb(Q>AJYH`<_w$*L{`kXhzi+Vj53v1m|AOr$|Ht`JKkya*$9y=?{*AbwKbm_w ze`Y`ZV|?M8KjZuy&#&;0apvjsU4D)Uo^j^s^BvDI!86W0-JbKM3n`>*(_|B6RlO8zSzub2EE^Qa%2&iXIn+<)e@ zU;l^ox9yFOIP=)lxN&~w=2!T`_`)}T)_D5teWQ7fiTsRne$?ca=a}FbXa4kG<=>I9 z;=khkXZ@Dn&IOnJPxJLx{a5*`{*QUotK>h%wLa>ve|Wv*zv8R@Yrf{c=4<|I9(67F zuXuYM9mxKPIQNe^4gVEy+Z!Ko=B>FWyluw^ijOzv8R@ zYrf{c=4<|IzUIH;?YN)=*?$q|{tGUi*{u2fS9`tj5oey`+5d{S?HJSi+4=p2H-9EP zkkenrnFn{vb4>WlIP<8YyNA#=D*@muaf^(qzC+0 zeAR!=*ZkLf&410;{8v2czhm32|BAQc+W3h3{&)WsZ?B*JmPAn|HHc>kJQY+H~%cY@WI9Ns{fKN`Y(CZu;RbqZOIk?1z-L7 zA5|V4f0X`-k9PjCxUWC_c24kR|A#zkSMs07Xf*$D{?32JSN+#~&410;{MUTVf5lh* zS3F*416%(_-1m?BuXv#3Z~dR}z|ZS98=MQdc=O3QKI-YK`?`Ay51kX6< zx8+Uwol|PO$35@Y|4IJR^ufsfzld}H;kfPWf5qGO#z&laY?|`69b=k5JHNm1=AX)s@%9z|@te#?-_3ZA z37&E0gNtWu?)nekm+t>HzjK$j{%gK={nvcWf6dqYS3F)X`Og|Xa{X6))ql;`{MUTV zf6ebG%)S4LNB!A=xBe?WoTon#XMeD3^I!3{9UJfbpYWXi;V5@6xlv6&0=T1?!V%z z{wu!fzv8R@kNLX)V?La}_kYY=^W&J@`!9Ly;`Ens_V4sx^ELl9U-Mt_J7&DM^M}WI z{@56O8_$>i#deHo^|QF=;kW<%F8Hed$2>0itNxGqy8p*Iy8Pf@`QZ8^?$;mh|Bd;& z|BA2rulTC}im&=V=20^?o%LVDxqjxi_0O2E`#w_^SVkulhgc z!})gp-04#8-_!pwU-y5^BOP-V{FglNivOCg`LFq!|BBx+`^xoS@zv|U;;a5E9o)PEygR}PwW<1BV`)+#=F!NkK z`&IMUUhrP?HSaZF^Ir2c?-kG2`DoW2i*x<3?X}g8nV|J=^)eB9ml$9}H-C-^_i zk7M_N4?q4M=lLVwH?#TM_QK!&>-m@cAI=~9-C2`XKa2DH&1vu7As^0@k2v$#b@)Hz zZ9B$z{V0ok-(T@SPJbEa{Pg*z{^oqkKl5MaM-40f3x3B0_r`mi=Z}r{^SVC%W&c(F zC**(f_4~P?&+pf3oxkk=Aipmg`I$IqJEj@y{G?P$Q}&(7~JeDg>0Ku&)d zXP!QL-)Np=T7Isf<58bmo@0V%obzKjH$1kN{Fn1D`mgw^|BA2rKju-dqW^yXjAAWb z|HpjYf5l^6h5LR?+wT9b^S9Rv_x+l$`ajN(`tO_*`#0j;zvi@`cZc)0?TwE(^Vqbv z^Y)Op?HF_K|9Jl3?JNA_H#t9jzR7RS2hZ`Dr_Xmh#{|zf^IZO%$M%x{a{WdB6<_sV z@m2rFJnB{SAASDV^?%6M{U7JYvHQS>AAgVg;~(o*JhqqoS3F*?{k_j{{ir`1u;BkV ze>l(eM|@d-%RA!{wv;IZ+yg;{-H7?@te$JPPaVA1kX70^tt7g`8g(d#+m1|=RCG!jPoA% zy!&s12K|rMOV@wR*ZkLf&40zCURD32j$QwNFJ1qUf5?A=|AH_3FZiKm8Z|a z#dBUiH*-wnXPon+CbvAt1kX70$^T>yM||nuo!%*)x%n0TFuw5CH>-Sb z@yz|_{^9rB7Woz>QDL(pc#&b;YjC20r;+eUw=MQcRo^j^Gf6edMw`I`TlulcX}n*WMN{n&KYe-Y>YGpFtTAHxPef7WImUkcKHyHn?c>3(~-X+g5!86YJQIlJqV}fU#`E%VWKVC2R zf9|L6f563`|7HFs?7Q&ye~Pd9ujY?>75(?~AlAF+|Cq1)ulTC}im&>w_^SV79`(n8 zt@uCY!+G|9#C`vV|6`uH`4#>!zVP9#{rx+)U$4J>P4V=(owp> z&V1^7k$*?Vz40FR{82Z-V>`|PEx*M*kL$aiw*_Cj{xe70&!zrV|HnM)RrLQ@N0%Rb z_4*%m==i$-wANcV4d)(I_e*5)P7zGmo0w@*ER9(|BA2rulTC}ir>*d75~RP>c`o@eyYpn|42LW1hMB75*^3@Xen!o<85@=a|UPIOj)AZh4Lgo^j^6{CR$C zFZnOmU-Vz`RsR)_*FWv^{@wK#^(y(#ac}+ivSXW_1NyojfA=@wIP#M}@88WE$Ls?i ze%$qSe>`vIuX(Ten)iyw>pLgG`A3}V2M>1ETk*EN@eyYpo2EQ-^DDezeBsR-m7nAJ zrFhKgmgkt@8Rz`Sd&_f7@QgFh<n6mxcA92t7{kE##|9pLULe3|y zKjNPE>%HP%Uw`|3T=yf+Jh&IVep~j`d%HfPe|TJ0yjQ%vUi!SR-#=XQqh=rYVBI3l z>&A=i=Y7T3uKQ~K--q+ayEA{pIX~)d-YWj@8Si}`aptk!DgPVXjxXkqIP=&v<-ec! zh%dZ(qvjusuixjAc^)tJ-Hhj$;2CEg^}FRcCV0k~x8+Upb7mYv-oM7)tNDW|UH3I# zyY6egcHLJz>h;10*B^1NA6~Qb9cuJ}$C1Zp&HpiP^D6nT_^SVkulhgcKTG~ce5qga zZ_J~vJNwT2&*RLa-cufjkJjVpjIP>)Rj^~)*8E4*>Xa0}#b9x*@-oMoKU-Cu&6<_sV@m2rF zJnB{SAAO2C^7yRzKj!QHE57Q#;!&59|BA=!aM=6LB1=YDJx`K$hqdDN@qKgJF7=w5SFRtnS=|*+=Yya5uXx-4F@NN` zoEZ&i@&YZLR-&U%CGhH>`iv|Foa(_}S~n z{Bex&mGkracHD>g?|5v#R)3Fs-u<_A4*DNN z$$!n){MUTVf5lh*w;~PJ559E$SA5lf&DZ?be9eE&yR&}%U_8G5D<1W;YaV&V7}xc0 z95=;tJ03^>U-{tTnPc<$o8$TA^QSE1-}~|P(fJ>*+gIZ)&i*hTIeZQIJbw=2_{^gw zw>-y0e#V(++F5?)jz)*U-4D{HDB{z^ELl9zwc;?=pT!7|DZlQ`%m%Q&TZ_!h%=9E zQ=Z#{k2v$#^_0hUn_Kw9eO>sYZ(<#n{-5&PUvTl9dCr-)2a%s~&X1bh@?2u@j5E*g zBX2zC{78qd;PL#1cmMM`E_}&<&DZ?be9eEwqrN5o^Kr=Q$Ll5k6~Cpw`-}K;{Os=z zG+*;y^ELl9zwhiI?>~?8{K4()JH>N5j}7^VGmmXkp4)?uIP=)`l()Gb^T#|8UwHFJ z&Hs+){$}gvoGbpT{N(w+JO35W>76|GgMD4rAMgL!I=G(P|M<4#zs_ItU-LEp6_3|T z{#%)Gpswo&U-Dn^ThV{b*ZkLf&411BJ9^;Of5oGIJ8OF9zv9{d!AE@QU-Mt_Huq!x zeta*y_5CW(xzYa_U-5s&bK9N&n%`}1&SO8qf6dqY*L=-?&DZ=_eBJ-^J}966>i&=U zy8nu=`mgw^|BA2rKj!QHkNI$({TuPc-{$|ArH3c<*nI@+k^RAZpZI9`E$-(JzwP{~_^SV7zV1KfiFsV-U-y5^ z*Zo&~)qllT{a1X||1n?pf6U`}>^vsypNRYZfe_X|V;-m-)9{D;y70}PHJzEsQm~mcU-f^?*ZueN5RYd*f7SgT^IQ4; zU-4D{6<_sV@jDs}4#7VhM~id+&~NYmG0*Mz42|&-XP!>acy13q;>>eWGalRVxuuxD z#}~f&GoJq)&wjbfkIyX~{xZ(_QIlI9pPM>(#+m2x=lOSjZYz$T#XTSX%k>xiSA5lf z#pCr)_`E-l$Hm{$&;K|MFRWwFd)ctf-UI0C)_>l==Q#4+xA>gmx9*L{JrA#uZ=9DS z_Ye4-+#XS$Nr~LNK$Jf`tZr2Tqdw$>NJbusj`ucm}J>$${-cz32gO51#sMnO| z_TVGVJPS0RKWiKF_xQqZkMKO+kMO9;Lp+y1&yVxOv3`#)>yP*S27S+w+aJEeqxFx) zJ@40BtV8ho)32xNKI5Ku-!=d4Jw7M@-t&8$`QYN2$79j^*H*_XkMfoN?sv#<+mF8G zIl$-dah^Yp--niW$iKe+;v>h9kGSU#{{{b3@Y^@ed))Jf|3m(}*B9pB$w!=d)MlT} z-xRroaj@!$RM7>|yB%=uhD&LK$pYj|*c@?Y{C6FlS0Bd_gemY-vS zXPkL1|Gs|v!E=1i`*mOE|M5pm+5G?R)#IK&{1@wg0`EWffA{Kf&maB|`OmhG&+y0m zk2v#~_lsV?EgRmvyx0Q^iQ^XQrJJMU&h31#?h)s_!NoJibmt9w{qP<+cps4Rqb47i zSM%lj{o(wv<8S!j{3E{PH*Zw_*Vo_u3Ul0j{T^o?>n-r!_r9;b@8Q9e$Gni=`G|9V zY?|`8=OW+c@9~A-X7z8pHBiKvr^k0Z$9VmI`zywoXTRL>91}d_%yap3{x^C28t-w> zANTvJf2#NUf-m3i3%-26Kjcv_bKdJW^Z&U1cK(7d`akB)tCIhUulld}s{dmii${Zn z{~qW5L49`bzcK%v@!tOtXa4km%riHXvHp!X^Vl@aZ}V$>#23E#GtM7O>z^IF>ij$X z*Zk?f|L!yA$Nq2gb4=uCoOv#PR)5ZyW61m0__~iVb{*pW^L;azqW_Ao`mgw^|6?BO zDf)lhKX>Z~U-W;>*Zo&K*46I&?HD2MkH2#`PVw`9H-CG*bp2QS&vxY9y?;E;`B9(d z-~&1Q`n=aX1kX70Rvr|_>O8E!ZEN-SxaZ^kf4qJW)$6|< zhr#iG!rThK?^pS&{*QUgr{q7z4d;*7Oa3dq>c8e|{%gMGzvfX_e0l#d9)I3v#z+5K zk78fB|FA9U9?#wRm(B-2^Izq+{U7s3u1kJ?-_BdZ{C7O(cE`v3xi7|f{h0SH&oOuY ztMzkwEHQci+PnOCE#CJZuHUw|_x&Qy^T)oQX6v`@1^@N@YyK-9ub2Giv1#k*`VV}` zf5lh**L=-?&DZ?b{J!J3-}*n}v90x=?<@CDaPf?KclEFOuXua?m_Lp&zH)wk&*Q$z zgS+K9Cj4cb^K-p-`8g(d#+hf^&UmE5*WT*yanHN|YW*Ne*MH5|?*BDk^I!3(SIK`X z68eDkUAzBBkq3O$f0ZA{?gJlw{`UBC{Osp`&DZ?b{Jvvb@^^gwS3K%z*F4UjG53|{ zAIDAc+>Xc5|5rY^c)lJ#j^~%xkFtz^@5k52#}8ZZ)p(09^EdynVaVtC+kWtWndf|& z7hjU+n8?pK^TcMn?HOa7$5_NY@BZ6{VgJ_r*L=-?&DZ=_JnB{T-|EQvF8V*@Kf!;& zm;D!f*?+5?!V;!kk9_u*b9$u_tyVIp85C{{xHt@`TZk2 z<}~H={5h24bAI;QEI)aUiTN|mJeNP?nUiA*{@Z@I|J?t8OV@u(GdzEk{TKPm{ttPq zr{sSe$Lsp>{VN}=U&MX={qF`8U-e(}HUBkV^I!8<|KIfQ&i+$8YS#JBak+l@e#&z@ z8P-4I%wyA(XI};%@rAd(;TWz1^S$=}ln*YRuRLDgvD?F6#yLO7&+12>{|o;aXWlkX z>W_5z3LejIc)$Lu`2#Nbulbt)ny>k%d7I=@!TKhJ>$7K{AHZykDA=_+;{MdGaq^5nfuHAYp)+X_Vb2!|21E`{%gMG zzvgTHD<1VI`hT7WbN#><{U7sN*?+}X{a1X|f5q=RTDJ9{$GQJdpWXX^%-i8Rz_*PrH8@_8;euzneaI#+m2-<~;HpyvIEs{>%9n{Z~9*FZ}+WV@CeL zpZ9!t{XEX|NBv%A>*sbpTK`#m;a{D{z8~^`%-8)_eAR!&SN&H!-tT|?&Ck959$)I$ z{2TMAJ^0@?KH|*N=~?~VdFLa}JoK3I^e6I1eBqlv&+5nRC+~63hyQZ@MgJ9F^)5^_1T~;B%7C%{z;G9$ruR?Hhbfv+*AH{Jzim zeaB~BBfrI&M?I!Iw+A0_=IQb*Keq=TapqCrDUa=2@DX45ZI(Zn@Sgk1Jm&NekD5Hh zbNTc6?`i!W=lNsy@$-V{-|Y`yUw<0?V{y+P*K5J!^Zl>Ci2kv-=MP^6Pw#(}uKPcF zpLx_TxOl$aw?o>J_phuY>$!5@j~qiDbH~5;@x$Zu{*3edk?%u0euDq{BR}Ww{pWGd zAN~vePr?7R@gDd5zR&VwUEp7gk2v#q?IE5{Ka$@Ln4kZK>yJ6Jei7&S^N2r^Kl#6u zA9H#rfAW7RKUN?93;xGA{y%QV-{Zc1hyQ|q0{_%_k9+>`f5>n6ygxtZ@BQy_=25>F zef&1VIL01WY+SeTeaq*+w_o)>uK!owUN8KXjtJbx_p8$P^l9_PAY-{zgp z|K(TP_T^X3dz^XHufV@c{JXC*AKt6{_%~jV-}#6$kG0+8KY8wlj|*?!sr5 z{fy_o6A(P(oFDZoexK^U^8LPjUZ3m9 z*Imr(Js+)p7U%iX=h^zXoe%O6U-&rReDMAB`N6#M(Rhn9pXxT`ZF|Z8UGR9lQKmC2lLp-{U-gywdzv>#zE+_^SVkulhgc!+GyNKNsZn z({1lRzkg;u^ZAF{`Dpya|1n?pU-4L1$$!P;_0siU@t^j2|F`w~w9orr`S^^#`~UXy z_E_6KJAV9(J;wMAV2ktd=e9@q(|=Vz|BSz%Kkh&8e_cQ4kN!L6&$yreelveAQ2)LG z8=L=X{#E}KU-e({RsY94>IH#I*ZtN!mpzV5%`tNtq=^$!Nqfz-}c|~M||P8cK@-&pZ;TQejoEDKgam_ z>+Rnw(dWDT91}d_e*P$r=N;xpYJ64vAI~3f@%~@&RsR)V^?%HxUM2rAZdgCOZr6O) zKjOar{&SDwtNv@g=D+4^{%am}#h3RVWBkq!->3IatZp+t`kyS&u7Ax*^snOSeDI8~ zJiedixBX*K_%q-)`lIsS@toToAM@wF7+>ml%VTcG{26E7N-~*0r^hi|zklr)-mm{^ z{a{M|Yrf{c=4<{d9c8e|{%gMGzvfT>QJbBQ+<&M~J8#0R zasBL?$NsgkNR;{WxQ%&k$K&XKgdLA>r};UaU(AoMosXQKFZ#S=KmGZ~w&VXAZ{KE~ zbDQyb{v68jnMX}-d5($vj5BXbvbxXazc+qI_Wi>9_1`uOjvrnx`LFq!|C+D)uXxm} z>VG>9{qYB1^?%5Jg8zaq`!D#i|AOCl)HeDDvGjk)qkf0KjJdDezx1Q|Gvu>BHul2f z+bPd{{0e^<=luMBmfyDH{}fN3XMCPNhjM(*kDA=_925B&XP(QSsSN+#~&410;{MY=>riuQsIQI|gv$Ovc z&+XjC{);&C*f!<4J@|+-k6llBY`3|EKit=ax4z-)?oogI`EulsIP<~9GpCb(e!=TI zFRPKCapqBzX@2tjU+|1GZ<{Ce=bTR-`+38=|7!k#Oa5!V=D+4^{wp5!E%_hEfwjuV z53iT}SNvA|yr1T4{%gMGzvlOy9pwGzaqd5G=AYuZoyUfJ#F@voDbMY}N1S==ddl0} zkNIOBh%dbPr{;ghbALQk<`I`TVuls-2As@fG|6_hD`>*(_|BA2rulSt})cVik+<&M4 zW8Sv6&$~yQc{=UhjCtGM_=q!a%}uFzowDaQ*Dq{3KX1?Y!Z&}`_|t#Qf6C|mS&rO) zT-c|4-v2GXV-NMu`@iL}F4VT2e=P3n2fwHFulld*SM`6)qvxvE|F(|4{@|L3zc?4*=P1k~>d*Py9Dh#n zvv&L}?)k$TvHq(6a{W*2jkbP^`~2{Gdi<*XkMr04KjzV$f9w8_`MUp#ulld}s{e}r z0!QbI&;9s$oR1&sv-|Oz@$q?g^8M%CPyfd}KVMIV`6JHxO-SpXF;6!5h%bEeXN^Do z*E~MA)ar-l%lc3MHIL6<9X#WH{^7skzr^~3_qgZ7f5lh*S3JBd`LB4qUilZnF{crPQDi7rc zZ{Dxw5ARoba1Z5=>;7tftUliN6ZQY;^S1qI>pzeC{`2dt&i@PWUpL<4o_F6h|HJoN z`@BCsD{pb;gNtX@BmdmQ*ZFAuWATN5ZT{Ia>v7@D`OiMvUI)$#=JoFY{hjCZIOoJ1 zKg@I9@rU!P`NNqd9`$^P|Lk;jDL;{MU{5IP>AX&OhhF z`&Ax=e`x+Za*wP(ykDJvc)!Yr_v`#|kKg+E+P^=?@&9={{vPM!AKvTyAHTu9Zu>VT zJns3pw-1l5`G57iZNIX61wQkU`S4!lhr2KE_QkKe9$)z8e|UJ!U-e({{{a5~gXX`- zIX~+6!TT?sulezM?LEG>pDX{zsQ(|g`g?rI-~3VeaekS6M)351jX(Wg<1x2~<`2I4 zzn1^>e~mx=U*oy_dH>9hA66f~8xj4p{}polm0y26zVy%2Jpc34wmm;N?{UwE|7!i; zf4^^L77GC%cYc{i*sd_~*a>?S_ZVzr}g}bi3sh`TzBYZTr{l{OfVg zA9)3Tcl_h}f9$9GS%=4dcKlEO*Z9-_H6H!j{9opqKWqHy{~CY#zs7U<^ZuD1ztew} z|KlIv`uzv)pT~Xw?ahD1|Es5M`&Z3>k9$7+7yQTHc)#Ic`CFX%)BiDF_y6$V(*ITe z6%YTn=0Bbp=lSFKHUAa=qYt=$Y5sfM^RaHl|Bt`kw*T?he*8S{`QYODdj7-f_}d=m z8Oz`Cg@;}J@cU_F6o2|Z&R_pGKE^!%jSSA&^AG=xkmk=CfBHY>Ie(6c{ETz`Pyfd} z?rV3B2_E-y9e?_-c&;A5XXFpSR*NftT>pp154{8b|3~xR<2--tJFfqN|IrirxB2gJ z&xikN{(t{HoN3p8k28PzKjy3cV?S#CrJw&bU-Mt{HUBkV^I!9*E55vcJigT5>ZW-2 zKmNw%Ee{{2eD){K1vx*aHs!1StNGvY^qJS+8P74{ALBfKa5sF-f1RHby!T)8HUBkV z^I!8d{}o^LKl%{G>aJh$o}V8-zZb~IFWz_1e9eE&*ZkLf&410ivt0jY+aK@jro8^B z`9L>xtq-xE%lV_`|0Ms1+Wo(K@HT(V zf1Q8dv8`RdwEv2?^TY8swr}}#+=lhzc05x5_x_~3Lmu1h%g^8D|DOG`jeguKybaGh z=hlAy9`bqq9Ln*Tr`t0=`%hl^j}628hG0`$|A3GCf5q4Q*ZFJyYrf{c;y=OvI1U$o z{hIIf)7O9G7kt@&!Pl<;I)B-Jk$>O0Z(sjgf8+YE@_&N=!~EGF#>|ub!MA(!XUKCr zzs~-D!v`17m*YR@>GLdqoJwx4z-)&Ew1QpYy@RGxpN)czx&XMdW9k^N0V6_xB(6gU8QM9nbR3>W_5zn(@c| zzgU0Ge?9-2|C+D)ulTC}aU4*r?)X)I{?~lXf6dqY*L=-?&G-JJAG`hox3m8gZ`-$b zt$%s{(DOKMQ{J|>pC2O5{#bKQ@?$%`;{8XDFTC}=n!n)_9&?)VoHO3HO#b%kkG%1W zyC1BU^WUfWIlb)vTi*TG`D^}bzUIH?YyK;~>Obo;KL6LQ|C+D)ulbt) zny>k<`I`TV$8kYn@BLSN_J{HH{9(<_i>f?++;;jm;M;NE#qpo>nA0s^@qae|ivOC& zx=@?A|6tsoKjPk<_`3g5hwJ*Q{tN!&Z+wftU+};GX>niw zJ^ucu{Th}`-!IPpAwFNXR`Tb*U*pfd8S~hVdy;nkus9!o*A$8i3SoBtm7{TEz3U$0+yz4RGh#s7o%`1|?x_dg!z{HOn8zV82d z9_szAUjG&UtB?51!bd-UdYtEf`mgwpsQ<@Se~)`U{8#+XQU9N}^RLG}AO0);Yw%w; z-s8-l{;%<;|7$$@x1GP1`R30WfBL`1pZ>4$r~j*b_^!0))|DLb{!-GlTdWz^9wf_-Brv(SQ9DKDh3P z`*r(uf1LMZH1FQ8^X~mB56-+><-_|`KD>W`H}6;Z@P3sC_fY=uellI$AI>lFSa&$T z#3$#M_~iU5AI>fD$@wK7^?N9Pa(*d)a(=MVJHl_q=ihn#PXE{DfBL`1 zpZ>4%;r}Wh{;%@k{~CY#FL^t}s{c>_<39L}KZ(bf%YVl%-FLJ;{8T>tU(J84do_P> z@q9V|`I_7P!<+S={*UL6AGpA5{sWl(cR>384&dqkn8&|+J>{|Mn0GvX()>BM=KT_X z`oA{+)BiDlSHIK$G0%SGLmfY?KCb^_{Vb3^e%N=r|5y3%`0#&?KmA|kUwQmfA7A?C zoWG61x1;O-I`96k^X~sT?{(8Ww&RQaV`DDs4=$eB5BYu5@8CbSNk05ny!GxRKQ>w4 zD&Ah7^XC65AO0);ZvNn=`S0q-<N?j-|C3{b;l2-voCf0IewP^o_GIs{pR_> zy*!d1y!jt}I9tDs!E{Fcuk-HzI`96k^X|XqPycPqW&Ls7W<182|06!Qc)r#jr{*2o zB#%wjw~Dvd=e+r|%5!e)KgHk8pS79sSl)5|jJ5Rrw@>+C=x@Y5@7I4de=d(-ns@)# zdG~*nNBzwI2YB-zOWb)J@FdTFHU~Z!_ zt6z8iJdfKrKeyu{`7`gBXHtHp{Fmd0jdt8iyzMI=f6i^jU*`XYXKiNurG9UCw(X2J z0RPw4Kj7p3e{KEr<+1#6|G$-+P^oBWve zhgQEu{_ua1-}guIvp;A2UH{UL8Gq-`dE8g)A6z_t+VM~R59@z7f7GXO;daTQ`g8sqGg-g={IBNk{H*@R{lCrQy8e6qxc^_`Q6KYvb^hSZ|2PhJ^XIsc|LeT_ zzs|e=>-@g6e`Y+lMgK6)>&N#~p4;&rmgMQjEWd3}{d>)C&Hcdqtv?^&qwhE`uH)K2 zck>S}p07M!pVp7%o7KUT;mEZR^Z!v%D_vjyw^YKUBZ+M;)VCu4ynZRK;CC!=TEF=HpWs=b@OMXa z?fHivk`oGGb-mI*jwFxes^WT5i_DTJ4{d^x>Jbwy* z`hU)&=S}~({=f0>^#7cP<}n8IeZ?;0^F!zLU-8bk|06#9U**I9RX+S*<4^zB_|yM2 z{`7yDZ~m|Gr~hmG>Hivk`oGGD|Eqj>x5@_>&)548y#7g_@xSuff8SU3H~h!*%iHsh zpEkJ79s}>koc*nwG4y`SyZ7t7d%w=R_p3ZOyYF7*!~0b}ynlcYT-3cNCSwB7x-JpJ*a;D!Rz7ZW<@C78i$Ysp`)c*D*Zb*lalCiBHv8I1x!d=5a~=0>)4l4XEmy^}@9OUN zs)GOXuWq+L|H|)mJ4zpnC_zq|5>hgb85o05P0pI_bZu=;6nKL1=Jmi2f0 zTb%#DZS~`E&%47i|Lr?}g=O`xy#77Te0V+Qdsh#ycjr>A_HB>j&DydDUwoGj@0Z89 zUznHoJ}>b+czOCA^6*;mr~l4<^HTBa>(b%%HU9AW8h?0wnQvZQ;}5T|@rT#f_`~a~ zeEbcn_-}o<-M-cSJEki z2(~}_E+6J~i~Dg!e*}N~$HyBUeqHdm=Yxyq+*h{5c08Q-xaVWNR{R(5ab0TvZ3>Sw ze|UY3KfJ!iV{GlZbeV5nU*iw2uknZ1*Z9Nht9*E^_}_ZE-G1xI>&N4K{*k|Vt@v-k z>u)x%J?{DNTJRh0QSoqpJkI>#^^EUbJ-m*Z&#v@s53gr!*@ItTz5Yd8uRYHF!o0+K z-Rd*vV#`n7^5OI9anHwiRQ?}7+-^T^?^$`=^TEaQm>=60-#I?KR{W=*VGx)!W_|P7 zukt%kh~jVS!|OT!5tz(>{ruaXWgh$5yv=#$=?D+6n@$}#um__C%|7(bIe*Aip|F==s2hVum zZ}dXtXU-KLUMrscXB+lEu2DHZxRd-p#hm$Pai5?6i}fY*;kC|Buk&@`ld0F5uX(Nc zn%A1Ic|GTQSJ8$SSDXj08JwHbzpv+Qc?N1;Yrf{S=4)PS{_y&1IH|l={IA(}l-+Ci zxhby||Lb7FYx2r##ghpyBksMxUU{ycZ^6*Zh%=A8Oa6aFezqb1zqGz&9<{dQQG2`B z`1hdT=y+Y)mi))YxYrTq{5YJg*J}Q_R#(<*&DXrve9h}QKld7A-uxct-0OK;&S1@J z&DXrve9ddke_}4PF6p%LTJgM&#(K>*%4@~*e8DI4f^C%7ipO^Q@&0=})U|nmJ(F|I zmj2WD4Zn?lM=W_>3or)jKl)C-yI%;ev3Z)`?{Q+i{!Mz_<+nrPtSFvqH6QK#Sv-ut z-G|TfSG`{3|A733`*4-N=Jh)XQXDR0Nc{}sHx#M4>7_Q!Ls6<_0vUQhE+yzZ_G$?GZq3a||c;GdmmRsPXV?`1>4rmpu35UUv5q_p(D>uX)x>TJJ5+{pbEw|G9g`$GpWe#+v?S zbFcBYg!P~6HIJ3^$9k=JdX2wjjK?+6UTesFc&&K%+IhzKTWb3EwdQMHYrf{S=4)Qh z`QBB`wf%h^bKak;zAg5}>t@rsuCCYfTs(s{uQgxuTJv15Ki|D(oa+jld8v5re}4Yy z?loTf>3E!vC2#w?>%yCk#{?~T?8iNV|9u~E?mxHDYt{c?V!h|FG9UG%c;1JjMr{1_ zdgOzP=f2kbwL-l1Xgs|hc{}{F|GW=ByvA#v-E{@yv-@zBzj`08`I^_7uX#P^dsorM zypB2R=elnjUeDXI0;>1nIQ=+3eJ=7fuXX;K*P8zvy$Y{A&UKBsGOskx>%te!>o<0+ z%!k*CXC34Hp`B-(c}&nre&#%Q#slBxeG~J)=EG~%fAsH$*TJp-c#qEdlJg(+sPgj& zpBj(%2oaC{$2J^Q=g0otYmak&?2Pxh#Q1CLwa#DjTJtrp=X~$#;dP8T-&^%fv?tIghn( zdw4x-%O3poclq#fd7S%&d1+oN{&RT!dGp%io)51T|1I#}YP`oiA6_dS^Nzn6z5gC( z{_y%54=>tvIK?Ra?o zc%18pwYBd57hhpraj)^rIP-_sv;4iQhu4ua_qA_(cs*;&9(?Ct^Wo$2IQI)>xaY%b!9V`b@8Wa&&bPSd!)w8xT$c{7uknZ1*LW6=*TrSNd2x+DyuQXC zUSH!m{5!|r?!!g?r~mO?d~e9>r^Q44G_M7J!~H5AUjH8V{K3UI@^=Nz`}Ml=F1UC; z_}uy%sqK$b_X&cT}+J;}nwpNRkw&6{sE!vci8$MKy z%ZoE>rq2Xs%7uxRiTxh%3 z^J!bwm9EXc9-_YTwN}?;ye{I;%yYEmih}KU@QdQ{S@x*o+VS`MD0}^-KYrhD9M@{I za$Fpz+&1dCa@?rnVq2@XO53R8N?VMreB7wx%5kHPYi;-Y`NDbI?=?=_^8B~^iAr1Z zBI<2jJ5k5SJ;PDQFY4^Q_hHtSHIMCh_`MZ=#Sgb0^&d5@`0rz#_};Vg9`}6I`JBf% z+d55Jf`BV{G89#{GW~gaOqnAas0dTbNKi4AES@g=&cUXpLETA zQL7I+*Vr~ZoXtz$mN~1(<@xZo`#s5`zu{q}t@ji2@g3tp5Nn~ANiUG*Z9N3YdnT?SALri%sYO>{IAD|2fA_VYe~m$>V`ZOZQl@M%p~0KdG**ewNo}b?+2D>a z`pUlPvA$?)zJi&It8bg`(+h3)HGk6faI}pVgMWuby_@e?0|a05bv`a;+BWQaWPZfo zW}NdUZkqpV_<@J<5obPpO~>i#g$z#ex0yfU%(GKGhbta!aDtp?Jn*-B`0!Qb$Mz?- zY4i6q=Ewe%{N`xu|MLr;!(a6ubBFnh>y^jD_{~?{|Mk5D@|&-kN68j^o%0y>#Mfe5 z^EK61s;mCE;cKm}`#Nu1_f_*XUlot@vHOa(?GbY|^;PjWS-%KhBhK{_Ts-6WXSAE;?wbnN7 zhiAvF`#R5MHCntMmif)mR&UZ*ouB_^Q>@Q7i*voic~U(0G5|8 zTlx?CA3pXxx^=5r#$*Q`g+UxF@MHIKl-|gzX3X5J3jd;@|S%TeA!pQmwlb^y;qzYU28Ae zny+zw`g!f!hOf1@`~C2wzja^dx$5hy=CL;3w#V?5@lbCY=WxMqm@DJ0CI=qelIMQ# z|9kkxIOoSPmppUQ@q>TiyUn}m{}~@#Joj~B^S`{GNBd=dUtd>$zi&$($A97!we$Bh zdA%;~hwV6%{+HHQJ^q@nbH4YAebcq}qOJKF^V^TBZyUbW+Pbgvwsl`MUt3=_&-L~B zF??m5eF3*|4i`MuSLa##j5Ck(wB)%T$F}_B@oUF(!zw=suIb_HxW04$J$$OOI8M6n za$h4q=Fa|>&*M+?Hs$GS@DXR8!(a6u$A4m*@D*|Q`aDJ-uQ$bU#{QRlP2(8&ny+&n z-M+nieYn`xd`jfJwNZi=EGOje;%GW>5F*1Zka#x$noO!`N$j3 z$ko-4ZEwEvSo|5rZ@wxX=f32t=4-yr`Q9szO`oe5ZJV$A^(f6t-}dme(l&gpw2k*# zXKl^x|AaC9r*7*q+4I+y z_V=L{ZNtq<+iLhlf}B@KEvJ z!-Zn?c{u0Lk4e4LSZv2bdmJ9lc;#WKZS&BNU-PiiHax7f4G$}A!^88ohjZs`55Laa z9xj#IHgC?`9*&&1J$yKCd(?iVZPafHd`p0%W@^=|{JYTzJ z%!``0Iu7QfFZ<`)dHi)-ujATry^d>by^bqw(Z;Ubm9|mGm9|mG#kN+*m9|mGm9}V8 zK5o=;<+vEze!o>X$NM$;yzNnoXKiyoU$)Kn3^)64UjARV-@Se7_PyKxdHa8E|M%_x zz5Ra}#Q*UdFYf2w^H`V*dq$4ucb1>Xw>hCHa z_a};fclLTpTtDqRjP=Xk`S9zX$Nlxs^I{x=KYgvNo&Py+$9>&r=ZE^|f7>zMn|S$J z;ZeWy{M;Y>?6u0He&;;d;3FR9uhs80{-|HguU;!gp9=Y(AKUrISe}R1inkLU?H8|= zWB%f`R;vT_XE=ZB>laRs-K*&OdxxUc>o2&tZxH#t=FjRMIRsy;f6d!_OIyqTg#LE# zEhTQ6KiFO8z3i-YMNssTX;&@A*xsUqyIQJiijQjHG_`xpMZ{)Z7SL4U_QvIho7|wsK z{xx5#f6e#xKYkV>#;thPJmye-mm;`$#_@*n`{%jcztU&BJ09nEi~JD}=ill__Z{A&GSTL1fTo}cy4htHqK!}#0%kK$|fulkSNDB$z^AMiE~wC%26{GE^1e~X9y zf7!+__;URVzFhxP{uT8<_dFC;5%vJio^SALl)uyZSAx zU%|!m3m)?(|NcqimVDGd`=aVU9jD8m>mTvtvwHjAztjBad#V0aer!hppVvS8+3Kk4 zKUj3({Q9r?TKzA0)co^PyM9`n>j!?{^Qo{)5M5bNSyDYW1i1b^YVmckxI4UdxYja#wykr~db=okxskn7{S-kNUmV zf8?{eK|e0#kGi?edtSxccJxixf4qLL`u{x)aQQj1cK-I)L5KNYU%!v~yT%{&ca6vV z+|_^Z?fhTMf7IVK{;0oe{84{b`KZ4+fBt!1=g^OM9lfg`+rIuBqJ4Ji#{c%LT?gKL z=&%3SZvRbMUiCfhumAr3ljeW^-P`Tw?Z2JwanHx~TjYPlf4dzI^RLA{zqR@keEq-u zFUG(AH%$(IuI0z1-qnBV6Xz|S`}23&|GW6ZpR42F?#hqRxBCx~{|Wzg1RhpDEgtHp zz5gos+ux&p|Gw3)$35?#AJg^!@Ba1e_V3!io#FAox4Jt#8qVKW_&0UF^7ZGhE$;c? z;(7EJ+xO3pdEE2ipW?sq7XRvM`!{hs?)mUf@$orOQXXeMtzY&&Hs`S)|C&GiyOtlF zYW`j3Tm4?+(f_;n!@q0!IsEqb*QNPK@8kYo@V|%p`Mp*@9_RCq{LMer|DS>XS>rwK z`S4Hizl6WPZ2o#Y@Xf#QV5qvsAUypk}xOg7&^K*H} z=jSZ$`S4HiUpy55t-3Gg>&Kc${WgED<;U3WD|_k8##_zi0&9+tnw10U;OtAnxr{|;;3-?jD6p)_&fy#K_%3vT}&IL}|i zdH%vb#s4~z^WR}6A93bUKX%>~&;7wiJn-hvf=9pgzs(;0t@w|2|L{7r@NdOGKmXU} zAM5PDPW{vTr>M^G&*NeI=AY(k{%OAEpXO`+MIDXx$F;Ar{%OAEpXO`+X}oKgO94E}qBvqjSMWoOwFM>!0GeKlq3T-uzqex5QhVd2pxv|Ar>M ze%x-1GmrT@<>TK#XR43z@1bX&!(Wg8Q~Vq9{%@%BIE;JV*FQb}ntz(F`KS4sf0&w$ z^Dx#=)j!SG{L_5RKh4v>Pe1ee@i?Eq@K5pd5Bqli7-#;N_xb$MIWn>SG0r@GZSx+_ zWGjA7>)XFmMHW>G(A|NJ{?{rjE4pY0?+*Sy0& z#yLOow);<&zviFrf6YJ5m;Gz=FrL5K`iK02FZ(C>vVVdv`#0rZ;op>hg@04t&MRuW z`M2@+q5c}D<{#Vfqx?<&srvVVfF`FEU$YyN4z=AY(k z{wW^!EBpEvajxH3{}j))GwK)jP8Me#+}7@&rt^>cwJrFFGmm{s9`}wrAMwCjUe*6# z=wHN{4=$d^`yVplU&NV@^>4+8f8-fw-iC)2PVqi`U;ps816t14Kh4+t(|pZ8&DZ>k zc^v1zdjF~Untz(F`KS4x!I`-K^f;e?a900{$Lj^=9P2mY%wyh{JYKKZ`G_+g{^|U` zP2Sc&ypCe=z?*+3yscl2@9rO?ZdQEwM_#ReD?a=qul!Sd_7AU}VJhbSX};#4=4<|G zzUH5e^J5I}#rx0I`%lcxl&|@x^Vj^-Je~Vl`}@!1T)&t%^JmS!N&K77G9Uga9zQ-r~$-!cX!aJdeZ2z_)o<^S|c9Kh=NhJ38t2uWvrXdnjH0qwaKmwh12Z;dK5V zc@>ZCm?Gyr9>yQs4fB1KeKm5DKTXB7i z|KDFn80H^+U-jR}JNU!DYyCg`yT%`NdzB9^p2zvacFe8UkH`7^BY(XA-aH=pfAJQd zA8GIZdEE2y{-4Od{SDrK|C{f+KOPUfz5jRgW6b}{ukiU9_YcpEdwy&F#W+U(XYlW5 z%|DNOKKxVs?}7il#(UiJ;h*C1xxU5cR}cTL@gK2(tp2a@sEvF1cHO_0AN{|JKm5Cv zpToa%{$l-W9*y<)4V?dPwEFRQsGr8E{$u<8`Du@PKKxVs`t!G}&351Tc7Ff(@BRv( zAN?!8et6vH5C5Vchr6If7kfK zzia&A-(|kl?=}AL?;3yjca1;%yUOqD&b)pf|HoJO{Jz&ui--CNZ|D5&=cu2bxAn*4 zp5OZ|c>(KlB`D1K9`Tm*vcb#|tuJi8SRUX`S&-lZ?tNFvf zJ9zW&Dj)t`<-y&RKm5CzAM!(JQ$pTfVNHvc^C^G9CA|METjZ?8Xk z-1EW3^OzsoU-kW?7yR<|ufso?f5{*IUE?vf=I>>`)$cX_@b4Ob_;-!x@V)M@^5LK2 zpK$)3+UuVl_w^V4DgIaC->)|RJns4MPw{{9_ICS|w*GlM@Ui~2IvDHs3;6d%^Uvd+ z5C7smaO7`KsIm6`fyX_+_gm!O;NSM8Uw=IA`8}`Vae}w4@fK(P@NYj(cmHksQ6uE> z-%cXmy?=H1H|K4C<1r8T>3Q2=_b+pv?fGc^pYg4Jukq;LDgSZG&v=->Q~voG%Ma$y z#*R4iHooQfAJN6f#(UiJ;h!8o{M(v;o5ejJ{weoKJq&)8V@K5nyyoEo_KaU6A z{7ZG%)gRrf_^0`rf10oPr}^6tG5=eezaQeiLAB-a2N%z1+l?Rp@gjU?%HKbZIP)kD z^Iq{Nt(}iJ^EjtVp8F$z!~<{jukwT8YirG4k28<{pYoWqooAeR9-HgeI)C`bc60w0 zJi3VT_xiUu=ST13^%t8*OjmdQ@O#O>MgB+RKnIvr`=|Mue^Ey-`(N`<^ELl8U-M7% zy?^*`(M|nRJe|WntG|fz`429h$N8gk!AG2V9NOwe@!TJL!~<{jzu<3)w>b0MM}Jm4 zzpK^i&%U>ndDPu0k2&9Y#+m2vPx60+zU}@o?s@l5_rKc=%3BK%~;LH9AzU<$We}#Wj zKAbD~H|4D^P@C=iZ~VPK|JdU7t9Udx{9&B={-!_?mymdAR1E=4<|GzUH6evHgdbKU@DI&h;1TpW=DH3f}4`;>?5FSpSO0z1z-5 zoOv92$=mT;{)h+O&b!JV4C_DQ%m)|G=uUV4Lni!-IP{uPhc z3&=PBJkC7keaZ9np5P))QAufO)|7k{V!y8q75zc^OTA9b_h!$0zjGap<$ zkM%<){EImA9R8~Rwx82)*AKK6{;B-nOa5uT=AY(k{>41txx4;V{nLESKh4+t(>$Gf zO#VIoFrRUE@(3?fP+o2y~zJK(t zdEEJj`NhjltAD@E{X?6Jy!&^ZcmJ;P;B5W5%7=ef`S9-!-u$`BhksXjaChYo|E}i8 z{Mmiqb>98E&bxPa@V5See|Ghbx(p`VZuK4ipDj)vc!CU=b<-@G7=_2{o3c--@G-w98q_49Av-fsW) zt@9oaeB;8S(Z6rOzi+ksUypk}xOg6UY+tUFE|+#s3km|9{k8|MYmMpXQ(9*VkWM zH{QB;ia-1J&kk>={yzQghZ`PN|1BQ+-`2nIXsrJ~hJSzDUVrkq=MQe0pMEahKfw8G z{vF53_s`h>ulQ*GTAcGA{$1k_|E}?ef0y~@-!=a5?;3yjca1;%yUK@uihl$D-ZcL_ z&gUQbn}3S`$;0jTleT_(-1Fg|;2*#J_J)VmUyBDm*1x@u`}+O%huiJjZT<7O=fnHM zgP#BK``hiu%|DNOKKiZrPvGAt?fpNGdp@{$9{tDm_Wn2eVR7aU|K_~yzkOow|2{we zXYikN?;juj&3W73c-)@6;BVY!_bqcC`|;!XBhLM|ZFlg8e>(riDL>er+DrUKH`Bl{}%i$@fK&E z`?&tDcmTEsAKkI{A9Vj~{%OAEpXO`+ zVI151@2{GFny>k%`I>*4@BQOFXg+`8pW=PZJN!et?);~DpUxkhBg6GG;+!A5f{W+j z`e*#+>o_${!Mv1uPD-1{~Ler z>la(Re&cyKf7p+o@P~2clYf%u;e%(K`Q)GEi~b3IL&lPSf-n0g__BY3ulbkG!*Kp; z{%OAEpXO`+DIWJLID!8C1CQtHpW?HBTsu(=UHyUESpSO0E@N1~weSD+_y2Z$BOZA3PvsBB*RPlPqi$Aw_{U>0&iR9jXYB6$B@_NdoO$yL2h}`> zAM2mTJ@5CQny>k%`I>*4ulX1A@N)iY{%OAEpXO`+X};#4;=?)CZ^ZfhhkuF>=g3E# zdCa%@r}#5}z?*+p`S5SWvrYJ`{9Ey?&EVDgr}+)px5hJ`zy6~6ntz(F`KS4+fBWCD z{q^e+{^4Qs*W$i@;{89t-+uBQ?_aj}|2*#bc>hoFZ}9%#oA&;n$34Hb`c?e4{QL}R z<1YU2?^=E|A4rIKm5Da|8(7N-+y~;|F^sPpXN>E$GDcC ze~kD4)cDUn{}}K83I6GK-{SKt{{DN5`}&Q~zwG@O&j0DZ|J6SKqWCZ1-|G8&;h*CF z2>$(1^UveH|KXqFaeUOYUw=K${Ndj<{_yV_kG?hkFY~Q_uknX}*Z9M~Yy7cpT;-$g z6~F%c6Y{suzr^#4>&FAzc>SOa;#@yi8{+e4?KmU#-o0lKiBxf zzsr2{?;4N(-^CyPUCYnu^Y!~GAO0!+?DLP|o#NNm@54XEWBaSV|JVD6?;rgWAM_{U zq5f_C!+Chu?t{AZGZ@Xgf7f~U?eN?+)JT_bMO$UFE^ul|THunjiCL z_np^y_wPFI-d*LvJ=2?b#(Zq~^PAkxhx_Ak@1NhlD*mI}(-Z#tEw=te-1EMEDjxsM zqenhGzsEhl`)lKP+5aDa|3TwD?)lwc!M_9luJImc9{a-IOMLS85}*9N%7;If_~h>; z9`kos{^aka{K;Rz|LE~{`@?qrJPpYk8I{#!o~=ltRC zI{&9_{@9mKJD$T|*UzWM`1$iV=ST0`>pp7y*k5}6NAdnQr|0*$&mZ@_ieKOVV*cK( z#?SqH`1a3L`v(?|@8325R(!nv zPk!t8!~bi%9S{|+=YO*%t^O>|=N}uIKPvx*2GM_yGk^H6`QzW8!EuK1qyA3w;|B5; z{b!u>vu~~LMExNpPoG`CJ?{DNU-iH0zv8R@E57RgoUi-u_raLYi|hZKuluifjH~3o z;<0`4`Z34r^`m&~w*q3-c%178^Sk72fBXJL#F;<*pXayzjgL6%ZWu{;T|$my-XA$98z%)*r;EK|J_94vyEH zZsVSfpZn%NPeGC8ChH>scez$p3JT478 z&$c6v!!3F4C)50y@i(4#l^^IW@fHvLKjnFO3x64B9(hlB4l#Jfndk58{)63lk9*$z zUyQ%>_rKM`_U=F9%pd1% z&eMM~tbc1e@c6Zzw|MTaAGRND4uAUm*l+$?JBm77f4GG|ibtPL`RqU2=ka6yPI(S7 z^0R&BxzE=vHGZ%=kG6<=-u<^7^YNF~f6dqY*L=-?#lOP;HjjP%fG^$uBmb0th5v#t z`!D#i|5N@I{!e-O#HnHZVlFMt^_Tpg@~`lJ$|E&%hW{4l{MgsHc<#@??Z^LxfBZf3 z$$ypK^bCICzvMZD;1~W2zU;r?YwN$w)AagL_Fv>L`#6jq{W151jd@c(z9kwe`#6%;UT*`EZ{3 zBhEYyz2xoqEq}xVZ~m$N2NV8rESbmtQ@-N=I{&% z+r;&QalU?}x|R9aCV0k~PkE=j?dLTB*H8bMum9;d-T1+j)_={{{MUTVf5q4R$2jlu zf6mwaSA5lf#aI1T{Es)x?dJ94ajrki@8d7tz7zkd>O=5gp{ zetdRk&mZx?H*eqg{YPBCJkI&SH~;4O$*y?1-Ol?WzrO#W&-d`?+X>GOMt+Zn z@yB&b^dDZ~+Sbm$#XY~zo8Ym(^!dO2IK%x%)&DtP_aAvC{(?u@o`3!ao=^F@|BA2r zulTC}ivRR8eCOmdKmQ)*^N+dNeBM_4o5a8QEc1u|a~|KFL4M~W&OB=KB>%zlID8Cz z^Jktv7$5&j{_tP(_})?*KXN0^`7wWm{GaSR?gu*l@L%Qs1Y-`~>kv=ePIFulX;Y@ZTMK z^7`?(=i%p)|3mOUYP`oikM(K6qhH|P86R=xvF$EC{KawFdFbaaa<=)mzU2Jj?;X7P zbCnN&ukzsT${+q-%^&`1{s)-zAGGuDaX9D>2>7T{# zdG}ZI*bj%D_qgZXU(J{Azo+9z?(O;cH$QIqEzbElUe24!&;9(~e49UuGfyX1Jog75 zapsYD$#Z}35f8l8zv@4jTjDLwJoH#HfAAjn z{C@u}&VTv-Tkz%kZ^6^qH_6{OqrdM~-R!-TBq~Pir1s-}6VD`_Hkh@^g3e zKjO?E{?ErxhC}r0r^lJ+vCr~&-uFlipRK0{wp5aOW(g${DuOn z_&?_{f8hQ5?-A$ofA~M=ZT~C2f6pBG^Ka<-o5QAr&dH%l64|eB0?)iQF-*_CJui^Sx z^nVk4)qllT{h#v~Psx9ddp3S-FRlNIzwvd2!u`MIYwN$}YyK-fzyFO|L$ST6-+kU@ z^G7E9VGhQ*{_y*fM@jBH+m1XAx8%8>O!H^P-=g2~JkMk^{%kw`FV=tlKJd1FFL>_`C35^&fP}f5Dgi7kt@&!PnM*&g<;{8~(iI!{^WAJpVXf?ft(w z&;5L~`m=c8pP85EWtJao$$!OH{nvcWf6dqYSA6zA;$i-_)%<1uBhEbXE_s}qji-j^ zFXGH&*OIs6H$LKlxAU&Yf8?L>!NoJ`rMrJ56aF)1yPO~G3;ErD@@$`Z4*z8SQQOWV zHGZ~%_w}Fs;&I0QV{7U4Kh4+t*L=-?#bZ1r|KmK2rE zi#XRGxUJQVsGn_PY5Dcr_`T%6;;a5^zUIH?YyK-foImql z@z}mmu`~Y_U-e({Xa2Hp^#3X!{;znpiR%aBeEo>JUGZ!aJmbs<7th$=)vs;mH2~Ld z|Cz7k<`I`TlulcWd%tz6GzYiMc55E`vpYwJ96<_sV@m2p7|GMwrzns6WkD=0E(``NMx6OZ%^R^l8t}c<#UA z+53wBk}uu=BZ-**s{e|w`akC}Uq%1X&&l6E;EVpx`MUp#ulld}s{eBygWpg;8|y#f zTz{CK=HHyh=T*VGKM`jhJ}i0W4nE?{W8adu{I%F-RHyapFHmKJE!wwf9duAd49~-(tjK~zIXI)=0CnK_lvDf64Z5oaD;fp`C$@9P)!d>4N#`}yGbBOdtYHh=cadc5-a9UObg z(|xQP`}cPl=ln?bewCm5|MB^q`5$r5@BWMYw=bWbpZ}8M$B)H5zilV^H{7>>+j)F; z2XW>x?j_It!AG2V&i5)m_Xi(w<}s!v&;7wiJn*+welWMhTbz0H=`J2~au?6xulo<* zkMsAU|LA@E-L2~9J8zo*Y|A*0ANe0n@<04aTE7|h{O-TVkN57=`pr1=m_OrU9cGPO z@mKM-eP6%*v-mkb(!J;SHDA8}w)=>&|2XiMe1yM@hy2?~{tb*>|It^AGfyX1JokU2 z@eya9{ax|gAAH1_$Dx-z_Xi*Gz~5H+!Q2vWapuvdQ~uY{q|N`0apo~6r~I#Bh`}?? zJcqyT|AsyX?{UxX_us01s`uZ5_j~Sk{eM7zr~c~tFW-Mp^J9MB@xlBN=ka4(^WQyW zja~D9&e#1{eAR!&SN&J~h60QF^>~=S&FgQ@V}3U}(&pdd%yYh1Jog75aprO8CC~lA zM?CP&pLzem+!Akb=DBax|JWV=@=~99%+D#$AqLMl^Zb3CAMDP1-1FhT9DmV&#aI1T zeAWLsAI_iq@Atv1v1|U%`5XVfFRlNI$GF!Nc-LobzMXGC%hRAMwC9f9CnY+!Akb=DBY*{@5Mt0UIfHUH=Qt?a+ztNtq<^HTC( z@z~y8zvDBG)z#nO|D3P;Kj(Qq!oP@z`nB_BeS=)%`9pViKH`CI{><}pypccR%yVB` zf2Z{myTf1Yzs`>#6#Q4bJKwI~7|VG52>%t2{ps&_#(Dhc+rxVNRsU7~s{eDo>VMSn zSU=c~mp{(``+JJN75&$I&410;{8xPb{GB<50?6k-xOg7tk4*T(HjFdR_N*VpW7p2J z?a1SBOP>45H2-G2`K$5+y(Qk_q5r2moj>z`m7hZlo^j64-&gZz?9SsjFL?KVk-y}> z=4<|IzUIH;vAy*7KWmHg$mc8Tzv6F2|21FpU-LEp6<_sV@tDpH`>cL>ju_|q&D?DM ztN!QX%{$LH^O%!Uo~0T28E2lqN8Whu z^Ml=ak9*$zUyQ%xzvgTHYrf{c;;a7Sv~08a17BMI6@M%Gulbt)ny>k<_?Q0UJv=m4 z-@oU180v3B^WA^OnUC{^&C~g(|72MI))sN*@vCw1{4)Q+TN|_=c=Kn$W0&W*0RNYH zzrz11k9ym1ZYusy`B(Tq<*hDS{)mVAHxBz0 zZ@a=j{*w9RzvPSlOPfirr{>uJ~{AK^AeAWLrk5~OyeAR!=*ZkLf z&40yb|0B-zkNMr&x-p&q?0>|WN8Tl${f{{FsJbO@$48^Z{X_ISp1b>(Gd|6mGNv-Jiq(TSozQ6&e!kkKO4>0f6dqY*L=-?&DZ=_eAWMS9=h|7?WOyF#aI2; ze9eE&*Zfy}IPd;!8|r5p>UU$^DW2_Fb-sRioOztLB_Ga{k2v!<^pdyZxBL+gym_Pg zAB?(wVE-v!@qeBF+<(P$dT<*ceg0=Uey}C~Ij{5UZ}t6u#n=4T`D^|wzUsf?u^j_D_h0eh{F(oXKl7J; z<9WNvhyN>{ZQ}aDIM;vF?TTlc;2CE=xOnDxdw(|@oBM}Q_^6FlS0)917NY!f`=%yaryJksH3YxD1M z&-=V#kElOvFTMY-_^SVkulhgdF<(Xh(a*d5pYwJ96<_sV@m2rleBJ*!U-y5`*ZrUK zXa3R%_vada_^kJa#Sfel+%KYKK=EHv;i*e@Z_G=&)p%3OipZUl<@-BJXkHl^M!T0sg^R>!v z`x_r|&W~M7p85F0{P8pJw^jaN6pucg@@x}4t@v`6{j7 zn4|Z8oZesXMgQl#jjOPJtNgaTCOa9CL7yVa!)qllT{h#xgucH64 zj$ZYD&e#1{JjPY>U-8&p`u?rrtNzb<%s&gT;QyQt=gtIHSG;IIm`#;Z5_iO$u9`jQ2U-8&py8oZ^b^qsl-Tyg{vD=UG*LK=@zs4W_Yrf{c=4<{d ze!~ze{wu!v`n%$*{wu!f|D3P-Z*_Wy|BA2rulbt)ny>k`v|FQpe z?*AfxY5muH&410;{8v1-m+t?g4mnx*^NZk1>%Zcw{%gMGzvgTHYrf{c;_bX(QqTNX zylroM#C`pvxN-eZycK`J{{@djc>gWH|Kw`I`TlulcX}n*WN&{BPKI>c8Ucyf!}K zzW&{R#oPA7fBf3}XB*mipZ)!3`|*F_AAisJ(I@i{|Gz1oZGvZWX&3SLM z^Ncee{-c@5zu7L&?{Uxj`*)hJ-v7(|59pe`f6r$=`uy;FIsY~PRsS(xRsZ+%kmnzK zY5hn3DgO%p1z+}G@MZr6zil{YTdN<7^ZCR4Z0-C_dE1YvAs=z(&1paXQ{MJBKH|({ z*D}BDN1Nu~#@`1%^2T#_|A+SW(|C(BPoG!g=WezMo^j?eC#O8y1kX709R4~#_M?sS z9{2q2e;j8Ve`)YyNA#=D*@GUnT$JJaB@ptpAFy z`mgz#|C+D)ulWr{bH4s79@|-TR(}!a`onoMe-&^08y|7zv1`fOeza-+Z2W!T%^#H? z?d>Q0<1d+yx?AyV6FlS02N%!S-PIp{FWvuZe&Zoe{nvc${$KMo|21FpU-8&p@}G0m z?xVW-2VYwM6<_sV^ELl9U-Mt{8z$!5f5l_|Sb(SgD?Xg3KM`ktaA@;i@wOj3&-`ET z?EdaAc8Tv{?GZk|8qW^KlgvmTk)ef&i$7>4srO)IQw__ulbt) zny>k<_zgYY+V#WZ+<)wh&;P`8SO2#E72m&SvV8xHUmy7J`S-Zb55N8OACbT6|2~c` zf8Brdt-TJJ`wzal{!jV3|MUEqyZ3yw`Lnp6Klp9^R(#ce#aI2G^L78{eBJ*!&wAwJ z+<(afulTR|n*W-w`LFm5y|4JMcz9LvU-8&p@?Y^)|L1(&|NS~NUO$Td&-uFlim&>w z_^SVkulhgd>;BLAy8m)tivNnQ`mgw^|BA=Gq8SMxQ06_4#KAiIBzINyJmpNsjc`m6HueDZO& zelK|7=l-tvioYu!``Z1tzm}Kh&xW^{zc&2FZy3qe{r!OrcHg|nUs}I4U-MVFM`Qz7uVgBs( zGnF6P!I%7>=6{9%Qy!_Azv92*ftUQ3e9?c&V-73+3w}fIw~GIQudUze{3G`RAFX~Z z&h^8!dF7w&U$5V--~0EsFZpYp;yS>e?0?l?&DZ?Ze9d3YyR&WnH=K(t&%gO;D=>56Bny>k*`I^6)udUyT$J~|HZ_LsA zcK_Y^%j*&!ZT+`6*Z+}s&fEUiegD48Z~ZE)->UyO`Cszk{(9W^AAXy^s{d90=RD?) z1!(I>#5uqDy~tnpf1V$ynZMw_`-=ZEf9d{xk^cev zPSY{V(k8YJp7;Y zb^qr)(lKYjf5`){_^iVzv>iVzvs{eDo?mz1MF8}9z-G9Yb z{Z~BZrR2ZjvAyv3JKKo)V*ysy|0!Shf1V$ynZMw_G~3qlTb%P_PWHN+<+uG9TAM%cef`6SC2#v1A92o)T}z(%_~ZTec;NSO z&-(9#=Fz89o^2vO5ai`tWz;gNtYG&-KIKxi9iF&iOGXr}^0?c*dFM z@K^J1`_aaEv_;(W?*F3yrS)I)HUBkV^I!3puaf_99xy@O`NQ^-|BA2rulbt)ny>k< z`3*&L?!V%(9lY0n#JT=(-ppUc+y2H!oO$e8^32Vj@Q3lhn?EW)+w({9QFkkzZGvZ< z^9L8t%r#y=xG#9dndk87zvi(YZJhVG=iPtJ*Vcc{*ZkLf&40yXd&&QpM@&{X|KLmh zE57Q#=4<|IzUIH?Hx$je|BA=_vFNP+BF^<^PTSuvXx9FY$@Oph8y|7zvCI5d`LW-A z!XN%J@Gb8)&2KRNPx18G`@Kn?ZGvZ<^J7j%Zn} z{%gMGzv3}pMgRRei1A+Zf6mwaSA5lf#aI1TeAWLskNMv?r>x(IbN!mr?tQ!t)y=={ zZ+yg=$F8kiH>Nyu^C$daJn-S|C7wQ?6x-hYq#{P25m{^8GCKAiVB^O%o!E1vuLARqC-x6l8hZrZvOcEc|7pVzj=NqG><-=@@y0N8Rz_%lT)5;f@hq04u5_Au^(+({aD=d;jJ8h z(SOBbd&z&rSN)&!n6IM$`*oOKj)d7Kj9DKfp7j?$tlk^!86W0hriB` z{U!h9_>2B4zUsf?vAwkZ&w0$((tq<4^~ZKTkNy3B)nCom{MCHTU(MJ2RXnz{fKL5Y zJnDVtBkt=L`AJ?*E32 zTjM?Md0)RZU%P+Te9d3Y*ZfsHxAVdIi#U%T+wA^5o_T)q>qp$qN8>HdeDdFpGx8td zy?eGHA92saZ?E4e|10VKJ>s7C`*+p4!b^61;nGtNARf0mzZB0uAv z-~FG~-_!H+@1x7#As=zi`+c*Tzkhsw_kf%aRcTEp6Ba~XB+mPJmZ`n^LNU# zP4J8}Z^K*kpWR~{uOE+lKK}le^;5n7{=j+Q__9C9{lJIk_qfj=_suGQZT(i~5A*eo z59W_J=f^g?ZlRC1j*k83em)v+apohh;%$G)|9O5pZpnYeSN)&!A0_`I&f~}2H2>y2 z`oFR2+WEIQ^O)}?kCNK?h%=8vFL^tD%OCN;H~;4S4~G4ZIP=(c%Ck-Ij5Cks#^>MTo)7;eU-Vz`RsR)V^?%M|zKZ_)I?D5tuV3Jc{?GZk|BA=B zO8zSz+uQv+pZVy||JMAO^WnVLAKJp_%wv9*Jli8@!T)*waGv=i&iQfZWqzE`J%7Xl z-~5~B4<`KMSTfIg@%3NxY!f`=%+u#Ho^66>oOv6b`9IIk?y(Jd|JepU{Fi*uf5lh* zSA5m~Igj}&`j0xrJo5Zp^MB6Q{a1X|f5l^7O8zSz+u^X+pU1iWFuyi$Y%`lb+l~%+ z{gLnMAM?HB!+G)%=lnR_lDFfdk@p{M@iXu@_YZxWoc}YP^>W6uP2^{s^V8=uo^66> zoOup^#UmYlwl@DB_k8$2A3unq|BA2rulTC}a~|_m@*nM{=O5ck>%Zcw{%gMGzvgTH zYaa88AFn^g^YwqlNBxuKv2y)kpUu1C>3r}j{}pe?N6zqP%+KHH&sCm%JL9AO>%Zcw z{%gMGzvgTHYku2UH)sB@cCT^R-}{eqjGvsJzqj)~&40#Y z|0&Nl;V@Fo8>U-Mt{HUAY~_1`9GGJoJp>%Zcw z{%gMGzvgTHYyR*bb+qx3>kso|-YA~?ac-=Btu5lr$9Ypc_Xlrn2R^uXX4`!I#;^9% z*1rwEbp5xTIPcs(yZ+lA{9ohk*P;LBui|t63A2Bh$DEw}z!Q_ur1g{teg9s{ev7`!D#i|5G0GRq{X1<2ZisCI1y) z^-p8L6v^%rsGv2V$9fAA4!9*17?*l&Fce|W5c z-|HsEG1UK(=kbDz=ghOuT%IF8{dv!86W0e~-NJobw|ceuBsI3*Pulbt)n%_27kk_Bbx&Poc z)}7+HpXY{r#F@vwCC~lAN1S;addXYg_x__FhzH*MQT;#TdA!y5+2@M?DnEJt@63P2 zvwH`Rk<`E6qb zo%yeL%>TwYJ@a4jtpDI69_rWpSG@Io@4uhlfj57z^6VS^U-1?HS3LKf`LFrS`qs`L z>U-|L=4-G2Yrf{c=4<{dzV82VA9T(CIbZi*@m2p7U-e({RsZLF-Tyfs&a-|a9{g?o z&v}|jN5db+1K<3;#`AdYzvgTHYo4_o{b$_we>=$!cIQ3rdC!Yc*nI%Ulk4BMx6kiK z-1G3;u78TJ`mgw^|8u_XzmH=aKlsx9KhBHI!^qeDSA5lf#aI1TeAWLsU-y5`V?H;| z>AC-N9%#}3Ydrhb)_-ySeRudvRkA;rpHsf(zv_S0f5pSAlK+aw_R{D76<_s#&e#1% z9-N%f-@5;EzV5%`tNts#>c8Tv{?B>(kMF&hzY*v9r{C_+oag@FBhEYyz2vc<-@Dn@ zPsRh^{F~=L<5@4O{&P3Jx3uSHobzK&PI-K9YUdeep2J_~-!T5*J??p5H&Lh4`bT$* z{wu!fzv8j|72m(-`N;P#nBV2!|K=yWXSh@K+V^iG?&lAFF8S>}zPGr4e~)p` z!_Osu`||1e`7hi0VR6rI+nUGwb`_7xRelzZQUpE)| zAATjR-;8_Sz12Lvdz<`aocZA5ndjp*{(^gM=P#Z|9@BUJ{k?RYj=$Z$|AF3n{dk=F zkMs9_o&Tp#Y(xI}+2fwy{TKcJ5qSUibDy6*?)lySDgX8JJLcb*KjO?|+~MDX_w~zp z_=pbuGdwtMI=vcyFh~BL$5ASL>OZb0DL=b$PyXb;96#Gc{~71}n7`BfY!f`=%yanX z{rB~|oxg$K{TKcJ!4tY{-@pI*+2bMq!#e*1c>n(H*UujJ{O0)|2^$L4*Vq_?0>{V zeye|#|M~fMK0_a^{v*yj##`XMex2{@7xld4(J$n8KH{7oyOuoeoyfQTdpz*B)%-W! z{E0a8^zn>m8?T?={)}lf-m2H zPkGE21g?Mop7T4b|3&}zb-3frtCIhUulld}s{eBygGYgd{~qW1!F+9Ae{=q8%+Y(w6Ewt)}-=lus$^k4B+{}o^Lf6imRivI8S!JWV0i~i5~y8nvDxL)!7 zd)7z3e&PHT*MF7&#~bo*UOyh^`a{0v-<*Gb{?Fju--t7R_&?`Ax_z?q5oaEUUgp0g zKH`CI{><|S|=8>@Ezsg_rU-4D{6<_s# z&SSoc{%=-CoZsvZelPkz=j;9}zUsf?F)yY2f5l^a^B?cyTAb?-^JDYIHmt*O{%kus z;Pp$sum8jUIgdjcLq6i1ABS7!x8tJ``G^Pp=Kjp{2cvlGKjqmbc*Z$D=j$v#+XT-z z^EN%07@Ozm{M)`Z{~q`JzW&=hzC3?b|L60Eem(HP{zu&Bhu_QoSN)&o$9PKqquq4; z*k1Bq@m2pdU-Mt{HUBk_dBu;{A7i|RkKg0ixpK<1GN*4WR_t?h$^SI~T ze>Hv(rTc%)*ZkLf&40yXd&z&En|2<%^AEn{zv8R@Yrf{c=4<|Ie%n|zXa28v>}&Ps z$IA5=Ts&jGyZNvBuXx+O_aEmNKRG{t=Xt-%gFEHfCayn>bAFEZEI-=>&p7kpzv@4` zSMh(rm;Bd!&410;{8v2YtK`2;l3z!=`U79`U-4D{HDB{z^ELl9fB26&+W5%zhxxJV zrsBCD=f>*S+9J+;oHxaDfAH3J;Dd{2Hw%boz|2F*6_1|{lymR~P`fq#ie~q_a zhyI(tiqHKg%&}yi{bgSKO!Jdxo5;^N^TbxX9T{z$M_a@_ANT+B`~XV++kq$kAm0NY zEx*Nm{K z|5G0Gx%IN06yE>Se9eE&*ZkM~=>LoQ-B^E$$NX*F$NGyn*B|yRdF~HB;>=q?FY;r*^)3A2 zu?F7ihTA!g@%(dh!Nv2)WBbO-TjXb)dA488A9?;Sc*dEx-6!KecpT>i@BXX) zqq`;lHDB{z^ELk!kNGY6ALn5_fB3!Rzv6F2|21FpU-LEpHNT<$qJBNj^#{)URXq3e z+?@HZc(6Mkan6rJFY{a9_x__FhzEZ6{vQ8V{jd1H;tzj0nz{dqCvouF{{>(2U-LEp zHDB{z@z`GSpK~-j|KLmhE57Q#=4<|IzUIH?-FaVsJkI`Le#}3`bAQEu#fS6EA92oa z#ZAG)`Qx6*AMwE3dB4i@*sPlsU-5s%bKlweulddT*3KX1V!VFD{Xg2Fqc~p|@BbBF z^I!MB=D*@Go}&Lg599dpd(rJ9_h-)A{>Dd~dCc3A$A0{H{)h*@`8&@a%;DdQ{-5&r+|uqZ%r2 zb{^lM>Ua)+HUHdCrky{FbN|sHTX)f~Y5m*&()zFXs{e||_VoQ-#<~BPzjv$gb3Y#( zf5e%`@jf)~?Ko&NT>tUi+uPHV&!5LV4?q37A^7b*zPI?;=HKF;ho4LS_9ebI*?5n8 zezW@L*xGT1{%;$;w;A~@&OEp!&;7wioOwFA>Oc1fA93bUUrQeQZ^1`A@V8a|V0`}l zSeZwk?&2{gckvwly8l}mzsI@%=zZKbi}R1~+duy(>c`@q-`7pSJ{oUv&Y%3B^5{GM`y1ce zzkkoT=Xd`F|HTu(cklJ*anJAm3;qwm|ETdE_x!e(1Neu=d))K8|I_?8 zeE*)`yZ8F{IP;jl#`!vY)!*=VAJ;>iXd@xYruSNT}KS3JMB@AHST zBhLB5-xZJ74|kq%=2>s_NAsUx{K0$N^ZWg`-G{!cU+k~le+#~R|1J3P{r8l|{Fc^l zI_C3uZT(ifotKjT^Za()lK+aY`Y-t(;{5-xT|X?&^>g??=W)ZcVGJAjh%dw#qgfGFMn6!L2x$2{SY3_tDsS)B7@ zL;L$%^}p)B;;a5EzUu#+ulw)!!JN-4_wSfT`#XB%>;5Yq<0|>Dcx*4N|B8Rz_wUE? z$9L}CfB!CiuD`?odH(p$z5D<2`|lWA^MB4`?c30%)&G=l{#@e^|25Ax?%(A4d~y9(eAR!&SN)&!b^o_kM_2uy^L76f zU-e({n3t0OipTc0e$Uol%x}zFJa^YmvdG`+&*NNwhyU~ZxV7E+h%=8vN8Whu^4sxS z{)h+u*6#Z*@pSu)XB)qM`DY1pe)@dIvrX`fGjG#l_y6Uca02RsU6foV)jY`1$jAIDdBEq4}Esn#a82$Lo(V z-h;#Mv3>*>&#bk4|HSrD|BQil^=nR|eicvWgJ1ctcso9FhCgF|{!ag{^6c9gAN^-v z7!UJz%A;?4{~2c~W6?zYAeR15 zdCcGLFJm4npMUz%&i|Cp{#e_A$FEDC`S=t5FwXh;`zpWf$NwpwKCk%Pe>P?NoF8*? z%Ck-6XPkKsf0ds(*{1ntanJAmx8wBn51{J5;LH9CzU=>$$9$FiKh9%6e()v#6<_sV z^ELl9U-Mt{+lCs5`ms3I59ViM{VAUNxsUZ1aptja$#Z}35oaEUUh>#)eG7khtbw<> z;db|^KmXhu`6JGJaPiFUL`59*(bF$1&p8pG;aprCJV*c6ZgU4}R@b16r zKj4!8ny>k<`I`TV$NZN3kMqE}%I6Q;Oa3eVR{Z{*=4<|IzUIH?w~ZC#_2+S}KXB%s z;<=yahJ3`C$G#=c{lQ0^c^rDlTi^HoqaTO|-uzSjKjV2kUN;oaK3Du-@f_lr|B7e# z4j#wBv4-*6`+p0*{?GYa*?+}X z{a1X|f5mSspjLk#=lVPRpYyiAeg8b-%+qQ2X3pFG#z&labZyDA@AwQ&@~8j)yX~fw z`{!W#`#;;W;1B=j{U`sL@85Gcx&Fw%=KJ?A`3*;?fB*g^k8xpc+V#ice*WS2a{j9R ztNE+?Kj%?%)%CxPqo059)%AbM*Zq%q?DOM%yywH`-{XG%;kV7d;;a5k9;ZM2x3F7( z%;|N0Kv;L|^RMLl_3Q9|m0$CAz-9i;nzZ?Qksljk{S@bKLxafgai0Iff7O4mi67Tr z%-?B#6kuF`aV@~#QRq>8{(^lwIsfe9M{WKs?)lvtG5)Ima{LeIW8w9G#aI2G^L77` z$LpxO{?`4U^L76fU-e({RsR+L31;P!kG+08&h>NnzvAQj=j8kEpCA6ud4AuW4D&~v z^P{%g`akE%1|RXjH-E12hyR+#_mhc)R^!t3Qv2`gvIA|0(z{8t-w>ySIA&zW4Ul zzJHJJu3Mb>;NtlXf1lmo+jn~ZpZ^K>O#kHd=W))DeDB-%FY>#;7x~@aOFZT+{Jq3~ z#0mH7*CihHcP}6HeXjseSf?CY5V)zwT@;84}eq3J` z-@iNjzs4W_U*plYyZR5l`F}0{;r})M@c$am;jimwef}_dTfdJw9P4NM3+(#~Uw=Fv z>gQpd|MB5=dwg)-he~ihA1j}~@L%!SpSTue-iq5_{}bo0_TSG@`OmH&;s1)S_^aHl-mM1ICOKjv@A^ZLU!!K?LO^`G4f z|E*@cx#?{_O1QhGv#yt z*_7=wAO2(Wl+XT?SN>y%;K^(@e~e!8asRLQn*TVk$Y1kc^ELk!{|f(av%g>Qw@c~% zANd7e_FwR2{{>(6U+~+;p}9XV{WZVcpDF(e|EGNRhcWw-{lTwWJ8x5-?fKLEw|L-# zi|6k8W59x^&#U~o|7^}{{>(6U+`uBr+n4_ zbRLKKtNE|_n*W-w`LFq!|C;apXS<<(H`c%6NB>72zb|?2ClmL-BX7mM$dCQjxA1?$ zTitN`{QAGGtNBMd{A_#vm;8SJFUDW< zUyYxy{Z(H7(|pZ;#aI1L*WvE`Ro8#b*ZkLf&410;{MUT%Kki4n`UAJI{uFQfZ*N-t z@&2Lbao(1^?QefSM4bJx;$Gxu^)qMqH|Dq9ckt+wd85Y9KI3)EJwM~z|KQ>oM;q#o z>;LiZ*K)ct&)-+`&+f6!G5(Qv|8@SF|C+D)ulbt)im&<~^N7hB=D)W7Yrf{c=4<|I zzUIH?w~ZC#_4CqS%)9xkc-wzF_h0eZAI1}Zm-*TEivKGA8IL}he=EM?|BA2pulWrf zJojJoHUBkV^I!8d{}o^Ne}5h1qW^+_`t=X^{DOb}r^Undd;i=XujBX`^8fqy`20kB z|KH=DkN5vY{@WAY|9@)l|9jl?@Vn)W=luNx%9`O0K_Wr-eJsS5-|L}j#*Zn`PL%qM%`+vp%@(JHrc=GF~ z$GQK9|B8RY{6Dq%_qgZ7f5ra<^Z%1}{q?x#!+*tp0sf1|dz|^h|7-l=|1}=<+pb@i z`R30x{_y`AfB1imKm5PShyRNIQ=I=lZRg+PeE#XSue*x>)kl1P?a}MsX#op*n)^5D#$t9CBj#2?_n%*#-~5aFi1GSk+ZW&e z4}Y)n;qO%*C+DvI+sU=p->%Jn_`B=b_y{U*zMy`P%&d|D?Uo zuVu$|-@9-3?U-u%Ax+o<4A_7=kVYPuZClR+scBx4vds1mLP$yf=9k z;NDH%Ku(asZ9u{kV8f;@jiYOr(ZFhnEs?U>l8ksF2GJm5@(+l>vnARz?|$pMs_N9L z`mR-{bh?4=I(_O>YuB#*sULfvy5~y!-5wu*+<$BTFa5CZKeoIu^1RENzwv&mM_)db zN&Vj|zbkiO`O^P)ahmmq)@%6l_vQZiu=2J4A6CBh|HI1H{(o?Joj(t~ezpG}cKq7^ z4=XSAeyI9O`<3Ts2l`j;pAW5n>Hmk7ul+wNKkmP^|L^)y*MDqzVdT3c{Qe)7*D|U9 zd*w^L4=rEHm9!s!(lH0e&-3SDxtbFbNhn1J>@lf^GtD8Q5`I|HJBE z`~P9(YyUsAeChv(mM{JP(DJ4KA6CBh|FFDX;>iEn|9A7?p#KXapEvpa|IqTK{~ua@ zciy=lQ2#gQ@6~^I+@O3alh-eF{Tjpqk-bT#vOb*X#d>mrwow@banuA6`DSTU=i9R9)Dl^;q*uTPMm*v z{;usP@tW%=O{agN>koc({Qc!q|Bu^me0(W)`(chR<+cA84@c*(j8w<#|A&`P{r~Xt zssA5dKK1{&eC_|rbmw2L+o-%S+W)=srCdq-_Lre~mAtULWU04Nd3}FeUi;6Xvf3(f0yqw-{{4D3v`nL|tmon(T<#k&=&HqvTaeDX@mrwow@banuA6j18Py7Ev zl-K?*r?}!eND_{J$_UW5UwLkMX!)}KKeT*V{~ua@&F6hs`O^QR_Cr1#hd;Ufn(?z< zH~;v^m%m~8dR)Ie4vIhK_}%rBOugHqHe??3*o{~uId+NbpYL(6Obuh+4?etrGH z+3~;h|HI4g*8fxW=i~3z{|A;&{eM({v@-DlhG${r}MVOL^`8{`SXLxgVnb>gPk0FW#YEIFH_+ef2NpO4^r~_lNC=<{P!2 zp5M6r%JVWe+TZ^ER&IZ( zTx$1&>Mti(%9XU4zqMY2^Dq7X(E1y1gX53e&m1=>pV~Z)-|4lzescDC{V#ck`K$fk z)T3)ZIfDF&k6+gR>p{ma{r}M8OZnXYckM8!zcA8XZTpq}AC}iLdH!_Dm;Qff`O^On zEnoWoVdZQ8KdgN1|A&>A>#-(p4=$g*JFI-||A&>Y{r|A?)%!!smvSX-?_c0M{to=j z{r}MNrT-sRzV`pHyi~u8Kj~a-|E>MMJjbB(H|2$q^^PrH?*H+=KYpe%dHi$Am;Qff z`O^OnEnoWoVdZQ8KdgN1|A&>Aixw0!M1hn&Cl z{;=|;{~uQW+W({S+I`FVgZf|X|Fs_W`AsTa#t&iSXLY{r}+dx&I$lzV`pa%GdsXSozxj4=rE%|DokezdN*iDOb{d z{+0KCte>Cn%iI2+VtM`7jw81J<9+-^|1GcE@~QtGUOx5T!^@}sduVwnr}O8b-v1~^Q&^aS5mu0<-h!mW%=?q()^uXxBY)N|K^{6yxt!F{x`p| z$X_j=U$^CV^RHiid0meGdOm)7ZOco$Y5%SFA>Hx!lrR1F(DJ4KK16x#KZlkt{rAxF z(tZzh{L+69J$~uGVfmA9ePfZo>Q8=cuRr?B*x&DoKi|v#q}OfvGVezI|LUtU#JrmP zPp`Z3<>!7&KWhD7UV2)-f9dH|KD}izE`#x- z_P@i**Zy}{`P%;uE}#8BtbFZ%hn27W@38W<{~cPstbe2Oza-cHm-6=?rq`Xnx&KAw zKQHA!pUbD$ZTZswqVnVMzm6NFA9Vd^{qv_6`K$deziy9TjvJI;-ac96Z|cA4bz8oa zD`|Ip`FUA!^lPbndfk>U^Iuf{rB`J9cqNY?`r4MS{qL~ywf`MfzV^R^%jf=gSozxj z4l7^#-(lrz|2wpN>3>oApSiy*KXX4_|Mc2k|2qFgFV7>r|1Zn@_i~>9((AT->3^jk^yRNTCEx#@zdtg)Zp)W?N9E6+T$ZyZ zQ~RaYZTV8Jr2X;b{lU*q*8Ufjzwv_fk^KDa`U{WX=NaVx<@@Jq|MSZqE!Ug!7u)+@ zu;nFGnZJYfNBQe7r1MX&yYjjJ`Nv1uQTf{c{PLHi{3dnA@$nk5?D1>=^UKTFCuOeX z`hT9v*ZvokN14x?@}F;xFYQ-8{|(yj>=p4RkH6`)t$*!*(ebZI|GSp^UwYk^Fa0kn z|MEAa|9m4|zx28*ul=uj*!w%z|Kjp<{Vy&**Z<=3(k{!jOE~|xajz$@?fI8-B^AG# z_4l?t4*#?~JlwW_-jpx>FDegTuZko%KFYsGUfbi#f7P3)Jjw{OE05P*dF_9PmM{G; zDzAMvAHR$x_V`k6&+-36+AQsV+qVB#&&8H6{VzT~`k(E;*WCUWm!Io@arwFa7nh&w zf5oHTKg@kI^Iu$kuK&g5=lWkOLk4l-+|4=^a ze^GgqL7zkaEw5XDB~#Ao(DG7lSpKKw_+W7SpUQQy#~1I0<VHvrT$j@Sz(oBoDlhNrpH%I42~~#UxC~5rT@v>?(x%_q0E2(9R063zJ`>m5|zi?hrjvy>1%s@DVNuu{_$t~ z-{AOPm*Y>YKcnMM_rH7{+V$6u(f@+-)BP_fKi&U=^3(m#E#LJ&Sws5kPYC3VUtRx$ z!;Qc4-!+x<%gej^XQKbP$KO}p^gp-!kJ10!@=pKj&VSA2q^8;rd;g~UUr>H-{?m5y zk3ZZ0g5%Hizj__|^PgUS2FIW4fAR6>`d?iB+9g@H==~e!KD@T$C;AtzdsJTYm+QGa zxVF5M8wkD{>o4WB|3u}H zziofA>woeLp(!udZCGCOoBn&fDK9z?%S*n@x#|A1ytehnd+;}^e<@SuPsFn2i+53Z z^gnSz&mZg0zI-WH(%v8RKY50w<$ZIP{4Xm1Gbi%-=}8*D)9beUx~6uE z%D?oa^q>6sVR~)L*Zy}{`P%;uD=+>$RQ;uV_U5qT*Zy}{`P%;uD_^}mw0tR7(#~J> zPx+hYe|>GQzZ^gBe~HS!eP8yE+)w4x>$ZIP{4XfK{<(bq{^#FF{U^Qd%6~nNKe--# z{a=4t_D`n%Cn;XHen%KD}$ZI9e^L4GNuT{*?!W1ETfX$a zp!~_Vo|gTyseFFjmM{G;D4)lSRDT{n>ilr?D%s24|ROB=R?;2p~_49JXHDGe-3TGR8Cq!J(Bt~{_X$$wZ%WbyvD8jhtb;I z^PA$IUtZ*U7k}Yzd2Riz{vB4n`gd4)Ii2j^!R7PyKdgKmzYi;4{X49D_3zN~W&DoH z-Bu59^QP<8L{>{$C1}{lD^Z$>V3xe&h1hU%&qH-BG*a zm)ExbQlCA?-*)9?{Lt67JWhXHf0Wts`KQ-y`Qoo%|1xGp$~0Y*PRy6bmA`8ogP7;br~-zs@0IDdKlLAj;xzLY z%18r#5XUdCZFy7**MC%An5C4*>#qFrFy)K?(edT|`(SeW-S3Yt`FoD9&gc4XR34{4 zs=u_Iv|s7}>2-Jh<@1-)j!pYZ`QiL6$5;Oc=Px1l`)@qxjz2g4$K~hzkIKvW?fjRq z_e9Rc^*<^vC;xKszr42XU&@tK;&ozJ6=ind8<8@bF{W-L} zl-pDO_J0ABj(_{V0Jq1N^W9e-{)YXh_#f53%sDuId2Np`)lvVW^3rBg{>SBSONjmc zOFi^D^7WtdKQ2G#e_TE}pRZr&|De2le`=XO7JY5ozqDIa9{JLM>OUB~w&hE?lJ@N< z@9Q7bzx?UStACQ`wtp#;%dg;Ud8yy9ywvw)Fsc2t|25^|c3Qvq$4_%!@*l4yR8t<+ z9+j8)=s)-K_0!k3{t{39N8CJ*^yANz|8e=-(gaif>v;&<9e>*Yp!~G|LHTL_qw>~& ztYJ=U`y2n=@}2+7z<;;ATo?T_;r~J9jsI?W$N$Bizg%xEro;r@*Or5z9TKQ2G#e_US1?qxm6gt0zj$qrkAS1&5c- z41ddO+x|HHQT-+UeK5s;dEGpJlk+S0za>sz|0(~?d35FH{5R*(mzMzhpZ~<==lma( zH~x#eoxf7I7409FANQZ)|ET>MHe@zf#C~{ux~VR3`gF<%|DO{n0Ww zCdvoT5A?V*<%OZ=Z>3yG+81uYxXZHKlWc@KUDeZ?_tN6%kfahm-2euiEUm zL+fA4l~n4}oWH&=Z3BPGpU$8B{N6wRW%;BGd7qg1{JlH}ZH|xn;BWRiF8GY5YCt{HuS5)nD2#`*&FR>ffQ|lQ$A4IR8&b1wWaue|l}N ze<@c|xYF$(c@lZn-~UY-{r^~garu?y6U+a(d`kX)V)=KP{$I=gjSF(kjPaMZcb5Ej z7x$7p3w~#N=jhV1={$IOdBDtq>@-haUheJ5Ki`voI?mr-9Ooac<9u*pq*APyVfO{`ToT`Qkvj#{T&uug@1tA1n`yBjP~M*fw0m zfnmNlFv^DmqkK3p%7+8Pe7VM>d^j-5hXbR0I55l?2Zs6Lz%XAN80Eu(VLlwtemrns zl#lD*<%=WtmV3q#I6%zB?=7D;3_Kv_-A`|ZQ5W_w>cbvJogijwjwR!zQ=gVmH@Z01 zeRX4yuWpR;;l?Qc=AL}GF(|KYjPl`zT)XX^fg7WIiQSi%&)eSF{?S}_xY5NBf6kY4 z!@vz<-u=|}smiDudl+?N52J1nvo*(3H}){)B^pm0hCE?rd9As2t9PvBCCi{s zah&ZB`|-qOI!|1t^TcC%PneO}s2fk1xgbw^ruSr&uk+5}I_h&nnMX(C3C7PbUpyJ+ zizj`)=Ls{*>;1gL%=XvT0i9pFx?=vajE=p;T)f(Q!p9P(^TcI3PdujggcAX)Dwq!*R0RglRXTs zop&r72l>p%J2y-l-t?I5_m0eSY+a*t^=Vv?F{M9FlaDb)jx%&+ln+-%`R9A`;mM%9 zIx@&tKL+{gMwd^YO~Q>mjJn}4@4i#7m%6csQ8)H6aD$lToeTS{Tk;*|=5n*vN8RY+ zG}j((jPl`zJj)%rG0MNUr###km4_RHe05`xuWk(T)s0a;ycp!G6N7y9VUVvbjPl{Z zC?5`t@+Gg&mvQ>ma;rL`bIBlvu1&?0kpsGJiJqB=1H*iAV3;osjPl{YC?5`t^5MWR zUmO_a!+}vg92n*6JU?n*abQ>;{dZIz*LIMvd0oDYkImcBhV(t|6q+`?9zqi}zR zW$aj!K09nr`Rc(aA0CYI;lU_h z`*_^`$&o?6#*XvxEF=B3j>tQ*zeC0xN#$Qb^dA`$m_7UW*~h^mHLQ5S?9V^<^Ur}r zYFNw{S`S-?C!RY|_DM-At8>RB3wLJY>YPGxPjVfQ);efgOtL!HIP5ceZYR$@W#a0* zGs)^4G|P&E+z!vlA6yHh=G??bX5V`5EoG4!_Lj$<{hPCYqdrJlS$NvVwc~{L0rjgo zVDq(Xm%lA1Z=Ae=VovGR`Wkr7H#!@^TyFK#YRfZZgmta>`hs;85zdP?l_ zM5+VQS_k!Xl2uO~_OhOvL^pBO(@9o6on>!$?R)an$x~=wq~_eSynwIc6ltZNNZg6bdpt1 z9rm);VR`J5iL0JE?8$p^Zp&jQ?=^Ke_S)>^y@^F?Sa?ct*C$@kzOp`X$Mh9EPjJ{< zFX-62-nwJQUU*7z-+b!udSJ@Z9c}+K7ZsXv$3ZR8+z)ncd=JU zoWA===P9$d?{3$?BCXd4o-+IBnpmWjg{REQPk?G%q=uCRyTdM-m9(<()MJm5r^`|2 zsmDHad}w4jX#PZ0u>zS`RUv>bNrSw9g-T%53bZ!-k$Z z?9S8Qzgw?6&Xw8QcdyDx!_%wvX91OC_EGumdti~)xbT!&{H8vzNDV9QIqZ^INh=Fa zJ@&mR?($y4Vm$TOH9LLBIE{Iq+4Zp(lto(WfamcJ8+z)np{LBop7yLXft-E1N7s2@ zu0i-bN5)f~^Nh#v^vyi)zuC|GT`U>z9;|uZU;BBV*{`m7-e3E9pV_nZ32!zuC|G9ZQ}r zQcvTd&DZ;=E`R7Lu>((;jXh;H_LSIxr^F6CC3fej_-d{@IA&u{9X9mTVM9-e9eB!Y z>?yOcr^F6C?O5xf&ijLWc&dHgc)TtDE03rDQ&Mw%uV=&_VfiBPnliwczTD%Q)b`0rg0Ccsl)2k;c8})8dlnqIlmERy(vxL!)8x!OKMoTk7D+J%IwMK(!7tWic-@yPc(ZAE{x*50{mOmFH+@HZHD>$0kp=v))sWO`dLNy{F6;PahFqO?`16 zMb|j?)L}zUnTU;9J zMc1-OE34~MVlUrK>?KJntLrynm&_tHthmSZ^;sQ5oVeIiClT*noYlB`9UT^X>%hK! zxw3kEW_6F9P?8!J>r-N5PaQV&l-bzRo+VFF&ylBH{dtV=Q@(Kvg#?-!DrReNme~2cFA=>TI;aD z(@9o6b=Zsa8Qxbn^BJCcI?3uapJl-@t9$+AtRyw(hUcfmzWMB%`Z*#}!^*tR?025~ zj^0Nht*k!h@8XiDIQGcXE?@59|J(ZC;1kk%Ed4x+*pt6G`5SdlQp29hF^N5YaIVh= zkQx@A5_>uCF*s`W7^tU{ta>`hs;9)tsz~dL)YKQAPO|E$!(QlTcoNlohNqrRvg+w9 z3qOec*y|tDIv_RY298*HNA@2IC8=TIDY5>Z2=%mM$y3A|dD`X6o|5mKeGm0QYU*`Q z;t>1R8*k~@i`202l-TFqcurZQhJ~lZK9lztJk{(mP){dW^>mU|Pl*loIl$9NRy}pt zC$t?--gwfqgL*p2s;9FoJSFz$-}rg015$G>;1aQC-#z=T`XH%c!4WI(=rb&&l~qqW zw)a$-fv3ZKadVh2J`VH6!BIZE8|A~bQ9k?{=8IFKe0VgHLq2O-W>~l~$*MP#tU5Hw zs!znGeWjNU6C7;uo{QIu-LF)nTyTZIadbaFW&ekXV0g*ZYe}R_8;9y_Dw+ z+V3{W>U=oMii6y~*Kb|dIv_RIO?+f_`He;Q5g|3~EstIQ<@zt-1JcT-u~2w3-dGQl z<8gkfQ=7jn_rG)hJ2)27dMv%afUD+Mk~`j)*|Hy6KBP`dYU09EihJ?lw5Hu8t*oxw zCRz1#l2uQM4c65%4sv~cRy}p%UdrqBBYSRm_BY9@r?V_PW!B%zchhB`UY^$LCTYDE zx@M!e*t-c9X=T;ZjwMeqwi#b+zIxi_%f7Miyse%ht;f=HC3by9epf5{kEDhLN36Uv z+LvkSC~JksFCIr+q&2R3N^vh9$Ilspwa*^Z(~#X7Ry`#a&oU6Vd!_+TCt3B>VK3#l zN9I|H-d{|z>S@Rx-LP@>nF_PNviypko20dU^}d$a6Zr!csbMjm68p$+Kcb!@t*m<5 zvDQN!Pj$SyvRhl)eD$=;m*{`9si#QmvD8y$?{DhqBB^0fCuU#X{zBVEQp18{R=-0{ zD1TpOaj<;uN-xrdTjP|={ad}w4jX#vusct;&(t=@xiWk4ne_P_(#nEk z_R^YIq?LuI%*vUA~;*-z@ss3sQ5wSO+tEf4Q%1 zBdK9A?=$=I^0Km$8W!^bvwt8XDIAfsvf3w!z4%PppMkWp+AhRiS`&-3vU+@C<=s{5 zAd3XUE^d8=VOHmTjw?_15{n(Q2#0@k-gnrG?CC}4snceUEZNhg^VDHKxa4_%>F0f} z!->rJxE7Mu`s#fYv%f7fK3GXBtMh)xN)yQ0oBhL!{AVzpYD1ZPi5`2}#S%95l-bx* zW@Ar@9e7IYz*Ay(o{F!v&9hidn<6*#l;g&pI&A1Ev$3bl#-1`8d&+F=X~*`SYM(Y9 z+I*e&yYlkA>ad}w z%r5^i&-;>^^Of}}v)g}2J|V3vJZ1LiG`lBhW#K8avdU0Tks4Oqn`LorJT`f{z1Vx| zvB}fz#okk9i>F88tEn&UqdEuVv$4=qhYdY-*wE9S?LC#+4?XSkN1i%t=&8eoo-!+* z{zqNsNLt%m*Qee2NSptM^lSiWW#K8uy_BDKA+0PtWfsrGv<@vR?#;3~hERPas`@YS zjsJQb9X3BlIK42>5%l=X`p?nCQ?769sl$ezI&A1^&yuI8rx`D8zTQW5`P=fy-#nuC zQAo|T#C;U8C-+b8<60s$?77D-UtYef*IiP>o_g%1{F%Vf`O$f0)l;fNW$pJmsHc;x zdP;2Yxdc3&WYtrLz4(&0!}<0lb8Z;(2JD4l^_mlV@ud_OX^pEfiIsP~&oE@(=Q^xU z%I{5+YmC&y#q(2&`}S|W{aav>R#xw$I@Wrq_xm{Z$kQ%gob&fu!c$_GZ!F)?HkY*4 zOFySz*58i{Pl>&hKaV|Xz9&aLon+P1Nme~2RzBJAzN-hGPO|E$!(Mzv+w9)G#DbgBOJ?-L>r|{myviUlmcKOn8 z{_FZ*aSll9vGnsOVwZ0%y3ZY{VbA55#9n`J{Q=@4H7q zk*Df*p`!=~R^ zC!ama?~^ku{F`Or;v}nHPO|FgB&)s>n|?>0c-5X89Gqm;*N&C>XxrpBJM5lO!_z&C z`nivRm-`s_xQ~H{4kN$Yrq=n>E+cn!=DGWW))ktEyL_?7pMPYm(|Nn`E?6Incg#M2 z^LgE0hSWHUd6?=j_+Gh5R_EbKR_9@22j43<$?81pu$S~ZGo0_0n`Ct!o@K>HZr`&f z&a@6l&9x9OnU!1C6O2Ph4SUODPk!S>_l_d1td5ageXWP;Is7ti*?g^2moGoR^WaR^ zNl5FlbiGKdyz8y~;VH9UT)v3&T_iPe;VH4QyDsmu+a9m1-q$#6xX&(Roqcx127OS* zN3O5Ws;5reaG%{ItDerX@RZn-51#1fm`H2;ru!e^jW3ex?;VAw6xaX$&oq~}ajl1G zJdX2I-)Zx=<&Piyv3iQsoP*Y>XP>|Kyn2e%u<%s>+BHP*+y$Nz`=j^&=>2dSX^pF% zI_&a+#4aDGtd6I|Uc5iCo1~T1@s!x*1BpdySa>?gs;3TnN$V@oOyJQw=ZF9NFq&7va=QKQZ z;x2arPdzsB)L}zUnTAF>`S*^%Jcq9{k-3? z)ou-Vf)r~P=!Z1HrZ@s!!(X|Nx(aYROBbq}ejue3ME^;vKpn>-EngLZXDo*u3J zc*=2??CEVuO?@%%caF#$l*dz~hL!s$hs~bemejCvAI0pS(efOPnm_EaGE`3)^`t{&ayg&Q2Va={)|2K;->we>?yPI zPP*qJPnnH9b=c5TW@Ar#)_SPxQ>>#$o_6{2jP}8w>3tMZ(=TP-$GxMCC7)g0JJb6p zq=r5B*yYccKi4&!q=uDwpW|Nn;_(;3BCV`G+n_pJ$)9r}tt`e^AAKRQNNZfJE3xvf-bW!dES{ed z8+_i4=cmN}@vT4B`zWL}u0B8QSn?Fd9(mg3Z%gofn(&m^;5%2(J@(|~6aD#5r1cyY zcuH~oy~yh6B&(iIvg#?Z!RKf2bdpt19X8yzJYbu>$QYxE-SWO=q^5o02eH9tZQz(4 z?*}z*$+&gvOg%+f>!6-?amiEteCvu#SN{4`_w+T#I{DU#?(sxgkENeSb+Ke`g8aeQ zfYh+?l-RScp6PcPBQ-2MCH7L@agMW9#675p3buH zl-S_&Zn#8j&|kqZJKhg!JnKDGmxFw)Po4bj=&j|gvgZnZdW;Z1*fHYeUPgS}$6&nN z$H2dR47}?ZxzGB+_5<`Oq^6&Uce5`{N zj-K1QKlmqmZrGO&)@RHbfpV^eXkhHSu=OnA1PO|DNv2tXs1JYUt zv>VsgXVup(u8a@c_RR8;(s$LO?t%f-FcJ9$^{cP=&GN3QcTvD;VD&&V9zyD&c^qx)Tm{n3|x z_$7Gvwxs4dVtyv}_O_l-@m#xzpGW}XJYaDToHF`Se>7V9sFL`Nml1) zhrOhAkeWPZ&P~QiZinTuJDF{McZ-aZ%&wV5TI1?H3Dx1sjen;1J4g*HUUFRdW=#Fu zXt{Z*d(P>w^1Hv$zRRu4{W`L%gY{4ymT}E`X!G?rUB3K0aqKCvVz1tpA2mPArJgb? zKbMGeke|HlJ!SUPdls&q5-abf=O)W?T-#hdC05>bSoM@x8I=+%X^pG%$|S3vI&Ano zcMhAs!>0XNc6iEc_`OUHE8p3uKHa#~d&+TRPnnH9?O5xfdMb13(9_Wj6dcad}w4jX#vu%V|88+zKa z)agzE3r{^Z^3-D^PaQV&)L}zU z9X9mTVM9-Qw)a#PS54oy`FbDKQt`C8 zmpgXru=BK8BiwM=ou|!r;NNuFou~HqMd-75KDV8xm-_qtj6xt()8)`&*~|DXQjD5GM+kY_7vZvWLUYkbJ*-DK4Ukm ztgjt5d)j^<9mZ2;i>F64o-$iJ4fcsPj>w3t?jbexmGd$#vf_sf`bxA}S>h3CsA zf8=Q&OW4p;hYdY-*w9mEV^5ilJ!RH+4`b;pi)-Vtk*6M;=6&{*+1OKu4Lx<(&{KyE zJ?&ZRq0akQ%NP%BzRvqy{>W2#^4-K5dFrsCrw$u>%53Z@v$3bl#-7fyI)-qY<>v@I zo_cZ9K2i3RS$QWIPaQV&)L}zU9X9l|XRU|oDb~>=PrLk~r_6@qX?kvV#jYn}Pbu!5 z>?zVZ=jweFv8&AYxZgoqS-G-lAEP<K1OpsV&?95-&m*BQ;LiAF5GL^y$d`gR>o;%kyii3hG|wkb>f!iy|!QJyy&py zdzdY&V-vI0Q`2A7J7V$uLTCraQ(~oM^z(gQpE_+8d)mdd9_n~{YmcX0{?JoqV^4|w zXXjVW(KblUbw8E*5qszEdKWCx%IbLPu#2+m-Nmr#DY2J?LENK;RZodsGK;jRFAeo;vL9%&vx2Pl;X65{tCPRZofi;p0Dg9Ci5N<8ME1Shz&&#fQaE zVK3-DidlI__o488RL}OF>V7^m{@8rIkCHuC-FUlQ`t~L}ne$%0dvY(}Fv~Z$*LKXg z&s=})eU%X(-8ippua-FQa32Hz_A&6TXJqVnb$b=fy!th*15$Ht;vKWw*Dt=V?I5XP#ZP9Jj~;y#?DEkoAFV7nX8nDl+lyDE zYnNw9{yx!`k==T_PxO+c^_bX8gK@WG?_KCVQQ5EO>=W(S^RMZ?%OgomTzJWGPcITH zX=T+O* z{!lcezfZJd&(l89BT4JEkyV=RP3+jy+t)O%q?OhAnd-Z}xG5{EJ;Un!OzhE`*h`Yu zxH>-*D^KB5+?EyZbiQcYY{{&oHLlLj9CtZNdq0=O?B~?^*>?y?^?-Om~j`xYS?6R)XSW*{Bt9yFCLv;`+ zv65C+J$2YSnf3OGc6A89R}6bUJN9@@&yU=Fq8%H1%5h^)nT|Hur_9Elc5Lsd-b)NT?ej;TI&A2v z!-k$ZZ0ISo@%}qzo_ehNjQtq>g!)S8sl$ezI&A2v!-k&rZ11Vw z#|}L0^GBXKZ0M=OhMqcX=qa>ad}w zJ==RK3#Mj{viZ6`?eeXs{l2C?mascd`+ZFgyYsZ)*W|F(Q}dY(`XsY53(HB#tSD)n z8__Pzme1jlRu&wy@=l7o(*8SYGnx1kD`}0Z>r;m2Ip?4x;3=`vvc*&5 zo`|UXM7#A~>?y~M_cJ?e=qar_MW0o+cvfN7*G5B>Z!j^)W)jg zslQLOW3#9JKGBZNp0=NtV?5>h7EjxIE{vzl7Ek?sqFo)brxL02l;eWInBKDBJT{G| zysyb)lcy55yN_a4$aKHI^y8_+W>5KZc!$lN^5^gln?2>vH+$B4i1AcEXB(_f`}~oo z4x7hQ_S9iRPaQV&l-bx*W@As8_1%+!liD=->3izMjXd?($WvxxPaQV&)L}zU9X9l| zXM0ca48x8SHec7LUH-_^K9;bdrw$u>>ad}w%*LKF8+*!Z?CC6vF~nojGb|oYJvM!Q zz~d>i@=h?GI&A2v!-k$ZZ0KpvS`T%7dSj2LUH;HhW@As8jXfoH&7S)EL~Xy5@8CI2 zbFP#z^Rrx8-Ot&wck=xFLOYkc?3!7m_1lj0PdRSvX~&YMH}`njUV;prr+o;qyubbFER_Z>Ekr&5RBQ(_065$Hqx zd~QF?`3K7T$Sm z^6ui*-aC&?-bo#-OSnhq+E44N-d()fd&lh8UQP43>=wOY&JAN2$NhTt?(6;YP-c%l zn!G#uX#YHvS%07C(RxL?_IRIY%ZPigqrdS!D6C^U_TJlhzuw#3_c}W4`Te{P>VCIh z&tXr$|Fdb{{r=C^_EbNq4zdqQS@GDg>M60Z4@z0t2W43Gl~{RdpW?PG9AtLMtfaNR z>TAcQVS4$w(x3GH)@82k7`?afm}A3WUFR`3{)HHs`mU}+Jm%(=n>z;MugB;&HKsV~ z9y7Z!0_F8trg6`Xi+W%FfLt2x6Yag*zM_8c_cU_cc>f)O%o>F}W`}w)6{v6(EhwyWFkG-5drF~6Y2YI%R{wlrJ zx+n9w6Ib>#Da-qsIBx7Iv$3bl#-4Vp^-w*PHJ)|A=BuY&{?JoqV^4`4?-R9kl^G8=o!Z0sqsv8NqtJycKSKEpa- z^VQQXf9NT*v8T-D`*MGusI8-VdK%386nEe$u>((u9eB!Y?5V?so;qykDYLPs%*LKF z8+*!Z>}khZ58)}+bk+fz4^R92k*5wDdg`#Drw*H+$G4xYgJU+{f5&XR|Bl(%Q-=*b z_1MT$kBvNa*w9ml4Lx<(&{KyEJ?&ZRAw0$X#K_Y=f8?pdhMqcX=&8eoo-!MI%53Z@ zv$3ZR8+z)ok*6LTdFrsCrw$u>>ad}w4jX#fv%ROdmmPW9=UY#`eWEs&usct^eWD$^ z^OT;)cXgDw)zi~@?}|Rj^(|{zq?JXxFk3!{M_O5M%*s2`m_n`IKGF8v((u9e7Htv~2OzxF;gwpfJw>0kec$F|ecI<&PyKzOHdY-^dH=OyZoW2%*LKF z8+%GD)}>gN@%j{dBieTK_kN0Hx}URUu`WeiUY|N~-8HA!;KcQvR!_OUYv`%NhMp2T z@RZo`KGC+##`{D&HukiugY{57z13bM5~5ncYKLSv)gw;%4@0%feHN3kLqTta|FO$HLm(fasByMy(L!0AB~H&#+Cng^>tbGwu_rW;@hB7zruZPe@=cvKDk1S!wR#$lU5O@=f47M#f8*k&&=4aL{A0V|mBmyv489t=L0mV-FoR^w42L z4;?o2klENnW@8VTg?|{2@Tc`~meqNiu7yO+aqV}L!ACD{8b755=6fOGrNfr{b+uEv z3o4#|2L#t4-v{A-$ef#a>cq|8SC4h3VZ~R6&GRaD|u-a2gPEwiz=%*Ng_ z8+*%a>}|)o-pU$q+FN1=-ZC3|%WUi|v$40t4!k9H;4QHOZzoyx)?q_$9X9lq+1OiV zV{e&_y=6A`wqreSC$8@}ymjJ+>sybFymi>nTZaw3b=c5bhYh{$SjY+FZyh%D z)?q_$9X9lqS!t2LTV~}QWsw>erM;Mqy>(a-m)FAZ)?=gb)?*`Y9X9mVVMA{nHuTnE zLvMT5^A^u(X1!%L_SRuTZyh%D)?q_$nT@?=R$4FcmRWgcWfw(IY1_Vi<=wzrkBz+b z*vMOl4ZU^P&|8NMy>-~oTV~VG?aQ-PeHw;lMceB0GHv54^56F7_r2$`DAT$=@R!-x zUuI)}nT`D=cHl3u1AmE?7Ek`tdckQkd5c}wbuPyZ*9%_U&|i)l`^#+XFSD_~%*Or_ z8~dy6WL|w>={+hR<;wHuTnELvI~6^p@G!TV`W#nT@@5 z*w9;#jlA{P$XkaEy>-~oTZaw3b=c5bW@B%c<8}?;jki5B^44KPZyh%D)?q_$nT@?= zHujd;*jtAUz4h40TaS&rb=c5bhYh`T*w9;t4ZUS{;O&hGZ#!n_Ewiz=%*Ng_8+%La zz*}Mm-V!_Tmf6@_hYh`T*w9;MV{e&_y=6A`mf6@_Vh7&doba||hTbw8d&_L>Ewiz= z#16bAcHk|s18-~oTZaw3Wj6Mf+1OiVV{e&_y(MIy6qGg8OG8=o# zZ0s$wvA4tyyd`$vEwKY{nT@@5*w9;t4ZUSH_LkY$TV`W#nT@?AHuhHcbDPZtMI5_Zgaz=)|kMn3Oz5pslT&u5_ zu%U+@8+qulk%tZ&dg!pBhYlNh=&+%O%nm%nUd82#wCVomvgtXlWe3j*C~o|G%ZVF~ zqYfL6qs+$RD6_B@&rg%RcvL8Vq_2s;d~UJ7%t{#lxojUdVa|S8bG;Jd?3e8sF?QDn zWnJhVOHAD{G6%bi7`kI*ymJ{bvoLVcV_@WtK^r}o_mJ7xLx+v$bE-r6en8&0?Zgc| zWH$DY+1Nv7<8jnsLk~SR8b>`g8b=*A97i2C97i2C97i2C97lT=eT}@8Ie2#b)P1d{ zUk=xy6gM6}ow(un>9Dc4REL4L#16bAcHk|uv9}Hzdh4*Ex6H=gG8=o#Z0s$wv9}%T zdMoR~X>W;@o)PWyW;PygnT@?=Hujd-fw#mCyd`$vEwiz=4jX#wu%Wli#@;d;d&_L> zEwiz=9qW3Fy@|~j8t>ndpP=g4fw#=Y-ZC3|%WUi|u>)_39e7LZz*}ZxZyh%D)?q_$ znT@?=Hujd;*jr{}Z#&lWR<2~{V(cxmv9}Hzdh4*Ew+#(7>4jX#gvuJ{T zeT!>0JKi!Id+V^Fw+#(7>%u0)>2S}@5;Fy(nlto%uG1FmVZ#k}Ln_aYVvFF2M zBX2!6^44KPZyh%D)?q_$9X9l~XFYFm9cH~{HulzGLvI~6^wwcRZ<&p~WmZ}*@Rr$~ zi}HNSI4&*@SSeK5v{$LW7E*)kct75HaU*XXHuTnELvI~6^wwcRZ<)nttMjD4U$&Vi z@Tyizr@D=YQH!B>KN_qmo#(7>%*Ng_8+*&F zsOGo`4`*3$9vh9j9vgYSzIfRjlA{P$XkaEy>-~oTZaw3b=c5bW@B%c<90styzQBhw+#(7>4jX#QZ0s$wvA4{|-p;Z*#&p*}+BaV3I&9>vQ-{!7hYh`T*w9;t4ZUS{;O&hG zZ#!n_Ewiz=%*Ng_8+%Laz*}Mm-V!_Tc9K&dZ#!n_Ewiz=%*Ng_8+%Laz*}Mm-V!_Tc9K{UE69;WXvIFhg7m0?xdRD9F@jxBSPpKBdG*j~rg%Pf4Pc*lACJf`0V z&+PR)eqNW~3vc4WPl}6gJ%%&sn~h5y)KiaDzgkv(B^KX;tS;)eA(y!7EwS<)#4A{& zroK{$>nn`LMOs<)wu=jF`$OI*Yp+3Kc%LjYyic}gUXgD;-t|wJd;7ZMSU-|)Jl-)f z&Uws*eA97Z;GoC6>+F-Y^?`pE@3j8G!Imk{RoOpg>+dJrzEay=cEGCJZQP^mpYwZ( zsSfg;?&@Fr-R|&@>+qh_bnTJWI>0|>A6*lRw6gGzS^vA;OTTT;&1ZG~rgM9AP2=WO zNoyVS`HjP-ar3JD9+=ANJu|UVGyOj9?mOdgpF(W;9{3BjbJq{CHe@z`ANPe?x?^v- zZ2ms(WNTq{%xV`^s!Qz7lJG|Es;G z7+;AU_)6@+S7HagPO|E&!=~}o@zr5NUx^*~O6BV?e&$Ifv?QQ zzA`K8P<5Nuqu7hv)>Gcm^?))U;9r(&@ z>?^aeuN~|8iutqkfX7#6VqYCL^wnWQUmaHFc6Ga%rGm@J1pg1_o!dH)teD&DKS7u{hnT>sQ*w9yp4Snrd&(|gJH9aRV*Ff&wm@VES zHLR?g9X5L_&rbX21XKrkcB<F#u@}jc3E}(WOb&%+W)%z}oP2Nh>{=SP?IkY|}Kw9gd_g%ymZ;=}I zrgv^z_7C35dPO`(BY6R-Wt08Mx!E>o2hbf0>Q_Wj6Mg+0)Qp zVh8>bTig-5jXSsw+-CAl@>kN@zToh;ozLVQhgE-xEp>4Gb=c5fVx3Y4dZ}rx)X@2V2;tW#b;tH;3;T6W{)-U<*G@D}faq)Y(Q{4XdC2}3)EIb#F z{W=u3|9y!Zw|aZjjk^xJ^Y*A4cO7=;?NK-GGMl_DpH<=W2FyKnJn($&8M!{8uMQjf z>ad}&4jcN)Z0swuv9HX=zRt3^M$E>(dTep9nft|8X6rcH`^s$WtHXxAI&A1Gv+OIL zJMZ(gXGXp{Z0M`QhQ2y%=qt0augu22G8_9k%feTWjmB4xjeK?3vTtDNePuTG)nP+l z9X9lpS;yBK6TWuL&{t+-Uzv@4Wj6Me*nzLa4tync;Oiu-zB+8^tHXxAGJAZK*AC<> zvw5G(M!!E9_ic8JlY5`oS7u{hiFJIH`#^haZ#^Ktg|uOYzA_v8%53Z_v$3zlZZD?m z4{xRRdRrvtw8{%&%UsOsS7rykQe2-^UmZ5|)nP+lnT>sA_Quf-tf3uWna%sMoZmA~ zZ2f)T{rZ*L*YQ=JMeOypV}`ym8~e&^>?^Z7U#}Vm^*I-@+l!Ct{mb^EWz|<=kJiK< zt(INjHnGccHQyICEIPy_tG+sHs>8B8YR^sXHN3d*$z$ew?6WIb=Q-^0)y!VCtc+_8 z8~e)jy?Jy~-KO79@5Igf2)Ad+SBlHN;(6FUUp*#08NlNkIoEr#ws+zz_kJW#1Tu3T zFz2txlYq>e2F&U9vxR|=-m$h9D+3QbMs|$s;=sS2!N|M)Y`QN8iBrq}OtbLMi@W?> zio5(=jf?vWkG+=JYlg+z&S8&TR{V3=8`txAdA+;eci5Z9*}voNe&1nl9ovwS;$-`ltQ&jpy>UQ55%dwZ?_T!7j4y|$d= zT;BIu|G5CO+pB56fTVUzfuDR%!e|>cta>`hs;|Ueyqfl}BCTG*S+0XHS_h<+RbRWf zz%E|JO60Qoub#RL?_b?6*Xxwx@cz}FdF55!zuGg~*LnXcF~7$9S9^x`1Hvy;=k#2k z_pi2$SgGGP=tpn1^>U>T0UGC=3(a!987#?!mmPH z_wSCc9g8L)U$O3MTy%UTX5cHc`F_apmD%C`)wZ5%-VZ3LaYcQlxVN)|NUK-sE3tRh zih}S0d;*h_v&S z;`*%m>afYz_L-OZ>afXI=jQ{6Ext-!dS8hh_{wbTE3>h$9qaju@uaeHT6-lcr%F#KM`L&(n<*Mo4(f0h~{eWBt-$Aj$iR-iQ)r%YX>amfp%*MVl z8~f_8p|1`b`r5OeuX@e)jIYeZzB+8^tHXxAI&A2x$ENGgzA_v8%B;K-jIXmSeD&DK zSC5T+Wj6Me+1OWy4SjXk(AS>zd|fccIKI03|A;N#BCTT_?$0=G-AC0wr*hcrt-pV@ zt*<}Vqpxz@`njnclhIDh*3V5X3yxXwK)scm)wIJhWTi}HbzMO1Tk0Uu4Xf({hfUr} zRA>Kc*JgPg3x8`J%Kp`sE#4wE>`m|7%6*r=f3=I7z4iC6wrqN?FZavt{?(RE>jT$c zxgIS$@R!*DKim)L>7#1?nNZW9;o%2n^%LEh4543gG5fSYC2 zUy57m;P~sXp})jRt-L*hH@x}|{H3@9f0>Q_B{ud~*H>oz#bxmJuSVW_`&T=5=dHJY zwPSbQdiz&9cIRy~Hp#f#pOf^(7t{R9pZ_ykoIz?_T)nvPDtX(m(*7LRXTdRB_8{O> zn_35qyB_Phc^p)AzS7u{hne`n^V=T3q>vpx8~e&^>?^aeud^(C_1JKKm3nwZ z#4DedR|lK5s&G!+;r`WjoQZwqxbgVvu%WNaI=;#p#@5ptU$IWN%+Ob6V_%t#ePwp% z>uTprSr2f1w-;BPw~^NQRqw+n?$Mf9q?KJ{J-~4nc{{BK8Ws*xT%T269rjL+d&krP zF28Uep&Ckh?RHsI>|09b8oG_5?kii?)f}?C3cZ} z_2jFKi}k=PtG+sMy*XZeb=ZraNOidQ3DdveE3?O2W;e^iS7zh=fXoi}ueR51;48&- ze3d;5HlFKi#|(XC_TGhl-_UaJUD+LoOR4{y%L``D|33Tr_x*ktW>42^+1G0|uKG%> zy!#kf@zt>EE3xvfvf`^@b$lgOd`)$bwAMk-Z<1AC9X8cLB0W~)s;>@vTkE?lw+)NA z)oI^jmxZq!_r?|7U$8xXlg2ZCUmedkih(`RXxp$Mwy!zpdOktfzL2`02(uf907Sa~d$G7dr+%dU3WFD+3Qb=4h=9{OcK9m5XQcSS3f?^(}cZ z%fdg8-E!Q`#MS$YuKjUTkJYsuv&Swg{yBBH@xG5}pMCs&A2H{KF^%Ki+!FiY&9ZQs z*;~tRYTRd+->h+!Bi7%)x*T7Tvo7m#fB$OBEZ^R~rPt}(7vHMKR1e>g{?x=gOb@o=&prE3tB9tpn0p2Z+n{^;z|` zi>qV6s}~Y6%`NKb9!CA#$G}U6x&P`byJP7*?=Z_Zwy&4^=y>Tc7r%D&(ZZ;I4nzB^ z9`wHO=l|HR*f}-azuK~O|Ei3KbxaZeIPR76<8wHL)Ue_ov+Ld4cfqcAWe4XjuFls~ z-}UZx#w`5fxJQ{iYU1jAO>t$9tJVQ&t%Fu(lGXW|*ir|HdRF7=eC@ESp4)PFHLT9p z#NIh`S@DwF;qM>+;p1pCq_qw@UsK$R56hD#Vc(V1u(!OpWqs-F2khdaACj;4BxWMOBQvs180Yh11PB&)s>Tk3#&z8Y73on+NlX4i5LY2)JFT|WbFJh*sV zev(hl4QZ`|`bu%j{kyXtklFma$?>&gU0*TIHT86SC1&6&v-$qr-@n=(TXucw`0DHj zq_}H#MN)fB@w|!H@&47e4tMf3MQW}S#$t-QW)`VoWqzM!)mMspM?U+4EB^k~zP{-h zg1>*YWtaT9snqw_)c1y0-|~Fa-@n?%9r#M;HW*(!*7X%**FIl~8TiU<>?^bR`KaS7 zv)NaSMYZj9eDzqp{_S|B<14Y_{i|(TNd%3HwAMkaxGYEN+SO;(SBFi$wx8MR`0B99 z*Y5e)u~&!UtJJ0UmEsP3Wj5Sj#qBWgwTtWds@Hdqugt{0I&A2x!-l>(tazH|ZQ}|! zkIkRMH*U*SbJ%!4AjkC`gs-zKeD&DKSC5T+Wj6Me+1OWy4SjXka6Qnop0BuO?U=#q z0cK)f9X9mUVMAXXHuTkFBVU<~ePveO3C7o17QT9H(Z0Kvx zdcH1!ukQXoVvDy(&3uS;Gqc%SXa66wyU$JO=Ukc1-nMhS_Elo*=lpj5)^;Mce$H=M zJuhO#1NByNSJMuQ+YW`5w6eM`ptz+D65X)6E^yf7twgA8Nif3;=PcV}F^A{be@x zm)L>7#1?nNZsU$#Ut-0F*gZjs0ad_Ltb$ zUu`$zBrb!ue>L*f+rQeeJ8!-Hs~x-Zw*UOUucuhD^R^kAWPQtQ_13Z&cbP5DAT=(! zEWAqNSi?&Db6lSV$85YG&|_T}<$jFW>aDkbwY?VATW|kr$L_rK_OEvA&RcK)YRfvG zr(SNyP|sJLpN!LT6^Hv*+hbyVpx0FP0hsGA&o-R6p|1`b`pRtVE3>h$%=!*ujGblS z6tl6f9vk_}Z0swuv9Asr`s%QuugtQqy8baPdcO9|$XACAeRbH-SBDLKWj6Me+1OWR zV_#?4GzPX~272{q|7tfL_;bCCuTC9?`&Zkzv9BDrJfG$L)(#u`%BfmbFVeAN2`sytkO;tcagW#dZ1xt%$#M_ zS0`?&!?N75=Z3k^VMqH{+jCov*SwBh`};7CJKVq8#vS-dam({rfB$M5*YOqif%|;z zn4z!C#=a7}eJSlH}tu|B&)tMTgEF%O?^@ENmhMj zR=$5)`+uq4wSLKc zeLTKWT*p`JS=i@m$HsRd6vGJsSUrGB{x375nS6lXnUrPH|k(%~|uM~H^cIO(} ze!bT0@s#^5k3G^oo-M1sQe4@Qs_fRpRbPo+9?SboB{lVhuam6$N^GfvL^pBOSBG7- zzRP2)Vbxb+ZwsTowk&)l_BiifMQY9sP7y2L=BD50hSad&m>uq4ZGB*0vCqpg-ul&J zj{fR`_ODW$rN3Lrfkk&e2TxE9q$ntAiUr7xs?m6sl zr2VTGl2#U+!|Lz3k_X5#cS^qOFVy{vH?GKk_v~M7n4`Crw@^Q%^_aW;s|~xnb@2nR zLjJ(8@DckPXIOYS$*P}|ta>`hs;|V#8R@wpHRqPwwmmnWRbRWfItKjULLzqiS4~^> zjQY7J4%V`LJ5n6@xGxSobeMO4@K3eQpZ1yU|2g`--FYF#19ISa(& zm7E8Lz2~tf_fPI4E>gpahaC6$uRi}(ut*Jyd7J8R^wlkWU*=aA!|FP7lGS;8lGS;e z*hP-5eXOa2E|4c#owtcC=O$-n_WtU;J<004J#u`FT3H=4ySV5h7r(cBy73l{nf@pdVsD9k{`Kcy$FY&tW9yzsV#|J3 zq=tpJ#IAp_{)L{Cq=tpJ#QJ+*)mw)xzen5dlT~jgS@o7!S(WI1Mx>^`GJbM>eOA4t zxY%!oc4)sJNxhw9)!SJX-V(cfarvUwK~i&WH(mBa%ZHSe)UfcD;(qMek39<(X=T;h zj&;3-H?!Un`@66Iu6m2K9$V{3?Del)*XR654GWG~|Jv$aGh&awcv;)^xM^4Q)?v3V zpsiX~y(RYOi-|pI;;OgA2GBCV`?+p(^<7{g}0CHCLG{z>%~ zX+5@jOYG5C7WEdXVNpkBzqIH$b0n!@!4WI(oNBwC+RxzCTVl(8Y$;=&N2<5P-dW{I zmpG2p)M54Nux1viVc{*s^;z|n*gNrlY+{!?X&=D4u9r<6j=ef8`LltJz2ULjFD#Fv z9gv#17;mW#+lLnYc^9OHg}20h;@MBCw@53i-gd0#tzO?rZ<&p~Wj6NKVMA}3l@?LI zkec(ya{xS>YR>KUX?{N6u<(}I;tYGstnZ@O;l%Y>c@Tyizr+swB{ud~+s*i^P5aJ;jJ(NljJrLvEuVb-6MBD!)LbtacbS#Z z_Am8%NorUbcOCXi+kaM8Qp3u+-C=j$He-{laha{&S{CCjv&9*trVcI(uab)mEA7v5 zeHI+E@%}+(*R{BKr(Z8f>~3t@dE2m9FEIP~k=~!l=-Z9E4*TIFy+4!Dw;Okv{p7R% zR`1V{*7n7?%WU=b=+lOk&mnXU+T(4{jJ#zw_SRuTZyk2$?P~nO8lPEt_XvKi^u2=2 zVm}sGq_wS<)r%|hZuYie#Q~1%v$$5wmc3yM?aN|zUCX|#X0Oe$7q^bL4J+PqT==Se zlDu`;&|79>Z<&p~UF7_1pY+Dtp4kTDEwiz=4jX#wu%|MDk&Ak7+MSa;(+R!hxWyUv zmf0orc9zvKhUyDn)fw{EiyL|Cuw_4)jJu{!Vx7x%2)%XK&|79>ZL4Xd z+%z6Bdz|AQ8#X!6vzI^Mvf5rfD`$H{>no`_H$2Cs_Pze$>$*-rYFON#5&OH({;sYQ zkXBaj&xjp(tM#}dO`Z13xZ`cd$Y*u0e@wkaT92)tKM=e8<&xI7k{b40&WTy~+UhfG zV&&U)v|X_;zQ$E=Ct3A&l2vbs4X&-s{m!|$9;mkzx13wM7gfETWYt?@5ihye>~V!J z#IC=*{xVpkwSAQ%R^H9~3+d-*iGBXr=ha)JHLiL~?7&;?6MMYv7&(`}UjJIpNz!_3 z^_JM>SC(JVwvyDa@Rr!Kn`e6dNDYheme}p)(G!Tf-CUlita>}is<)G@dQ0r`#G-XT zTI-kUe67wIXAdP?1}urwLofEaKy?x`g`G# zR#v?wHug4+&#kvd|G52weV*Vk|MaPMKec1-$+}+d2mAHL#izE)h^KoQ@pB&oFZVI< zaUTN@dq(_b}>V$AoPFwlyWKPaLcT_r`%|`{KZ_Jq(=M%OHmMVm%O( z{x;nYOOD;k3Xa+FzE|Uy#PwP6Y&tIHWvTHrGMN z#7S1?WnzPK6CbDRE92obD}FK?oEzq4s&ByFnrC$^?Bb%YA#xeN)N7eb18>{?sffj_ zFnYaO7ThcgZ)aI}ODw);lk1?~PO|FlB&*&ME4A|4LB>z6ug|Kt6gN0Gcst4JdUBS9 zx5WDO)%&1X7T!*>>TSoWw`!RATovB5<6;?a+r7u|mRWzFGLAdTf}3UG?If$-5?l8_ z+kMsQ?If$-5-YVj*S^!X8N8ij)mviy`s#hqB&*)evNz`ItKL%FpdH}tB&*(bta__0 zYrKUEzPIgnK*L*RU&?EWmW8*>p1CaQ$ZXxqdRpgx#*6|jumemHapX?az3*xIA$+CllIuPap5hqVxl%! z%VNA`77V=YSQ&3;S$NB=UkAP4lJjfF8~@z&zKhtPzT&M@hwLrNm@!1Wb=d4}$BMTO z>$(GPdlpTbB35s8tZ}`S99vKE)?xFpJ661P*z9e`ink7%z3o`>c9zAtdu-VoYR?TE zvt{3_|>$C8dS-%eOmRXrW^1j!mzQ-Qx*8$HBoVeLrlxe+n*z9e` zink8yx&v=}7EPNXR&OzWwEcFGKez^xvzmH}x6`b6JI#u>(=6tX$@*%aB^JMDFrS;b z2HH-$0cp<#8MK z+i6z3on>{MFj-%HuCPe#cHEVE>NRfb3x8)>_&dwO-&q#^PO|DRvHmqye~InB&4*j$8MfHs|KDVr}-e zVdeN7*Jr^o>(@co3&OYKjelhLj+ zi*Z-`FnNn_7_Z*;jPL6F#iR-htuCsLj$E<&D@Rr%?VsmaX-cGaPt;=R_o4Dew z%Vuva3vXREd)u($tzcAcPo%rN4Yzt0ilEzWC(J^wLScuR5doz6PmYHgv4&d(TcCt3A& zl1=x=h}is<*@j z?Er5lS@o9K;N0NtB&*)evKZ%x4bBa2&9dMoS@o9L;%$44#oOe0>n(OC+VOTTb8jM! zc)B-^__>eK`>sz*dzf(#ea+SxKJJSH4|_&F|I+U*O{w%wIZXa%nuUjb+`fL8@AonA zZZ9Lg?PbKXy^Q#>k3oLVMD3;b`#L68uY}e8ta1aJ+Vp|M>lkUL`Wy>Rjq>5sC?75j z^3|h3zB)9>SARzN@L-Uyo(%HUkwL!tG0KMiiG5nm3GMKd#INn3_aBq2&WE$CILPhruip4qS_h=H z4!SO*xPSY`-ztmLu(!OpZ~gbT{yWYMX=QcH>f%}t)p7VW^0dpB=pSD`j$2gg;CPl-KyaHi*m)Li469((^g_rC)lkQx@AQe3}ptEU}Hp2C@tr(OQG{HKrqC-oGm zsTYnz?EPQAuisOQ)Ue=)4fZ9%Q(}YfcEiV=u6Oh2-*+GJ_K%u# zm%T|l_TtRc0c!+`yWCyw>bxSUVKD$svg#?Zm+o$7hs+u3cyVmxJb zxqDR_0PK6rJ|m2$%x+~btfaLLSf9?a@RV7xU+aKAQ{(Er5atVWt)!lxO`nOrB75H| ztM^63-v4ZIdbNE}JmosXo;qykDYLPsJ!?J0`c&sXbM7`Dp7!}8PnnH9b=c5TW{ao4 zf35eF+4r0#Pp_`Mr_4UOCQq-fy{F7xUDG&?)HovU&9d;6*`Jp0SVLd=sU|KwWmZN} z{p|iu+gD^fW%h-$pAx%fPm!AXV%}#qd%E(x&usQ|<$0gj zm-4)iwAMlA{f@OBs;7(8b1gPl+9P%53Z@v$3bd?mS)k@s!VP=jqaqr_9Pb zk*8D#pH)wZ9e7Ht@znMe8Be*s15YU~{M2!PJ!Llbl-Pl%9ou`VZ8h+;&xfafruR`V zef&?m@s!#1*%$OaYJK)jH=a7|%@_1OYQ1@+l{K+iP5%_l5ued3&E&%Z}?l zcc12Mn<9;;=8FXcumN@;LeKC(Y{Rk#Qqz59(lpzV5kW9JRszVf1H3^75%H9f1^DhJ zZy>!ugG)dH4A78hNrQ}{8(8qbYPqk{d=XogK~Bj08AMD*0X$#>mMO+mpYzslRn@7g z^;>IqohC0E=&ru|e5Y3Js&B8_d!M@dv^ho3qjjCs!BNX1pK`tPQCh1tAN`TZrw)7V zAbWaXuA?0G#RI*Lnx(Am#b=4kKL5&B^g8PKSH5cUsb#IFI-e|fYF}USl-bx*hYdY- z*mEbk?rxT{_6<`Xir}tqFn;vLcJ#Qy=bM8#?^no+&_uq=A+=hkk z>!o^qR&xlmQ~J)}b@!dYI*tyTzJvGPz3w}M!7;nMj7iGg9dhF)n znf&a!?iq8EPq|*7RZpo6KC9Om#4bEPZ;(|_i7n61GtUM@ejH?V%tu*p#LAWndTe)V zCiQbuVo$zzqR&%A*^C?RpA!4USH7t8KFZ4Kb(CRS5A`|<_imRwHLuI_{I2X@!9Jj@ zvD8yyPd;|?F?CPMhCP;;#2#HfQm0WiEIcK4^TZit<*9)UtNC=0RZj<5^_19PO_M6>~ zs;8!2@)X`Tb+xZ+J~gk)8iG&W`Xt;#S!1Qoa{IbA)5}+0R;N)mEIg%pKXK&~%A#yo zcuMT0E5DwPm5(;8dOFCer-N*|Z)5i@I9}l?)$6nBDY3tH<)gZ9m%2QV&fjbsd^XLY zgRJH;%YN|62el0-o3T)rEPMRqvCgk38&>zrveGj-zjVjo=fL%B>ml-~y1d}&;_KJ$ z@P6@e@%`f9((8I%r2BAIE>E`4q?W7Tw4M*HExli_e-_@a*E|ca!=t78;m*?Q@MZCJ zab)pz@nZ3H8QZ1T@tS>I?h)vE)3PQ~9e4{|?PFowb(1aAdW0O6T&i_+ufqcqqkA15 zEWEBBEWEBBEWEBBEWM6#UU*$SSa@AMSa@AMSb7~EEWHj7mR^Sk3$LpOORvjon3KZs zmDlX+l96;BR`E#Zsiiu^0b7T4VCi+8gBI$C155AMxn|-0$OTL9*Ewb3{W^~+Q3L)r~ta>c<@zb;K|w7pAhAhvCa0tL_-K?OSzc;dOOq z>2U*AmY{5^swn|?N#r&#F^Y?<()xbgQjb z{TgJ|wNdth*T0*;UH`52uawQc!9i1R=Lj5JcwHS_dL0hpJfg`dUHx!y>2)}0Uf)c& z^Y7-MZ1zRk;jsDn_3~_fdGbEegZ={tsb1M~h(4PBxb;;XWLBKk{=6~$ajjP!TwrhC zsH{3j?B>SiMygl-SKEt*53=eYv8xx>TJP$GwqA9R*vrJDhnjjjN8sSX>+0ar>*65BaLK{N*O6n*`tSlVldSxVk4)w03tSlU4c6}qcjk00I!BG|tGAm~5F*C`rQ|pC;%!*C- zXnVicvT%^u>Z|NsJ!Zr~W@85}YaLvA9S$zOE)MFrEabt(*Tq5m`jUeV8#>5raquUP zS_hdu_b180&2!d4W~V<%4sM>a4l=uWF6UP%n=uuyMp-!MuwP9MZob;q3kMzcMsl$C z6%I06^Q(2xVYlZ4HV<0XI=J*Y99(=|9Mt1|!NJAXF&EF`dGmhBCwVSL*^CqBVrH|0 z>05AQc+o^$b}ZoO~a&N=b+TTMSmPPFw}2Nz!#2eHrX{NyIr;-KTJ&M(ADeVJ|ZtLDH# zR>y!?IWN_E`*T_C17gKJW&3L{R^|*WnOmJ&_Ra{9kgugkY1~p{pnuEyo~*5 z&hy&WbzWY29rN*An&eaS(G{mty4l=awygASX0l`ENsg@YcO@~ez&lQZEUvr=Dj zMatR+I5^6}L1v`}&GEOpdNH0cJN?714bt}xTh_r%LTfYiA90Y`P3WM*h7MY`bx7yp z1xNIA4;&v$4lcb82bW$y=GVo+&u%`e^Q)9iA04`Ep0_vMysZwJxYg~RRR;%Ib&%Nj zyE*N?OD@jmx+v?use@E+`EJhsI!zrMWHI*K2ESfiheq|v*0jd0JAcvZ6K3C9|Gl2S zNLlwy*H{>q99()Gc~Iv5MF*E&hl5M6AK&41c(?F=b#38w^=sjEb;`Uhp5*I!luchE zR}Hf2lwqacH|Y*Ry5?7x?!c%+cVcAxoOb=;>T`N7*?&eQbulYj(z-KwE?Tp{xVGik za>bL||G7K74tJ!EMR%57zjlZB!=0t~!<~iK)t!ac)t!ac)t#l+;mgA7>d3c_(C z>c-OR@M7t8xUlrPyk=h)J9Ir)SzDoV*g_p??Z>hMdM*~tapJ(@>*B!T>*B!D>u_M{ zbvUr}IviMhT^v|?9S$tL4hNQAPv;k4&dR9_uR}}o&%*0^d@sDNV;jGo+Sb2b^5-PK zK{-wT_w-Bh74^S2{fp@{)4!TNJN;|f_NzbBT?5<{&-8EI2l32*mJ)ITu}4oH>3T$z zP5wfDAodrp{GzUNMA@*&6~sQ0*Jqn`nK;KDWHpBjvYJnb_1BT=dFvpndB$NM_14qk z9D9(}{4>fT7ZH0!{$P$m*^CA960x_g+)@^0!(R5-qknev&rmPQhDDv~PwScg{3+## zm95uMFUqD~ct-5UpZK``J}JtEg=fUBWqrEN)%`kkcs9tYXM?PIMr_LK($emksOs4u ztDZURJ>KsZz_USCJsV}=8L`KgkF^abo3Xg)vHQQh|JxV~lno2dsNVUX&i@oF%7%q! zntNK$e(>rKUImM?VNoZsuf6!1{$3Tzh6P8gY&k}~C>s`@5xc%P>F*?&-`jy_gRFWs z$f{?=F8of?Agi7^>^W-AnSim!?_xx|2|1Gd68y21s z`=cvA(%gr#Vd0t1TdilWz53tPv)5kzq4kW|`R2h*v;k#PFXA)%orCWvD`mriBUZMg zHALO_zUuilv9eWv@A6G4YrX0jv9eX!{`Vu*Gh+SUyVQI($f{=!dyn&bqI$0Gu>0>r zpG^+>U5A8A;4#_Z*%HTTVzueP}lo)P=nmH(-p zy>{h)7|(Rv&pl$d+r=KX3Mj`P}V+!XUyI&zbB4yLs?mP#;klI ztt`rh#d$sQYS(9S)|*%%9Cqv3A2rV*#C|b*ke?fevKeD>huQM%E|isp zXUtB*XfEklamQgN?|C2a%wyk|>Yd)#v;m%ZZ2Fz^X}a1tiG0TF{J_(iCs8*0CZ0KL zn9m$G^o-fqGo3SxXRqaX^EEqf%6Rn0@qBa6^X6>lO=iC{=XrCs^Cq*;&d=(xDP`?5 zJ${Hi$j{M4Sy}A^V(*{R8XlCD)jl9rw$AFAOqC5gNgpsP46{0KI&6AY%rxEK)T{HR z!=`6&Ow&Q@j(Emxm>)<^qHNlWd6Vj$ADQ#KIoo-Y*~@dDH)lI<68qYf*YdpinwdAH zgN!?`y&8H(?1E>^#-1@7dq(VnXT&aeM(oxz@vRv*aLmS@Ic(^e!-k#_yWknKv1iQ2 zo)H^+rpH{D&;Doj?0-nv^siiRGW&GSXIG_c*khN?o?Vr)VdY%XsW*G}H03j9%QJ+p zQa)q$eRIk?D4RCSUKU#%%1F!-k$QyZ_}hZ=$U2 z#k|Svr7tIUP*xW6CbQ*P)&28#F|RNy&j8kW6J@Pe5|_{Fyou)qR~F;o)tmC!=E!>H zvB@($!>ZPc^D}0PXZMP44U6jlIrr<&cVf>RHuQ|y*fX@bZ$q5Vn2kMi*w8a(_rJXV zWt{JztbL~EXVl*PFQ;dhqpYl+pAmbHJck_h_Rk~N^A}>L%%ZII!ZU8K&+75+)SG`V z<=OVR>^f!+n|~+Z**EWL+5nE(vgW4yPEK9#Ky2(8*NZ%cKI44G?1E=FPwev9k6!(e zUI(CT_D$wZZF9$-|Ni;!qYWqQM_F*pmUT7$v!l8(e(j0Z^m81PwY~UU zoa_C;l^^JJ0Lq4yc@uMT@7esH=l={JP&O<)BX<9<_y1bmk+NZrJ@)wKv0j^^Y*=_k z_1=>|V>RC^BlG4ctDX(ktDX@npY&;aQ8w*GJ{x4!GlyO4XDCu@^BIcfvq4rp8)e}b zu^)f&K~_B* zW#JjIzxe7eY8y~CV*$sAJ$mKn74<>Nh6P8gY|%LuWy9W-b40A|x^`AhJIZ(MmfuG= zzXKkj`3=W0u?y=I23b9h2U$Iii4B~@aXiTCaqO_}a}aSH53=dJQ}})?E_?N+a|g=? z&mzTf%x(CsNk2cHq-@6cvd7NKWC$emJegM_F0*EMzwwtDX@nnc#xO$v&nkqu=i%qq^xZ~K6BX6Glva5bJ)-`J?^{wfIO!COZm)UL(d#G^vq$m zo^3u~`waWV?E3TRzB0Q9Ja+TbIu_IBrz?wm=CJp!?p0RGh852oHuTJ4L(d#G^i1ar2p1lmDN5V z_RO4El$F)^#LCuL+aSB&u#?+fVVKo+SuYvY;IXZKFov&neo zupgT8ygAu>0DMXUxW)5xd|S zu?wCNyY)Dy5joW~~5 zRKQv&~Q2e8%kNms37N+3cHK2RQ7dl+QL&Hmu|`hy7T}XB#OS z7S{oK-{$O8?}NvlIc(^e!-k$QJN?@{Z%SF)i+PjT&HtNxKv`LM#_Z}ayCY>~;Tf|M zO+7=|u;R`ri*fMSzT(U&*T|AX5M7Bc(xMXn)c#4fW|oX%wa>%95(b!T4(0X z*fWO>J#*O5GiJrJf2;Gnl(o}~_9ecQLu46Smv;KV;@r>IWd*-mAXAT>ChIVxG=DmM?ug;q& zoBqXh0I~A5XeStBlns0AvD2SVf3EIG*|3KmdnVu0T^+BEE32MS8!FrWKBRg!$f{?= z2KSZW*&wT)IqdqI+7HK@Z#MgeoU_2L8&=1c*!4G4y(nwFS|_ox)w>5R^Cq`pzBFG# zdr>y^;yQrpee+{)>UWl*Y*<_epzhAIV2ukrBX;_a(|^=Hld`Gz*k$utDy(N}Sa?SD zp2?qQt-9auR?h}m^=yz;&xn;zRlLvC;MpLno;mFL+uCQ>Hs7xOp!sZ&RnJCQxWMdR zOn;$mkg~QxIcAsF!*uQh-;D>);AO|oFU>Ehzfv}BxaP6b_a|N7hq7Ve8P$9K=6PMm zgtB4b8L?;LbytI|dN#a@7_rlf(~Ih) zl+Cz-W7b~}Bj+V}4odG?`kpE|-;wXDYU-8ac$7u|dTe>-Ccb3`X#xM>I38uuzr(Eb z?=UOwu*YMvZqHBS<|@VtsaR`aC8y5A3s^S(h=^W-RtJW1@)BS-rCkSLq6K%OKP-+7E< z2xY@w_SpU3+Sj#7C>s`a!k^Baqnk%M520*WaKr}ZM(~W;Z%p6Nye?%^FFYewR)0LK z`9aFc>Up2ThU-8=)>#KaY;X>a1V6~CXAT>#0~uu1vr!hF5xf7Pef^vPW$oW|ekgqB zLvXyoGpaXuu8+EF>;1~juc&7zn>J{jmVN5lQ+f`LvSHzw{%z->;JOf=5&Pr!|M>mz z3}vlXJ#*OUp~OxPRaWyEvFrCIb|YnFHJ=eXJ(O6K4GYf(S@q0e&uDw4_NHFFzHr#H znLXRE>KUY2kno$GzNsaHL7*v(#Q!)C8(!=BrQ zz3Hs>nUoC+z{!d1Org0f-Z8M7C!s%Nv54GYhReg5*Fs%I!0Ry<2NV$3sUW6vBm z^vq#H&zOZ@=wJ4XS@;E(J!5vtEXtB z#%%0anqS5|V>b58VMEUxcI(-J$!E+SEL&^DUHu=n9_pT~COIhp1Jz8dC&m1=NjM>;TIS^%@J=% z95(cf+1N8;7d&G&_Keurvvf_==CeP|`3z;#zj7VG?A4slP&TYw2RLl@?5dOvE9a69 zn?1XFX!9Af#k2Xa%O$f{Z}BWxZ`2)ck`XmWp={bKeamg|S#TbkJPXzvnKmTPRb58VMEWDjXj$%*AIHeZ0woChMqASd&X?+8ME*UPO@jr z`tHE9QC5$4>fbqEU$AFhy=lD>d&aD6N!JYI8MCox4jX#L?1E=FPwYJV+Rd-&bpXod zxWN50VvnvJ>2(0ghCTM!=|4>WLC>qDY*?8$x!$wi*!u=pl$F)%XlldR{5b>4$|9d} zy=OAJ>e$I;r_7?P^{Qvo2A@^W9CrP6?T2q{zFzCq+~BZ3&g_pHR>zmvAAdcuC~Lji z2gJ%&y$(Rxu(*FlZ18y@?w=9+mCIkz>j0EZy)tj=XAPZa!E0fzyxyqu;pp;_dWN!T13ZJ59lQVieO*I@vSF`z?1}urv5B%_;ThF?^qnJp zMi|P5g=fT`iJvDn$f{?9ta?Ula16n-K~_C;*zkE`gRJJWQ5K#N8+={}$A}G%H*m}@ zuQ%#E+q}Mc9qyoPe31Utbv6Sm`qyL2_W`e)dNE&&vgqGoR{D3CmHr)OrEi(N{rX$l zXSZMfNwaTQ`=IM=4$sPTTb^&U`cKn;(sKeSoBoyKnA!D5H~KvwC>vIeV`l&I(d&<* zUX%?h$1$_`K2)&sjlT_x`C^pCaXiZ6IA&HNYa38D?S(s7Z`Ac!z)Jt>`jU>7EqdN} zrh8tSe&!FpV>jPUYgt#<*3DX0{oIz=AAj?WZ=%oMl(K0r@+7eb=jL-@QC3#xV~0)O zMKYhG?=2w~-&cZqHyx{alGugsEg57rPde-wZG*Jrfo9)uKfz(IX104atQ^P8&JQFO zWvy4w&8Xh97k*05`%pG4@+7hH1R%ZtJ6$|u?w2_1<(1CI)8%{Yd@RRj?+%`Ih_P@y zBUbFw>x)&lW?DUCR@U#MUil3L>lw3$-aRq(j9A&4uHUAqxlf?;F|o4MVbwEYB`fFa z!nR($z8GZHGlvbI2jZ~#ca{6!xq@fRhQB}Wu<~pgjKy@}jP;D`jXh&F_6+A}U5;At zjM>;TV$1o1;~BHXGb!uwrk)X7)`3iibHl1<#4fA@A$Ah|bS$K-ZBWk!S@q0epU(Bt zIuM7Q^KsGLYlCOZ=Fd$h`rOoEW6!wW*fVBh&oFO|dd6(*8ME8pxuSeV?36!eSg~is zZk{Q>S7$$;ms;$;<$GfIoW5~K&P$k;jGBGuSUE2lWz{ok1I_@GzxMNauilb>S52kF=TZb4T+0Zl15rdvNZ0MQ8hMqZW=oz!}i9{MVS_i^xybgp} z`P4Mk+dGN#UpWu&k4@i6c;>N@XC51Q=CGk>4jX#ru%TxT8+xYm%b;ft8+zujp=S;o zdd6(*8MCox%*LKMtegAbna4(+d2HmF!-k$YZ0MQ8hMqZW=$V{+m}9e^pUD%#^>k!= z?#t}fGy2|NX1AWTzkjTA1+&$&!`cQteu$MCaz1O%<+KloEuYV$to3Ri5Gz~fG{1H1 zB>ly#bP=;UZ#r!8%w2EP9rIGHcipn*wqfg8H^*LZ*{x^YvnnsT?AEjPxvY9mj`wZr z*%^DiiGJ($ZNW2UW6zk4J!3ZZjMxRwh+XiE*sW*cTjL}+W@FDBHuTJ4L(iCvJ!3ZZ zjM>;TW<$@?x$0Tzr|td8d|w0K>Cp7AT*EqS_6)!8-mr2V;;`8>d{))4axUqx*|Yw+ z9mr?Q7SH-?2IMnli)X=lqyBiCQ;w3F+T167%k_dmKI>U<9-BN1)*IP2Xg-sA&2<3R zD@NwrXY-lEX3yle)y#bjhs~aCK4SBk!)DJmPuP5>p9}Z<7JBBep=S;odgid9XUxW) zF&lfvtnZE-kZJu+-)Es`UcHfL9-HzRd&X?+nZt&jIc(^e!-k%vYvi-ieRs}h4jX#r zu%TxT8+yiU>>0DMXUxW)jk0>Y<6O!(nXY3wpLzAB^+xO&v$7?~XAT>B=CGk>4jX%h z^TfU%!hDwQ#dJ=_o^idgXT)C3o}sLBtX>BYJ0GSw3uR?xWYT(=Zr`5Hc?V@>^}L?z z&FtK>lFzswz+m3&S@q1RH+kl)YjfDLuFcMy+=gj;&0yzEht2Dac;0l_*fVOcd^?VQ z?!@z^t}p4vqFe{?`I*DUp5fZ1uQ&FL+3@+3+=glUjOW%#^^EGp`5t`e&->IfVkJ*1 zi?VSNo(;0O$zVYyn zA4VJAc=*kS8y1ccyZ(q6ChVH71DKU9UOtn#Mc2-Bd1rHDa|89FY}z3GJIbPeJ@$64 zciq&B<9L)s{|>Wq95Z|U#$Re1P&WG}{mbm;yKDVkPm~QSmRw?Luqcc)A>@}CYw$}AVvL41+Z)EB{{!3lIvy!r@SB_(+4TtN*N?BPP z$IQwzR+XJP7RNEO^4wo#&q!J8#c|B+lv$Jw3wOBBrrZW88&>)kYeq~zg^ohQ=+F|p0 zqsd)wWX3I@_xbCM44cpU{PjjXTh99&&u}dF$9$fT{q;tMU0iQu*u#9EOUgQK>KU~` zJiAA8)M59XEOKmOolRe_c&4m)c2BKWJtI~;OZE0FJY#mstdzB0^~_$>~{Kl&Zf{R(JHgkJ%}+QdU+ybJ(k?-pN~UWZDour@?9O-kk22xa*Bf zy|HK9-Z-Bz8+(THf-XlbbA~-{y^*Om_Ke#bd&X?&nVwS) zdgid9XAT>B=CJu*1$)M9ybgrfcpV6{v1bk&dgif_XCCX`)7^vT|D>F!%v!ra!jc^@6`&K^BLRndG z%*vL0en#s+s9rg1%kySiug;qeTRijD8=3iSJ8#nG3|#NlGy0r?*{x^x^LeKqww~F~ z=N)$Inf-iTI%wQ8W@FEojXh&F_KesC&xl>{jM&Dr)=A;G&lWu6dbjJr$uoy7`HVbc zHuj9!*fVBh&zKE8!!g$%LnWW_=UEP$J@eNanR>Hl{(2+BX3zT1osiGC4aKwmTn;&% z+2WbM-pI6JPB}_yGM;h0VDx@p$Aa_Nl+XC{d5=w=N&V(JfLS4f&*vRBd&Zw=}PB#%$~vv$1E)#-5F`INm)r-2>r#=CSGi zFXuC6WlNCH95(dKVMEUxHumfS9h>pz^UTJcF&leE?3_KjDrG%i*Xsac$B>a!zR!C^+tVr=lq$3)NkfZZiBQe@{HOb@4kR} zp65-c-qqJ9gFz<4C_n!e!%ygp}l;5=CHA6RIk5=NIfGK-*c;dCS~>05?l|4h*jGNq3#=4chy|Q-b5bmI?ta|3L>chdatq;{x&zOM-5h1lq^xbwd^X6cXAYY^JEH4Nhs~ZHk!Qpn2!lS8RY$Fpl5=?9-pK3P z-k{$*V0QhH-}!--|yP{M$E1rPyM@k+}=0B+L_gSR`e|E z?d7hdeh(h6Q*hX8Z|3zdZ<^=tIPCFBelE(1Sr6l|hd=x|IJuIt_5+S%W@Vj%vU0>X zERJJlWu1buvQD94F<&q%cO_H3JqvfZ&!)^uS=)=`MWevtlk`XRGZ&r1I~?3CLeWvy59B(-6h zekQe7%F5!J(5*M0%iU*=V~5?lKe1BQdT}1-u-p4`^xPS4Z$9ty*Bcpk@_g*CH|p7P z-p9u=)~)ocY*~1|kzr%cxZc<^Vi!K2Cw3KoK2L1?d6v@;;pbT%dr$U^KA-0{Ozyol znJ=7r<#Tx)^AmqQ&-KQhF&lfvZ0y;wb!WjdW@FEYU0!cwoQyrAdKWw+cEK}Z7d&G& z_RL|+=UL>L!@Ad|@Qm4V|Cc>uHuj9!*fVBh&*c2RAL9kjn2kMSHeX-(>y7$0$i241 zbY9Y)d+NMN^)7fu?1E>+E_lXl?3u%co;hsj8MCox%*LKE8+*oV=o!YYALH0FhYdY* z*w8bF4LxHvUI)T#ybgrf*fWO>J@eSeGmnitbJ)-`hYdY**w8bF4L!s8@~CGH8+zuj zp=S;odd6(*8MCox%*LKMZ0MQCMxJ?Wq%Ne7L4#%$~v zv$1E)#-0(o;2E(Co)Ig(SUhW;6ps5$wnUzBy^HIO$lrWlgFNGUW6zk4J!3ZZjM>mL z9CQ7?mGd)R2jZ~VGyXiwVY6rcdLz?@?3usbsAr33{(7UHEuQ)7je1rxqPl~!$$jWA z?lYHF&SBHM$)C@=^{QvmhW4J=p4SGMVY8DqpK-l%7d-gf)M2w{{(7Un&*I;o$Nj;c zjXiVN&@+b(J#*O5GiGDYn2kMSHuh|k#h7_)>>XAT>B=CGk>4jX#LZ0s4cv1iQ2o{h5b%wyB%dYsQZc4@s)KW_5wAfIu)aXxd{ z&@+dPJ-e`jXUxW)F&lfvZ0s4a3!V|X;2E(Co(;0>1Y^dvb4TSe%#PJ}sZ0VNFio4>&L5d%9wYt_$i}oR@*+^E0Pj_nb>c z)2Y{YQa$7L&Y@=x8+u0Uf@j1ouQ%%ZYIYi4x2oa z`ptC!w_%F&8P&Vs8MAr45nl&5ZCG4y)c5b^xpd5_kmz%kFP979?!%381dFwAP5(#NA?fi*5Y8;^yBV{^kC4KkLA?rdMyu57L6>IXSpqaM*I)B4yKFIp=fOd_IYF>98UtpL@bdkByx4*vLtT4V`q@&`F04 zopjjHNxhFZcn^fx*hz;CopjjHNrw%cWHxq^S?R^VNoHls%$|vSa=hDPUbY5KdTivR z$3{*%Z0MxJhE6(c=%mB?PRe~uW;dVPd=CAKvgQZ9M%O+*D}7piXK>+qh}Z>xnT`Er zHujg<*k587{3Uk5Ut*=llfN|2Cx_eqUGSIdjqe*dZ0IkuvA@j5{xTc;%WUi~vA(}z zpRSMUubpBi_58le)wrLmc}L26TW@9Irjh$pRcG6+Poa(Vr zPW9NxNrw%cblA{IhYg){*w9I4V<+_9C=b9veC7v5}Jw8#?K*p_2|9I_a>XlgutSd0_`9nT?%fHg=NP*hyj+oFsO^Nn#hA zWHxrvVM8Y!HguBN*hyw%Cz*|%WHxq^*aasq?%*V|v6IZkPBI%iN$i4?#4b2V?1Gcb z#!fnH=%mAjPBI%i$!zQ-v$2!R#!eEu;N;~UoMbk3lG)fvW@9IbU2u}v1t*DJaFW^B zNrw%cblA{IW@9Irjh$pRc9PlHNn!&hXZcJ*?=zj1J}vi+;<0epa4bAF8Viq&#=>F4 zv2fUMEF3l*3x^HIf?0noa1Srt$7{zTzK6$be80qD!(8I9VJ>mlFqbeJ=MrY)T*B;v zzgXuuwf!slI`^Qp&YPBv#{&1SOug|n8MEP7IQ52O;jrOYFdL5rv+-Ck8;^y75amlFqb%Nm`fbi&n0m8n)PhKNn$0^(mK5UxQLzPdSfSDV<)jbs>^2!d6L)#Cz*|% zWHxq^+1N>97n~$^!AW8loMbk3(qTg<9X525+1N>DV<(x7on$t2QbuXmNoHdw9X52* zVM8Y!Hgu9%*`nvwDC_63VqaPV*BzU&lU%Pjna9C=b4jVe@u%VL}kI_8IZ0w}NhE6(c=%mAjPBJS!6FAANY*7|vCIs$nT?%v*w9Ib4V`q@&`D-vCz+LA44hXlMd@UsrN_izQysi`s=Wvzs$z|G8_BL zZ0s+yvA@Ln{)&BR9bR{S7CV{x_^b@T_OpY~Nrw%cblA{IW@9Irjh$rH_Y6*svfw;6 za?)cXCml9)(qTg<9X52*VM8aGjh)o_Wzb274V`q@&`F04on$t4lG)fvW@9HuS&W0n zMoxNca+MWA7*1GnT?%fHg=NO1t*DJaFW;s zCkI(|(qTg<9X525+1N>DV<(x7on$t4lGp_&FYe$Zv$2!R#!fODJ4x(8s>?E_Xlg!3WG8;Qd?1Gb*cW{!~*hyw%Cz*|%BzD0`Vi%kwcEQO( zR-JU%&`F04on$t4lG)fvW@9Irjh!SmaB`M&aNK9=&nIOt{NJS=Wib{W8;ym>Mq}Zy z;aE6qI2H~Yj)lX9W5H}N7B{8OWUbAr8;kPX@s)fJXT9%tgPOD<~C&3d2Z++tNEAM`{#7b-zQ~lgI@1CY&z!elkZ=z ztX_u@D?_NywKUHd#rYwz<+-72dA?;+FXnA#x8GAdU2NFPE}Nfgxt6kFrA{25{TP?; z(RDmyHXp~1XT+{z&zQ}g_1`_Ao)KG~w~eyyn|elUdEPe4%Bp9?N)38!qHI_>j=9f# zRz0J7%XduSyYp(j>Y2kP&*b}mt!Km*&!jE(`G~|Wc*bn(8MCox$2)k&Z2Wz~%*LJ( zD}HG{b37wb4T+4%c}nT{Y>-vY95(dKVMEV|UGR+91<#m`J!3ZX z40F+_XAT>B=CGk>4lB;!+>`T}$L4Ds@{HLsXYstrZ0y-63(q_@^2}o+&zOxpV>b58 zVMEUxHuOw-bJ#P74Lx(%&@+b(J@eSeGiGDYn3XNT`PnE7&pbBr%wr?Zn2kMSHulV6 zL(d%6^$gdg6M43IYn`8Ozc$aeXSQ53pseS#`a2y|uRML|+j=c6Wy8uG@6?-}l&9O9 zYk!A5Og{A20XWu}E#Gl1uQuo4=r3l=cU;S>4GWH08RIl}&-U7XftB~ve$Y9V`mD4; zYHwJ*W^mZ#q||D!8Hkn8dTolbwn3hn?(AD}5@o|)blL3WM#_f8wJEise&<4aZL0U8 zh+XGryP>T0s=t%XlMDV5yWlUgvA@j5{xW+Q`b+GBzr+@I9Dj)w50bx9*8Y_rMyaS4UWGK8~RJEG$Hbr*ad%?js0ad=TvxH`z+l{wSDIMo9^vcwmP{sIaTMa z?z*t%)V0Z}4!d=7ZE~u^Zk_D%j-LD4_EslbHqAknEk2;EeU@^AW#Np@7hUd4K8~?z zzbuRI)l2o-@3G;2kiGCc+e4kU-s+_N9vfz>llJ?M9d_%a{r+Qz-8#8yoP=kXGyLn8 z>8AC}VYj)@dgid9XAT>B#%$~vv$1E)#-5F`7zbu!&pbBrjM>;TW@FDBHuTJ4L(gz8 zeAF|C4Lx(%&@+b(J!3ZZjM>;TW@FDrS$O8LQ9kq7$TNp6pIJ^epD`PI=CGk>4jX$W z=c>b=F&lfvZ0s4cv1i0Cct-4kXT&aeHpr@H4jX#ru%TznhTpS|>k%`?`Lpp2eg7M? zxCX&I?|i==)myJc?7XSpli8nh$+fPYKhV7Cu(4-y{bcqn_KexsGh#Q-q;Z39^_&am zXWZU0XYu(NvkRV48+=whbJ)-`hYdYrHuj9!@O!qMe#mPu9M7oU1<&Lf+4vB9#%$~v zv$1E)ZaurNaYyg15W9Kiem$?=Jkzr38L_K5v8%adCpby$G~Jia*E<$-;UKG?Ic#df zG~M6so17X76iR$vF-id&cdJzyFxoyw+#)M3>K`e{p?k zJexK@m#&94KUebuuCqp2^smQGKcDKIe!kX=b4iaqm)Ua-i}L}8-E&##Ux&SL{({Z{ z51%*pt{nE_UY;-Z%)Kjz-G1+H*S|NV4RTL)bI)1nzU}&*zsk=R`YU^nl-bP-=~?ZY z7wkP!W*>ZEI>x>|_=3Gh%IxMw`n+4p)^)j_ciD6tcPx(MQ5MHBv+EmaeH6;-gL+1N zCXBWLWy4DUrfb=*e;3zB^<%NTKB{NW=Jf<;C0{meIP}_Z@NDW|DVz3co`e&f4`48E zJ*#<=*eSCpn>I-QazAX2^7=C=8&-}@mrY}Q)Yhwc(rH7w53@OH&mV9cbG_5E=^ozZ zi0(mCz4K9;yQSSWPZIlg`Fnp+Hv1;?E4N{t&--pm*|3*Aw#>)=`lx=~%6&P1eUxDr z*GKj2^7^Qr-F!YD$DePOe{V-(VQw}try3!uKDa- z_gVFf>Xkjq^^#`}n>~AmJYzQBE0(rc&xpnPJMA;}jM#F00pFT_fM?9+>sZILV>@mO zo-v!x`OGtDx)mv#F;>s0-UDGYpLMKyM(ou&u_&89Lp~#R&MeA?g=d4T zdgidnv$?wmt@+GhlV>xp!y|Ueo=JPHXT+BKCC++JW^+DsJYzQYOy;eAj2Ap(Huj9! ze0|}pD`s|aeUxdh_yy1U&w14|s&{#PR9~;up!K3Oo>9F%tDZS*@~pp>R?i$ZdFHJ5 zB(``aZLyvayWknKv1iPNo*_r{{TqAcu%TxT8+zuj*&TmJ#*O5Glva5^Vl?Q>>0DM zXUxi$AfJu0@XTW)&pbBrjM>;TW@FDBHuTJ4UC(e0JCSD#>r03&xesMCx5)V+*IPf! zx7Yp-o1OI6NAYg6vC!b(~DOy^i) zOB-E={sK1lVlMDV5yWlUgIj6$o+FqQiOE2179sA4dVdyWh3;q&Y+!4DQchI*^du5Xz zLsB;TCUuUo>TlQv$6tpH{Uugf<*i$};I((bU#fS(UuJVob^ImP_ZRne^qi-=r%;`= z>sB0g>!e+`;;>sMz4cN3u~~C!mvDy5j9JA#! zK-|Hut|O;c^rw>8+14?AA%TZ!i1Tv$1FB3&Vzb3|luhGn+Z%hv^~%xWb4T+1N8?W6wrec;>O;dII(5tO&FHtj?b|g>&j%Tp!iv zhuAZ&H_m4c8+#^mecy&SpJDBcVPnsjjXh&_>)G7SEi!L%8#d3(I=`W;^AP4uW><4! zQC4n>ub%He-A!{lM&@WD~tt++OSHH7~KURr`1I zOv|cg#Flx;+^2)8d*n7y{nzk7DuUYjy|{CC;2zq6h(dpMuVo}H`xtDX@n zTOR-`o;9p`MyzaARy=E1&1b}lXQ>TR);6eTgRFYyu&E7F(*w0$^~_-pw7t`G(6E@V zu;$5(+n&q9GiEQG)z4!$51+kI+W;ROc5!`_X~W|BD8o+cNAofCXwwEcj&Uz$ghl^) z>?YT{Y3kK;NvB?q)$;*n_goe^o!JWyKBi7S{NQ8FzTp^V_Tnb7AKA1l#*Ep^(?8aF zpP2q}Q}0b--;%N0JKLUf{nh6C+P{Cb{(i$=bJ_oI^MbNcHtey-o`2y%Wl=V)%ok1@ zURdAIdSBSws4R}-Q5MJXD2wBmS&6J|Kv~;><9L{r{>42L)4z-Bqk6WkkCMB1nnLs+ z>0hq*?D5_)`V3{mVm_ue%+DS?3wC~1RtRnD)ja92veJlH&6C8go=xnkt5@?Rv9g9r z+kmpRK^rs3YMvyvv_Wb;s`YA~bl6$~?`Pg3{W!S~_Q9WDNN6DuhTX*CRoUXI!+35>u zeH6;ds%O+*Sxc3!FJw(sWz{oc@wqYjOv;8;&xn(z!2vg#SJr46|ESnE~K z23hrt*}0r6xAo%MLVu6H%hl_LzsAp7fxxR4LtuULfV;#?sd%89(c*bnL zzVO#anR*x3NA>KS$5_gCEN~r5ZCG9()z^D9j|Ix6e`UVldgsidY*?8uMp^ZY+Iv;j zMPZEn^-;FH=^DphAJwx{zPBRn-D}!=!E0~1U*fNi>g!$bjP`9IpCO-&dd6(*8MFC* ziN8L|v>|(jW54#9<}>0DMXAT>B=CI+siSg)<<9Ob5*w8bF4Lx(%&@+#X zJYzQYj9J+dzQ7cl4lF+ONcE_qO9{nBZ-Ltno%Jf5FrL29X zb1cNR-)H{%67_eod2+#DVi){nHujg<*k5L2e~Df2m)PQt*xk6J<4dggko=Xh8DnsR ztoloAX@ldh!-oD6E3JzBC3eAIW@CSujr}Fo_ZRnpwBOwGNq(-6!)~4Q)<^Zn5Z0RN zF;AbrIrVOx?DCFWA2VB>Y+2+~W{VFf8_!%8&ZHdGvC_9(ug`*GHeR>lv94!w-NI~j z(pw+Zk41ITTOVcEt&`sRD8p`@w4d|poH6K`!-k$YZ0MQ8hMqASd&X?+8MD4S$a|wK zTwpf#%wr?Zn2kMSHulV6L(d#G^i0n;20e4w&@+b(J#*O5GiGDYn2kMSHuh|kO*zM& z?_l*)%9D1zr&n*}nZquwk1}~D|K6?hTp!7mh7CRAHkA7?<~bPnOa$kuqnuXzVq^^Dn)AEa#B3(p2w^^940UY+_Y&wHx%s%H+H*F4GE zr^;#`VRmo2H`P1c+putq*}OhVo+e1MZhoz4N)N=g?>Kxo!;+J|}b7m98P`S@n!qS@ERormI&yBX)WquVa$3 zX)in*WYsfbOBKU;I!l-9G3(tt%%j=_1Hv0z0h?S?|>GO?H zHY_-17uQGiKFI1NUB`s7saN_J>w-pD^e?mPN2kZo4;v|Kz3AUj7X3TSO8+wZ;A7{t z4Jd0HaJ)0Sd2IR(ZLgFKD}C#*zm?WUt)*<(o5Es!)P=Khl3v!NuWn7ZP%p}cz2>pg zt@Z2b&aKVs4ST!;E5|Xn!LJwd#VCv8c$CF)%&hE@?iIKJa{GHLn?w{N{XjHY{=~)w}x6=9;$mJ5$5z+&#!@ zP90=5rxH6!Y_tJo(_R@1Zm-X3PNjOwzDcdk`ZLX`gRJJ%Q5HFs*rRJl+P^59eM3$q zcKY+_&$S<aFW>h z&*neV_Db2XaFSSmjg~s;u<1S`-c##UCkI(|l2}>wa;#&~)rXr-_77hC19cK*tykj{d;Z(!b!|S%h6P8gKW=)BL+su+?$JKm>-tQcblA<;(GNYV zP7=HNMq*c8z3L>f!MMT6K~|k4wzNTP_+HpbrNM|;iQh;pp(qTPBI%i>9C=b%*x)T`+ZV2`-XFST&H*Yc5s;Q z4R$P?WVZOgPBQCzHi?s?ES&V%^cf(pWo0&Y(qTgXlMgdF$@P}sUGG`#FRHhG2H1H9j#wGvl&fcVoml7ZmX-h1e$cs_ z>Md=M+8b8SCy6aiPLp-gZLd0MSj^p2@APn*yHVEm>iHzIA4zlfBxS>5?k4urdG1D8 zS-mGm?B)-r&*}MtlnsmfOOyQV`!`{L)n8&u8ytU$UGSG!X<6hiv$4O-#{Lq!;4iVhzsRZDZ=JuNe)0G8dI)88 z9oIw5N+$ga92Y1XR&uJteslBhm6ft#<(%4Kw@!9>N6tH$txmQqaw@aM2b4`4To%q~ zd%N5RC%Imq1;=c>euvq4E}mVr^Ssn;^3K-Dj>SCB?87U)9+J#za;n3AWTn?bl37ho zW%kog{Jvffp{)IjoXTu`jxUBR81o>9Xr z)?R=`S^I37y?SN7%uaT!j4#*gvls_v%Q}#W)?hF@&t(lp_xb#uS8vUe9VL;F zH*(TpLnoPyon$t4a+3Y)kGD8aG8;STu%VLCr4S$ z4b)z^s6LRBUcHf%4qMijNWN^2H=KKN8$u@?HguBN*hyv=oJ5Lk_s=KEI=XwrHoDQg?_e3IG#Mm_7;G+#w+kasloraZ#zUaohqVbl0p_MV4a zR@-V>+1m@+UMZV>!@W$}xAPx4uX8ubhQ;*|v48NyAL!hTva)(TMC^i-+K#i*)n%Q+ z$6x%oI*GE@tM}K5o&I7<=aW)4?6I_$S$Ev@9xbt0KZ-uf!O(%=U)bkvKcpU#LAYu-iUsei`b{0 zcuJi_S?g6NiCu6~eQ%wdzc+tR+bd5)m>fU>qh^W-3_P7+)8O=@rIRVN2ob#j!2lf*vt z$Wyv+D4TtQH^lDCAB+Xch6P8gY`LsHNLg8RlGwmWnX^(}ZJpeFX7d^KLCRV$#$uGk zSTMW(%=A>McY3PUi?JAGF&4wDjKwf3V=>H1-!dzEru&An**ARthI?}tyZ(J^^Op95 zl$FJCG0dWW2kTYtrftLYaynm^tK6GS8^AHUyr!(%H`J$2_Vpr1jn<1CMJ%4##Pw>9 z8e}y`4YHb}hz<5l#)8}Hvznu*-eBM4xZrwyR&&%~y?VYytlwUpGe_CWUVHs|)yZqZ z_wE!Y`?X()&#b>r4BRLSCr4R0Ni3e(q)vA2RVN2ob#jnZCyA9-dF$oi$w5|~B-U@Qp34og>f|VUVZ6PXC#l|`AK>I5t4?B^eJA_p_rXbK zpU?Ar&%#M&<-2xu+|7`1mG-j(anfOP zy@nMh9X2~@SaH%}vk!)q{TgM#F}wbJTI15!3n!TsbMzSMS>#D(!N4=aN}e2L;Uu$u z8}vF$_OH(+{=UIUt{3fe+Izuc<@u%_D^7B~Q+5*dH@QTdbXeCNIH@_pby8kw>lG&* zHrH!danfP4lZF*19X2~@SaEWcMIU%fBB2w!J+oPA>Fs&x(`7tT;K!>V2!h_Nu>=)ZOP)X{U~H-(L7T z%EI4K7XFU1@OO|^e~I9QYp>J=yT_zaxvo@*&ix@>l`W5r3A%}#c#IO(x@?(Uwg2`8D|JX5~2sjU}I zGAmp2xV0?uB(pMOr}Kxd4ag0nEXILZzYXA+_4f@}1QrNtew|wyb`}Ap6%Jo3d}I-u~G);-tV4n|sgPwJ3UjUyeEBug}8CQTEVd>l&AK&67Gw z_4=$jImoJ$#L6CA(BneNdX1w_4zlVbv3`5i$w5}VAvS0)xKS2Pjz$_L zWZ%DV67A@n^w$s}PmZ$3JFsw)>c#Wl)CXxx^+BB+WYx(*R-GhPTIIAsog8G-Ih5_+ zVBci!9_@#e%f{+W-dHx+H{Gv67ETWKgF4Aa9(>CLFQHuN=RE_M&Xs zi{paW55D@rSHYreSR5C`e)QE}Q+EH=OAV{JdXUxQVvyD2g4q36_j4Qen>J{!9%S{n zAokZ~pU@8={_Cy( zihV=bu&5LM^qxIAJqdP_vSGn7>#yH|XT%22(Sm2h)^%d-_m-$wLPkwOn1NeZlVc{9o8yuVP z3{G^OeeuaJs%I#hdQm5_C%<{3&vrxEu;7T5EywC_zkUav5gR-Y5A*yWtDX(A>KU>A z^ZPWP4YKMPv1k0}7-F6uWYx1#_JUXMiTqJ_q-@3wo>9H$Z=P2tQ8p|*BlcUbd`ssy zlno2d^n9+JH^1`a^Xl1GrEFMuM(n{8^Al(<%7#UJW-rcq&2S)P!-6ALwj8RH-MS#n zXT-{P_)f|`d#|^Ks5^$_dwDavK5E(^=P*ti;_v6BHu&G=tDX^iCVxlpneKakHJ=eX zeK~#S?#Y+B?+D)W+I#Y)lP{?|Qa1Yry~ug$uS^s1B%3(uH+aefi?UX`+8;Tf@C zd*ylc>`$d^Sn*89t{aQkGiGDY95(cf+39dThkbkVnfY98FF0loo=x9tzd1T+SmZNi zr)Td|&o)QzX+D=mK4W%M);vjB+o0#l$g5qS`7Au+dga@twGD8-)(g*=-FzwCi@z@G zAS#P|#_Y+Lij#AD42fsV#-2HB=oz!IXF9)heHMGhZ0woChMqB7Jo}?_)-z_`bC^84 zZ?>K>d;gp~yKlChF?-*fav#cOjK!T%7M?Ntvvcz7A9VG?GiD`=>1RGyd)LJ?W}nXA zH;%GtuXyILVLo%%&@*OZ&-C1+^X&ONZ=!74i+NLy`~End^Sp_&VKHwqn?0L(-egw% zLOz?xGp<+G2q-&|XUwj$XA^nGtYoe<$4c4ko4B*U&h7droi}OU?#rINhdkqY<(u!- zvxB3yUOhjfdgtsJ%BH=TH<`_z%{*^1n?0L(-X!+b4T z*w{1e3**_>^g7`AC;!ysGiK)}p4RJt`H8D0pE>Nsr}a8uzIfGK2RQ7xr*l4gx;f{< z`2e%BHGNOTbhTlT)0th(Kbzh82kp4I>@=l07G-m6O5bw5J`0Z7`{w(#4eycMTIBQ-#b}7d$WB;7_I}D z4Lx(%&@*OZ&vdRI^o-fqGlva5WA@}{lV>RF80+;7=8Uer^1Vav!yGU@(6V}tO6=y` zndI36XWH-c5zn{{3*SFP_4=$H@61l=JCN4hcOdDQIc)k)p?mkb??3{_?D86yzRyC> zxL)KjontAVF}vUy&J(*feCx??>AZ=ujIT(`9xL%)C&!`PPtLMqYEQM_F*h%9aay zZ1!tLaQ}?hlkc7AGha|P9GpzD`Ibvn2o>!x+?Mwj&;6xq1!jO&TRh9yv^(D*K57%`XH;W53=eyvHthf={=1> zR$V7{<$fQax<1IN>!a)iuYWgxyZ&2@1ZFWEKgPH7Iwq72EAjE!mtpgBv~Ks$ z(ZU!LD_hd%n}6K;pkvIeIHT>oG5v9EgO2e6d;3OZb&QGK+}PYm^~(QrX!Ac#dwo{N znCe}XD z4ab;S`Mu^x^_Z7$46XgE9M!wIu~v31Wo0qOT(9)h&!OJ6l$FI8GrPW#+(Fr}lKVzk zj4`ufPP%_4Zq|A+#>~oS-J|XOUdv*PnXNv^-c=`MjG2wcSo^J;TjJx`VZ$+Iwv6#l zy6>7rTbVugCuxi~&)G3%cKVYv#+&Et7&E(hF6Rd+n?93q8)Y%Z4*S(K#+$FU^4&*m{+bFOAKf1j|7T61h- zjJaO$jSI!1>ukV;uXyZ0rNG zu@A&L$T6?;mO19r zGduBI(#9P*cW~H8SC8qOC1qtbuX7uoDf4{$z2L}YT(6ArgQ!=I;sN{oi;aqV&-m#ef@Sm=5IIG zI5_4V_O09bn7`c~^D@S0vuW>VqA_;ZM>o1gR*uYOjjWz$P`z>-D?3f=hSm9sSQ+Cq z2TZLGn)is6`ZC+*2hC-Jto9eNa^9fz_U9Vf2gJ(QD%+oX;yC6$t7F{FLpVR9dN<)1 zJ8U?{+K$2F*kOM&kFk{X7}B{L``6c-eUMqcVKK%|y*WQf&o%i0W6Z47m&QWM+6IjA zD2p*>R%*~3b-SwB?Y(B}5~td23&Tb`lapQq{=53(2sZi8R1ejY*f z%GUH*N1x9mS9877TkF5q`Ay1Z+;Ch7-;XhVH%#ZD{(K#-kFwHMhyBA0eEsk-xtuKcU2H`160bY-OGhV7veN z4*YZL`u4y2pZfDg|Gd6AE8F#csJ^?zfF zwd0h#|8s8ce=hBozR*9se|h^sDf@V@Z@1h1OZ@kRM1ZU388Z2o4`AAfbbJ^pO{_U9;G z&zUU^@sx5T@x8{WHLw%d5Q2j;#f?i_DhU#`Ezv)hAseYolL;`#Y( zJYH((x$XFs{VUt;{^i&2djHm1!Gjd9Y`5`pJMJ>xgV_rkuWt9_*?czIpY^<<_oZ(4 z>*ALQoyl(Pm-5$idUgG8Poco`n-e=?4?LoW}Zg~I78-jRK*>2<6{OOM;k6($G`E5S4+ikqe7wj(gujaE- zQQAMrYqG()|5C8wcxAszUM_yx?S8zPKQlj<2Be?4KhyS_C;NDHyC1LS&)wqHJlV&q z+k<%5%l`PsW3+!YPnvkC*>Ya$$E*2sw|Licy?38KcZ(P2&wTuy*!{EPH5zYQpH}eF z#nPX4yNze-w?C)$MC13;we)(8mw(=FxAC$kTmMJnmG{|rc6$&nW3o0R{ckQCqW$Y% zulr}W+jzPDg571jA8yC5RFvBJ!@6EQzmT@Sw_tY}@4dtMIt8lN)1&>F+qs|Lzl~?N z+x|>^&7Zr)t9h~<4=G;V?#HY7bGLXkPxkTZ_8{K%w4d95=kmYQ-st#y`}s4+8H{&5 zHD`18`E$2;?>$KY-+R*cXWef5GxOX18I4!+Wai~KLd{b-Pdd>b&+Uf%9~&?Cr^V*7 z;ZE^#{{{K;r90-&9A`LQ_GaJqXW4G|FV$c3=V-jNU-iCDiD$R_@oN6uEndx&eZ0Ee zk5}{OZt-fK?Bmt#LA>iZ4i%9vWqT=2ytH}X{L=<3_1Vv-)AsAR-nX4Uw_%s#)jZkn zU)^r|Gu2nGpSOYXf1-HraQ@tejpC*4HBa{YSGU{!%N5Vt0OmhYJo7%AKTCac5YI%Z zKi(nU7A*U>-H`ud;|2M1`?fp9%l-Ox^XG89k|*u{mF;%_QpJ=%?-(!b*E^O!2jkT| zS@tirqi*;2kMieWyqYKbcy)Ua?|KPf{fT@j+e>NUrOgBRbGLZcbG>(;KS$%G{y0bH zpLVy|{!iKuKL1SH zw|RM+KkfD)-Zscx#*=oo{kd&NbUuIA@$&v`^Jm$=vfb`q+D_N++xY4AxIastwEI`K z+jyzsnmobzw}1V;TT8sM-NwuPZT4q8UasHfv+d`QHeL!;^QRx5_piJ!^V@i7d%Qj*yzC4Q%fI>k!FtTMpFdL|JDxm#xj$2}x%>RNTf7Hz{(SJH z@6Wp3_GfBfJ^vhyXY+E2XSdsUHh+%B%N)%QcDs$2UbpKpN5`+;_bB_9`)k{dAYKkz ziqnf{^Jngl68H|s1MZWjKX(7Nc~o9*&(HGyZ|hJ0*?Ipa8!y$v>qBh)_UF_dKK^>{ z+%{g?UjOySujbFbo;&52x1T?Ei&yhx-=B4Ruz%NU58!`wf200P+h0n><|VTpvu^j} z)%92@?r6O0Io^2wOmDFH?DXRK`Rw%K<#C&HnTu18*M}SSW%uzb`KS+gdi$4s>BF7k z{-r=QU#6c=Z~tul_UE+!QT{CLI=NKxOL~9(*FWCt_4H`G)Q-P7C}oLPe%_W+VLKnC z`fYxx@zeWw|H}4K_VMa@qTRp5+x&8R@%;R9dhzne&biFRsmJTXO{W*n&o8GJFZ=SY z?OzIH^ULY&Uy4`qMA^;Jcz=_+XXoFKtM#Xd_2+Ut+s{*b?$(a^?4gsgXQ||${dk3Y zXnQ@@zyF~Vn_trF_WHKeQ(E!Ri5pKIj;Vx{C7+d_OXm!w$2IKv^-`!VU$}V2B z-H&JU^(h&u#>-yco_f3-wiKrq&(GJV7thbvrx!2v zpv~8(9na?L!Fa!$k3T89hD@hSL9V{&w^A^vV3bPo8w~n(cl(TfhA|m>;&!$*|A6DDS^@-H&JI zhr*Y=4&v?qqkSc$?DntO?#Hw9!(hCrjQc}G>CWMpQrap+3jDm z-H&JcZ!q5c{uEEjE?%?Uk7w(*KL`7_eU6fSUP*cXNiZMT`JwQom!o(;x|E0?nd`s0 z-R_@1Kb&4Xe||Ws(sQXi^>}@_tp{cEJ2!s*{BU~v=g$wP7ccdgogYp+o}C{? zxIFzFv{Ci`Q%q;+>@ZEdSd4 z790w|`UJ?#HwB+n8UcfEh< z{lByIrSH!t$(QuHogYT`@5$WGCr!M%-R@s{gPk8n;51gde?|y#REnb}my8YW>e%LME<8#_SJ3l-=->Wa&d43p;m$=`UQ~Buj z__N#X_~m?-+d1yb{b|Q2p51QarMFEx$1Cr%`)9WY@iI2Pf8`B9yu42CQOcjWKg-)Q zH+cMQ-(}~A@&eDdseN`m@_4-Temg&ue)=8SztoaCKjipxX<;g(z&9@WzSQ|)w|I3P=;PJxe!MzA>=dt=2fBF8_8{I#?r_Ny`e!ab zr!pA7cVK?lDcgo*c8xccddvQmipq8yFZW-; zc8>SH{7xIMY`5{UFLxa;z47s_FWZXrKa$U-Z2e5H*ZE=8m-Ifw!5z?{omMDgDK{IFZRGCw>%cjGtJ?RNa^{4g4?%nzj>N<6#W#`Arg=2A~8 zxj)N1P`DD$ZnyC=KbQCUKXW|8nf|P`1@S77{x|m2<6`60&{j+gzQcxAhdm+G(c!*21)bpp>1sh(&)s`JBc@!tOYuv@%35A?p& z?S6mO`C+Gc%{YqkgRPI8=}2>g8K<_8lui1*IT4}&I2W$-EQOMif0qR{22MNoww}#Q0k-WF;j8yV;FDCm;Kvr$p5kX z7t9alZE?IZ57>BRyN#E|x87eef%1=WyfP2icxAhdmnx+B!Gw+Cy<_vkV7zy1ei)2b z=YhUI>vq3CX?_@s*UST5yk>h4@1z9qeGSI%9he_>iZ^{AxAX3=A9joP_UDJuc!}fr z!EU$Xmyh@PuEuXW?@Z==u(U(&D@(=g{erwdJIBlSJDT^Q=4rCqZ9IjV?~fbp&wM{; z&hOvupWPnBD{qtcd4KqLu=SSX&u+KzZ2k7<6g`et<^db8Y`5|3{IF}hG7s2zWxI`+ z+F$2~(Rls)>h(j3lU~2`^}}xQ-v0csTf90Cl>SWnRk!>7S?7nH;x+R?7q8hK#5+mt zDxWji^9%M<`FCJ`u)d~t1o5U1oTS(9ety_3-rJuaM&l*!cjmNz_Wsh7+wFGza{c-B z@$u{9)%n40xAC%%JI71=_1N}(ou56SLT7zpCw+|ZuigDZ-2hi{w4l5X#dJ~8!y#Y=ZDdF z{rl?tkk@JC{<`!0uv@&hKR@giug(Ky{L+rq?S6mO`C+Gc%{YqkgRPI8CmqK;?U zz{i7be+TA=RR3VScVK?lE#BLoA9jmZ=7A@-`7FJ^Znxu?{g@M1{=IX5ruY3$e&1t3 zyvOMNi=7`*#5>1J?|Y2m+3j}!QvG#)7>$>>$L3OY$HR6$;{8j!{rArMSK^d%G+ypc z6L36UdB2U9#`jSgKR=(0$1Cr*@$$N8n*Y*{+4}9zL4KJEXP*yNxBI@>&mRh3x;cvX z_U8wGf1`MH9_ahCZuj@E&JR1qYvzG2Ub8)jcT##Tm9~F_{d+n8{)3cVyk@%}udZ+1 zDc<}Gshv`G@tW;^Jp20(gZnp~P4T4c;x*g-cy>MVXuKa?PyO*D^ZOQcyN#ER*Ezkf z{Cj%waz1+3;^jShx8s$L%;l-~=eriKFr;NWApQA$Fud@pM!k1eeRrn-dcJ8 z$sO0Xru{8^>E$5a{Qi9=xBoBG`=spqvu+Ri^LnW{m3DuFcqjRKManK-v)zwp=ZC>~zx&Cwe^Pewn(cl( zJ3kD@Yo1%x#cQ_Pc>erwdhz`E;q>BVPv%_a;?(2y;YN>#W}HUH&z~PoZ~y%H;q>CA zj?@qirKfFuvPRj9+N_#!Q^Fz;#-w#RetMfx&Px=YZBee5Tdgc6nDa(9R zelDdy|JC^+afAEU+z0I9HQW7ob$-|>UNet(@tW;6Uh<>P52qc^&JU*@FV$~9pB@~) zrr$>UGsiQ<>BY12!)f52w9=bX#c~{ELmu9;?{!;yQe%LAA z^b7lmH_zv5w)^qw{IFZRU(4}+t>3??ZV%#}q&VeYo4=!c{mc1%zuaFRO?A5;kLxdy zQyIl8?|Y}8?;XYaUzbvQ{+D@PSKaRKpPe5{yUSii@rq~T_apuJ;q>D9^TX-I%RM%i zo=fGa$Lqt<^S$4>@$=`0)7w9PemK2&sUz+DaN6-erwdhxQCb1rjn>hbz; zTMx?ScW(Ur`Qh~T&z~PoFJ9^~J3pLuymGvh@fwZyU-I$rU(E4WxBK~}oY(CdZ?&J^ zu`=^R-R{S;^TXi&o&QjZCuNtfo9#iolhn@gFQ5PV_j^8+-}j+@ewgZZKc1Z*M&nJT zohDx0?#HwJHyZEd>#0XxHuF*4?#HwB+n=NSQaJnk*1Fxs^XG@cm+|Cy{rl?r^7Q@a z<$l#UTF>s!4|k5&zputCElefH%dgLdGe7hGCBEb(8?SD+{n^JUKizr%?lzu3Ka9sa zqk(z<%67Yd{`@c=FTMZ&n!5ZVzo$^P+jxDy?Ao8dkl*kNCSKj{$FuXp=>ENYDFuAl z%nx?}=WabC?Ikn?M`$4>u+|Kg*qI3BUKX~ogexO9cLtK0o}b$-|_UY!T}cy+rUua4Jl@y_RdxAVjKIpvYN zeZDvMXPO5doOAoO$DiG9_pi_M+uzsD?T*JU<*SL}+3hx7u5nxcZvDyeN_}O&gLq{} zc03-o{ju%OQc)Do&JR28pTxl*J3rv};nQ}zf2AGzvi!4ayyS{q+;KTe0wmB^jTWJe z*pnyCKDY4S-7Cz~BhCS;EW^UhKR0&^|4(G*$*g(d@AE<*=6In4H81>qUg*OdZ>$ei z2lxH_K0*8UgK2$adFX(*FZ-GLm8bpd@o4?f0p+P*dDdUlW0psp^3*@zc{BFe;M<8| zeRBPj`J^Mpp*;N3ZsXYOm`5$t^%*syJg=A1{p5VQp8TZA&+D_f-!xF@!yNA`ALm!X z3%}-P0ih3bymft;s#G__Ig;?2j^}z zf0SS7K%HOs`}u`F%<)18YF_yJywHa^9{TWlzwp{KKjBxN>VrpYM4D~q6CI!(JoPKD zU;oGTf(|H8{mS$98*%;PHa}@6^BKJjc+tQfZM9>_E6teC;_wH`^ZC?fTkRP0eEwwr ze0jmIJkdG^?8~;2zJB^9jNmQe?PxQACkP#ftnZoKCjV-BrkNJ=7nE*1ARE; zsSdzXzw!q9aL7{~fTw=tdB>Xo*0`B8j@de_ygq)^g+VLJaj;L z_?0)%hcpizP#%8eS;vh&Bza$XyJdYy@=nu-B=6;eH(b?+BrkNJUcd17*YE2afPTG> z>T_Km=6In4b$;RR=NI}g#|s^(dExK#LLcUMp#wE9{K`{($nq@iCtIxhYtKAC9De0_ z|J$SS{l6^Fp9k5+8BhJnbIvZ#J(X$evmK}L)IZ>r-n02>zpS77m8bpdu?=LLA3C5s z{K`{(nB}1Z%EPZb8-M6SmRHAxK6u^w`g}EbKC5|t$=hSv`Lr|Z`Y@N@x<1VDLI+qs z%RBu2^$UH_`my-Ye6H)m94~aB&M*A^{6Zh*c%cI|FZ_L8=))ZEKW#SO`utM(mFN9? z9Q%9xee7uc?0Wv+OC0&BUwK}SB`%wv#l^h9Q@`?T{4diyofmlOAMhNTpHJ;K%hT&S zJD>2-0p;P>{Iq{Pw#3`(9UeNMJp9VD{z4zJygDxQ!Ry7>=U5-+ct_=g{{H%fKGf^t%P{9Thg}={>eQ=J44*Vy1J|z6g z^ZM9~!~bzTnrC#qqYv?ZDeEu%%JcnfnrHhJ^AbGuE6+2U=2=|JQ~!YHSj_Q!YQJ^8 z#5k0v`r!QlcH6EWJmUMjyT08U`aRksq`#l!^CMn)rVn29)#`Y^{^*M~V?=s>-G;n#Yx{#74zeh2gUmFvUZR=l0R&-?C^arr;Vd-;u< zMf^t1+xh!E)rTzaAAFquAbCTcSw#N(7_7bOLzc(98uMgMp`ucDk&sS`7>*jJ^jVqtS zjC*uF%&%WxAFj)}dV|(XaP^l-~!#-``)Fe3Crk@}H+; z<5zv4AF>?f=lbv>`fxwC$Upqh&rk0k8vfw(^8WM9`u)$cUx&ZX<2thFm-0Dk9FOwz z?+1F3?+3acTjYPb^?9lf$^15-m%FX>Z|CpxR3DPO)4u=VI$mENuH$({Y;N6L&Z}|h z`s6y2dfBb3)=OU>uFJ2l57+T*B2^!*=BYj;dE5VXdyMyP>+3!Ix_*|Q?$1fy%U8y` z+lsgI_j%gC9*_1<+R5h+miqqsP#>&*e(}-r=Kq%G?aci87r!Py_4o4&eRvyQ=)>Fa zLLaW?S^s<<2Ct`Hw|=S*SLf#yxKW93!~^Gl4|e%{z8TN!<;{2o3VnE+^$UG?8(!$c z+wj=uufN`H{rJ77@Lsp|-OsJLf3SJ@^buR@L->>Wa51mZhl_cQK3vAL`ET^$GTuNR zF5`I-ZWN>CtKUy@c6~y-{(8{+hpY4RdMOEB%`;G=4;R-ZeErV@WZh@KA2#%1ig)|(?;q{&7X9NG`?@gu z_lG?EFQE^1%skoAIKN*R?_2Fus=e4=Q=2KYxAWk=eoi^5I|X`n%iedf)l`*L&!L^`GRueD8y`|K5j+xAXUT zp$~Js-*evY2`~Hu-px4tulx6CKEJWJ58vFX{O-puuRnL&=V||XJm8hj;m^N*`xr-g zUx^*Pe*X}UIN#T!pL@HX%j;F)@8_rbkmXU=dHw6_!*#shunF7h`MZwioVVuH>80ys ze*Jtt-;CGShpX35_2FtB>%g>Td4K=jBL2SChnMj8uXojlEbmv&%l|%T<5PV|@^0UJ zc*NgrwO{Z2{rpNEVBUtb@t|<$oLA$T-!INv zzrH?PmtS8WuH)H6sy$t{>HDrzme-N{CfRaeyR^i-iKcr?{2I8Z0GOuR3DPO zzi@rH+lsgI4|uowf@t@*?*6%bV{vy|@pk?`PxT?md->%j8|N=;ec1W?Je|KR@2{Qr z*TM^bpQrun@o0acUHtu+<@>|U?D6M&)6Ojax4c?c-o3DX=Kt-@BHz7ee!ididHQGE z9JjnWE_mu!p7%J-VAap}?Lr6Osb6`%pKaDJuiwV&<0D=j7yFs| zmFJvkUL6-a^$&R7ET3Nqcsyu$etM|4B|N)+1latwJp7uU_fPoX`ya;oXYtSL!(4vr z`Y^`}9pHMfi3-2Yr=1UdnB#>G)V%Qbd7%$eyqykIyq$l*yHPOp^@?{;FWWa3celbT z{ys1CVT!lYfr_{D_j#cYbG*=jniu{)FZ5xK7dlY$@c(dAp4LZ}XL0DmOZojw{mRq+ z_1G$=tru-ae(G1A^%tMNr0qvMiQC|*f57u*uk-Tw*^1-wpv|v7AM>ex<$3?5*({HE z$&YcrD9`KVX`a_dsTVrJuRJ@?K0iC3#Qjis+&}!V$}Y=JsfJx56v_J}>m)5&sg`za0;FI~}Na zJAa=S`Y^`}9jJNX@AE<*=6LA9==r5%eaP}u2gpzTnqR*jkJnG*;Hh7E{d|sj61Tx~ ze=!4IIWPVA;ix_%EX(u!BhVggwPVa9UU~R6KU-h@{KoWr`u)al%YMy$)^88?Yxen) zRWd)~p4SH_CV8O)^?Zh3=hONReVF5g4%EEx_j#cYQ@ouHRJ@&kz`HqTUqUZW35-f8-9$Wt94KlN*VzVB=Tki&NU zG!CBnmFFE#^CV97f&R7u&%;Ni%}-mBpZb;O`D-&d9`lG-9)9Hw^dZgj`dHP6B=0nR zNb*7l>iG=6&Zl+U=tGhhI#Bb%-{&>@kmK!ipyKWP1Kte)b;YsSL49uD+#cueR(QqV z=Y>8@@pd{;@pk?`FZ5xK7dlY$!r$kGKFsmf^&!hs9UwpTYkuDU_E`7(e_37|_u6xb z-yR3||CHzcaz4wGxTp1DlIPghyez-s@CTZo_OHhlHn{%oCuy%d{K`{(pj|!AF>h5L z=6LJ+FvklWsOK~MI-fRgp$~Js(1Ds4{ys1CVT!lYfr_{D4|q4~L+i)J%vADYx zUh(&Np$}8MoeosIoxjfueVF5g4%EEx_j#cYbG#pIFOMI6ehL5a^GjKtwfi0C#eSxK z&Clzx#ASIF_pZb-pXyiMV>))vKW2Fr*Yeaq;5nA(P4xMg!S(Pm&-3|wnnyhINq+b> zKb=24w)k;=)?S}qdbiGMnB@AKmIhq?Sh2kQ9@f1elnFvklWsCnV< z^Fkk{csm`acsu`qce8cmf99X#LA`9>+#W6NR(QqV=Y>8z;$M=yoeosIoxjfueVF5g z4%EEx_j#cYbG#pI-hQij_>c7=%d@&#*M}_6_N#XPRDXXy_4)B^y|g?VZ}sP7^Hd*_yqCZEWcmM1&D;6=Jk^IR@8{0T|Gl@ZSqO-h|7O|f$>xy=!Yx^`{&c2 z-=q4F{Qbiq-~RgDzPUZx-)+U)`TIQ8hh~2Jyq8~nvhmG+ zAA{;cmiPD0`+L!c@b~jmeaP|{Xa4WC`}%Mludff+@oc^I{^4?-V=>q9d_DoWy^hz{ zhwFHjkm|$LJl!v|yq~|f@#a6jz}jp7dOXmF^1UKwfB(aP_rdkyZma!z=kM=lst=7m z4fgBbyV?BwUab!=;qUWQAF{mfIq!SI3xA)-zH6gxzi(nRpa1gd5%J+)YJIpLorS3Vyf_n=;O>y%x;zCK)+Utb@t zp%W}`D&i(!__?BkvF%4?_)T-UZ7oH zpQ;a6&!^W*N$_f(fkGeNh8OzqHoVY>x8bqRUtgb|&+9h+_|aqYe!1!AFVPNL>%%Y1 zegEE|zCOhL3h|D2)AH=Zk8fCb9Ao>uxL?WgtljrNVBv9G>>b>GzIUTXWqxg(ZGP6@ z51jXda{s6PetwM}C3#;s?+f9DUwJm3MvpGz4fN_JVY(BkS-Yh=@HF|Vee#UF`=#ck_+rIpOrCvD3_Uon5qa5$$N5;F`insIk zd5s<=d4J%%KM-E{mDjKT(2K{s+&`b}Dm}9Pk9l>wuW$8y694s0^Ru|nqq-kEdg z$E|*TIpaIxp<}c6x1mRK`Tf)f^wXDmKEto`>HEt@CeQJ{9q_(=QJ(729Pe8nrt-qC zJP+91y2-9z^jpto_y@ci*L*)hd;M8J^qb|W9$7!v<)?b|9PejRFXa8Rre3W7(4#rt z&#d{2^1|O=ztE#O9&xL$zh~DE9b0{UCCfv{^3R{S9)0wMaC6Kf4$Jkxak2Lv_xBI( ze_htykLpEx{Sk*1p1BkEV+K9uSv%%oRsXU)+O6sz{V>JteA=0_^e@X}Jn{D=;ju@0 zz1zaZ{g}0y<>~uBp?=xyXMO#{>y zy^xsOJkR2PBKmi)lgH0bntCw+^9?r3`^p2p5?=T(mwAM>mwajW{5 z-#j%;`Q%0d7UQv_c_`8 z(9P%ne$x`o^3cuI`@byjEd9&!&eFeQp4G`&`WO46t!I1vInT_p{vGpd9B1iYmUou^ zWqGXgs{UnpwA0To2>)O|+iX4fpZ0Owf4)3)6TP(p3cvDdy^8*MWVWqOjf1Ct<$1rG z_OHj9UwuA*Kdo_gd_12TM}F$p{5*eYmgf<#Jp9V@^?jO0yz=lX&p_xH*ld2pwfDF5 z+vlNUvpnKf^)H*>S^Agdouz-rJgbLw{qwroSV>>^%U=J>@@yRI`Zvd0*S|U5y8g}a zsH^AoFU!+*>}TrN{iV^XM?mQ1s6I6gp8A#Nb-%gw=h=>V61Txq|9}T>mRI70SNzID zr)Z$_Z~pf83EC5{Jp9V@{t2JXk9g(bSDugmN#45t&CTb!{>|~$^>2>1u76pcwOiLe z-5)#x2UH`H?tz-5x_3M77{p<0lKD8Y@^()Ue&du%p zdD_QMIkv;0KG5!I{hQ?3aPI$;Uvc;Y&CmNU&1QMTD-XZ&e0`th5wAS_$}-y&va#%0UGqe2s=gT3_#-;bPK-y*5tscNA zzjghaGu12NYuoNG8V67P%JY7=x_>=tc@n4kM}OOZrvNz~@=81MD-M64JakIi z)yHEV@yf%mJYV0s`{roOBVKvWckL{kord|GPMP z*xR-~+ql=B+vmfS=e=%jdH#$;w=K_4Y*_N+7(3wk=`y}@Y!8OK(oT5AuRL8ZJwD>m zUU~SH=j&U>L%ZU5JQ(Lkyz=lX&&OZ7pX06T-yCmU|K@n>`Zvd0*S{>!>S0~~sH;*y zgZgxynFamJ@@zco`Zvd0*S|U5y8g}a*7YyT^L86`#eSxK-Os%KOI((xaq!fyJRjdQ zPvV}w|I6m*ykf|&IQ)U;r~An)k9g(bSDyB-$2QFC^ly&0u77j9b^V*;t?S<$Z(aYg zJZrbEe_oGr8MXE4JTnXWm*rWzb^V*;t?S<$Z(aZ9c@_#67KllRU@9d=`g4(EQM;x*hvI-u8Ou4DrmT`jzMFOEb559`VY< zuRH@Z{VTtDKVKcU`uu0ZAMn=ouO2sPj@EBo|K@n>`j_QdJ)EU~tjl;loo8lQ|BiV! zlC$(L%R5W|vb?kOFUvdne)}(**QTNZL%$%I&GU$7{Ve|7UGMEj^YeP~vzR=Oc;(?&o)J`kvOLD8 z`WOB_Py5&7ksi@*_3!`ar;Kx;w`b{JmUou^9rLUn&eA{TX*{3KGqbFJ$2=R!S^Agd zouz+S-dXyW<$bl;ynZG3E8*Ac-S-`jv*?%dy-ggq*Sp32#N*=c4b`ta-&d!37T4b2 zs$Y4Y!8Fg}TAum`JjY_P>o?Csry!Y~<>~z<k}O#pDd5K)z3f6^3Kw~EbnKV&B)J0|H7~HX$!7@4?fHLcEJ0# zx!>&TUzYc+=cl~zYkoE#djEGh&#{>6czyl5j_374Vs2-7Kb3mGe}2ey`N6?nouBH_)jaDz?#Hg?**u0G zy$ugt$zSg_t{?dI_k(i1tG|D}qbsw#?>q1N!V7<&hpyy#whll3fMtK-7^^&8FFm%n zRv&1Gg~xHR_YT_qEWZEC+r19!@ngqdG|%tS4l6u!-|y2jKkK#8ze65z?;a0+T-Hzh zeO{w~N#1v#{?{Xu?|&da{D@PY`UgC4=Oz6|&B{0!9SUoyWh%e+x9^f#JMJKyMEl6QOmudfsI@k`lX!msORyhi_$ zyzh+n>)#Px`1`y@|B}3~KiK;JzVO1YJZm4h|OPvyNMSe(+}f9r4hy)z61MUOyYp{rw-0pFe)7=QI2|pR5o0 zm_6nZXZBADPyNb6KW2HvDNp^%bIvx)BTjkhAMk42?)&kWpV8-04|u-s|4H+DmFkg! zkJpa@&hmWxgu9*P{b{KeIdDf0PUe&)Wk9Mp2M?XjPd6xcVd2t`7 z`e*ZfAMgFa{`VK^f%9gMdBnLb` zajW{5<(;K}S>9Rtcg(XoJ4^rAhsXQ1^UN&2KjfHam35Z>WqHi|s{Unpv|GLZqo48m z`9866#jfe!G0*ow=f(G{sbBXO^ontsJ?7PM!BfBToa5t!dd#cif~Wog50Kk5&)YY= z;#Xc@|MEPGZ+ZBY=j;1)einb;_v2A-{og0JZ#?h&@jlNxOaHR#cb5KTd1vY0G0*1t zEd7i7g3{cNi@G}@2#mO3I1 zy;Z;RYP}-*n5S{@)UP}zY>>9Rtcg(YT zSl2(VtBsZ9Sg$|lnOV?3`aj~?`E~u92a_3Qr9=+z@Y z-w)HiUaWEO)UQ0R!%gc^kM(-cIC$zG@aW!Ow>!?S1o#8tmD9>Yr)bd3zt8U=zoK)> zqhIBD|KO(cBVKvRv?uYdHP`Zvd0*S{>!3MKY+_A~YCey08FG4Z-zYdd)A zSDx=%8~az&{sC;Shc@oD=kl}hXu#t%`V#Fw&)daSyy91$=Tpv4=EwN%w&u~V@_c=s z<`J(v{K_*>=-*s^#67QnbG&u^o8ztP-yCmU|FS%*hjsn)Lft4>ue0X&CFhx0(7!Ct z+O6x~9B*C!=6LJ+H^*DozbubB^7du_RKMvOwb_Q_h)2BSS9DQ%-XGm#(>&sphhKRHK*zwv-}`?)KjNO( zKPM*hTi3ri-n#zH@z(V(%d>SoP5&Gl&mZXZ?mRQ=`gh2)2B+y?l6RW^C3&amUy^s4 z{vGnzcWB6drheVeRIiA~60h~Caq!fyJnwg-f3+i?#=%qnfTx&pe84O1gjf8^L%&J` zd2qxdUU~SH=luyK4v%=mD-XZ&tY>sAI6V41kGN(116Q8!)%vssr|Dmkcbfhsd8g^$ zA-smxTi3ri-n#zH@z(V(%cG8{EA}(>>wf0_ZxP2M zv&8HE(#E~^{Q5qT$IoWw{`=ki!T#?%++WUT^K0Xbr~U!Yo0ajE<57O4fj?kA)vr9w zM~{zqv{xQ}<#~T)ShT}NpL_?2h|~$^>2>1u76pc)x)~} zQCCOx={z$F`j_R|c-HlAj<>FVbG&u^o8ztPUzX?XHtLG~O#Ql_dHt8TEKlR$sb6_M zzGP!`CZe&h=b2g1zbwz%t?S<$ zZ(aZ9cs#Yq@;u^|hhKRHivIPOdei3%>UPiTU)|5q z`mO8V9B*C!=6LJ+m*v^Io~3`R%Xs~qXJ%Rdj(Ii@XX#&-cb5KTd1vWgmUsU5@6V^|Up7BxMfETIeO~l$E#vs}`O$9m@Bip$ykFb6&eFdu?=1a0=Gi=- zrGL!Rcs`wHW?BD^dA5FM>0g$2mi}dVXX)QD&lYa}`|2z%{*Ix(uEzD^pI5b6`_Lox z>;B^VZHdeBtR45a!BfBT?7Zqv-rFB(r%Q@tPlg&Cm0%al7xw zV}A603_tP8!>>F8ss0`3R}XMi|FS&x^;P}L@@TjE`JePNzTRy<&(gnRp4G!y`p3A( z`8m(bvi=?Od_Hejt_O~>{p$f8vsU}>uk!0?@ca^StDk?C&F?JzJLXy5f4bR>#NWTG zU+0tgVkXVb@Ge|MUh?@7uRQ$9Gmz?EmiNaS@ii~}eI7bSn#VkAN!+UbWqIhxs{Unp zv|IlC>krJVuY0p!n}1&atY7Y{(7X8lvCs2<|3-XWFX8Xk3%Zi$*?q$AI4|@_{e2#~ zGRgbs-;ehapGWrK?fiXS+;^}pHc#-|_ZRs0op^qsN9tD|>r?lCync1Rp-1Xhp6bza z`Q>?@*Y;NV!NFdgAG+}@k9e*>)(^j~pVtdGe}8_yUWiv7e&rb`^ysvcSz#9^ry zj*GpIYybPM`(KCg_|app>yiFh^M(7dEYC)VZhn0uKlST;+WAKRO1`7~i2I+90si7s z&HL^X{ywkKza;PW>Gt4#5?=WGyhi_$Jid46@BXOHFZ{~0^@``+vg=2j+2E;Pd907E zN4fqE^CM1q>Q|m~wpku=%2WS<2M&EW%#VNp&-?kiKT@9OPx$3LU*9+58K}{}bf5r>H z@@$^R-;c-j+kgK0{(Y>EpI`i%{fy&c?*rKDpO5EemjBV2*Wa5TKaKvGn|9CZQQglG z4;_p9F^dns&ZnIZJ(}YY7x!azf45J4Ug*&rFXC7~ix0o@Y+XZ-vOMDcoduNF`_->J z>cPX@PzU4nBTjkhSDpj5Ssro9Q~!Wh<96SV$9VPnBVfRL!LK~;k8rog^GU#O`GdM% zUS9Ak&)1jmY2LqmM8y3O9pP7=oew>-<7|Fk`n)MG{C!^N(HxJsR*$To+xtE*^k|Mp zT&qXc&vyeJ`eCi^udm#A^!fTEZd#8%(!bebp4Hj>^MfAuI?cNu_V@ArLL8Rsf#YKD zy&mh|G0z6aJgn+pmPfl){iC1pd|G~I>0g!?I>-9iIKr>jpRKFv-!YFk_Fs7FS02}w zjf?+}dBiDC{mOH~2FdI(k2vM2f55A8yYI(iyd(V^@c2D)^m^mdymubS`q2@7&Cl1D zW^U8->FrgI=qB?8D>z+IeOco{zMOIp$frv-B^^W8PQwFUzCd>ir-6jMvZR6P=6Ks_u6y&qdf0V z8s>S#OMXMW_4R$4N4)azYkme&{mbS@T&sWd+vlNUq?zRrx2k_x-dXyW<(;K}$2_Zt zv-FRBalC&z&&;y^9rLWR&eFdu?=1bx@>u6p{mb%bx2k{ib5t*J-^hOE``E_Lq5BK_ zKj+OJ^E3{g`jzLLZI&l-i~4t*Up>Cpd4J8M{n7l;uexQPN4)azE6>-r#_hiUkM$Vo zJMqfHuRH^xV_>uS5x1&;S>9Rtm*t(Me_7sH`ghE;dRW&#ud9v98P%ur%q-|%mS^Kx z*S|U5y8g}a*7a|WM_oOye_3AJ&h~5d>wZT4QIFc5^SXcHCyxD7{mS$98*y2l#=%qn zfCtXsAF}^F;c;s4dUy$YTK^{VEBASlU-4^x-hUbBERT5Q;a8r4&@tY>l$}rFp4Y#* z{MPkvj<>FVbG&u^%kr$tB}F*757k)$UKapN;xITE8~Vcv6vBbWght#}SWs<>A--tY362o{z}!h)#x2UH`H?->)`r zf8PgfzgEBQXIlSRp2opbzw)$yJtlsj51Y3y`APgX;1P!1cyPd@nevKXdEQ?+?+-Q{ zM?B)0Pl-F!zgeEwN0T3Z&CmKr#~9uI_mYQia6e7l^ZGZJ-@5+I@z(Wkj<>FVS)SFy zY5M2b`29(*cjuW|*S|xaH8@TGlDyOOFUdPi|B}4Z^zV@8`_)E6_D}Wee#U-GoLbIn zed4D*JoPKj+i%3FC0=y;w8VkKG~1*e0`th z5wAS_$} ztn1$#Z(aZ9c_u7A|k(fT>h%!2-9c{ZMP{hQ;h>)#x2UH|5I z>-v}FdAlv@>UHOufBi4ZW8YDp`uqE5JYSaOIcHOz`UgD1c>hZ|X1oKv-L1dPKj<)Bg4NC_maO55Mv(?a)8kF)yFz5%>K4-yCmU|K@n>`Zvd0*S{>! z+O6xK*3YP3oM&c1|FS%5x2}J4ymkGX-smxTi3ri-n#x}c~%c+=^yJ->bg}l{nGc;#VFzRT?}V zEAKW zu9H^()UWgD`_9Hp`urs46JF?_#fM*cT+g$-cNVY_N4=QG0LpR~+_y;_O z>GnFFkLPI~@tPlg&Cl!QX&&*)!>>F8p<`f==aZJi!&85s7yGld&+>>{)xRu{cB`NN zNk3zKuz5I3|BiW94`=Bg;~wYdJTuGscg*woykYD5oYlW958YhVzbx-8{X6E_=Od## z@%QiQ*X!N)oz2#P|Bre8dBr7;^;5s{R6mS(%=;~C*znY^JPQjQ%kup5rW>C62Rz4O zj`P!gnNRgA51oQ!HqRqodH9v*^-|+@-;c-o>ir6N5U)J^$}^Da-*JBR0QLTlv!l-& zMaO8Dwc~C)?dH-eBC?Re_pfqNB7e_;+2PAc{a{3 zp5_s+Jp9TtQ0S4hJKkTcUAZ30>woI+^U#%iecm1&e|m4@4LwqSpNFpGdH#K7&I>(K zf1ii0?1KnKKzmo4LKl8Wxr~ZDupkt+8 zl04!<|BM&@KCjWgB#*ezKjVd8dA44S{vGl(uHMgf{oM!9*{?SnSAIUx4dURbU-R?! z(>yp>cpPH~JWiuWhx1ti{6Ut7P7yzM{gvluiayW}{c3)`?lhauk9f@wzw!*!=wEU^ ziPQVB@b`I*{v~SpNF6eu^%wqry`UfDbG&}mlDOyfD4U<}9~&biKlN*V zsvlXN#=%p+@_c+{oLQd76$7t0{K0@H&9dtkVObu!5s|Nt@;u^|hhOtUH=gAYuRQ$9 zGYnim zo|)y>$BudRJgn+pmPfnQ*T?8*JfC(ZbWW~^Pn_>x59k>EXL-b}>fbTX_p6N&lAroD zKh-OXKjvv1JoPKj$5+Og<#}8&@QTA940zJ)I6nz!?vFUHJamflX7fDaH9!2y^YyK9 zyYG+l6V3iY0P)JhuRM!G$LJ-SA91Vtm*s`d)%k_LpC39ln;&tj`j^e`Ed4v?Sv{Pk zf9%7|@74Ez$2=PezgMm5UzW$buj*fxN4w{rkFXpSG^E3{g`jzM7E91=aJgyjc#o-SIJZW~Ep9C!GU!I4~X@2-MKXj@dZ=OfI^6)Fq zIOrJEERVQV{mb$~=j!~z-_H*no6V27RsGB6cb5Jg^Q<1u(m(b^=J#s-JLcI)&eFdu z?=1bx@>u6p{mb%bw|f6aKS%Wvue))*`#!c2sn@&em9;zOX&gNDE6>MK#*^iFTru#9 z!ygQI((E`t30Ty>JP)1I{P1gj=u|!4Jdb$g;a8q<&@rf49&xMsm*s`d)%k_LpC39l zn;&tj`j^e`Ed4v?Sv{=lpV!sK%(`u!pKzX;h37xBJR8Tl{>|~$^>2>1u77hp>gsv@ z%ks1x*Sq@ldT;dV5fC~$s!xrBr+($ppId+b#4%6eHhAhE@W9RTN}TYDUwP;h4Rrq9 z-(2ssCti8@mFN8vKAj)&%EPZb1EFKQe_24`+3;LJk**MnqZ;rRFe{;Nb{hQ;h>tB|qbdH=I8yFX0trvm4{z>zP?ZMh*utd z-smxTi3ri-n#zH@z(V(%k%we^Y-QWI`!-IKB|BEfvQ^59 zY5#hxJc(2NE8zoPIWPU-AMDqhj=whyk3CYJ=daB+aSVCHGoQraSDvpg&9EB}+zxrf zD-XZ&tUq+DP`2{O9t?QIJ+FVxN%BJH>iojr&kr3dStWVIJ+FUr`K{|;mS^>Fn*NoE zg|FAU^USR4-yzQ$oTh(C-f8-mk^e?4q?5~un{f7$Pc&GJe+@+%I1p!uOw+D?u~`Q3kSu^;8(SDvr0bl)5fdBiIZ zzw)eSbgbdv81RT&);~Dd0WWl}&M*A^{LnGFZ|s0a+_L^DaKJlF{| z!yYv2$9dwFhhKRXhmOt8Cvnf~-&}s7b9H{<@8^e(&E`kk^ZGZJ-@5)~c~%eW`bS++ ze{P%lbe@?7{mb%f9P9cw$6MFGIo`Vd&GFXtFU#|G8+FC?u717Vz5YvFmZx#>)UP}r z-!xC+p1%Lf=I6X($gep3f##?C$t;g}<>6PJ_OHi2%w~Tf585jazw#^&9V_n-p*!q= zN8I!J$G8Bw9q>Zu>iojr&kr4&&5yX}^=~e}b^Xiotlhf)*?Lh2WfhzCbDo(6{mb&K z-MaqG@z(Wkj<>FVbG&u^%ksRAH*5d;d+Y0!U9R8laqxP4|M$7iBeQnL^{F}sPyNdC zacpkg9P=dZY5lW)(!4TE@+%I1p!uOwb-O%|c;(?&p09h2+kO9^pJ?_M0*F^0e&t!5 z=A*~$-*eS*&+A{^4_SuV9;qT{%j?sTMKjNO(zq$O@^)Jh_dN@n}n1ANCT|eiU zS=PT}o{i)z{mb&s(!VV4Ed9&!&eFeQp6^#16~*qn9sBHFUvbi|BiW9XJ_dj^E94M=b2g7zhj<_7 zgBuma{;7W5KUJ?R{+Oq6@YJt7A72?~mM3wG`gfe4^NJzA;_wHWA39aH%kzj=9)9Kd z`qsGJ_fz_b!G2wyA1Kck&=LJA&(5P`w9e*7+^YU%dF<<}`j_R=ZuS0;ewg3({>aXp zrGLjftB14nk8zLlbDo)H{X6FQeBQA2^%uI>zaG#r^2zduTmAgAEblD+%ks|Bzhj>7 zR~sw9`l(;nPxZ>z{{#KFZT3%%gQtGw(O=#FaeflFsDEi*87BD^hdqh|b%EPZbi$llgC7T~{tNNGaouz+S9y+qBe_0;wroWHjBP(Z? zeu}rL7psSP{qz2B^h`e-yKQ*p58bKjGyMJfL|6FzF1|18^E~37*Q2@o*7azPx2{K7 zp0$h5#bEu^uj|+7$0Oi){WK1q`jtmLxaIq7{#m}~^=UoI&L`u;k{`!d%@5ru z=achEd*YRcUwOX1gwM_=pWpKI{n*@muItepZ(Wb(c0gp}n*JT~Y~D}PzeAqt9QCRG*N*nrgV)36mi_vWCvmI#m*p|cMjtq#`Jq$g{9|E$ zk>(N4e9{ko<@vhPY<51+(!XSWr|Dmkcbfhsd8g@LlJ~U!N&lf26q4@O?CV(SljCCV z9kkcG_OHh;FUqrV(C&FXs{0|k5pP|O=6LIRG{;-lqb$$rVO@{1Jk=fQQ~j@n-_~cj zuQFWw{c(f(EOAfkQ8qsxSTW>R9R5J_LpSPnTvy@kUw`rUSjwYc<@vft$B##O9`VY< zuRH^xD`2xc;+CHuyg|nH=W|_;tp99&>v}ZDds>e^GH+R))x-SrgC6%0g$| zyszqCmPfnQ?+2ov@%q`Bv-Izn=lj*hh}h56ult$mmBkUh?s&1F(5wAS_%JcQDaW8ou@yf%mJOiO)V6!~pR`oB-J4^qvytDK# z%R5W|j(JuOXXzjNBK32%{vGpdBxmVgmUou^WqGXgs{Unpw0r*hfqcK&qEhTp|M`Nm z?*ABfP?e`T$Ns7Q{{E@=f5$u@$%ci;F?PW7)0i}mfW`a2JP)0d{3h@J@;r1-dHDPD ziHuRHNu)4oE&&B zTXFb<0k1R@Uhyjr{i4BSensb$N59JR{=rS>N4)azE6+ga81HvGu9rIQdHtK4&vpHq z|dD+76!jmFN9!^sDXh>-Esaz4lywHXaRloJL)#x2UH`H?->)`rU-nP+>wY$<|I!crX?pGXD}J3%P7u$0s$Y4&zBI#bJiv~4 z#48WK@~l5}jNbM6?DqAXI_`P>bK+LW{-B@Vy8g}a*7a|Wx2}I#p4G!?`sdg%x_-_x zv#x&u@<+-u_i6f<Gu12N)oQ(H96a?a&->l9 ze?3;7o`npvtha(>G%EPZb>$%at2H58jx2%6j z-f8-mrij2-YeU7lYo4u7Ee z>G>>A^U-7a9r0+dJp7uUuP@zB=SRHq@GH+i=vZ0r!skIhKjNO(Kjr}rw$EGFzd7Ez z{>|~$^)Jh_dRW&#>WX#4>iRj)%!2-9c{Yx9{hQ;h>)#x2UH|5I>-v}FdAp5zVn0*A z?q^>AB`(X;IC$z;o{w*uM_yQX9AgJOPV@eda?At0{_tb7Jl#*S^BEj_q&)i7{Iq{P zrr%M1v{xQ}|~$^)Jh_cI*0Q%S9c; zD(d<<&&-1UWqH-smxTi3ri-n#x}d0xkxwLks)@tW7;ROi?~)!*Mg_4T6T z>w&zm@HoZ}c${{79S@zVfq5SBnje16&)2=iwcn4|tRDfyD-XZ&EKc*$Fmj1CWMt}YPTKzlb*+|aPzbx-8{mb&s(!VV4Ed4v?`F^$8 zIaXprGLjftB14nk8zLlbDo)H{X6FQeBQA2^$@z)zaG#r z^2zduTmAgAEblD+%ks|Bzhj>7R~sw9`l(;nPxZ>z{{#JC_4i$kgQtGwd4C)Inmx|1 zZXfrz>L2i=*>ya0ss`qH#514tgJ1LW^`)8HJdb$g;a8pk&@r%C9&xMsm*t(Me_0+n zvZ{Ys9_^n0J|bH|`e8j=y|sFn*FW$7M$h!aF;@2%^M~%#^%?$teWEM8KHYr3+Tiy= z;-1%|x%}4kXpXn8M_Hb=i_gVi{nW4P*XYM1;CTHs4xajz=k>QyhuQpSkA=rEcEIDb zzaQl|zY^dNvOIKy_}To3R~~-N&({~+bbiDu55MvZgs#k9@5DW?M|1PJu19mcbv>Hn zp(D@hQI1vG)Sme?NlzU(4w6qsP>>>Jja*!ZY{%KCNG$=vArD!XNQ$bi_UX zeGH7((=G3h*8G0+(V*2o_4o5b$MX4o_23Z~pU0{GJ`Wws^K2ge?ynx$m-sv~^()WL zhmK|Ev+g(USJbaOuZPXX`D}i9o^w`tTYWt+&o766kN!sU$#kMeuhahc8C`#@6X!KQ z{JMS?_XXWg^N3d-e&rbm9ecK3LjTB{e)~LhEYG_=I{x(D`i9`~K^7Y(KhR+dAF##`64iT`%Durvg$I6rIG>XG{U`JpS;I-ehLp-0w3`1`!jBWuq*jr03=kA}pB9;sh>w%(yfS>C^` zc%cvKSDx43W*q)M&hNLZX^Epg)vr7!lsG#+=GnZ(`%2)cf53Ar<~knNGo;!4h}Zn^ zYkpoYH7;?zGjGHz55MvZ6nd1+uO49Nk^1|*(4#pXaiK>RAO1cs^k|MpTz5bCJzhWCuZRo%Q@`?TT~+^%c{Vb5p?~UEp6{z0 znVCK2y|acTj`>u-@|;uR?D&|cv%pMKyLFq;x#|~nxEIp(>&sphhKRH zQvEy5uO8s4{$+WgbL3~^2!B66^omhudBm;iUzT^4{vGqI9?sG~_S^CP={z&b?+-cV z*-E3EtNNGaG4HGTm*vrJ_5P23#_MPEi5`Xisb8-@-*+}^$N$GXjpKS(zw%T+jCjn` zIC$z;o@ca?S(Ybp<@reU4|p|h_x*9`ia!4$0r%%=UVCnTlt+Jc%j5Z^J@LxJuRLF0 z!rkV1#48WK@(iH*m*o+s`WOB_54|GIERVR=`@byjEd9&!&eFeQp4G!y`p3RF-anmZ zW?BD^c~)6x>0g$2mi}dVtn;e=WqGt))j#?dH=7&zz?eaY0m4{z>zP>f?{`xNt;zs&Tyz=lX&-z8L zpk#T(t?FNvcb5KTd1vWgmUou^9rLUn*7eWp>aaeYXJ$eFvOKHgb^V*;t?S<$Z(aZ9 zc+}PN`j_Rk?Ot~-Uf&K~)cwr&$L-O$(|)vnY8?Bg`jzLLX`aTxQ~!YH&D!}GH{ubmJp9Tt5IQzHpTs?{e{=J>u77j9 zb^V*;t?OTwXYJPY&+BocU`O@oJTnXWm*v@b*7a|Wx2}J4ymkGX(15g zPr9EC`rjVG_y7ES^Y)#x2UH|5I>-smxTi3rV&-bg%+n3j?)UW%Q)_<0#aqOS! zSDyB-#~we@Khi7tN&Mm8BS?GnVwP9Nq4_cX(!d^U9CLo8N1SIqHBNcHzBI#bJfOc3 zk9g(bSDy8YjzQVKFV}p19&yj>pA$F8pU-by|K@n>`Zvd0*S{>!>fto~WBG>HpYzPD z>)#>I8l0woN#1Gtm*kzMe@WhH`gh3l{c58j`r3~IJ>n6s`QcZd0no7qSH{`T zkGN(1E8x%Pcbfhsd8g@Ll6RW^9rCOm*7c9|0?4t}i}TDZ=pX$b@$CG%{>|~$^>2>1 zu77j9b^Xioe81XaonLpZr=S0%o8f-u|~$^)Jh_dRW&#>gs6yoM&c1|FS$A&$|B2@z(Wkj<>FVbG&u^%ksS47IpQybIt2t zmgm>a_JG{~WB*itfBy{q%kto0;c<)|@Hox;L&`DNe}BI&%}RdZu}8|IKibXaN4(~T zUwPWU9uqgpkM_#LuRO~O9V_)kx{^ZBjo-yCmU|K@n>`j_QdyLJ83 z`WdaC^UN&hUzTU>*7a|Wx2}J4ymkGXp3D{ALV((D-XZs=j&VJCV0dv55MvZ6#3{e z7SDUTls{S4Ge4lH0>hJHLasOxIJ?4=YR`+ZC10JW{UdLnquYq|U@tPlg z&Cl1p#=Ycu#48WK@(hHIfz9%WTh+fTk9Ny{|Nfp#S%<#9pQV3{d#n#Op0o7tm}m8H zmi{qMlfE&mdAY5 zz&!7r2PzN0=I85Mk3VX8;rSDu|g$7q+$@0IiVqrC9aVZ2XXzi~9`mfu&eA`|eaJKHvi=?OY`#P1>gzB3{rXh>%kqd@)xRw7Ed9&! zLg(uF48P7NdPV*Fx_sc6{Z+3A;{0=s%j;F@R~~vr|5+Y!%2U7coU_gHXst7-}1n^US3}CYkt1IHSQ(P^Up^w^+HGZm1pNw|FXO70)p5^% z9;aO&S>AV_{QEOL)z@G6`_}`yGMnG+lYc*m@WS8c?eyc3U^c%mH=B>Y`=dI)@GH;v zmyPfrDGXuu=f-;a`Azv#DKzwj%M>kFXG z&viUsUvQV_XQ0rdx%}>W^Z3#A3%|~%@z53KJv*Pb_g_6aX!QtxpNFo@^1gfjn-5;A zNBH|ZbY+%D-1B;rT|e4kxgIz!_MZR#_X+pErv3QoAAiyOJuL08!ZY{%K5a0cH^*^3 z2!F);eUA(MGf?>ZJnpN?`W^EA_0jR~I4|zU)Zgbd`j_K<{L*>xd7Ka4&fn)X`gh3t zUyuC0a9(^KnfjGy^BtcjWyimm=a|iHx;`b3ZIIvL z-=klh-$4J;>qorihhNvv>xJo@o=@VHhhKRHYV@m*oB6X8nf#SsjJH z&ujEA$@{+ZLjQ~x{yq;K%kQ7|{Pd4MSbm{@>Q|oDzsLKy;g9qoz6X!>qrYPB9q#o{ z``2UYOz;2dcA-b=*Zk~!=uzE%oL?OmdZhk7FZ5`RM_lNU#fQJo3q8v6Y@Yvgv-Y7! z>Q|nxkH=Z`{`;~<>sR+1dZd2k`9Aj~?@vlxU7z7so@Z3z>{y>a7+nvg-=asBU-$<+ z$6}^=Mc;)t(sw{^^E_XVhKFDCv+>0DwHh$bBVN}Jzw)gA(4#rtA8*9hyzuvVp+{Ms zwIeR{Nd0|Y=+PXHxX>eu4}YH*dNju)F7(LbKVX$->l*j7SsroNdi~;g!vXKrz55Bh zpw3i}oMUGB^|51~4UX$(RsXU)+O6sz{T%6S=p5^3d52%u&(5p<9rJAAezFk{PyNcX z^Kn0B@y9&7kA)Zdr+(%2_3xNRUS@-*e&u=ljX1N%Je`+%K4ZQHyc)Orenanf@O()0 zo8_TXH87ta@yf%m`7!=ydBiIZzw(Tu`gfdPJwAPXjI-I-$FjV$^e@W`ont;Nv+(!l z6CGn7vOMBe_3xNx^$0g$|yszqC zmPfnQ`#<^_ub<854>z-M|EKj@5Wnrb&?EILudjc{Jd1nR@YJt7%cuGK zfKTrC=hNEzKRe&@)IZ?Sz1!pbv|p}2^(zmZs)2bP@yf%mJX>GA|I71;R~~-lSzfAt zSst^ps()GDS^Agdh0fLU8UFr!qGQZYmPg#G{vGqI9?sIgxSycTuD$;|=Gn}jrGHu8 zS^AgdvCgadm*vq;^)LK-J$OBATnT1rKh|4~$?7VeQabpsu$;(S$O_4%d_#U>)#x2 zUH|5I>-smxqpqIUzbsGNas8=ZufImG9szOx>G93;gBk}<{mS#Y*ZSAvhNp4x)IZ>P zv-0~xmRI70SNzIDr)bd3zs>I`zx(Tc_M<%f%42<=|}1=j!|~$^)Jh_LJ8gC`cuDNf7-tudwjFMXghf7SDx=%W&dj0KY;D^(8j&?Tz)nl z4S1YJU!wizdAqoZSNzKJe9HOB{21Te);#)E9_s^emPfqu@GH+a=-BJ??2n(#OxeGi zda?7wJ+FUrymkGXS0~~yiN}5#d&5H^e@Y^cI)~# z$6MFGIo`Vd&GFXtFU#}&YV-DG|5U$Te_H=pp2l&#t6zEAzaIN|2m2@4#p|0AfB5$Z z(*EG}#v!kq(EL3Aa(wxz(7Ad(!{47zbc|Wd=11J~`j^em=J_=JD~XQQ&v|Cn_3w~p4NlX)B=0o+OY%)6<9>x8d@`zKOb=>G*l1JS0_kRWC4;W`Zzti-uU_Z|bovY_F z{Qdbv#|oxA_&kreW&Jzk**Mnqk2(f8%FlUb7W6O6v+=C!-yCmU|K@n>`Zvd0*S{>! z>u95{xc=0y*Pr*li=zj#9)FqsW%H{?)!hG;)0$s7;Sa9nY5#gWnoq__d)80=njigX zJB~Tu*N1ieW4t-uy8g}a*7a|W7dlt3U-)(XY~IkZ^86>$dGP!ManI{tHb1MQb^W6r zNswc$Pv@Cg&_DV=;`ut|mLu77j9b^XioypA_(ANNP< z*Y#7q%JMXhdQrdfe0*h`S)Rug1Ftyz!GI^tvh^8ZSspqSk*|;PJmQsyU-R?zt#K1P z;+2PAc?ODn^q9E*^-kRL`Zvd0*S|Sl=v+OY;qT8UI%c$dy%6`j{$=yCbv;Y}SeLOr zIM2+o{vGpd9zy5p^$UN0{m?PiFUuotRsXWQv-B^^L;pgLyxuluO6Sw}k8O9*EFxzx!|c^^Ygr?c^>B`cSnv|kMntJp5Ltl@;r2^jz3;M+FN|f z!>{=9Rtcg(Xw`C@Zh_80Z*`qg@sUq9lMr+(!*VS{A$I6vAePyGWP&D>tc^ZcLYS)kq@ z(OvuZ;miju%;xj+&&MnELO=NX^NC*3I?LmG7k(nV@b`JKKhNby+^YU%^P}DB=YP`A zSRZU2&eFeQp4Hh|`p3A(`8m(bvi=?Od_Hg3HT}!-&eFdu?=1bx^7!7NKi2Erb?T3s z`!V0oHd_b&Kjsl<_D>2={kp%PSCGse^N3TP`jzLLZI(xS<*9$bqnX>|{0Nxk_4V&M zp06*%eKNm4E%ic2*6*J-^=ao-|FZd^bIJ>UfBn!gMwjIgx2k_x9y+qBe_0;wR`37l z=TMJ6T3!6&Bl^H`vG*nV-1jlij+M0I(ck-ieS7z4_~RQqiwl3hUeFctiO>7~Jny?t z{{0yrYF_yJJalE2cXQqkgctrkFYc@6=JU(Vzt={1;a8r|*H*9B@q7}eJoPIN{g~wu zr#$s5&pFfiF+Sy~f54-ezaQmzJ_(rRsUFSM%gf6w&)1jXUY?(ULXYP1`*M(9`1|XJ zu1sI=?;rP-AHS6A?^gVM9=bBi`_B6P_3sET{C%G4LAE}>{$TU}`@##q^7`v_%p(rV ze$8>Q_X64Lk^5hV@%YhW^M2X99zZ*+@XUR`Pt*LYKb}7<>sR>MrC$_DZ_*@lh7vGO( z>oBU9c^-OY{pRbXjQ{cAi!z_;@6V_Hz3p}Rkr(!j<`W!xbalPF8P7nC{#}-z@f!V0 z@_yjg-w&id!{4vZM*ot$?>q1N!V7<&*XZ9N&*p{i$NTXI_80XluV4S67p$+opNKdt zJdTUKcd*~jtUv8vkK6sMj{CaIr}{NNJ0E&fx3{C$_xosmb=>OfW7+)BvDMFq&hmb? zS)M=JSU--jI-j<#p-0wkmiO&|_igj}A*x4nyl*#aue|VUe%3zp$d0r5MZfiYhJV0w zEap0%-j5maI-b`HiMgHS{Z#7Z+s!)qX;Uxe4?VKuEbphK-+KMR-(SDbqd6XN%g+zq zjLZMS{p`K9Sblym$wSAMpC3Hrx!!!lvVI&Fd!K;49=ZQ@S$99G7wvo!hZUZ=6Zc~V zJ?2?E>UdTEvOLL2|u#qE6BnX~jS%lm3G?pLzEgkP_BTUgb3tKiYj?oq0y<*Ydo*_ji9i^6uDQe|BE~KhDo0=6QYno8?Wv zpH>pQj_338Brn3)&%$Gm`s;^|(K?$SajW{5<#8Xks()GDS^9U(vwh^O_lK|#v!3ns z?mRQg?+-cV*+|aPzbub=U)8@Xk9Mo~fAlk6KRa{&_v2Z=qk1|2`|(CR+vneHc0TrN z_4oHPz5mP3XUj8w_y;_O>GnEaU;pwv;%j|)cmMs#el$PZAjaR1XHjjvnE%~Iyz=lX zkN(W^e>Okb=imQn5$G84Ssrn#`j_RMrGHu8S^9U(vwAp7|MuO^qsV9AX%z0)O^e@Y^ zajfg#9B*C!=6LJ+H^-x{p4Y!DPusDdsbBY(Mz0>= zc^*7a|Wx2}I#p0!)oKiwawr>pcY%d>H;>)#x2UH|5I>-smxTi3rV zPwSZdMg6+JX#aXVs!wePPyNdCeRFgBqU}e#Htx0O^0V=1z~l5RZx>hbieGu2PdPuC zALF~*nn%CN^Ywk2N4)azE6+ga)$4un<7YF&|08`T?)m$_Io`Vd&GFXtZ;rRFe_5W@ z!@B-?g&fw4^UN&V|7CgBZe9Q8c*sUKBQGpG=`Z>G=Q59BJXC7`ejCrfoR{(WVLP7$5HIJm0T28nU0MU-vWBE8=V0){Dl$Q@`@O->vRnk6NC# zfT#WePn*f{c|7z>0CG6y5wH2-*Zh2arGGsf^N3d-e&t!u=$LXi9`T4<);~aQN4(SY zFUdPi|B}4Z^zV>o^{}pg)Nu`L*Ux!o7W6O6v+=C!-yCmU|K@n>`Zvd0*S{>!_p6P% zVn0*A?q}ZrE{-1dwyn=L?zQLk`7q^qubbO)U&FE4mRFz8zaOQIQ_t)1c|2V&JvRE7 zM|;+f(c;(n^!26L^n4PpJp9UI`~Vpj$DG&KbMRwpUg%<r z*S|U5y8dN(RuAj?M_ttm*j^9LGqa$7S)Pq&UH|5I>-smxTi3ri-n#x}dERcLuGnAH zultMFe~HWTG!CBnmFMG|=8+c`9>>@LkJG$Aq#WCW_WF|s<@sdwD^K^6?0nKM@tPlg z^v8H<$1&%x(!V+0y8g}a*7a|Wx2}I#p0!)oKkDPCUYuuULI1Km zYqzd{bG&u^o8ztP-yCmU|FS%<G@s)9Ac^+2`yyEZ& z1D-VFegpS)`e%eZ51rHe@N0g)z9ix{&m&%W_?0)xryjs)J{i~Q^Pltsb;MiOzfrz@ zeP7qVIo`VdWqDQ)XXzj7GG0IDnOWAqW1fxVEd9&!&eFdu?=1bx^3cD~Bd@oOmDl~n z_nmUy+8y)ixcGiG^(#;HD$A?mf~S7vdEV3cd7PWzseiz$o9(_I&rXc?Pr~v%bc#r` z$LmLXi*I@OH9ucp!rkV17JuIN~L& z^mhLqmixob`xQ4@n7xkYoF{qgpPFCzHNQG9j;%C3Fj{Ilm^D7VdN}f*+zvgEFx<6<0BW_jyvOL-?fBxBfpC~t@-zUz}KgJEU z<+&bx#Bx1wT!*5j z_4;|eyjgw*3O%|yKjWb*`TBgsZC`%CQlA`S`}K*gO!8iSWW2krcsqZehpx=>{=j*E zAiVG^PuEM2AM?_AzLj=Z^5eMJdk6dd+WoJ?c>L(Gd2jFa^-bDgg=g;jeVXQH{c&Ga z=CklW&->*4e)@II3xA*2=-M*lA6HTriM&laH3zsq<7{kx23^%s8+Zu#o>+zbOo%xL$w&sPu&kH@W z_+);!|MBV3{%$MY&fn*S9!>FHer3G7t#~`X@_c{UjKlxQ{C53jd8$WO=jR!1WcEh9 z8uxPfe7+ga>*dXO1`0j0E4%vhn_{)Mxnn`KkV8dFXWh`xtD& z<9@6^ziqu(yLnz;|E|l=#u@ixSLf$EG1uj%_hVP*=k@Yt`58#{@4ERkp6Xwg_jAAA ze=gU1`1{wp>R*=kkMC`~|Mv(5GwlQ;NFXz>`QU|!tTfe^kU6-HN z3yHYBj%NVXzpHtwe_7sNzPIuIrRY)k`}>RPUy`@|lkx7h-p|6{=c)cBd4KNucefR9 z=U1N9i|XGo&*IL~zh*yeo*#6cnPvSu<~{0UbN##9YCd;?|2`ng`^}Ab z<(dEAH}z@bQT@yESOER|2iElm1D@(%miJfhjrdo!9=(KL=hND&{$+Xp?7V*#UikYw z)xRWfbN##9YW;S8<=MKb{vGoyZe9Pp-Zm=1Y`cFt&&-1UWqFTr>~v1%^Tv6dPaA*e z-xP1Ba}{sr@AE?c=6IoVH81>qUew1NFXC!m_?4&q>#@!Es9w;&`1@jwSDx>yoAt~4 zH9{{(Jd0!BiogF;zw(?j&9k_cr~U!YvHAS8-+KLG9Lhtd0P6gkzg<6g#48WK^1Od= z{(hU|^|OF={hP~=VLq>abG*>GdOpLi^Jyat{hQ;3&ego|_j#dzQ@owdRlJ>FdDegE zUzTU>*7eWpc%u@`w%3F6%q-|%miHLP3Hmq1+v!}jemlRepU>AP=5LM{I#=_;-{*y1 z&GGheuRZhggN;YZ(|XME>NwTEe?R1D|9WiWZ0l3oF`w$!{59TjMozf zJP&`>>BrAj9FGTWe)aj#cl9gJ`!CIAdBiiHbcA1dzV0-e%^V94~aP=7qn{ z3;mno?R2i6Zd=~t#CiIcd|HQ%{v~;#b2TsgeO{w~Io?j^D&EeoJgb*R{|hI5I=wFrx2Mdp5?10BVUf1elnH^tlOT*ce@m1p%5 z`j_Qd+`9g0z1n=Y_31n_3;LJkJ;rf@{!Q_AI#;dV&adm|^YzIruT$vz-`e@K_Mvk% zFZ_L8=-6C-5m)ojzjw|1-Ms&8HorRVH_Lu)eqR4;d0zk1ygDwPZ&iPPK12WJ=95_o z9v-u8e)aj;dLcT`)BR*NKZ|d9_;o(De?7JgM%M%SH~M~rFPi$a{^I?gb3EpAq<`(_ zmot7M=XjxW_4OBioloP0{>|}1=W1T~`@GP-uN&8}-Bb z>gS_4&&-1UWqFTwC+Oc4Z>MwB`tAI>em-BH%<}*7d|J!UxtbULJ}-34`pNPluIA*E6>(D^e@Y^xU=+6 z|DL7&{mgl0mi6zL_n3!2_rL$U+iE^{ew|O7zxewHJ5KVpfBN)jf43EH=kN34`Ohid z%U>GrZY$o--{*yn&GCNz-rE0M{vIg&%CiOMc}$Cb{d+$i!PnoH;9%?g#=Kgupj^ju z!UoCg<-8hq{d~R|&+FyQcm_hpz+Sz6ZU2zXw)-c3Y<)e@-|f9#f7V|0kM?%9_xHDt zGn?z&-B!Gvzt2*I1>jeEI{*T4U}j_39AX89RN_3yg;jK_6Enpxi8`t|;|wI02M zzrVj||9U*y&uF*${Xq0Xz60LP_3v)0{d(uu{H$J7|BiVUcb5LOdVj6{9rJ9afA@y1 z=JO@|I-k~F@BgyAfAISJ2dU5S_j#&+N#2KF8t-na{C566PxUX!d-;{;_p6$>^DD2f zf7kK)`ga}A>P4UbyqxD)%yqoJ{$0oG>)&-en?cpTt9hz_N#5;$*!6d})%Cvf>-A^( zsU9SGFTe4@;(w#oqn*Fc)Bg2%pnv6i9?$-Myq5Q@{@HxQ=WAO(s=p)Nr;pbD(?`~i z<6`fC?-^wGf9R35yP6kz^ftWEqpNw=f838<%~L(Pn&(BcQ9N(N1IPCReJqa0gY&Kj z)uXHPv;O1#SXc9G-a?Pwh8KGDHoVZIx8a5UT+P$|_1M;TbUpmyBkgN_2*2vBw|{j% ze)QP9-!<=NryW*!=6?G7@y_No`d9M3Ccj4iF6K4*cNxzXw$Z=Kcmw^rjA!)__hZzz z``w&fpV9l(yn+5*HlJQECBdunGf<;{m*r=?M*lA6HTrikuhGBDc>Vf_`z4$2_WCOY z<`2*#J0$+=+v~vF`y9 z=BXZC&GWoAw{ECAyl2-7{bH}rO z*2m%Fn$1u3?>b&z|E}Zp_3t{K*Tv@6&E>orSH71K_j&c%*T3uX>+9cjJex7qzpHtw ze^>KV|E}h#{$0oG>tB|~^`iPme5*%&{cHB`!G1mB5r0eSAMNRHbiLDV_WR?=pZ@8G zQ~kS+*Vn)6czyl5j^`DzQ5j}0=he98`|-}Jm%jd8mtSB1uH)H6s{UQg zQ~kS|r}}p_PxbFQUSI#Ryts_&=Oc-4^{B6Zx}T1&zY&l4FSp$NAMNSyY@X`h)jZ~# ze6Hqc|9U){Puh*XAFo}%zW&h<`L;ZZ`^iR&x;}|-d42t(J-xL&i;H$yp7&VBX~)rz z9k;x?U4A|-PXE7-*Vn&e-m~-R^&$x#^Pa62Ux#U)$8FfTdQts5&QAvTGRIT>yPBu^ zcOB2xUEeQwIqy}b9zR~Mn;*IvUGLF~_0#wx{nPf=zqjFq{=E$^>SK-<=QUNm0oMfFeHk9g*P)gk-I=I6~fw}bC5O)-Uu=`>}zH=Ccg5=%2>x^+10_YJ1M>-*eF(JC|SR z-_<NEPsFxD1JUgMU{~gy$>Chj@`jyjtUg)1U+)BXX zL7QKFUf-_~XZyU+KX183#OtH8d7*#K+1$E0k7w&1`u9e>*J=LD&w2S7B<}zE(6f1s z{t5PMUZZ~(^BVoTjK{tt06A>ulQ_4kMuL(d&WvV!X8DnDdjb zSCzW$^Fsfw=2`!te{aNlO?&qf^<&QQ^+!;B{SiOKi>E!koy`mVdmCQp-`ns) z|K@niyI$|%*XzOSaWfA8)1Kq;`dR!>L?4K6>!sdz>7Vu-k9iiK&(C|@=-F(RN4sfW zjeDUV+@t(xm*=Ve&E?1YbMn0Y{>8YD^5gq*^YzltC(ENL2}F#Z&#e zny31A9j~u{*YW!LcOB0wVxuz5Ue2p=&G+Mtu0O_=zaIMfM?VbXJYHY_uH#t-=m+^+ z&C~w%_`LbFj8y-w=BfT&$Ls4~mdASQ?-RtgdgMIOKb_yv`i*$Re>eDkL)Aap)8B|k zyV>t|QvIW!t9Yt^SMyZ=uH*If?>b&z|E}YCMQl`t*~@t~uK9kv^R9=!{#}<}U;nP- z*+i=TUCm>EWf`yLwf#djdtSX*f2w~izyEwI?ehC|U;pTbEJyiqUiFXoR*(An*XG;L zZ^R@1>ks|=chx`I)88mR+U37*$$C`%qo1pIs()AWRR6By_4V&MUSI#N<9S7FREF8h zc{Q$luNdz0u7|$O2#_aU|4{}6gayBPWFqqBLTM{mOmJ-V7_{Wsqa^zo|sR6V*nKhI+$ zpEu%x^Y;bl>k;SGr|Qww`FXv(S$+lzJ-RwSZ1a8I z^&kwge|KBe%g(RYpY6Y{}}IX zE8fmO;8~o(?*GUAgt-R$^~-+8dHyuLnM$MY51+`74(SL4#x13HrbeW|Yx z*X7sOhwFGYk*W_@^Hd*_ybs^p9^<{+>iXOH_4>2?R3DPOmp?S#-B!Gvzt2;B$nyT1 z^F;r4zef#t9%tFUG~cH&*gyY||N7w(ako`|JAa?2`RM*V;Jy6Bcz0XzcK$w3``6ciDM)rTzadpBE%@5z20e!c#zz3M}fxB2fAcU#rV&fn*$J|ubnuRs5C zw-s;aAMku$EZdhC-QNcL+2;Ciw-s;a@AFh2lDwDy_`yc_A8X#u-{+xVd%e=pSuJ~)u{1D%MA4*>zXixlz_p^-_HSgQ)-#kvVyuLnUdEX9s zmdBrrJ`b?OJ%&~0$&QBie=py9+_y5H;qR{>{bFbH%k%pBaLlu~$b7{l{NE1NPxaxLXB_(dvjOkV20Yb=Ebo_}jQdOZ{Ve=CpVnUW;s59DeM4=@ zuKU3Ko;8jvwcHOz2+d5Bz7}F|h`|qA7=P&Wse9TP^lcuti4`KEYsQlaiJ3emX6z3h zUcEO)=!0+?;lz!xt&1^6gkUt8p3omU@6ku?=lJTl?+*$8k`upYeWwJ^tSIYZD*0qfU>1=YlWRv!3nx^Cj8+P&_dC zm)gH4wzvMp=03ir@2yY&=XRMd$!wH-s z4&%GMJ{-hX=s@LP(XRWKuA2tbiSe)Jm-Me3Ki=zabm_I>o7#20tPcnAg-@_uyjFZg zyUv%_4~OyHULOwQlls8pe?Epegk^p3@^L**&tu5?5bJlW1LvZ?wD#Nob4O*qe3*g0 z)rZ9A)dw$MvKs?8>0jHf=Sw=uKOb7VDL>oxmM{7<5qkamXpCn%KJoq6u{{}V`C>gu z@L}^E>#=lv;$uVGJ{fHJxIOEG*FWAb+0FXUw(ERZAH00r&#VKrf4N=f%ldE_-|h9` zAihEeD*uXh-M_34ah&`38eimmAAuvRA0j~?U*n6x7e3MP4ma0_NYKaE_+s(hULOwQ z+s57V`hgpAdpmym`GdIMN38$Sar~O~A@!Hr&lmL}?H^y`i;QQ=<5(}JdYz8<>O?b5#*7kue>alRYl(jK1nkL{8#=}tO6`4{6j9pCyF$NgZw zm?uIXVxA;E;U5!aeTc+q|M*|&9|KY!+V<8z#tPhc( zkFW8?;=8>*9K=`XK;>W2uKOqSp>|KXJ~8faJbm!-9Zw&ed`Hs@X`mo5yI~+|PoP1da>iL)3_4+CF!O3?teem%WI#BsnwCnz5ebDn& z=I7X}f3K45oln;d^>}7|@cPFcO!|=dQhVan`SSYVFutqMF$S% zi^s)yTI-|NEWUJjJU)M(%Yck$I)LNp=WFM89G7G+zDmBN4=rEPht%HA_tt*P+X`VjBiFvc(I!(n_`2descfIb|?cYA#}h_BFr%D`sy&b=pAALM9zIfxA z^r+?gv8f*|UtQ-DtCx>-f&N;3$n7m(Wa#5-eDU+~0g^AZ8+TFpQB zo7!8xRv&mjuYb{O5l_yC*GxXWo*c^eKTP@%?}Ik^bbq{jX}@;;klWjMGGEpQo!=V2 z+v~$&e7Dz!gZK&^sPeOD*W;Pj4|;r!c)l0!U&3p}SG4PV`TnJY`1((F;U*V=FYZ_U57pa1y*>`}hH#Q#rrlD`(; z%LDK6@=({8+}_T2-appCWZs*f_x}d-;kDu`+6_KFZsKeGwfy^=9Ut;HoBEmCb-q>~ zynH_#`F^BR4|Tl3-Y@zeF;bpGl3a5_E?WUCLS=4VuQ-(^2Q}TJaU_I$x^~PQH+Jwc;zRdNeQ@%<^_gz$FJ7zpSG2eDkNuPN zncLI9R{f0EUxw!T3;sVIiC3LZ`jeRW)!-}6Gb{g!cAc-S*ZKdPPv3f^>rvXT{k^>0 zTb-}1*U3)$TvYOLKfcK?*WbKO{Pp>bh z|3%l9=7 z&-K@u`Ip<<@ngPRFQdObzb>7>eCrVteygcxxn1YW{v5`)i+sC=FSqM_Z9U8XPyN@= z2h)D-?}Mf2$ok3l+Ip7kEXDK1Az7~HUuu8v?bbiNp531BFGfdR99q8EzdrSoU;TVB zK11tYYB%_5y5jf9_&BScq5tFGi*7!>o-O+q;~@Cj_SV1Hzk~gIe?0JI!PmC8e6c?V z^Km~DU;g~4ZP)qQdbS)-w!7n(1I{Pdv37my<@;9T^RJI0-!27|4dnUH|F`lp*U5T5 zGw)rtglam_g;x{64wj#_$~9LdKF(MzP7#fudSat zzZ}10m-qkLD=D6Bd&?K|q(3xYlHGJ%%a_^>z66Iu{YwXW`P%yF<%|2FPV-;lOYNy2 zt$z_u@PYoNdX|4bi{qR=510DRMEQKs>t9=!lYeb{>mT#w`swB4{dW9v?O%^EU#_2r z@!h_D>hn>~KkiqqlPR8UyAjV_N|?j=a-FRCa=Xr#>!+75=2;)(-`2A(wYPk+y}y}% zUwb>&nTe0><@T1Z^{4$mA8(D{*WQlyr}~-rQhUo6{kpM#IWA;5osWO*?bL4YB{&@F zUplbP7n?8IPlp}I_eXE1<7>V@GX3K?=kKc==HGOFjeeH#OzV~9`swB4fZQ8me}}}^ zw(H}U>!+8Gd3OAAi~4yO-|g#XOq@QxMm@CV-|g$?VSKqxrtyn$el)$ppnP6yuAhhT zy*Sm$nlHDv`NI9k=bH!e^=G;0oi*ZTj(`(w_jAx9OQ9q}8E%^AjTt6e>B45mhAswIc zGqoo>t$*B}&p*?C@pZw!sa{X@GxDc?3_4$~pNH}7*!=a)&p!|2J6ior;arI4(dws@ z?`ZYY$(QS7%FmcD-Si4eWxbB={Y22bVO-XibX=;Fi7y?V+S~k0bujJMzFK_gIL1Z& zjN|^bS6aSkzi)Zc|1G|Rr`OiM)Nb%4SiBya�dhuf-SRxKuyKvqU9dCj0Fhi!aql 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≤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

t*fI4A*P^)X^(ar_eoas1 z_rEA`+y9u)(yMF4c)H%^9oT*+&8Oko$rR`K486j&MB#d(Ujg5*WPByg@wL#a5YIMx z75EOC=ttm_l~$}5nFt(j%I53O1?KM}o4*q0=C6f*1pg4v2K7Afwb84aoAR~Mu;5=C4U73K4U_lmqrO-gwl6+Y!}j8z zs$oX`-)d%6d%|;bR9(YoZ)ykgYH8RS*m`?D(~o=H7e7zM=a0XiWEdZEccC9YUv+N$ z{kZrb+jh(YM~U0o81q?L6@LE?GUYi}CC>3NTJ>PH+5AR!ycg%T#~D7viKyjreM_w$ z@i@bW+B(a30InL}gfo0?v?|G$2HFw$5KoE^ ^8%LVf33o9m`$QO!F)_=PG;{25P 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 z z^m;4dzsh`*^%o|d?MEN%nbe2hq{_B0RbFCGK7Jl$_0heBp}kA=@$vHr{(^%l(eKA^ zz452-Wem#8^rhox&ykG2^9APnp1xFhnZ9)Vgq=}k@$Uza5rX~H!9R_Cum(T@io1Va z{nVrIB)cB+))L&%Uk^!?bM5o>aeVg;_`@5v{~DY(r*8bDvaq~NUpihZ^(^Xp*6O>z zQR;p#Kcvdb^rhpqiH~5OUBQA^&jk6RUaR(?_56e z`>(CqKA4l?yANZ$o8QaAvpKKP;m4P_yl}iT>l0?p+T;hs+GxEsE-%x^tWT&v-zXeL z-*<8T-HqSAxICk84Lf%E{P6S04?l17!`ra!+d;gJ%ggj}`Qc6Ic(c#%4SXz!*Kv87 zJ}y5z2Yt_3edbvJ-=1-KnZ7FdVb_0^^21KwL7jNL(+5ATksn-rHR9P$AM9CGU#0x8 zYahC=YWrYLCON-2;60 z1o8A)yL(Bk72xj%#Qb`Fy5aE#(P{|INq83K$x!b`vGo#aNEb_hp%n0 ze{1u@0~bm?5afrroNr&-qTfd54>3+N8~B`z=1S0g_R{Z}VH4EheL#OpyH!e@p2;OVOnuLpgw zXH|W5^25-+I{CrX$K?n2_YynYOW!?m2;0+P)@0)H!tu`J2UNVP8?jdW`vGo#aNEb_ zhaYW}`jO2KkKz2WV0|er=iBGLZ=3o30QIe?SI%pcK#N^TW{v_S=K`LtM`3qcM*BDVRTec8PnQ19R`QAFt!`!tu`J2XrhxCKn*qihn;~m_PXKC~_^M|;+OdppYUOL6^i)H2yae0|OE>!zWwJ1 zxBqJ72Uj2Y>b~=Xs}Do0w!Xc`Yqx!{XH|VQ@`KyH8u`K3$K?mJhsw_%;_|}r&g6&7 zhH&xohq$~uU=^2Vc`orZ1cYooJmP-9mX8vHx%k**i!JQu* zBX%EW<`1U4OdppY-1$RlKRhlk(^n%uP`{b}tCJrFeRcA~pbuvi@`I6~&{rovxca#K;LQ(kf2#`aZ;i_f$2*fBG$uQLz*vo+SJMJEf9UcueO!KU=MUdN zuJ}e~{$R>^eRxiU&}H+($B`30o|!+y;ip+}mI9<4as#INq83a0Gq8MU~i(ug@_W%{`M;LZpMgEA>Z_3--1gPT z557JwKRki){zPW}5SJH@cP2laK;KDb{@|9k$0wUJk)A{|f!+uA{&mZD) zzJ2E1a#r6(QeXG}M->jE?=CzGao3|>yiSyt>ErUle})bIbKieBKM(dF;_@6~&{rov4EpNi2TxyxcsA&(lOG0sb@IcYuTFk&^)dNjf8(8*KMo2b6{7W%_E&9|n8Y$q$3R19Z~<`QV_hPJZz8Rmcy6KG?IW zzB>6~XkVTD;OgV@!#~1!{zrDapRW=B{P_dQ!t%oL&g2Kebd}!^FgdUI_XE@m7r4LY z!pt9j4)cef^XCtVa=v}T`_j>W>-2a(LHo@58GK5=JJyfaae0|OE?y7oe^8eA{eZZ< zOy79C#=G7-I{fwx`M)nO(N_|$-+?aJJ$N2((ASrj=sPHg*KcpHFLL_&@)CV@;5B4mI*LP?7k8DllCH5?h*W2xv0{$}i3+bcs5`B;zZ6DR8@a!)?9!zpj;H&#vkG0GnT@!*5?)?&~u-=-vH(z~u$@1}Ovab(_QU8Oo-d`!OY8}MN$NYm z`?+%ZQspK3`1sj1RHqq#@pz#3g@xs1`qJ?e<6Uzkqwlec@b|J(3ZSYD3B_Jfezk3{(SG7q9o#K6GEz_Q9OY{gEHQ`1^nze@|W@o(1DQE-x8>6id_oY4&W*ct@;_ z?vISi%k**U*DJ*6mEGUGg|^;0J%lmnFc{+UjJ`F#*6A+;ce;JImw2a*%@6OvddPc% z^^mx{OdppYUPhbx_q*MKJ#Pj57nhgmlze@RGr|+On zyx!@9pSEfLjPt2K9^&${{;LwNckP2cYsAl;zDoIFr>|0eaP)Ec;k~Cyz1QZ4$1&a? z55{|3zD3{Mg~MG#Hs`IQkIfH|xytVckpG@v#QM1W@Wuvw-sXotL+t*u;C%^kIp4mf zL9<7GKVStNE0Z6(`(IZ$4)G;AY(9$0%k**i;RV>^1>1k$NB@04=)btUOdppYeg*n| z#pvt)?+b;)Z(m$qrmseRXm6~XkVTD z;OgV@!_Q#6|BM;$&0`k|$02M_hlyu#dEt0x<`0CaX-wUSwbA<^;_@p>sv zSyf-1{4lhyPJVFparxn1jQ4wOe0c)n{fS__$K{3NoyiaASbR)uMywV8et2Q09zb0pRCg=|TOX>(j&rjN@H?)>06*!H=APsHVA z`fB6{>OQ6KPp*?627QQU72@@v4`;RYRfyL^`(V$i`s(C|p?wtA_MhKfeO!KU=La9h zc>j1X-sAGZ@y_H2jmgF?j8*aP2MqHEQ8p_+hW@LQ z9|nB~RpRxa4`ZW3e(>~Fh-ZU7*t4p>I{9H}U!DBm>f`dmFJip^VrKpjmluwACO;fO zA8=76_T%$iznuJ_OdppYj1qqS5SMfM$VZTeMxKvz=MPVA;^*Vy@-lr~esJ^6&5QW? zxVXGbAD188`N6Z$7d{^smzU|=e|~WLuSR}w^}&z#9=ijL;EHCj-(p^(ujr`!+6Xs<0r``EM>iM|1yu_YpACn(|1Rv9Xh_%u4 zabv$9K>cf;fAHJK>!J}y7Fd?9uJQe0l9Z~yth?LYX=-s7jM@1R1wcJ;x_s_Qeg9JX9Xw<49lJk$59SZ|`1=ou@-lr~e)tmF_a$r37X8-- z>w|H5nLZ{zbbtR;;V}9A8R&b)*Ow?S(^n%u4EJI-9}S%S$7@etg?K&a zgFUP2tCJsw_EFrc+<)o$LxcGN4l~}L!gznmAMc6s!tu`J2eN^B#OQ0FukrPvEG#e6 z$K;3h>-hbEuiN`uy9W15HHT0@hsKa7=k=YPqTd$!%k2DNg*Ns3;Sb>XhX;b^AL8;d zeO!LHM4S5k{vSg34+DF~8p_+hW@LQ9|nB~RpRxa z5ANOWKfZYSD#WuvAM9CGU!D9gw69KnaP@KX2lsx&CC2+Q81Hd;;dp2A17SMr`R;<^ ztrxEo@B1&)$K(gxYl=0jp3grDKL4n%FD~cxnYl|oKak9wS^uPZXf4g?uCHm^bYtLUQ#Lqz=>{+A_ z?@!P8%Q^h%>5CG3mdESktUkoPB7G(C8t+Aizwr9{@{;z!oayx*=luj2?}^_J7~Wsd zmzU||_KUBb_U~VS&9Bqp$FsQH*Jpf$-j|2(Qc-L9ZgTu>xBoBnnfFnr^rgy6^r5b# zKJ$JFUSF!bL?6ZjtM6ds_ZY(R5`BDpiTmfy^dC3g_oEN?Ovab(_P4VBnJO=_C;TO; z&+KVk)AQSuf2PVy^zrcpdvU|>5hcc7TwbOx9bXVLcJJ3mEWVEX=Z*JNd6~X+e1Q#7 zW%2v<;RWISibH&X4Hp!DbMeKD=Uo5A{>!z`)rU5)Pgh?qzU)IE%wDy9)X!;t z7WdD)jc0*9tLlTlRMm&JR@Rq}FL*u%@%rO7e#Y@7RbDdws4vt0;=b>lyvpnyk%87rTDVb2fMcE{=1{&-PKoPJnZzro>lc#iZ8qNRf;c; zJ}$nTA-(~9cCBhp=&LZ^hxXNpFN3~1@nz6gC%(A)xcKrU;>(kn_!5^Fj(3K?5T@Px zsL8D~{W!#5!(Y5|{l02mU)#ctHTla4Ld~x-0@#UW)zWmcne2L2o$2${W;JNsiSYpm8whZw_V{YwSsiXM8>vP{%S%bd} z`s&1&L0_HtGU!8>RERI0z6$YW&{rqE4EpNCmqA~h_~Pp0;>%NrFHdFSOI%(!-kJEa zYSfk9hda#2Xw1?35^Jr$xcX|u7gryh?|VJO)mJ0F1p4+KUtE1Sud1&`d~w@XBfj|h zxcCzD6Q57SOPj=vaI>{$lFr%gy^%Iel~=KB{VK#TQp!jrii~BfIQ7zPS3x zu9fxeeZ0HvgFUP2s}Wz^_SJ|lzCJF#oS$M(I>TS$^1|`X@E3{+{qs5KWPJR17MJt- z^w%ryPY?R)#Fs%|o%k~7!&!y+;_0g}-Uoek;>)0~PJ9{k)rl{zJ}$n*{KOycae3i* zXX1;-#PSzY+VdB6f&X9d`i`9UE4CHJ!=SHDd>QoBi7$gb*uAPfso(d{mxlJ$i7$h` zI`L)DS0}!>`ndS=%qiZ!{A0T)$bKYl#(%gGNoebi?)@2_+9)rc>y zKGkJdd}80@&uw3g_~PoT5no(= zHR6k}kBcwQV$3|7;V*GH7himR-1;t!(US~+amz85F`jvS-urthjE6yAo%k~7s}o-a zePsCkk9SXBh4?b)s}o-aeRbl?ps!ARarH6rr2#*|L3|?h{1KIf<%Q#&<1fzps^G== z_hpQuTFd!^q~(b#1~Irh4?b)s}o-aeRbl?ps!AR zarH6rMLmZx`Wzo$66J;Cory1m=`6!v+;a0Q60eWmO>kau|7g%xC%z2&Fdiz5_d#Es z_~PlS5MKs;uxC|$b>hp=zB=*6)yKt`-^3XG%}jiW%L~Ul6JH2Z|Nb6yGCn?kamx`q z5I=Z*W-X@P{V#*QI`L)Dhw)G$z6|=%Ew%Mk81F;-V9%=h>cp3!eRblCr;i!$*D&6% z+4xfSK9-+H-~6Wf`|8)!)9U|H|C{<>asIUWm-zb|>Ny<$C;s<;sNcfzG_KL#f2n>O z-%&^IUeH~``&&?SaOnS^Vg~wT>#hOlXDShF=sF#Cjkv|v?ehdU!-wLPmUUK<-Sy-l zUimsx7-)ZLdJO)%!KSf;|GuzkFtlFG6Jv;dNBhgW^$qx7DIUiY9si8+v;gG!vcy-z z9F(z76+G0ID~+AlK3D25`f>rDNXIUo#CTc=U!}ihg$MpTD?Bjm%<%Xeof%)e|CmvC zC7*#!ygV+(aEE=E<_cFDQ%)qhLL9zc8w2%&zIVm0&k`SrFsK9FIx3@M7e|8Y=n}(M z0uDrcB-BGX6M9g^8%sKj4UaEK&e4}Fm+4J#5ZyX=KG?2-ckSzq%Vl~KyhH0eI}E`eLKeGlJ-$Mqw!`U580tf`Vdnt)64OR7UQS2ze8pA z=>7J_*~nh ziDV^s&|jl?`abIMP=9cEQnC^}@aIuH)`xfYA>Zckq+}&{$UVpV%Zzb%Jac#`7SQ3! z%J7u%1{3#;4ioQOJU(xTWo39uc!P=mw#^ON-}rbamnqA0Vp$m;jyIUxXE2zYx5J=E zeq1im3%^bC234BRTiB&-apd>`@r;HJhbK7Ka(uzBpXUq5FiXFNe!Ri?1{Zox0+Yn$ zc{_!AIlh3VW2~9}X*-;EzTUW8rkCRjP>UO3j9#_Ie+Ew5Uk%D-dQ12Mat{>Swj(~Y z8NLw9O7OsU+VOaX++*>)v%L;He7r|dBrCxKJt91JL%tMGFDt=A?J2MiLD+c*o$q`V z%3xzXAFw_}#h$DXPeK0CHfddb89XiEc(M{annPYGXWfv2@Ts`E$V z`ZLNJI&8d*WMz0bzToZ`9WNDrgL;QSdv;td(F?y#@db(-9UVb_x7Tv{eFdAWNUo*9 zhQI0c1pkft|>@YwX`2-yXV=ODdLw+_E z=g{5lcKfA5Jh7|<4+YT@JS5Zi5xz6@QDh%epDQcDLv1g>1F-=Qo%8)grM|2Xk1D{^ zLPguRne=7wM6wb*Wcx8ZC?_4dzo>udoWqlnmEeItkK%zZKMx4nK4W-NvJyPh+%fwo zwE~`%UP~CmlaiI;Dd7>vYsA2{@gKtz-2U>{9b#D-o)R9h>d@|v@KC%$-+BInvW5#MY~cwLf4EO-+66TCeQcRb9#(Fb@+bQ5Mby@ z^9dB{^;xPrvtJR`2R~tW!?h)zf3dvb8fp?f-;r@QBIo>_m0WhHoM97gs>1>|3J z82b|!SZh4^3q1a~9g~&dA-^oa^B!OzZ1~%b;R$6Wcu;o<9)h6p=o9?2^VQgvTEyB_ zp9}G*68oUy*42^0(}uDVJm{}cJbfSac&I-(JSkZT9{A!Y9_zz9`;c#Qcv7+wJmj9^ z{bk0uv5y(g93F}VbhxrIJSDur#66?K#5)&{&l_S{8J-f}&~<2YXWQK1ym9eR%z#VT z@fXX=@Nm4r_jDNj~4b%bk8x0l+9GM}B84M7C<(^$fBd zeR6yutY5KwLH9*#?DXPBsTTvjV0DpkP)0}2PO)B&FSvRyJAAK$8G74kZKToQGUYP8 z9A9wtp06=B0=__6d%dPyrniJIxEL-GA1*U|!Np@_C3xUhZRA&|fc%XPV_%I&+j_hG zKJf7I9z`u3^u1nIf``Vw1kc|x`e=w4-$-NEczRh09%@S=9<2lN`jf$<%dK7Yxe!l5 z{xKL_9T_|=q&@5sJm@bm9`r*|e?d%t+ zT*9Q6g?Nmt3{MGP&~TJ#^Z5cXFtcCb+Q-Ps@RaZc7tdt_`!udU)BowPebhqQ_LsRX z!^80f)QXSM@!}GBF4(V#%O!f@w<*3rRp^gAzpGPx@j`zY#-dmr`5_pBwOKFL=U4A~ zz8$_Eo=2=;v(;|Df)oN)uMaBXa+zM1N01#(nRb$js9dI(;}PuwZfMsXpambly>Yor zZxN3mm50f;LmBx59kx7@mEb`=ZRB6E4tl=Au7hZk3^pl{mEbvm@k{XB0~m$&X+v2F z9;hk7qm5FCCz2K7Q6=^v+=Y1BP*#Em{WXdQ_9q=h{gslH;DJAn;(;$e4>(2kNy$p^ zP}2+g>jv=LDD1CDR)(j9N3?6;UUPWBD-eI4w(%#HmEkGk5f`w}1&_ze1(B=_562@` z8>Lp8BnIu-ak)e<{5HiS(qksb|2aK0KC$Nxn;e}|(5Ac*`6Jbb!jkokus)tQyt-8C zRm&S*h3#Gq)*s?>Nju0t6YW41Xy@*CUv#@K(Cof#$#R)qjyK#~D0S2FhMQ}g2kQ@U zxlC^fZ#Y6zk1TIEx`Fc>yS76a^*tTNhhtd@9@NuD_K$SXe#Hkh9{dF!hf5X6O7Orh zi}3t3Fi`vPw;jV1%1ZE{?h-r%Aw9-p`$V!rJgTI>prlR4xEN0x%1ZE192vvY_fe0B z`h)Z5l&k~~{CO0Q_2Hd;$hSE>DOm{~a?dgQ(DTNZgUNkHhsk+63|ezsF3}6WP4kAr ze2)BmO1@8jGyGs{?~Q03p5R=|-GAxV4?W5I8~pd8n0I5ic1o4!>=d>O<0;7(D377> z)(7I}W>e)dy&PX~?-yRJ72c2HwimwW;4v_E5xJ5?1TFC z$JLR+6Uj>OpudXnkX(-k{gAVd3S}jD;Ll<_@KcsAka1i*BrCx~-CfdOgN|c#)o~#n zBP+vG!WXF3{WE5(g~EICT>tU;LM$u8Q^FT?%d4?}Ls_gw-@T6oVc;K_6c;L%70AXjJ9G;Y{1P?WRyuVI>=j2A; zUpYJ^7s|@;l<}(EY)c15)+eESwJgBFQ>>ueMF0jye z@E3UaxKD#Rl$GE?%q+rlFBDPx@wdgP;_ai_P*#EmRhQr)2pW$*!9N*1TEz67krv`9 z$V1vDt*ax0rv(a6R)PopHHxS2qaF|S2ZtvmE5QSQ9>rsQc-Lm~R}N1~R)UAzb9{W6 zF>dVB07}E+LD>yDTv-{O65e3qp3!0AoogSTH^j0sJSDur#DCjnofmvOl*|0zxcX#N{%* zC48Z6(RLfp&TgRX8NLw9O7N8M1(Lyd)T3g%{U^Y~$NQA51P}60I~HF_hA@y%zTckj zd=l4aJkUYqDOm{~s2RmWGIW?Rf-`(LJSb}EaAk#f3i1y$;N$AZ;E7}h3Xrwk~0HoT01EGI&~8r}boIcuM$! zn}2UD5Ce1j6;7@;vNAj+e1Y;{f3G^_kF#LE!dx@`8OzG>aD2h+eHa~wkHUi=-Hj>T z8*#ZrFZ?mZ7buP)m|ef_?pF-ga{2unb~?X6UeECdjI~le;@5|Ine~NxVVip&HFk>c zZ=kZUJa4B^FUJ?OoLyfqoW$>+xLl@};|rGyJlkW}7glQ(-QN(G%k-A;g>y9Z+^#R= z?{6TvP*#EmzSoY&Gg>ov+O99?-wevd`$$%T2f3mM&j)Ny>F-(C`397sO*_6o!8MeX z;Gypq*au=mj-&Go9xC4DA37J}Q3ZHfRNMCXkaT45M6wb*=&w;cus`Y8wK;cxLrPYH z2Yo+^2flm*aCY{|-QSRsmEfVKkN4L(@SNKuiHGhqD>%khKT3+$;_esFt@^I$z8E|=*|@B{5%*Whl~EGM{j1Lv7FgjiOB0e#R$ zG0Q}69F-*yZ`C@aB$x;YG_)>uTJW$h5j3Na|o z4yd@@M~)B2Ao?PSp|^jJfo#2tiD)G1+3~QHti%qeD~SOAtfupK<<|A z3o{;#9n9F{FwnTA!QgxIArgkkMgs&klpe7?(@*68?k_uz4Cjv!L8bf9dz8@qJR) z;?RSI{-3N5QlyIx2fuDXf8E7Briahp?)?-er?~%P;8t2&TrSg_$lp%eOh2t)pOy6m z)xa{%uFVCqGCYaAu61mG2Lt4H44#L8=OK&d=7OG&^zr0nWq1<#UgP-^?9jiFz| z;vs+XfA1?v3{QevXgt>er@yBPPKJ-cX3kyzAvs63 zg+%Mh%J6VJ!#opd>OF#ej)M7TTrSZI{Ar%y*kadaun)q~w>zhYe7@%+MAqp$SC1d2 z4-5)(F2RuGCRBmOy8oCO+64b!U)?4qPaFS;^OMXzY0fgCecCzM2R=M2JUPxnea893 zZaf$GzR-VWWgi;ZbMhaKvrIL<;Lo$N59}~AJZa7{RezD*Ir%g4>FJ#Cz@K9-QxN0) zct}wLoX=r>`534ghE3wZ33^6A> z@Wi>{QFF2n`fFBr;Lo$d1NWI39*)15wPq6!-Q3Y2_BGy`3$01h!O2R-JH@@UKkGQv z7#)=F@S{RhG38Voe*DSH%J6Xf#q3WQ4CbBK=KLk(j+ch@7mYD5E5QSQPVyJJPKS^? zyoSDnEt^KcfcXA4vc2XX>H9dTuZVBZU&}?j`gkt#*r`&Fof><&@BB>JE-yP`y8sWz zMeb>oy2tv~3uw;^{r<)}_N~0E3=hXeJ_oyg&W@*F0iIv!xe>01V=pf&!!tP-@%jt? z*hc^O=ta{WU8*)AJACKJb%S*$3VANZOxYK|Ji=59r>1Vy++Ji$lK1 z%L?Nm!#}hg`?U~g@7K}Ibsvu_t8;B@xPiGY!^829w@;ON`_$Cy-fLp6`*`xQ5;H{2=CXV*UfigeMjYYXul=XxHuuZQO)AKEDOp^dTQHJo3w=VtwAr<;^PE+;F) z!|@WA+g<}N>F<$Nu$zBhEdJZkVX;TDGCUkFQ48p`yyTamG!%Iv&y#GR}`)xeDg*Xts2MpKFEw_nf zh4GMCM}cGEWANy_YWYgnP>yxuvxyN(3r-2EMM z-M3?2R?pq^mtOQSzmx%a+ z0*6xIN%#OH@tG)|QGEbKy6D)oCAgl)?d#!r$!9i7ea7;V+rV|(^0(CfPF_}qhvOwK z=WT$ev3OJii#0o2kTSFG)EVE3Wo39cUZTKD`gilY_bDa!ce1iFJX7-$-+$nT6X#tY z&%xw8z{dk0nU#HLbVPAQkC|FL(zg%#YgTyR&$GfaJumV53*E)=lG_X92+K=8g!ud+ z8=uc{J>1{P%L?Nm!%H;oQR)&Y;C7)d?^;yeHj!%(yEwCX-Uq&**G6`>2(IV!(73hhI{bT6Q32_v!}1op7Gu{?+;Zra=!5+V_IXzD z!~Xu%FK(3jVrHKwmX+b*c#CRasK)r=3GnpK>Rxu>!rjjHqzrO&aI!Ky9B(oF#OU}4 z@O&gQF7mQ6Jk#=)guk}YxX^u2Cl7{r@c&uifgjEdkD6J3%?i)dye0JKsd-C`hvO}V zpO|>~ix*1$VjmB6EcWAbURD?nIo^Vy*RP?t`zA-H$hX0}FCdqZmEqxdi;F=+(`yh) zeR)ZTZ=bxZ1W%H;paNVs9KxI%ZlOFrVL3*gPk=w1(wL#Y_&UGd($@`3=ihDO*N1u; ze)5ftQs1!aD(-%dx$fIDFPpO`waaZE#^X92KV5F@av*cv$CHhSH*K2!6P z7!Su!+;=#*`#t8m9}n}g!g$E=6L;;xCC#yZP=&3|MRV-Qf~$OK6zOQ9{6+2Tc`qc z4o>p4|GxR)dS1^N>_{;Te_>4GK2e+_{)0lzdGz@nXQ! ze%qd#>wsc(6v#^2hqkWMcwA2WGWzvp>u2V=k0&oH!^80swT21S#?O8ocz)gDG1q-O zd082rsdFCjagotpUU&H>DIA5UIZhKJ)Nf3;NVuk3ot8#sT% zo}24Fp1iCCPm-5tj!?=M&SA%M^e5IP0P^bm!>^C$9|y1FE}_>gj{}DOIc;-qiEppG zY~EfW9*%#w+}3@jN5M8KSQp95%J6Xf<9H3*S^nWZyPvw>Brhw&Gd2J4`)hjs;o~`& zJm33x;F}Zkj|k7i`OL?I{+bn@>G_9mpXvEWh==1J4}yO@X!(cx9;np)CV5$5JY@KX z#%=ir<h&zSO@U1Ggyo&mYtK9|C~{pc_l&R~Nxk7ta@%J8Il z2EaJK_3gg@uvue$&-+cNFF zx3||9D6;Fr$MBhBI}bB+AQ#V=tOU>0JR=@o)8_RM5BiJc8Fv@<7ximSR?=U<$Ku&; zzhv`h-hT*BPF8{kbtUmo{YtHh@QlgI@T7SLV%+c0VPdlTe(V$AJZaqVH6|;=lYSp8 z`57GskIs{Jydz&CXZm>ZvNAjgo}u&NwGH&zy@L0HbG-l29R{XcqL;!LF|y;oNz~Sdq54T%woqT{NzVXP^=)qhr_R;CfCEOtBy?p#P!*vQ?zV(P5a4 zz1M>D;O^eL$oBd-1XP354s~g66V^?7QgtIt!d{KF-4~WheZj7CnENVr?V^T^$V%Eu zI2k+*^w`+l;k?hgO^54UfF~;}!;|JB^gG4FZxy#|ZC`DR70y@Q*c+3T;Yo851tZX5 z$54m!&YT-;zJ2nt56W^Fq{6Ritp7EW=KJe!x zZ$Wo7blhQXf#*auXKfTZJjrXoR0tCt{BtxKTSxrJuDy8m@|@*c;DFzu>=wGFgw)%kexvNAjzXZhQ}^S3RY+iT1p>^f(M z^DbCx$;-;{OwL)n{(|qd6UPh>&kQ(=hX=!CR`vm&sdJ!bpBZo#4-fo#R`!_zXYuR< z_hFu+d24~^RPB1jJssAUJDU#?4^q>JRK%OM~dCvSkLMvbVXK?gZtguLPi*kJhXD`C%jWIow~yK#*^Mf&ALA=+2RZ9k9nQP% z5akXx*V3G<3=hXcE*IEiwd2mc|K!#hzndA1yS%In&(u7`@2}~3h>r((ZQ{J|hAEh1`75 zz^2V1t_=CYmDRbnwYfvf%J6VJ8MZHdu8O z=Rq;J^$;){QwF&$#EfmB#l4=#?d#!r$t8HnrR61;u<50>=?Sho_rj7g$mL{ZcsO3- zu8Fw&jKtym`(ojDYdWlNEpTr6gOQct;dsd{)O*X;Yq*Hf7vC34ayeNUo~e0>??2?P z43BKkFMV9lePsJ%O?|WTU1~h!=rHA`k6c-aeGX9hobaGsbHk(NWFPd`tnk2}XN3pu zGc!CKFEQ^qGvoID4(~kc%=tOS`*|?l^Rklh4*M{?M8_!`Q&zyUvUuQd`1tWBEvs`e zWMz0bUZR$$%HGeZHaNHUq8y!i_sEhm$kAcrVI(WTgEpkrM-h1 zdMM7)dH{|)vR)F_$MX`Gv)vCn-EZymS=i~b!FowvR?K!VL(Vue zJZesO&|kB{1Am?s9=OlU@Nm4uT@ya;kXL#hp!ZMwc$k+J#zTgez_IW#xn1W^i>GTS zm%4aN4B=&EcsO3-?kPOD!Mj>4FZs+;sm}!KC3#s19^xI*cqje=X13!Z*=K4lVK3q! z_c-;Bm8At|8l@T^0GO5>2^8o!zsf*nhtoZ54AY&_iK)T z?I_?Md081Aj(@zefKBYWh`V2-fGu37$;-;{Ov^vQ{+gP9gm@^HMB|MN4CkT4&NVum z_rA0ypTp2{_+nmG)?c&3Gig3c^w+HLOwB(+`@lD6WgiR^X1~ULr`aXORKH(?Z{XvP zue_{md~xd{mkrs{j(3g0oSW-D9#6J~aO=v-@NoR&Y>D@0**W~p)8X0SFXH+a1OAbh zmEgHL|Iqi0BFEwbqoKZS6kmzY02Gzc0kMJGIM?&IeLXxcd3K}JvzC`U3)?+wZF&NX z;eJhCR)&Y;B`z0f8@NvIa~;gk?QB8Hz**=pz7@;L@Nm3jwNPqhdC6*xbGt5*+ONsW z%J59hOML%L503Xlvyu`-?8_dc+z@ui?U$epkf1VW{ zxX;Y+aJ=NCq4%PhF@DnF+{WM3eobCh7!SF15#;{<84N{v)!uu6GkpAfp~tMfA0d{N z;o*46CzeWm!sgIVY;bOKYihqHFDt0cJ;9b72RW+!f zqg+7G*&uG?Gt|fP5_b>g1=#cjYtwJTrr!?MOY*WgJH~ieUecfq*6&w1U-e@EJ{R(& zHY+Q`!|@V#55{m2GbYX2$sw$q-mi&eWq79LC1HQTuiGi}T!;t%pA{as!QAkunf2GK z@W7vEg$M34GdvtGara;z?v#4i@{;xuwBZpy9_D3*@sQ&s7<&C4j9F8+@%c1y--gbM zw)}$fqbn=J!|{@vsJDM!=1^go~o3mGphvOez2O8D;G|u~Vj|SM9 zV813WE5pO_k9GkJiTxUL57!}jY~UYxSs9*b`A67a@TE5LZ)y-ag$^^0_qi_O`||-h zWlnftgSp|EG@ph3gZ`Qo9*T|g@}Ft>N7!HJE@r=`X)xUFcz5?}I`EG!;2(KeVLW8` z2l6FyosB<$-E$Fh-H*?{Ect->p1Cf=!|{)=Eb$(-rK#85ulX*ne>dPCd07b_wB?HY z;{*GOx%?i)-yu`N;<%4N?QizA+C66~sJ#Kl);~maztWNFMknc(Um-zjK?qb$Uey~vL z2X>xz*5O`G%S(=N{dnQW!@R689x}XyaH~fQ7cpz<_8hsRIrZ`6Wo39cUh-+=sZZN| zp#Qj0>OWdua_}fta)#gFBV~}w$x84L?}&Jf7GQ`rsSPy2zWb z(VNyr3g`WE((ecVcz?h@^0Ik*`Rzkn*HQa)pB$l2`hC1rr*_YgU&Hll0sqL$%J6Xf z!;CBA(`JvxoSS>N&{Yoa&dbX1OwB+1{+gbD_;?N`&-XqaxIvrtXVsvr=hGd|ZM<&R zGzNVC$;-<8XX8K~ zA9-1sKXcF5kR8wL{F(A+zqf9#`{OGwE5pO_kIN<2^6eb{64?6pc)bt&<9z}D$jeIb zT%CWM11rt(v3CWdU7dgU_3`}U#~Y=7Z28BJVY?q&+okRo$;;;L72@Ie$1&N!@<-TW zw-;!*EllI)`>d=C563^$0xB)vS8JTx@n*P)k0&oH!!tGi@cV0e{^8>}m^|P6c;FWk z^N$G6#QDs}gZ`Qop6U6AZ=dP;M~H{xALkA7l;t1i9nLME?ywFK-Y=4u6~;qm{X^rn z{Dbo6xtBZq_?(xO;oRKH6`%e}7JWaMfo=@Dpfn6-;x_gQ9<<3`(U83^9E+cwbKH>OB*I_JK zf9)C?S33+)=KDu1E5pO`31|E~2|Q0)JZ4SM$K#H*SXPE7%_p|of7Q@o{8jsj#nZq( z{_i)9$x86R)?B`P?VUnA3cov*la=7%_yppPh@o@PP ztPBs!CqP^J`6qe~AA`r7`*@IA2H6%8tt%_T!|{nX!DHUE zbKo~Ga6Zg|HL|!|q8IqD#3#_?1?7DG7serbT!o*6^(FZPHBkLJbpE{E;e{2+si=V@`Nrhq>WVbFvTmYgTyR&$Ge< z_n8@Z(8=tNnDr8a!QESr*HNerIyhMw zo&?X(@$lD>H-F9YjL&V9`kbAs$LsDSmy?y?xjO$)4Z05fiTlRTi46bHJdMf@AaobL zKr1E({(Ie#FZKLauaiKe!O`{g@;v09lSGQQFhe(UF#XwPMHh(_u5Ydm>b86J*@yaBtuVR^{oz_WW^40z51Jb76eo~e0= z-(T>(cG|q=<2it1%n1+Na&CAg&TCPB%?c0vc~*GfJ~P9^@sOiOa38;YF63dv!~VTu z$B2i=K|IXM3gaQeL$sgSxhmy5e*YF_z{u~_$?$MI#J~ zu+>`>H)h4^(6H5_m(^iJP!wW^0G2KQ}Y(Tzu*Kk|KL!{1$Ne4| z)~sHzYgWO%tz;O;lS@U6V83=hXe9$PE*nB^ko zogfBJe4i`HcO>?io{RYQfgNULAL^Ky_1CQMz@KM@ zXL>FY`7^VIa`yuBReKM|S%>=sY^;v&b0xW)tYo~yJ`5MpxEm9bSHQEfcxVLZM?)NL zl$O;w7qT)u92a>4T;vJMMZS4~dpPZV6u~{OqzrO7SqUDrAah$i&B)4iU<9qM6uiF##?cevZU>vFn;9YqPt+PQtc?a6LfGfvIZ^0LBs$nX*%#mCNFyJ1Zo`8Alw z8k_U7GCT|~Q8yR(oe#^~+&zcHJby%1f+xvKPyzUYd44qJ5xeU-J#;?}%-ia}NWRc> z#q|=uK9-kspWP@Nre9qnI}VQ<*fdzb$;-;{Ov_6W{y1sg4e?NnN&8Q&J@IgS%?{6`c`ngkv%)hq zFA424H7|+raJ=NP1=fUZ-gW0`=ZJ^rK|IXM3gaQeOK2SS_o6EOF}ciKKg5-OPH)<{ zlWkGdy0S7n3@>RuyHq$#z3x0e@!ZLXtOQSzmw<~1?vFi%JuYzQMW(Cs59QUz^N%ls ze|*{UkB=>t`k1v{g2zEFC!4odh==1Jcf$sE+chrLz#5I|%MRz^eobChhKJ)HpIhUZ zFUvpf@07aVa--BdATKM!Gd2J4`wRX!alZHQ98AtXd_3^eS=k48CeHW1eb8UC!ZSVp z@a;1_{|NDL{NtI0QqNfa@oYD|=Pb2OoR<~GLxz87-1Z&=oj?2BK|{dXQ^0>IC$h3K zJRJY{GWf@rZ4UkTMyZe6+?v>DfLu;ig6FFIgT^QQjtY)bGFp;<0Fb*c1F;>qbFb%c zhk96E;_bmavxLuCn?3`ZKC^Lk)4tBIw-d|C@Nm4u-GgZwr5ejinhxikk0&oH!^80s zcMryWUik>vjv60NURH)@T3! z@l4H2Vmur#ara=ZAtqn5^R#P-hu4C5n3omCLynigv-&+4omVX{L4HM!_2V<-GO{u} z3@`EaU_QA~>XVk2d~%8NrH{wm+lgf*c#^yX65Q$BF%#PaqzCB8Z21Sz$b6cnR_)a*J70$0)?doSW-D5AbEl z2V7Yh9)_1R-(D&lre1fy=5tHf&F3W}vJyOK%k{{gm4q*xz>X)#z3m;^ukq_cA2Iv` zzjN2UW%p6`7;@QXGY|J32to3QpO+#{++!m3^k?CBA*&&&=~R9iFf0?DI9BLQMXYRXnVd~1nwe_domR)Poq z9IuO@0$l%HIubl$cRjD?40dc6c)pwGE28xmzdn|ioZt1j!eRRLqp;>sOTw-}t;_ zL{`#1v~``1;~&4kJwevDF5&l=*6+>vA)IjFC3#sH9*&p%V6D^-EEhQkp7S0L`sy;^ zC3#sHo~e0>??3SEiSw?H2YGH*c;J?E!!vQ-jrwa=c;L^o!UOl286J+8Y!LT0cD>{n z@$lHj!xtL7%PQa{d0AmRWOxbr*_mB0q5RqZ-i^8L=Zn0o3=hLgj_-O@;V}91XP0>Q zyq)L&C!GH$pO=itO7Os+V_qWS3+J%oIdU)dv|u#Uw~g}i73xF1>HV7X_k(}D-|~+? zhmHQ++UwJs=zftA*}T2{_Q6jW{_zZK@Jzqv2AlNvL$~nt@P3iJtPBswKmKa1)L&Wt zaSP|S?0M>bk-V%7&(!?G@2~0khmYp~&Jc|cGH|v15g!lq&JEAR`OLQu`fFBrrsp5N zec(Q`vJbk8Sr_>)3#I;xAbBxK#@T7Uh?)fCD zOm%BI42SI&IQP~$#$;u9IG$1M_r|XWewWOnW52QP_t)%Jd@_FaJ-|xSUlZ!YuEE*p9t-fla<&9_*gve zZ2whb#`rj%oU8;7$1}FTLPrUnFIn&3JmzCj3@C-#L{>O$6gXe!NaXzeVFy#`x)YfQzm0f>m(JyU_ zL;nshzEA4#e|%sZ`hTK6blr6fwd>shgmk_I_Tk#rT+{E5&)3iMi<29;hv$Z|)5#L& zft})V-%ewCS$^U8i+Ubbc-~-8@E4WwmsnPYhvgUUcxtJy44%>P1lgOOtPD?@U!ap4 zvIAi_Fn(ioXnTj_dnaps%#)Sifo~=G1^F#uD#7E*UKJ1W6^jRUDaO;wUKJ1egvEm* zjVGn!5MS*1GRfs+CH;kJnf#g8u`fL6uOyy#w%3C;_s=aDoGzYNwjYZ|R$?Fca}p0= z{sX@ccs#M}yT=2a44(EOls#l(4&{j)o>2BGcvyb%HyH1K6XQ8=RPdfMk{e{NIoOS? zq`zQ;_ zFUSUn!`GXD57=uwA0WFD2he|koNScf8^|>~o`Li7`l#-xK5DSKXGw>#(;GN{!=9V# zfa1i(yll>XVf*m^bsEoQGraH4tbrM9=DLq3FDt{7<{elc1fCad-dLfJR{h$czV746 z%gXSic?awUy?q{Yeb`+0@#JMCc;Jt1y1!fi%HvJyPdGm3}ifx}$T*p0)Jl9k~}^A5a^4E^LxW3ZX)KAya+1P}Z<#YY5uL7`t& z2V1T)>mBd9KAwMcr% z%^u4kj5Lh@ysQil$3I>Go);{J7WYuM_8#ibD;wcW-zR1hU@NoR2y?|cJKUO$j+4F}t z_$~Hf4TO|IE+;F&a|ieb`cm&BHVQ^Ved+ZNfFfOV>}(5Gl3xpy*&?-%gK(|F2KWakwfS`v>2KOZLof}!uhH>L=O(Wm6w&_VYo<( zy%rqCzq?1^>XwUq3V4EN%0^^mcuKekTmY%ojy>SXagkV7f(O3WmgF`(7_Q3jwBRDX ztOO4lUW5nsDaI4ZO7P&jg?P$x8>(yRaBV5Xqe}WK)Zve>wn4e|{j1?2M;*g+SE9`v zo|LS_KJe#JJdk<5)IKR$2_EPf#RD0_^StX5oPAQVGCUj?c^W?PwDpM&F}<@~By}%o zURH*Ozo|`ScC&)Qk4}GV%PkSXlN%ohYza{p8-_8mT za^S4+z%BQH=PLd)&JoBz=_t&Bk*vgj&|m6K`g7`@DG46<^Q`coA7+M!<1Fts9+I!U z`}hOzm$mrx{tE=g{&H-RvqPo9G^kC z=1JcBNJhDmUpLQL4F5BTA73iEL8#c-ppLj8f_@TxV$`SqUEU(E>cQk5h^#l9k}0 z#+2ZJ&)Ct}qHl8RP|}zh`g18BKQ0{t-<{#$5gt`$pE`KZU!!<_O2DB~vJ(G+Kab+s zZr9JlXNovoN>+jgdPebJo(?=+;W|q!E5pNa7PG!=W850?(B5-$j`4Ng`2L)imEqwy zi}rgPb61^0KDGG*9)}fs9K-lZ%j*0KIT;>~vzYw}gW>TF@~K^O3GRC(W!T4{gOiou zK^u~sg|5>f;SLz9Ev*UR(DP?}e;dUTWop#6)#v>EuVH=g8Rq_1!#RvSt}XE_l;t93 zZ|o2j8~QRYo3mYvhvOm&{bQah(Y6TgMe*_EWo39cE@C)`u}`xAPqJLZ?5+BE^0G2K zC0t|$v#ttre=IA(1AlBIf20Zme!ks)sSpp{|LV(1@Q^>1;30&j@7jj2`u%0D+444& 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%0D<=!uR)2W87=sPx9nh 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

pK(7+XeN*`)lCyrg8nN$?3!G7=wd+ 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≀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

p0$&-@Jt! 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

F7`>?zZ;ZxE6=|0`h`qqhWiCj9^9)X2; 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

yYG8oo}5HKL?ug%gUGewa?Rs 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 DoZ%TN literal 145936 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 K`9%7e=l>6RA4Ed{ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/normalize.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/normalize.bin index 434bbe2dd167c1dbb06074abd9e357de729a156c..01b8eab7003c432332ddeeceba7bf1e750910c3c 100644 GIT binary patch literal 47608 zcmeHQU#J}Cb^msCC2m7$O9?3O$wrV%B< zAgzc9wg@!%J!vR;2u<@12z>I3^HW2zf9ym>^8>L-B(V#15MN&iBpPIcL7} z&CK4N-O_f}p1X5b-}#+$e&_ph&Np*+KI)wND2~5#pL9F!3+^A>-?}IL*;m|G-B<9* zlm7i{?vgu+b~%m#9mAo^^DFpuIzC=}HpDv}1Nzl;v|R z>kd=?esKK$!P_`U@7u>Ok3YbnWv3aaKD6|rZ3Y={GvicbrzySn^DkTlj|0;Cetu7$wq%kzDY0RNPiKZq+W2`sF&oM z^fFFGFNwzEk{Y$s>yDxqJmHnr3yy0070I{JOE}VB^ov@(=!>;_NxqFMg1zZ=97HXztLW<`HX{)NuSRV@itBMXY}=}IBMr+l5f(> zI2FAl+OL5`3V3c>i~2PX{S{ovdE@`<8W`7upF|xP*Mr;WS>>2JHm?Wq@l1}{WB6d; z|I6`{<^}pB)Py*hv}ij~je}yn`_^lF7je+}#kU?m z+{J-YWux=!v0}kBlqhhlRA2SP!d7-{;jRDP zvX7Q6BPqjRfv^j8hzV>}u}&8i{KT;>cP*HDAz=p*Kx*5fhYwezvWO~;Y&7WI*EWgPu*Y=~oN zORN1g>KLv1YKfcnk?dRE$G%45nuCHb&pCgp^ogt(+h!a&&#GeeHPXo=)kyKRq%-EV zqzMLA8K(`tmV{V2{L@6mY6BmJ>q+uH4EhxJs`+~o={ie$83;~-++-%lV~rlRE4n6? zmhso6ST6Pl&Y%4EuV%lGgZkdq8`;4o4m#g_V?5fzLFXs_^B+flj030O0LL)+4e8tX zb!PhQF|s{i`n?jZXM6~Je_bGrO)(&RgP#hvv{mYX&4<7j*Vnw=8Egjj1a|A|VxC7} zr+8pI;)M0!)Co?2?e|~_-{kwpJJ$}shl4QW`S*4<#y`eEpa0iier7!UtIvq*Bh0tQ zhTS$ca7V!OF_YN9&4BM?oW>?j2;b&gVoO`49@v}#UtA-q@~yAYG2aqHVl$rP3iJrR zeJu)`6XO+)@7>uv_ze!ixOeB-!{6Ybb9^?&zj?m@`qXE~PvgMH0^8?ebp39Y;u}~a zV0yl_p3MySp6?p$39x~0^DVKZtx^wc&VXOTx4vG;e5ZI|yuel9t-{H)seiw*_3%}U z4xhtKfA#F)(>Mt4>0fP*r#R^RU(SDae2AlhJq9-L(|iMK1WeDj*0Y%b-}9Zu_Wc|9 zHs2Ck+A8(H<_!2XeCxWL`A+e`c*F_ok(^+CSSjBDe|3BZ{MGSI_|e)40*}f!=J7_p z(YKG>zXN_dzO|lq{X5_<#<$eN{ZaNoG2Ul{e^kC%kH%gt-yb1 zUmf28e|3BlewTb>J!r)@*4iWGCjq}b-=&^*^LM~soNv~{{ZaNo(f_D!T#9efQ^8&- z->@C{tK&Q1ua0lRU#5S@eEWU344h0-^EYaRJ=6%k=1%4LH8ly{t1wGrm-UX;)4JXP zzRh>4-jRB^KB@FU<^y&+b#KH5KA;Yp;(_s~4eP03kHz?zSh19KajK3@*W6*hKgGAi zmgfu9^RVCMTjI%@TYk>Y+^G9BnC}!1j7NO49*ynq*<>=o{Tuzf zk#F?vBlqus-;Qssrybt`e=)wL9_B}KBF6iS@Q=zj>(SV&w_XPP#rrqw;qhPLBm*fE{68c7W%_r_ zcfTjva1ThoCpy1hjrt(%x!V1k_atdR_j{sY?_BO%@*X1bgL?zp-otl3#ka)%pWG7- z_lrL49>LCG>+hmGhVP>M(Cx~(jOyDV{sTRZ*6{(_xc&UY#x}1TIQd}z-CM)_^ACOb zA&uu=kMQy@zwr4NhF+r5HnuOn@zd}BbeMnt(>Fd{X}cfehPL!mwSCdD_x?}r{$!Zn zJ$L_{YP;`VjB)SZx(nY(LbbhS;$C;ZH_YEZcVbty-FMew+!Oon6D}lV+x(l0;O5_K zi#wQFxP#|xdk3m+@qHx^_L79O7fYlOHe8~6T4tp1Q6i+v0Hy65hHMDeh(2(H^`jk|5(-u=Y=PnhFkJH`#;f+Uo^ zyB02uU~?QBu}F;h3l{FX=LWmxymKM8H_SUEA??kdF>vE~@tFt@ZNl}O>Reo2&r#o9 zNb_qycZPMQpF0B&{oLt!=;zKN|N37rcgFc=i|@WWhVQ;Z{^@4NeXdFCGku2y<)4&+ zhWrzsApdlehBiQ{sn6k%13gqCIlrn4j$*ZT)DNZ#}yG=rG^DwRKChM_wG;v;E4}D`**{&TS);p2v~w zK_;#FDUpMeXpi+Ew&xw6Lq7QE4(!>v^`N%rT5QkGD-Xh+Lh9U3)gENv+MW_QNR{?b z4!)Q@kcj$Ey*-qsfZuS_|x`;?4166fU!(D|6=w) zVnKVTQfO@ta{2}BaSPky+S>!W7qkZw3-UviNn3tseYN;`2Q`n~e;|>x$4f>1hbo#n zd)`5{ME~yl4{Dml>~R~5+C!C4YkN=&#rAA{eEZ|c`EWb7C(MV1R6HM|g3|WL`H-Xp zKga`Od%}EP&g!B)tuIl$NMpJ>^P0%t@-WhibOS9v9^j&qOv<+W;j;WvBG|HvFAYvbL-F&M2A_`<%ncY^KjS zkOTEOhtJ9SoP%l`EPl}(9dg7JKXi3n%}rvp9_BhHL%VoR^legWJR}yhr_VV!UUm-D z=N$jnat?m>o6G}Rd_T)Ed_T*F81WPL7joZt!|z$}t_N~qpAX~HU9_IHZHvE6_|V;H zg-aIP(bx2nHoTs&H@|-C6823tU%2)k&>u0`orrbj(`;q-v_UHHhd=tAZ z1;UMc|7OZgARYTt$Oer8;ae|#{UxQ>`=_rldjFKQBo%C^$lCGAPrtN<_TlH&+0$on z{@5;dTV%YzmFe%+nbT)j_VlY;ubQ$GNE`kJ*+QeYVfW@~>-!DFPsp{{Gw!fn@7vXP#@ahQu8nP4Y9vS`y z*`P5XT)O#1%U^X(Hux*8C8=P8^7mTG-|K!~Ng^0FU#s)CKuG(0t;yejknk5-V>Q0g z+TbrCNPn>dmFUlH{DrjHpF@nA{DpKweCzzx*RWIZt@=Bdru+@rlw>T9FQjYyEfA9N zg>-|z0l|*1zP6t7H)MBW>@Vf7TgqQZFX6Ag=HJ?1%9tm{npott_3_03S|YxXUdCT! z?akx28eilBOZW@vCH#f-68`FYB-+LoJB&$xuVY`bKE9By_17aL$1kKC{Uro@{OWr* z(*9mo^D`FeCH#f-68=JZ34irHC9VD4PWd}JeerZteBE}PzXd`vzL0M4Hz3&Yb?RQ1 zl)r=^*I(qoiTKK#Fqu!HcDLrbA}0)4WjdeSwfvR&WH?Xclh_Ha&R20hNeIf{3n_mu zox6^G;f8wQg6(gp7Yc-Qy>P+uH^_#1As{5`1$A#wh_AFZ)C+_l{l%WM9bdm+EbpTP z;x1ZS@ig0_o_ogd$7)L!+@T%oO1z4;@%>0Oe_xIo6?K>G6IX0~%_nMfaAn0b4`ZvS z8q;I6ulaC&ps)E7YffMDsf>?U!k$f~#zozgn6HY8t#%Is(&qRLeX>AE<`j@_$SDGX z9pAp@(-~igZ?y)(vbIEgA-zO=A-zO=-nt-OAUg zSvY@BeODc|puc1M#m&pv%Q)!#J3ssR-VbohYgC2vUKVgp&19{}IFLJly#Jng#;nJ& z?fKotr?Pi(kUe-GOcWqg9ZkB(yL4;gok*8@|FAIN2p_dGLZ6({$vKkUpN z#yhG#(H_LifA>bqc&Te4DSimEYERMsIwww>mbw|#Jj9HBr+rjUaU%W;vuwIz<@EXyKb81p&57yE#)<6IKtS#5m ziRG7EPZ_f=kFft@Dp*>VN9a3{om0=P^?y+nFq}IzW50_}R33o45q& z<8nV>e4B^X&+AO`pz}lK!LpHTXFsI9oYw{a>&FGlFT#Vy@16(7xBBlQJa9g_Djqa` z_dGEEvOEO;%e=Vw-JBne(jPQ__dGCuM?4g8-H(d`nBUBGbNTr}??WGDeyG*~g~6Tm z2aVr-e_;G&`vcbt!T;|2gU0Wk2gYBPhv0u%_jKJKG=BFyFn%{Yl=W5}56GeRkc0SK z+R9PndK_>#e_(u@2bo7{9j)^yRZsE!VA)7(KI<^-9T#>N?{+>Z^Hh1>BClp#bDrcp zmu!@{3*^-%4-$)Qlscf!(fl%)=VxVo8Thby`1UWqF-DEz>rAVLiE+6&Z%c%;0DIR-dT8Oe%vJd zzN!46)?_a~_m<96&mD=LzcSZF$jsNg-ks5>c;c|BPku+B)?M@cgQhiJ}Sn}vUR-+=pz#FhG32gQ%u*!sB6 zXTRop&G^aZ|E8X66+OGdS?wV(Qnfll-)@#R4>cca+=Fe!By7{?X zHlGoXMf~)B2gfhPA?u*{v2I%*?@vT}&G^ZBFZB$J=)2@iK3Q*l{N(d0wC6+(6_$$X}#-k+R5v?kO(uSu^*<3iD-crV`89zWN0{EBg1__MzFX}#+ke_HSQ;>UWs zj$g5^u04KQ@A~4W^{y{|theji=Xy)eeq+x ztBD`)FSnaN`8m^}u6*_o_3j~^%UZW({m$#stggRQ>S^(8@FUmngXYY7 z?4K2S?f6L@(kJ;j?`^^D1>&dgr{nmgIAk4x+iN4V6MOF@&976FaMmt<`WZIa0rq?S xy*YBPx8?qIp|?JMaz9z?KJxx`q1TR|)F*wCx_NJTvH0oh8XUhi``4`dzX589^Hl%< literal 70128 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/reflect.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/reflect.bin index 6608646fd01ecaeaaa9c78c9decdaeb8e338b64b..30cd7ee925d69aa7e7a60189d452bf4d3b6263a2 100644 GIT binary patch delta 42184 zcmbtd3v?XSd7d%G$k>(zNV~FRODp+_!NL&C!(eF)wJ|o5O?bv&S-c@&SrFm?3G(Ko zv`va-8w zRX(@;P@sK@inN{sD$*R3WA&)i)~}k$Iwr)al`BzpXIN|DZup$~beMAjWmrYID{Wr^ zGAotaYMv>x8n$l5^z@?5FS{CPqcUr|U?%H6BF;=jHmhuQyvbdT9avF+T&g9LE(h*p zhqIt!5jdafe06^D$a=Q<+`6<4+4jojHRywE_b8@1R=E=7LH4?`>6#elVQKQjM?dsI zHn_4GNqnd^iGHHyPJFbi0(p>)t!#=%#(7veTAlw|MLio@1=fS?W@S?~DfXc=bx0GE>!#LCbjIN^TAFci6q_qn%UZ!Z1^ZJl;XpH zY{~O1SX9k=>c@{S@KUg*7tX2X2dw9IFN-R zkO3G7MUfbQwO!B@oW_IT<|qj9T=E6SL5v}S$W8FPfS=129s_DYu_iWW>sQtC;X5(7 zo`)gwhP5y=DaMJyIA4TOf?-gEip|;j3!8%5h!8j=|DwnhW5^KL;DwIl((SsNS${R? zLyBO!9T$O)iyR3SwsqVteVkVh8svip93o)VN(*XaHRs zb8Kzxj=g>9N$H3wHpM2YS6jbkWfN#0KCYTs zOenT96oK6f#>262oKyCMD5FVqEzP*~e>Z({U#0M@$0N@vIU=Sdp=k z;QV-K!sp9T%t-skOagZ7(aS)>s&zasAr3GR3FlblM@7v;@dcPl zmwX7`&VyrBbwIB0^a18_`uw`gHb_~DDgZ-e-Lej7Ev5>#+0t^ zU7Al1!i5cfH5+J{#E$5!14cvTMUA^h{hk=jP8(pJqztwWp8j*#1EW|_OwX3Z|1DHz1K3q0A+c-Oy?j(vM5e9e6uULv>oEed|dMv1! z(SMC~W?(x$Gdkv2X9l+8Go$6&`s1BuMp>Fz)7+DR0WmKUgE}^JZC%=kni-MNW6%r5 zmB^rJZeHF6_&v{3T%)AjQA~-fm(H8HgzwOcqC{ikNQ5B#56qj9c1w{XGWzFvpq9eF z_)4}@>i5W?Y3?-EeLYyQ@7*z!MAjc4 zJ9EhkUy2G5g2=M(29PB+G9shz&X2QHHKWEwWUzGJG}iESATfAmfRf3X@uLYqiSZQ% zHmhZAH(F-~Fe|a18-aLYA|M-niBZ9Cy%a?q*gNCF1{iYz0HmhI@qBc+G6LYpsWG1K z!i%iyChOQh#)YeAE-Bv4Q-JP8TFF;J6@(xz*$0ICk(;d7?7%plB*BL9X9^y`Ai(*h zhB#`R^jTA$6V?7dX?dWh3A*HD6+XZ2d-XDT|4f;Y!_VUdc%zhD>@Zgo%{_ zP_t@a$6k+ri)$2qGo~ocfz8F?#aB`O^x&)LaSl9&^38-z>_4spHxsDY6I-**Jx#&A zLGHmC~O@Xi%<%dh6g2z)!cyJdR1h?s7fc3YqwMYkk= zR&`pA^_~pk#B&VhEou4!w4>;z`IEPS76E@0=Tde+f+(7$Y`6p^zRYye?0Rkmz9mH5=ip<5ZAWay(7K zy-9Q`gMK!%s`C-xnBBhyX@wF$+yFI?egtv{FP8gJtf{UX*|w0-j!#a-h?#hppzT-)*{-v#Th2THJH?yzlH0-^uOXXrE;xF!n8VsP9L5+ZTlg zkKe(U4<6hSXJ8cf@sB(FPR?p&V`DJFkc<6te#%9~9*!WBEWXL#7WHOEk~VH5aJ7c} zey1m?;`FFdOkj-e(E7l}ZG<6{?0awW1kZbb`)331)g%`)HkxOlX1~@u1dLG+zk}HuRuY z2%4ajxhTXJvnR3EpJ;MO4`2dDWzzQ(t+i;58ZmzV6RjFFQPpapwqcE*@eg+WR9h69 zrvwDQ;&?O9Hh=0wR04yY@P3}X@u`*xO;!q`@w28&c%_QsxY}o*z1Q>3-mA}0WlNJ- z9miD?w+uQSl8Z$xM#NzPLM`}#&$JYg8?eVf$Js{@X>vw$*cie?|06>vr=d>GATfa< zH+_SDqqQwfVgf?#Jv%?IJdDS{Hh!Kla$yHfjR<;ui~7M4Z=o?nY7oR`qkO5Quz$oWOSA;c4uypKFCk9~Z?- z3q<-j8+f>$J^IHvqL6OP1ok6;)MB?$64(|W(QIuL1hyjYPam1KT%?!2Tv7dEV`B!~ zj8UzOHaY_Pu2C%&8x4W&$gZV{64CslmPhV*M<3Pn-3wF=ypnnxiEk?t7;?vZ*>0yn zN<%cW=XN{207O8jNp^!nMcjSTKx`uv#SyUGujImqIY_cLwmFJGL^4;txYsMbDBtG&fW8st&xz;t0jct# zc}?akZY@+kEz>P8O;MeTc}-&Q7l*^43BGpGK@*z<+5L3k(puk>-sN_GTMK_%cgyoQ zOPci*c-VD>zeLCm)qN4?DFDgW-oMwn0xejq8wQM;a6yGX>4;sTq^*yQ)(ApP_0Fj}uWVC210;A( zQ(GIkGwcPqb5**?*~pDRo^=Lg2)WMzwL)-wRSs(yO3uhER&gcEwe4&B2) zLafZl z_M#9CHF{UrsG0#HHbz@slp7rnHckSyuTsm5^I zLuX>J(U-JTY-B|c{GS}k>y2S!Dh6N!ztS25Ga$|M40|zD59Y_hR0P8BPv=?p%UU69 zOhphv!)w^DUe-3+8x$?uNUkjUM$VKt(S!t|0tjD8olp2mW_A0aC|FaGdF zB2;5T?wA8(7FX-~S973#Yv$D%OU#1^c~%)|R`lUC1uXx+jjTF>w4$GYG83x$l`y5aEw_Z zA3(^ohNY2d-AWKDRIRVD(s&zKxeuV6*b+o>OQu*&+2$i3XC9QP^ zWLb^M6Ja%I3uokQxA7J1MaZsNM@LXreuV6*bp~Wv=XEE+I=gC}0a@;HhfjiacGWr? za_d(hva8k^kY#V|LddRKXF!(hZa5jn?5cGJWVwP{PKGNOX`4;!Y{&-@va8nFkT)!X zF}rG=0r{PqIS2PIf^~M)Is-DVGyh=EDG=FJ>u42F?Cw7mBD-px4Y~3(h)idh);b$< zFG8j*oRN8*t1I|*RI!T_I;{AyzaYK&cNIN46jkuf(_vX$MbCyjjF4SL&xYK(7{=@> zdKTmf>K~8@U%C&L+g1Av4qof_^I_u|{z>VDbk#lsvefIoGhk6%waelH3uokDBagW<@Q;+zx2yKSFlZKm)SeEv#M+`KTw_Z&a>;F}tds0a;$__9A3gtur9YtGfd${JO(#@V)TR&-`3^fVqmE!G)CU&U0Z| zTt&}-EZgsub7A|rZu|_$vMjADVa%?gXFygXfFqyd`0_`ZGME5iPr;uNKC;R`IgRKl zcG-vxVZ(VaMpu!`Mw}6DISfEWy^-V zA0gvTDq{fovLSa|1Y@Qx(!xler}|?MA-l?%0a@;%Pq-NFqFrUpfGk(A|6*7TS9!A` zS6%{4N1_05KS03o~ToDI42QdkXFy`y_b-J|LJ8bo&0I|H)pjbViBs&@wD zsyq4ptJbwJW>>v4Aj_C{A!JvrGa$7>MD8$7xMD3?=n~x zSJ5*d%Yu(0WV&I~qGv!>Bj9ovGi~9FEDQeD<#3DODtdGTp}eH+SO;Tv6+Hv8jQQDh zFlJZLvmr0&gvhR@{`OTkVc;9pWw6vbOs-D4zWaA@O zqAn@RUZJG^l3YBbwaI`iE8cJwtT@dDXJi@kmaAaQbSz^-K6sU%KjPAH>LdT__k7t~ zZge<`nj5Z$3Ajq24f!pE>?(maLw*(^yGkHEl2o0ay%xsoDuD)M+1xGH z!RB_AKm)RD?)$HUF}q5j0a?aec|DBTRRRsjGUhw4hcUZKAdS4^X8uy&N7uuPI#=DJ zfy38&`S!Z=2EVy$82#G>;K$dl1@^x5unrmqxv>`u& zkZFstAA|(12X^P2N4DH^L=#6+;8ET+$6U!I)je zkRBnT8t10B53V|B0Oh?6KwTx!0LowB2cWL%X8`5*hXAOn@EJh))hGaU)jR{}ZUpM8 zcLq>?JqIF<#LcE`22iPN5A{GAxGEcs%yl0`>#AuqX4r#3X&$EK%mB)F{~%KOWM|Md zw?I%=&7z%${AvP3>MBu}Bfx0S{0hG@HP*Yc>GJqBl zsH;+$K*a|O58njmimO~1kh?a)8o0`p0rWKl>MB2qB%!yW|cs#LV|@Eru|s#LUdwZr`M4#+B3xiTQH z`8F)9t6UjCO9<3et_+|HzXKz6l`8}200MPYDg!9L!w(4Hs#FHhA_8?)Dg)>U0(Dg? z187$-Oy5lI2k)VPxpsaQl09u$j7tsWHrEVYUt zw%fxySZWCr^T2{J2SG8YJ+umfc_Mi7=s`RcPaXuvi;76=oBiH5v+wOrCXF3-=bQK5 zH^1-y_uhQ<{s#Q?;|9Q#MWb8t8e zaoEFQn8OH%Q4R$TMGhqndpVRjjByy}a0iDwIZSYfB)cckui3HJbdsGGlk;PhlA331xXbFfa!>J5#zxiBP4!Q!Kd_X# z)8*Ik$(823>*4&IL`ru@{QezOA2cyG^=gO#IMGB>l1S;UFxH`3Prx86tYZ$$H2nH_4crtt+qJb)|mL#J}{`ZRMM`|T*gq_44H()foEBrlnc+sg8LL=s z9{2Q0lQ@vdx>(tt8WU%~>CF+6ZBLT35y@d<`2x(6b#Wl}JgK7t)N*y3vq&dooAyYS zsZ&+YQz9T2W3CkcHu`2Mi*Py)q%#vSixyrFvj_pCF6|l1$I(2=N9v1XAN5&f8EI@< z5>=Xs5tQXi=~>eqk;W#-h)20%f~XLEScKB!ImTL9)V*`Xp%PX_(i2jp+FT~HP1UA6 z3bY9#H^md*r>(XVr%9)ywY{SLwcY>XFromEB9xip`X*GmZV4~^IZ-*=V(+pguqE~e zdtPlF2i4O__9}a&wVf~)G|9-*!A?OJr7N{hzYeXPgw`t_KDB#1ON-*h-?_t&g#1ZZ zw$ElXHo-X}|5@hH?ZBg0n0SojNtEcTtz>IokY<`+2-*<|3uZd22>J9~te?u% zqA0u6XZ5mcq1io##)RpMrH%f!n(M4l(k@PWLPDzW>bu*rhUAe|RZGA4tZCs1l{E*t zHo`v+J6oKMhkl(YzKF->sPFY?RY@0DYMtwvs(wH`!Av|K^3z>~*nhjQu(ZvWO(FJ1 z85IV>BUM5gt2-4^@(`pXyO#=yQiqi}KcwemD(O+r_`y78rR^tj=J_^dJEW6Mj6)1N8g%6rbDX+V6++^Pg+z{OSP zs97FlXQ$mJd~ywj&3pNbT^{5@I=oaooC&^6+A}KNn}mQ=9Wxt$l@`owB9QnRNi!1e0`bLB*z>Dsbar=ey?TCc7?)#JA-Bfc4svyiGU;pPWB6_T99bZ!&AUmS;& dIPp$qOkDWH*=2?&zU`TLmMk!|YWbgX?LR|fZvg-R delta 143 zcmWN<#}R@6006-`1EPWfF=9Z)T!8iYxF)E9uQL|n!*XP2f8UBvSwZwd>J4d1OWG1h zM?&dJPx=x`ECU(JNXC-LL{gc`Oy;tXrK}{AwQOW7JIQ4)2RTY1CppVSu5y$6o5wT$ E15St^kN^Mx diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/saturate.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/saturate.bin index 39df7169b750d6727701e15ac9270f9b6eb5e69e..2e1eb821a9e788a62d14b3ed3375ab734d6c8a9d 100644 GIT binary patch delta 232 zcmX@n%6Oucaf6eH?p`fc1_lO35N7(%uvcrZ)_*9UfqAbUik#lw$@wDcx_gaKM2+?u zA#|9TAj_GVm`y$`;w-q=3|Vxq+1|UJ delta 232 zcmX@n%6Oucaf6eH?j9{x1_lO35N7(%ut#f;)_*9Ufq9P}ik#k_$@wDcx_gXJM2+?s zA#|9UAj_GWm`*+{;w-qw3|VxK*`CSbqUyS)7RaKe7N!;ma~7h=EworTIa@SdH^2&6 XM}Sp;6+*`z6uCWCdp3U;y{H2K)6FeS diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sign.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sign.bin index 2f3b2aa258b22dcee4155780650f6bddbba0aaee..033f2e8158f6cc1b223f099e3a54e832acb558a7 100644 GIT binary patch literal 21224 zcmb803shCb8pjVPDkx%Jm8%k5y;O4ZjhZCkBC<5oG{i8)NS2Bbr3X<%34CG(J}9FU zQ+(h9is;s{)JzunsH29arXq#`OD|r9x>ANI_nSSV1MZpm_M9aP&iDQPGyCkl&-a); zy4h^DX7Dr37HI1azmwpn0e)QI$L0!uH>5PUvG*=6#FP3B`Dx5dNxt$I#vH64Q;#t{ z=6&@C#-!JEtHYQY`-Xr!zzj~W>nG0B8({v`FuadblB&!4`b#AE&U2(N*&i67!xvJ{O1^x zQ@FnnW19DQqyS@L^H=3#j5FZoPK@cjJ$gIFWcq)%6=Ujh`fbLTNWXO(F=lVJ>jsSR z>k_vPV-{uon1wM_9fH?l%!tgbnHZDr<+&PTyfP9qFvjk2aRtVlNqc%Z#ss+)EXA1Y zMc#`s2J%@d#y}nvFimr1*Tb_=X7I`wl!=IlK$%%S&!Ei8ioqz8x9eXhb9j~y%2W<+ zi!xACpbRN6nqCXAz^ie+LEd8wsb9=Y>d?mHz%io?e0G$9bBHouoDaydTfiiH9 zp$y!sCf^PO@0^yIj%d#K(6%17|6MgU<~B$0E~eepeM#a zEzt*KpeE^uF;LqKz!<2J24M`;T0s~CHCr&oKVhq%xVHg87?b8?owebjy zff{=x#z3t;8e^d5AA>Q_JA`8l^dRFg26~xDjDenLBE~>(6@@X-qeWv3^maaF$Q}4M2vy8g1Hz2YYs^m18WxxFb48qiin}> zCjD%Kpw?)zZqlsb);-=8Dvo`&efR2)X6b**eVzIGhe?-vL#_+t>m4TD0lv;*@{Qu_ z8z$d*zOG^NP3P+wCf^Odj$!gGtdM_(wwL6-^%v#7fD3Y;c>mHSR_k^5qD`wu8Vv}?yFiZ_t}@peYPcXU&G@2e7tXLmZ9)TF8A>t>nJQ)^eZIQ|=4leJZ(rO^&6o zy7=^?p?D%jqTeb?7Vi zrS+Hl>UmFTI%n~Z$#vzthcxNJgXOwIA#&f~P`NKJOz!i2TJBpjT<&W=Qtq2OO75$E zUha!}LGCLVC-;TDDEB!g$bA8m9KO%dEUpFbfeo>;$TdjsCh zZrXbp*^NB6Ca)U)?Apk9%xSCrhW=H{pJOxEpCyrgU9N`TzIO~3bvJSfLk67LU9YRF zv3pD&UDWlauC6*PCOI}grA}8@)nQ-uqO6MFbamy1@R?d&U8y4;{^ecM)tyN@R9_P5 zbyZhqT)wb`E4n&oz`P*0K0oo^)#7z0N9osPNQLfvMaG01%XM{o;p&Cgx?a@P8JD4S z8h@s5@$-?pI_=Q+{5iixUA|XFT~1+d{_NkPF4wrxGWmW0i#p@$m-c&!?s+jzr~M_q zZ@}Vwa1r2}yWgohU#9;E_}889FR(ZtIh!E^mL1ZaZ@F=URu}8)78@UMbdj!ZK`goQ zh5L1NbK%>!y}aW-U7Zm=op18B2aD&EM5R(k8Q<$*QD=O-oKU`IVNpk-wO7VAz9+(> z4w3^z3ikrt^D+UlSXfLv-#cM(KI66?eS+_&u&6T*GiV^+V_{K8z73iFAM$+{7IjY< zC-ioX?s+l7S$#C$pJ8!6wVm0{3X6WIds2{9j8sLtL6Jf*id$QUbJ+--%g^d9ZLP?`-R0_z8>84`ykb^IPWIDKjrhWywXxv$MTqm zu8!qRPhB0$(_XqdRu{C_)v-FHgRZVOt$Vz6bpvUg#n+}SUiZgI+fntckM4X!jlwRP z@1?RhAFErt>CVUMWWMLh;(V+w=lifM>R2DZ_hwntk<~NkJNSMri@GS<=k(D%FH>k= z#rJhtoNtD)KoL4XcfQwY-^llWS)4C{Eb}?vqsb!1fv`r=^S<1|i7T_JxCU~xXO zx@7kl9jZH@v0Ud@&7U7woG+cOYw%|a7IkarItt&5W>NP(UAN)SBrNJS7$@c>zGuy% zZnLp~_WKy!^J#>^>`cD5&EkA)-Hq>ev#4Y1e0&d_MIBpLexCae|BO~cYv;& zM(du>gLIviKXb7--}iJ~m_LuPs5@Z#B;z{R)_Fwx(EELVVd(2g#oz$=* zzD>f6#UlIq#IZ|6_Tu7kOGWlYQ3=aL_R=RmP7~Rk39fI8?Bi9va}_#x0-Y8Ly`Tz>jJYy_8G0e_()`b z>+skdk^Rvh+_#GCv$~h%itNu9Id_We2lGzni|nT^)fb5D^J9kmTV&tUH_IWiXO3vQ zM`U;XWYgCoJ1MzD_Phz+2SxU(O}CDS?2f=&M@9C3wC{96WbYpQ+-Z^h>%tA^M0O~+ zE{g1XQ!;-M+5OHAyezVJU2x;7$o^^E@mi6+EVsB$WZ&HDRK3VfVw=crGhQ@sHI8F0 z%uaqcwnH2POG_iJHMT<>6WSq;3GEQagm#EyFr|5Xh+{%K#4-4v?q(k17=&rF9pYGX zksaa~qzf|-ajb>N4si@lnwf_<<}R{B9P<#_A&#{c*&&X>i8hZ9am-6(hdB0t$PRJr zZz4Oyv5q1;#4&G?9pYGLksacgkH`*j%vWSjK0LOY$PRJLUu2)zz3gF;owS@HJH)Y` zBKwb*>idZ7NijnLMRtf|a6_BV|C$kP9~aqOKH2ny$PRHVRAh%ZHcVu%+;nTW$PRJr zIg#D3eW$S^JH)XFk$qp`h6y4&snJAsh+|VkcHgrDr;F?m$Kpixg1F-|MfMB1#fc(& zPA?KT%;z7%Sjt^{8;Bt0y+t!@ufx8gso=X8pWqwT=#^@-Q3I{_jKE0iG{((Y`RSHL zT|H5*WH}!b0u1iUBTbYD%@0Y#)(9kE&qnyjU>l>ePj$4S$dwWYS`-PvY zQ7-+Jp4lztlX_77IVQ~6yY{aeu}~kXxvzXYE-$GY1NEYs+coa*t2Ztn^`n|QU*TxA z>=!%KlWH!zdB<~ij_0RgT&<(Oi^r3s-c*mbGJPhgXVu(a>8p=CweE$r75qk@{TC@572jj-~tNdV~KdIl<<7K~l$9>a( zMipUPV%pi0*#k*^uO2V`{F}GN4YGT_fgK3=6yIU_3_=Ic^~C6Xx@kZNj=_6 zH19({rRMg~ybt}An#-ek-woqRY2JtaOFiBOn)jg}Q**!4yzh>2Ebl|VrXFu6&HDhU zxoDdAp`TN8<7wW9{!YzZq<2^w0KJ<%f&X4AO z=pWTw7n=8dG44;A_q$=7H_iLdZ>r~=P4hnVpK8uQ^L_xvJx23>PmKG6=6&c_)$_8v z5B;l}OQCrm`dKx%ndW`yZ`B;j`_S*IxeYY$hhiMd`@=Af<$dUn)$H}s9FrNHg(n}86WDx1PD2F%h7Snp diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sin.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sin.bin index d583876c518cba48505c271089ec7e34514bf2ac..a2ca632008ff4e42fe5a18e61a63389816c966ed 100644 GIT binary patch literal 20176 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sinh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sinh.bin index 072c53393f46bfc3084d599a14a7dc4b110f4fda..1176cd472bf244bd4513facef35f43866c130207 100644 GIT binary patch delta 1256 zcmZY9Pe>F|90%~UhLqO?m`AFh!8@w z20MWiLJSr5XCVes43;R63cA>(O9Vphsf!)<5{SOvZ{GJ&^q7J9%=`CyZ+>r{kE|4| z2H$$pyT6TyMkzyiD$t~Q%2L7g4zy>8TK=!0E2{oF<)rnXs^3<(rEV^_$10Ih-G3KS z&-~7^xc2=LQGDs|b~jU@zQy%e)xELjV3TSw8NPh>!iV$^%dpSdncy$zJ@P#cKkY>9k0N{n>@qU7qB!>B^TkLa*w(mK84T71X~`Q?*BIX@z2%A zu!LV*U4W%}E&d2ri>pPe_vYcm6!+MC0P}1^<#T0N!Y!`chdKJ5W;qNj6~c4%{FCRAykc#j3PU!`o6K#&bW9tE`81)fX5&{cxrB{V(xK7# zGdFi^;|u4xgp6xE{M>Hiyi8z;8&zbIKklgA#gM|_EFyAq(e5Ch_(`%Q=uKG7Mliau zp50g$1;<^rs2I`qSC4{P8qsTGBLgVbw>lbpG0@ecR|pS;?t1D^^~yA#%_e+bq`qX*VU=P;~~ zRsy~l9K9p(NN_a!;7o9IkHXjZkKqmU!@1z-AA|G3uOS7?Nm`GcWOu8bm*MJu`rltp LJgI&=>L%I&9uQiE delta 15 Vcmdl{vLcp|Wh3KaJr)Ka001f^1HJ$N diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/smoothstep.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/smoothstep.bin index 43aac2b1c46d1acd72edaae1e7196ed0a759f50e..73b65d17c2edda3eefadb663276652f29b3e9ce7 100644 GIT binary patch literal 629408 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 Apa1{> delta 38 qcmZ3mRc*r+IYyR7##TlkVrpe%Ze?U?Wn^t-WZTNfuDyzd0SExikO*`D diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sqrt.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sqrt.bin index f466d2379f65802305e56ea5cf61a3f88a790c7a..6dd8088c0898cd7c31fdfeff86f8aa32319fe403 100644 GIT binary patch delta 1008 zcmeH_Pe@cz6vprIjEeKFmTVjj>iScB(^3MzvCH4|GSP8g@8B4%X_Z_p^cCc}?E$N4XCi%noQ=HKxJjOv=@VJ-4>$ZR# zTDpW@oFi@lKifLg;u=Tr`kf89$?@O~W*q^`IN(Sln2MxU8v_}&@l10bji}(`>H9cC ziBbIINYLkiT2yHin96m!xt-&wk9d j8%xb9mu@++{{TtlhF5MCv}8QLM+GaI<~zb9>SMnE6*~eP delta 705 zcmeH_ze_@K6vf}|s}MAlQyLna~?dlzaU7FW}^Xoi^T*tevZa#JWPm1Qp9HC z7`I(|M8THS#jee|KOIO99DSMJjyv-Q&^0Me7iwsFL>V2MiBZ&4+QgB@w1uR@)Ii>m zG>T`9g`SO|?=dU64P1EBOEespI-syCj+ZM)ge4u~MrR>b19;LUWl##Mw1#s}sbbP# V>LF{m|H=M+vctW+Z~glzzW`YCz*hhO diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/step.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/step.bin index 03f251cb65cfa6c5fddd7e567bba39bc9ae4ba7f..f6c6c7b5f3f00716adbd8b4dcc7a563046e50839 100644 GIT binary patch literal 33160 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 SzW?j_(e=*n-}L_A>ETb_^9k$# literal 905320 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tan.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tan.bin index aafb900347d0e40d3536cb35adcd40672a197dcb..572bee4df2a502c650055ee3caa963710be529ed 100644 GIT binary patch literal 21776 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 T)$@`0?sWBhWdYIcGvogN!xoc9 delta 2857 zcmZA3T}WGJ7zglkJe6YArJ0DFy&R9yXljm0Of_E~HCnvb5NC&`6YMTrE3!%u1ur&` z%!yZ_IC-$*AWKqb?X>Z`Mva>4g{ycWl-5;YErqVTkWzXzW)XLEh4*=PAxeJ#|C2Yw z=S_Yb=byFmNi)1GshOcb&N0Vvy!OKh7dMhW{LLpFbLW*%A+@uNjal2ENh03vOEj^$ zj@w7YjV09XGN!k8+Nt$1=5|D2TN1x)aqc>4rkcrIb=`JRGcd-xKXp?R7+ZJiK+QIO zw($_3v`c-W(#9ReTxA_))Or}(DbvA3w$WV4JX%vRQb8Lzj8%K0aGXu}J|MCv>#J^7 z(PVc5pQ-qA6zb)6srhr7aIN7)@OK4X$UbdWZ4Tkz!#6n+2|c9gjuo6XLL`UyrNrtQ zO+1g|gtE53O6?kBH&$h2`^&f&U-7TdUL#|sl{ax}yZ$9yY=|E&Q*2_^Mxo7tJBm^F!u(aAuRn(iJp>DRQo$Sz__%a;nMWm&KV%u$P zjTB>heW|~g+CT}m-jbJS#|Q1$!uDhb?F~CL^PgTbCs)gs!-1AN=)^_NRe_fKiVNGA z>j2qf#+uxtXz?4|xR+bnS$eEJ|A%{Sm%+o*2DJZ;rMUP;HKG0AXUty~M|MrcJ-Pfw zIeqod|Fd%^@4xoy_sbRV7(`*ULV_j(A;wA?oh`#-LNH*EwB?>MoLm~)2A`mO5d<|) zk(`T_(~ys0KQd-T6gCYLUZSS!nuJ+ibQQ_2pbnsU`G*! zneY}IDD`{{JcXiA5Z;5PLXnrDtI#QAgi~Qkd-UY@cA=g8R0ba zdS3l6nU2iMGgH84Awp_c2LX$yO*xN}<4H_1tVc!!#^8_BDH-tIBFd@Z43y-~Fv)NR z6kDCzyV7PArM*xAN^Ym)WDFwKdTHzD8I%~x!U+ZRMMOvm4uG|Y@O4mAM4W*O^uOeK zE>3?ZCJfY`Ucfd8L2Z(1utL0ukZtsVWl?ZWhId*n(`*NwO%y`bR#0qC$&0=>`k0T6 uM@||1wv+d0*hbV^Ps~G4uvvj8fBopzZ`52>*q$v8&b_t$$)C}#YVKcqZzCcA diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tanh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tanh.bin index 709427217c2629669fea621350b8c86d8d16917b..a13028b165f054dfdb3a460eedef70704d0d58e7 100644 GIT binary patch literal 11448 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 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/ai_arithmetic.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/ai_arithmetic.bin new file mode 100644 index 0000000000000000000000000000000000000000..2fa273ff1940fc17223d47a0483278d320e556d6 GIT binary patch literal 3256 zcmZwI3pmwx9LMo>( zhGRtHE5?Pp;lUh3zxv-h`CQhiCPD906+V}4oRK~%G(8gg0mtvVzKwF-1v>^^Ir{FE z$6okUtc9oS*yJ$y2TjGcs9x(Rcu7mIdZ=P?C|qExelRo4HX61sZ1WNCEewI{T1v+3 zYxdg*8)#a+-Z?p8C!8*)Qaf~~C%UpL%zG#vUYq;f*lGJhL;u99 z-tar=!J8IoYmUNl{yuZBNX~e|ZJLu+6PHCM!xLMYJA5zg@_?1)<{O=?txkoX4^&jI zGca<4wJuxEnviUi4mU3?{pFcQwJSU^=6t~Z_>0Hkw&0cVI|7z(gx~0XlxlZ&bv8Vv z;e}hl>a)(Us%pQqt5_iy?(C5F7g_hMhyBGt);0(0^WcQc*y17|JxBObP}580%&ODy z@>s2L-C|>V*tE6YElv8M2(Hx7OO^Ofw}JceJx+J8?JtHE9g^*pPsv-u-_C2P%CK2* z0hZj*G~QJ7^9p#kPFI>BrQ{JE^Jcly}n#DPz_gEC*_)T$r-^~Ee0BG*(&$oX3g4Gb?446;FSEV zIa%K?e*k+pxZHMGa&bDGJ6xOn%r2uAb`lskPbk=A0C%6sc_LGz&wg!R5^GB>i^mg=NRW7 ziL3iu9v)^FEEM44?O+f5zdzjn@bz|3Uq)Voo*zqn8HVpsU-*0`^@Y#9s4skel={Nw z$Wc{by4060nDylonDymP zc#!&{0?SfgI$_oqHJJ6K9TrhvCc@p+m#45c^+gkIqQ11ilc+CR@Kfqb6a1F?q63en zzVP!zjruYL^A76EV>p2N!p|cq^@X2TCDfN`*k49{c?i#?zRZAcQD5%Eucq`dA`r;0=zNEmcFJ3U~%MqCM#TRCMNrYKn0%6vdIGFV%1ZI7ShFK57Vd2P0 IJ#t0-4Ke5<>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f16_conversion.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f16_conversion.bin index 5b386b070434a14f96c724bbf5d0bc939e85cfde..14299da76670985737516491ff0392b6235babd2 100644 GIT binary patch delta 12564 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

fb`W`nu$Dhk{NYOtZALuKkm&D1A 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 Wv;dwfUW`EK2s|4`KmQQEF!mqKm+JEX delta 31 lcmZqJ%`ssY8>8k%Ms1$WM??*Tn|(~T`h4QM@M2Kl5 zTF}7qw!{t@3mZuroz9dKd^w$ES5j8K2L@CS(C_=J*0bGx_WR%6v;Cj@e|-$Y2$WZv z@v4z!OuVM^^5)4pPdQXq#`@J|X@z)a-rCLhTjkD8_ zWBzAj+pyv(pY^!Vy|)TaMy$@oQcFfP7I|uOF!NmOcC4Axo{cx%(eL1dh|YBw5VG=J z9O~Qu3d;6sQMQ+XcWgMZ8-L%r=q0@VUPK*EN_VH>+MrKAz?}n6zko$YZH-vE#F>ni zo`8?g6E^f5zGn71@NKWzjw?F5KE?ylkj9i`e(^7OarW_haQdc!Yj|mM&}2N2+1-aLYQjU%>u?RC*>06IOvax1 zo?%>b+TxGW!8rbN{qKM4KKg;l82k5o(u=H^4CzIGC%xz_z342x=q$bHEWPL~z342x z$St*(F_d0(mR@w0UVK@XUPe)RxecY4zfgMdL+ND%r5D|Y^rHKcUT$YydifKj7ul5d z@&`&U0Vur;q4c89MS9WaB)tT&F1-w(^dcM9UT&fEqR&-&(dR6^OkiDlxrx%tB$QsR zqx3QbrI)KHy-Y*tGk zj@hf{sM>4RbCuB9HHY<<=*V*@z05=D^@^=k({&W6XC$80HIqV)0vN-tla^b(8GOFLd_7+H?fQ~VC1^b(KKODoQp zIMs$1Z(MPr^s)-2mwkAsrQVLq5>g%bYi?jN-d#1=h|)_cN-y;odVcZC*gO09E|gv} qQF^Jt=FILKOsom7#%~?2e0<1mt-!|l9B7k~eA-ful0h-bRq{97#+;@A diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_conversion.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_conversion.bin index 74c5d000e3f631e5b708c46662a4e8fef511a010..04841df6078543261ae2aaf237c38570b10ae6fb 100644 GIT binary patch literal 11856 zcmZXa3v^c1mB%+X7Y{@Pil8Gfq|&S^KJWoLpiV{_wNM4M5yb}-$x>q}3PHpdLx5te z0!mtqC@P^E6w=a+h*hWyRw`(th*i;=;((CW723kM0BtB{_TK-q^PPLXE3)_hcW&-? zALs1-zaMc#l=A;m=uZCcCzNnbRMIg{?9O3unTj-fmFZ=zc| z_n@i{-u%y05y?*xz5Bv(om_I`=hU9x$t5>F^uzl)x#Y&1Zu+#7OK$xC&K^I{K38(% zuU@sUlS^*A-^S(hZGXv)_n3M60^^b!e|px{KQ%77@usG078;k_`22}8A2cqx@s{uX zs@k~Z#+zp*KQk`5@oNrLK5SfaIDOKzNRVXbk=jd#2I-DSolH~zP$hAlTPx$)bNedSr>k{kc; ztyk9>m)!X2?{$CPxa7uX4BlC9Tyo=AZf<_bxa7v)T=P+bamkH;xVwF=amkI}Uw+}s z#w9oY`q{PXjZ1F4W=zl5jZ1Dk`Spt58JFC6;iPe!jZ1EP&Gjd~XxUhA$GGIizuo7A_l-+#eDFnAd}Lg5B9x$)mj-FCpZZ_HytuAx$%`}e%NkYa^u2ele&b6xzE&LQqwpG=i1fDk%M#X>g345xpsAOHjW&eYge&x@BFTDD>m~rIbT)X^)c7z;!>6o4u*#5}DyZm~^e;P*)&b4clapd4!yDl}3 z9DMJJBcqKY2j|*#g>mHIMSV`V+BkA>u3h7eBM0Bu_{{ajk%RBAESzKUQvHI3H6w?VgcbOPr4>{o7yu$Th_In9}+CR(2DOn9{=Pm$)`KA5%&<{H2Fz z#FSoHcmuC_=VMAw{59<(8Zo68ceVBvjhIr~^rO6nosTI^d{Qph`N;RtjVDru5AG+A`6IDgEraH9Uu%k14HcI`kva zh$$V~a`&yG5mUPBW_iHQ$CSSF^MP#HosTIM+%)Qb(TFMa<-#W#F{Nu?9?HJc`Iyq% zqrPIF=zL7+C$}A5CK@rNi;K@#DH<`QOYV7cwP?hYxX!#R8Zjk)d>ch0rgV2lG5Z?l zV@f65_(db~{Q3Hek3}P<^rMfL?-q@i(raU@_lZVKsq{vf(9Xxy_kZ{RSwFY?^>Yj7 zvLA0%VZ{52_Iu@cPjO@s?UAp7He zBNy?W!N=G44M%vt$VI$YXkV_DpU3+|F5*4Hkwv^eX#agg_Q!ieF5-Q`kwv^GII@WM z14kC|Uf{?g-Ul36#Cw1vi}3%BEW-CYvIxKL$Rd2cBa86&jx560JF*Br@5my2yd#V7 z?~W|Ow`<>H|LzEWJs08A9a)4wcVrR1+>u52aYq*6!yQ?K|8`^%zT1&S_-#iP;j+@Z`NPT7w01Uu&x)~4?bAe zi)#2^T`#KPd(HpqI??_E-)lZM7vXQs=bEq0Mfh1=FWQ&jV|Be~UxI%%AFJzxJ!~$* zuj+cyJ_Vm@e%1VGF2a}UdeOcGKdS46J*uvgJfFFjFRKR59&I(R5W~`Blx~tgx}Nk!XA+4wR*l>gum1EGG4~v>v9o(&XGm< zI9)GOWPkX#T!e4a^)gk);n#8zKFyIu_%riqx=z@mA<9ck{GHil{5{*9Oyzqsdpndh z*3q$F-%lA=@&CI0bNhs%{`<;~%JF!sQpkTDtZOV8zT?&Qn9DVe+dSawn75Udpb zt9>v$4!2(Zwr0_GBa%=I)|Zf%LV+_ma0fA}Qk4ZRj0 zs%sp&Bj)vbBWgZ~x!(Tj!`ox7r&D=@`jzlL@JaHMd80YrzovK${~7#t%;juKhCjF^ z<`3x&YHN!50{sB_o`~n|z9ybW*dC~mD{Fki?{Ao9^W9&ytDpL=PRNN)pXPgCi}#nO z-m-qD_QP<0J$&7$b@Bc(+j=d2p)uw>Ir&L;UmNr5d6t)!Piu&|-nMb?zZ7#l%*gXr z#a!-YP4TklV}6OA(9yb>>vU+J{9MfS_O$+fdCX<@v~NH4shIQ4fxC8)(Nz?I_Agf0~oz9=Evv- zG^qa!pD*&>Rq_6)SH1H1l075%PtQC)aO({I(<6_sSuI;(9v`U(>XygflEVyidHmY( zvUSblt#Ud`3i9|&J)tgnybI};$AP8(W}mO;9J1UWCy!U+bMyFKoM#^Q*OkZhb`F%! z%zm!FZ+YC`=RB^bGowcy_s=np`{$m=8SvJd|IeO}pI1rD{XFa%b3bqSAlc*id0rTE zzb?4VX7~5&Nd1?dn*YnMJN^D3sr502=_k^b)bK|{{>Q3TYsExLEI#wKWU-wRlxv!J_onZDph%iPPbc)l17GeB_g_El#=t)(bke@2ws8D` ziZcSgoY4Qa{-QM;FD*a%d8q4m-Lfmx-6w6^8R}^*=LbGGq3si%3;b_F!*;m9_a^j2 z+4R8gCe*(DlfdUDG;!Q0^|zZU8s3xpwW;}~X8F9TiiU4Q7mw+qe)f)*!+c*8s@`&+ z`q(S^Uo=IxmF{Vh{V(_idhF)QH;X>V4@<@yOV$N`HR10e2X6G&!;dIo@47JXrwO&J z|9jv|6Dk>g?YeOPy2dvGADU2l)+uYl@rs5=1K*iY^N_CtznRd`Rg+hR`_~k|9r(+H z4%MBrG8~^!^we{q-mpA*Ce%g!r#=$u0l@m`B( z1->w05C7T2;rNc~%N`2#$gXP_hMND$YeA@a8Spx=dammuqX%rAkv5cNE z@cS9f-Xf#dtUfKH+1q6F-i)72v7;0v|djL z_vd;Z_=AMF-cJn2xgSgpHTR1tq2_)P^#6po-voVM`_YfX{kdNSeO~+7o#8n5yP&Tp z#QktqIL`fYcBr|Za_h}qKlj@QLe1-Au4!Hf+^^3eexUxlvI6QjBBMm#<~vAKK#Tqf zT{RB+B;TE=sC zG+~@iU-gL1(0sb8xA<<&QgzuzjGNvSbZa@@v{y0CkC3+lY7e@#=<5H;j`#gdR@eP1 ztB0=1>J2Yu_2~Mn{^*xkU0#>f2cFI9Im@%UFzDWLzO}X4@#4p`y0Ip!OCHPW=EYe( z;gPIveJHCdAIxg{X;ybE$m+$B9uVo(^RxSpi1gNZ*>U;pO6y*7{d=pjx-!yTA{};b z`FYvG<8_I2Wu*5;T7F|H{Q0es9+70n@!Jc05ZwxB0G~qm^NShhDb`lIh;_2}49oJ$XlC{`Bqczr` zP&1$$FY6gkx7YMGwfE&L^j1XYmsDTuoq*-LKB8WpQ()k;QV~7>m6! zK8w$E1?Vd{atXBw=zWf;MZ?~_2Ic55HFzPg|f}$Gp8#rIs znhU?hD*GU9FCWtOdf~j$EA-QIARp`IeG`iq<2f9Fu1b=Hk&V(!D`c?c4(8`tc3Nxy{+)Zqp>QuZwtQ#j`h^n zKz@PE3H3@0m?L&~q!F%cTB?U{wIA&;RbF@sPI$XdLqW)8hH;6?1S>l8&ce2m$O#xO z9B+W)?lc|LYJRagO^(^D?sm}{5Aye;uM|*faQI=+swsy?)#grUaXl`9bbKL5$0vdH zQ=%u(MxvYGwp&MEzz2IStb^j;BLgrzD8wg*KW2DTTH16XK| Pgs#chp8fwX=#rCvdo9sF diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_conversion.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_conversion.bin index 609caf94fe68795c4a18802aa7e15e7bbd23c89e..277ffc4d76b7d6c1d8692f92fb3e9ecd3eb93894 100644 GIT binary patch literal 10680 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 nu&bi^MYwR<-!uLqyxT(IPf{C; { const gpu = getGPU(t.rec); const adapter = await gpu.requestAdapter(); assert(adapter !== null); - const adapterInfo = await adapter.requestAdapterInfo(); + const adapterInfo = adapter.info; + assert(adapterInfo instanceof GPUAdapterInfo); t.expect( normalizedIdentifierRegex.test(adapterInfo.vendor), @@ -42,13 +38,4 @@ fn(async (t) => { normalizedIdentifierRegex.test(adapterInfo.device), `adapterInfo.device should be a normalized identifier. But it's '${adapterInfo.device}'` ); -}); - -g.test('adapter_info_with_hints'). -desc( - ` - Test that calling requestAdapterInfo with hints: - - Rejects without user activation - - Succeed with user activation` -). -unimplemented(); \ No newline at end of file +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapter.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapter.spec.js index ca97535007f..b5962136c53 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapter.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapter.spec.js @@ -27,9 +27,9 @@ undefined, const forceFallbackOptions = [undefined, false, true]; -async function testAdapter(adapter) { +async function testAdapter(t, adapter) { assert(adapter !== null, 'Failed to get adapter.'); - const device = await adapter.requestDevice(); + const device = await t.requestDeviceTracked(adapter); assert(device !== null, 'Failed to get device.'); @@ -54,15 +54,19 @@ async function testAdapter(adapter) { const kNumElements = 64; const kBufferSize = kNumElements * 4; - const buffer = device.createBuffer({ - size: kBufferSize, - usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC - }); + const buffer = t.trackForCleanup( + device.createBuffer({ + size: kBufferSize, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }) + ); - const resultBuffer = device.createBuffer({ - size: kBufferSize, - usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST - }); + const resultBuffer = t.trackForCleanup( + device.createBuffer({ + size: kBufferSize, + usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST + }) + ); const bindGroup = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -113,12 +117,12 @@ fn(async (t) => { return; } - await testAdapter(adapter); + await testAdapter(t, adapter); }); g.test('requestAdapter_no_parameters'). desc(`request adapter with no parameters`). fn(async (t) => { const adapter = await getGPU(t.rec).requestAdapter(); - await testAdapter(adapter); + await testAdapter(t, adapter); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestDevice.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestDevice.spec.js index 3d69c132c55..c7d69f28c8b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestDevice.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestDevice.spec.js @@ -39,7 +39,7 @@ fn(async (t) => { const gpu = getGPU(t.rec); const adapter = await gpu.requestAdapter(); assert(adapter !== null); - const device = await adapter.requestDevice(...args); + const device = await t.requestDeviceTracked(adapter, ...args); assert(device !== null); // Default device should have no features. @@ -52,8 +52,6 @@ fn(async (t) => { `Expected ${limit} == default: ${device.limits[limit]} != ${limitInfo[limit].default}` ); } - - device.destroy(); }); g.test('invalid'). @@ -73,7 +71,7 @@ fn(async (t) => { { // Request a device and destroy it immediately afterwards. - const device = await adapter.requestDevice(); + const device = await t.requestDeviceTracked(adapter); assert(device !== null); device.destroy(); const lostInfo = await device.lost; @@ -83,7 +81,7 @@ fn(async (t) => { // The adapter should now be invalid since a device was lost. Requesting another device should // return an already lost device. const kTimeoutMS = 1000; - const device = await adapter.requestDevice(); + const device = await t.requestDeviceTracked(adapter); const lost = await raceWithRejectOnTimeout(device.lost, kTimeoutMS, 'device was not lost'); t.expect(lost.reason === 'unknown'); }); @@ -119,12 +117,16 @@ fn(async (t) => { if (awaitInitialError) { await assertReject( 'TypeError', - adapter.requestDevice({ requiredFeatures: ['unknown-feature'] }) + t.requestDeviceTracked(adapter, { + requiredFeatures: ['unknown-feature'] + }) ); } else { t.shouldReject( 'TypeError', - adapter.requestDevice({ requiredFeatures: ['unknown-feature'] }) + t.requestDeviceTracked(adapter, { + requiredFeatures: ['unknown-feature'] + }) ); } break; @@ -133,19 +135,23 @@ fn(async (t) => { if (awaitInitialError) { await assertReject( 'OperationError', - adapter.requestDevice({ requiredLimits: { minUniformBufferOffsetAlignment: 255 } }) + t.requestDeviceTracked(adapter, { + requiredLimits: { minUniformBufferOffsetAlignment: 255 } + }) ); } else { t.shouldReject( 'OperationError', - adapter.requestDevice({ requiredLimits: { minUniformBufferOffsetAlignment: 255 } }) + t.requestDeviceTracked(adapter, { + requiredLimits: { minUniformBufferOffsetAlignment: 255 } + }) ); } break; } let device = undefined; - const promise = adapter.requestDevice(); + const promise = t.requestDeviceTracked(adapter); if (awaitSuccess) { device = await promise; assert(device !== null); @@ -159,7 +165,7 @@ fn(async (t) => { } const kTimeoutMS = 1000; - const lostDevice = await adapter.requestDevice(); + const lostDevice = await t.requestDeviceTracked(adapter); const lost = await raceWithRejectOnTimeout( lostDevice.lost, kTimeoutMS, @@ -186,7 +192,7 @@ fn(async (t) => { t.shouldReject( 'TypeError', - adapter.requestDevice({ requiredFeatures: ['unknown-feature'] }) + t.requestDeviceTracked(adapter, { requiredFeatures: ['unknown-feature'] }) ); }); @@ -205,7 +211,7 @@ fn(async (t) => { const adapter = await gpu.requestAdapter(); assert(adapter !== null); - const promise = adapter.requestDevice({ requiredFeatures: [feature] }); + const promise = t.requestDeviceTracked(adapter, { requiredFeatures: [feature] }); if (adapter.features.has(feature)) { const device = await promise; t.expect(device.features.has(feature), 'Device should include the required feature'); @@ -227,7 +233,7 @@ fn(async (t) => { const requiredLimits = { unknownLimitName: 9000 }; - t.shouldReject('OperationError', adapter.requestDevice({ requiredLimits })); + t.shouldReject('OperationError', t.requestDeviceTracked(adapter, { requiredLimits })); }); g.test('limits,supported'). @@ -258,13 +264,12 @@ fn(async (t) => { break; } - const device = await adapter.requestDevice({ requiredLimits: { [limit]: value } }); + const device = await t.requestDeviceTracked(adapter, { requiredLimits: { [limit]: value } }); assert(device !== null); t.expect( device.limits[limit] === value, 'Devices reported limit should match the required limit' ); - device.destroy(); }); g.test('limit,better_than_supported'). @@ -308,7 +313,7 @@ fn(async (t) => { [limit]: clamp(value, { min: 0, max: limitInfo[limit].maximumValue }) }; - t.shouldReject('OperationError', adapter.requestDevice({ requiredLimits })); + t.shouldReject('OperationError', t.requestDeviceTracked(adapter, { requiredLimits })); }); g.test('limit,out_of_range'). @@ -363,10 +368,11 @@ fn(async (t) => { 'OperationError' : false; + const devicePromise = t.requestDeviceTracked(adapter, { requiredLimits }); if (errorName) { - t.shouldReject(errorName, adapter.requestDevice({ requiredLimits })); + t.shouldReject(errorName, devicePromise); } else { - await adapter.requestDevice({ requiredLimits }); + await devicePromise; } }); @@ -421,8 +427,9 @@ fn(async (t) => { break; } + const devicePromise = t.requestDeviceTracked(adapter, { requiredLimits }); if (success) { - const device = await adapter.requestDevice({ requiredLimits }); + const device = await devicePromise; assert(device !== null); t.expect( device.limits[limit] === limitInfo[limit].default, @@ -430,6 +437,49 @@ fn(async (t) => { ); device.destroy(); } else { - t.shouldReject('OperationError', adapter.requestDevice({ requiredLimits })); + t.shouldReject('OperationError', devicePromise); + } +}); + +g.test('always_returns_device'). +desc( + ` + Test that if requestAdapter returns an adapter then requestDevice must return a device. + + requestAdapter -> null = ok + requestAdapter -> adapter, requestDevice -> device (lost or not) = ok + requestAdapter -> adapter, requestDevice = null = Invalid: not spec compliant. + + Note: requestDevice can throw for invalid parameters like requesting features not + in the adapter, reqesting limits not in the adapter, requesting limits larger than + the maximum for the adapter. Otherwise it does not throw. + + Note: This is a regression test for a Chrome bug crbug.com/349062459 + Checking that a requestDevice always return a device is checked in other tests above + but those tests have 'compatibilityMode: true' set for them by the API that getGPU + returns when the test suite is run in compatibility mode. + + This test tries to force both compat and core separately so both code paths are + tested in the same browser configuration. + ` +). +params((u) => u.combine('compatibilityMode', [false, true])). +fn(async (t) => { + const { compatibilityMode } = t.params; + const gpu = getGPU(t.rec); + // MAINTENANCE_TODO: Remove this cast compatibilityMode is added. + const adapter = await gpu.requestAdapter({ compatibilityMode }); + if (adapter) { + if (!compatibilityMode) { + // This check is to make sure something lower-level is not forcing compatibility mode + // MAINTENANCE_TODO: Remove this cast compatibilityMode is added. + t.expect( + !adapter.isCompatibilityMode, + 'must not be compatibility mode' + ); + } + const device = await t.requestDeviceTracked(adapter); + t.expect(device instanceof GPUDevice, 'requestDevice must return a device or throw'); + device.destroy(); } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map.spec.js index 2d4408e6c07..7fe5c002f6e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map.spec.js @@ -85,7 +85,7 @@ fn(async (t) => { const { size, range } = t.params; const [rangeOffset, rangeSize] = reifyMapRange(size, range); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE }); @@ -123,7 +123,7 @@ fn(async (t) => { const [rangeOffset1, rangeSize1] = reifyMapRange(size, range1); const [rangeOffset2, rangeSize2] = reifyMapRange(size, range2); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation, size, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE @@ -186,7 +186,7 @@ fn(async (t) => { const { size, range } = t.params; const [rangeOffset, rangeSize] = reifyMapRange(size, range); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ @@ -265,7 +265,7 @@ fn(async (t) => { float64Expected[3] = Number.MAX_VALUE; float64Expected[4] = Number.MIN_VALUE; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ @@ -306,7 +306,7 @@ fn((t) => { const { size, range, mappable } = t.params; const [, rangeSize] = reifyMapRange(size, range); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size, usage: GPUBufferUsage.COPY_SRC | (mappable ? GPUBufferUsage.MAP_WRITE : 0) @@ -333,7 +333,7 @@ fn(async (t) => { const { size, range, mappedAtCreation } = t.params; const [rangeOffset, rangeSize] = reifyMapRange(size, range); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation, size, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE @@ -385,7 +385,7 @@ fn((t) => { let buffer; t.expectValidationError(() => { - buffer = t.device.createBuffer({ + buffer = t.createBufferTracked({ mappedAtCreation: true, size, usage @@ -437,7 +437,7 @@ fn(async (t) => { let buffer; t.expectValidationError(() => { - buffer = t.device.createBuffer({ + buffer = t.createBufferTracked({ mappedAtCreation: false, size, usage diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_detach.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_detach.spec.js index 4d8df263497..a7d024557c5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_detach.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_detach.spec.js @@ -50,13 +50,15 @@ fn(async (t) => { if (deviceDestroy) { const adapter = await getGPU(t.rec).requestAdapter(); assert(adapter !== null); - device = await adapter.requestDevice(); + device = await t.requestDeviceTracked(adapter); } - const buffer = device.createBuffer({ - size: 4, - usage, - mappedAtCreation - }); + const buffer = t.trackForCleanup( + device.createBuffer({ + size: 4, + usage, + mappedAtCreation + }) + ); if (mapMode !== undefined) { if (mappedAtCreation) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_oom.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_oom.spec.js index 73aa5b73f16..0ec7d466704 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_oom.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/buffers/map_oom.spec.js @@ -34,7 +34,7 @@ params( fn((t) => { const { oom, usage, size } = t.params; - const f = () => t.device.createBuffer({ mappedAtCreation: true, size, usage }); + const f = () => t.createBufferTracked({ mappedAtCreation: true, size, usage }); if (oom) { // getMappedRange is normally valid on OOM buffers, but this one fails because the diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/basic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/basic.spec.js index 56b6785a65f..1677f3db2d4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/basic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/basic.spec.js @@ -17,7 +17,7 @@ g.test('empty').fn((t) => { g.test('b2t2b').fn((t) => { const data = new Uint32Array([0x01020304]); - const src = t.device.createBuffer({ + const src = t.createBufferTracked({ mappedAtCreation: true, size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST @@ -25,12 +25,12 @@ g.test('b2t2b').fn((t) => { memcpy({ src: data }, { dst: src.getMappedRange() }); src.unmap(); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - const mid = t.device.createTexture({ + const mid = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'rgba8uint', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -55,7 +55,7 @@ g.test('b2t2b').fn((t) => { g.test('b2t2t2b').fn((t) => { const data = new Uint32Array([0x01020304]); - const src = t.device.createBuffer({ + const src = t.createBufferTracked({ mappedAtCreation: true, size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST @@ -63,7 +63,7 @@ g.test('b2t2t2b').fn((t) => { memcpy({ src: data }, { dst: src.getMappedRange() }); src.unmap(); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -73,8 +73,8 @@ g.test('b2t2t2b').fn((t) => { format: 'rgba8uint', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST }; - const mid1 = t.device.createTexture(midDesc); - const mid2 = t.device.createTexture(midDesc); + const mid1 = t.createTextureTracked(midDesc); + const mid2 = t.createTextureTracked(midDesc); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToTexture( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyBufferToBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyBufferToBuffer.spec.js index 376596a7b72..76f37bc6e3f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyBufferToBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyBufferToBuffer.spec.js @@ -34,11 +34,10 @@ fn((t) => { const src = t.makeBufferWithContents(srcData, GPUBufferUsage.COPY_SRC); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: dstBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(dst); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToBuffer(src, srcOffset, dst, dstOffset, copySize); @@ -92,11 +91,10 @@ fn((t) => { const src = t.makeBufferWithContents(srcData, GPUBufferUsage.COPY_SRC); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: srcData.length * 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(dst); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToBuffer(src, 0, dst, 0, 16); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyTextureToTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyTextureToTexture.spec.js index 4609ed70c53..b004592da9f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyTextureToTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/copyTextureToTexture.spec.js @@ -17,12 +17,11 @@ import { isCompressedTextureFormat, - isEncodableTextureformat, - viewCompatible } from + viewCompatible, + isRegularTextureFormat } from '../../../format_info.js'; import { GPUTest, TextureTestMixin } from '../../../gpu_test.js'; -import { makeBufferWithContents } from '../../../util/buffer.js'; import { checkElementsEqual } from '../../../util/check_contents.js'; import { align } from '../../../util/math.js'; import { physicalMipSize } from '../../../util/texture/base.js'; @@ -99,8 +98,7 @@ class F extends TextureTestMixin(GPUTest) { usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST, mipLevelCount }; - const srcTexture = this.device.createTexture(srcTextureDesc); - this.trackForCleanup(srcTexture); + const srcTexture = this.createTextureTracked(srcTextureDesc); const dstTextureDesc = { dimension, size: dstTextureSize, @@ -108,8 +106,7 @@ class F extends TextureTestMixin(GPUTest) { usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | extraTextureUsageFlags, mipLevelCount }; - const dstTexture = this.device.createTexture(dstTextureDesc); - this.trackForCleanup(dstTexture); + const dstTexture = this.createTextureTracked(dstTextureDesc); // Fill the whole subresource of srcTexture at srcCopyLevel with initialSrcData. const initialSrcData = this.GetInitialDataPerMipLevel( @@ -215,7 +212,7 @@ class F extends TextureTestMixin(GPUTest) { // compare by rendering. We need the expected texture to match // the dstTexture so we'll create a texture where we supply // all of the data in JavaScript. - const expectedTexture = this.device.createTexture({ + const expectedTexture = this.createTextureTracked({ size: [dstTexture.width, dstTexture.height, dstTexture.depthOrArrayLayers], mipLevelCount: dstTexture.mipLevelCount, format: dstTexture.format, @@ -273,8 +270,7 @@ class F extends TextureTestMixin(GPUTest) { size: dstBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }; - const dstBuffer = this.device.createBuffer(dstBufferDesc); - this.trackForCleanup(dstBuffer); + const dstBuffer = this.createBufferTracked(dstBufferDesc); { const encoder = this.device.createCommandEncoder(); @@ -346,21 +342,21 @@ class F extends TextureTestMixin(GPUTest) { return; } - assert(isEncodableTextureformat(dstFormat)); - const encodableDstFormat = dstFormat; + assert(isRegularTextureFormat(dstFormat)); + const regularDstFormat = dstFormat; // Verify the content of the whole subresource of dstTexture at dstCopyLevel (in dstBuffer) is expected. const checkByTextureFormat = (actual) => { const zero = { x: 0, y: 0, z: 0 }; - const actTexelView = TexelView.fromTextureDataByReference(encodableDstFormat, actual, { + const actTexelView = TexelView.fromTextureDataByReference(regularDstFormat, actual, { bytesPerRow: bytesInRow, rowsPerImage: dstBlockRowsPerImage, subrectOrigin: zero, subrectSize: dstTextureSizeAtLevel }); const expTexelView = TexelView.fromTextureDataByReference( - encodableDstFormat, + regularDstFormat, expectedUint8DataWithPadding, { bytesPerRow: bytesInRow, @@ -371,7 +367,7 @@ class F extends TextureTestMixin(GPUTest) { ); const failedPixelsMessage = findFailedPixels( - encodableDstFormat, + regularDstFormat, zero, dstTextureSizeAtLevel, { actTexelView, expTexelView }, @@ -436,11 +432,10 @@ class F extends TextureTestMixin(GPUTest) { }), kBufferSizeAlignment ); - const outputBuffer = this.device.createBuffer({ + const outputBuffer = this.createBufferTracked({ size: outputBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(outputBuffer); const encoder = this.device.createCommandEncoder(); encoder.copyTextureToBuffer( { @@ -545,8 +540,7 @@ class F extends TextureTestMixin(GPUTest) { for (let i = 1; i < totalCopyArrayLayers; ++i) { uniformBufferData[kMinDynamicBufferOffsetAlignment / 4 * i] = i; } - const uniformBuffer = makeBufferWithContents( - this.device, + const uniformBuffer = this.makeBufferWithContents( uniformBufferData, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM ); @@ -626,13 +620,11 @@ class F extends TextureTestMixin(GPUTest) { }); const bindGroup = this.GetBindGroupForT2TCopyWithDepthTests(bindGroupLayout, copySize[2]); - const outputColorTexture = this.trackForCleanup( - this.device.createTexture({ - format: 'rgba8unorm', - size: copySize, - usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC - }) - ); + const outputColorTexture = this.createTextureTracked({ + format: 'rgba8unorm', + size: copySize, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }); const hasStencil = kTextureFormatInfo[destinationTexture.format].stencil; const encoder = this.device.createCommandEncoder(); for (let dstCopyLayer = 0; dstCopyLayer < copySize[2]; ++dstCopyLayer) { @@ -1287,28 +1279,24 @@ fn((t) => { srcTextureSize.height >> srcCopyLevel, srcTextureSize.depthOrArrayLayers - Math.max(srcCopyBaseArrayLayer, dstCopyBaseArrayLayer)]; - const sourceTexture = t.trackForCleanup( - t.device.createTexture({ - format, - size: srcTextureSize, - usage: - GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, - mipLevelCount: srcCopyLevel + 1 - }) - ); - const destinationTexture = t.trackForCleanup( - t.device.createTexture({ - format, - size: [ - copySize[0] << dstCopyLevel, - copySize[1] << dstCopyLevel, - srcTextureSize.depthOrArrayLayers], + const sourceTexture = t.createTextureTracked({ + format, + size: srcTextureSize, + usage: + GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, + mipLevelCount: srcCopyLevel + 1 + }); + const destinationTexture = t.createTextureTracked({ + format, + size: [ + copySize[0] << dstCopyLevel, + copySize[1] << dstCopyLevel, + srcTextureSize.depthOrArrayLayers], - usage: - GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, - mipLevelCount: dstCopyLevel + 1 - }) - ); + usage: + GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, + mipLevelCount: dstCopyLevel + 1 + }); let initialStencilData = undefined; if (kTextureFormatInfo[format].stencil) { @@ -1384,7 +1372,7 @@ fn((t) => { const kColorFormat = 'rgba8unorm'; const kSampleCount = 4; - const sourceTexture = t.device.createTexture({ + const sourceTexture = t.createTextureTracked({ format: kColorFormat, size: textureSize, usage: @@ -1393,8 +1381,7 @@ fn((t) => { GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: kSampleCount }); - t.trackForCleanup(sourceTexture); - const destinationTexture = t.device.createTexture({ + const destinationTexture = t.createTextureTracked({ format: kColorFormat, size: textureSize, usage: @@ -1403,7 +1390,6 @@ fn((t) => { GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: kSampleCount }); - t.trackForCleanup(destinationTexture); // Initialize sourceTexture with a draw call. const renderPipelineForInit = t.device.createRenderPipeline({ @@ -1526,12 +1512,11 @@ fn((t) => { }] }); - const expectedOutputTexture = t.device.createTexture({ + const expectedOutputTexture = t.createTextureTracked({ format: kColorFormat, size: textureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(expectedOutputTexture); const validationEncoder = t.device.createCommandEncoder(); const renderPassForValidation = validationEncoder.beginRenderPass({ colorAttachments: [ @@ -1575,20 +1560,18 @@ fn((t) => { const kDepthFormat = 'depth24plus'; const kSampleCount = 4; - const sourceTexture = t.device.createTexture({ + const sourceTexture = t.createTextureTracked({ format: kDepthFormat, size: textureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: kSampleCount }); - t.trackForCleanup(sourceTexture); - const destinationTexture = t.device.createTexture({ + const destinationTexture = t.createTextureTracked({ format: kDepthFormat, size: textureSize, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: kSampleCount }); - t.trackForCleanup(destinationTexture); const vertexState = { module: t.device.createShaderModule({ @@ -1676,19 +1659,17 @@ fn((t) => { count: kSampleCount } }); - const multisampledColorTexture = t.device.createTexture({ + const multisampledColorTexture = t.createTextureTracked({ format: kColorFormat, size: textureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: kSampleCount }); - t.trackForCleanup(multisampledColorTexture); - const colorTextureAsResolveTarget = t.device.createTexture({ + const colorTextureAsResolveTarget = t.createTextureTracked({ format: kColorFormat, size: textureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(colorTextureAsResolveTarget); const encoderForVerify = t.device.createCommandEncoder(); const renderPassForVerify = encoderForVerify.beginRenderPass({ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/image_copy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/image_copy.spec.js index 4263953443f..b8b7f520d6b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/image_copy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/image_copy.spec.js @@ -60,7 +60,6 @@ import { isCompressedTextureFormat } from '../../../format_info.js'; import { GPUTest, TextureTestMixin } from '../../../gpu_test.js'; -import { makeBufferWithContents } from '../../../util/buffer.js'; import { checkElementsEqual } from '../../../util/check_contents.js'; import { align } from '../../../util/math.js'; import { physicalMipSizeFromTexture } from '../../../util/texture/base.js'; @@ -440,7 +439,7 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { actualTexture.height, actualTexture.depthOrArrayLayers]; - const expectedTexture = this.device.createTexture({ + const expectedTexture = this.createTextureTracked({ label: 'expectedTexture', size, dimension: actualTexture.dimension, @@ -448,7 +447,6 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { mipLevelCount: actualTexture.mipLevelCount, usage: actualTexture.usage }); - this.trackForCleanup(expectedTexture); const mipLevel = mipLevelOrUndefined || 0; const fullMipLevelTextureCopyLayout = getTextureCopyLayout( @@ -646,14 +644,13 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { }) { - const texture = this.device.createTexture({ + const texture = this.createTextureTracked({ size: textureSize, format, dimension, mipLevelCount: mipLevel + 1, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING }); - this.trackForCleanup(texture); const data = dataGenerator.generateView(dataSize); @@ -745,14 +742,13 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { initialDataOffset, mipLevel) { - const srcTexture = this.device.createTexture({ + const srcTexture = this.createTextureTracked({ size: textureSize, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, format, mipLevelCount: mipLevel + 1 }); - this.trackForCleanup(srcTexture); const copySize = [textureSize[0] >> mipLevel, textureSize[1] >> mipLevel, textureSize[2]]; const initialData = dataGenerator.generateView( @@ -775,11 +771,7 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { break; case 'CopyB2T': { - const stagingBuffer = makeBufferWithContents( - this.device, - initialData, - GPUBufferUsage.COPY_SRC - ); + const stagingBuffer = this.makeBufferWithContents(initialData, GPUBufferUsage.COPY_SRC); const encoder = this.device.createCommandEncoder(); encoder.copyBufferToTexture( { buffer: stagingBuffer, offset: initialDataOffset, bytesPerRow, rowsPerImage }, @@ -813,14 +805,13 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { offset, mipLevel) { - const srcTexture = this.device.createTexture({ + const srcTexture = this.createTextureTracked({ size: textureSize, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, format, mipLevelCount: mipLevel + 1 }); - this.trackForCleanup(srcTexture); // Initialize srcTexture with queue.writeTexture() const copySize = [textureSize[0] >> mipLevel, textureSize[1] >> mipLevel, textureSize[2]]; @@ -845,11 +836,10 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { }), kBufferSizeAlignment ); - const outputBuffer = this.device.createBuffer({ + const outputBuffer = this.createBufferTracked({ size: outputBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(outputBuffer); const encoder = this.device.createCommandEncoder(); encoder.copyTextureToBuffer( { texture: srcTexture, aspect: 'stencil-only', mipLevel }, @@ -897,8 +887,7 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { for (let i = 1; i < stencilBitCount; ++i) { uniformBufferData[kMinDynamicBufferOffsetAlignment / 4 * i] = i; } - const uniformBuffer = makeBufferWithContents( - this.device, + const uniformBuffer = this.makeBufferWithContents( uniformBufferData, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM ); @@ -1011,12 +1000,11 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { copyFromOutputTextureLayout.mipSize[1], 1]; - const outputTexture = this.device.createTexture({ + const outputTexture = this.createTextureTracked({ format: 'r8unorm', size: outputTextureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - this.trackForCleanup(outputTexture); for ( let stencilTextureLayer = 0; @@ -1068,11 +1056,10 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { // Check outputTexture by copying the content of outputTexture into outputStagingBuffer and // checking all the data in outputStagingBuffer. - const outputStagingBuffer = this.device.createBuffer({ + const outputStagingBuffer = this.createBufferTracked({ size: copyFromOutputTextureLayout.byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(outputStagingBuffer); encoder.copyTextureToBuffer( { texture: outputTexture @@ -1117,12 +1104,11 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { { assert(!!kTextureFormatInfo[depthFormat].depth); - const inputTexture = this.device.createTexture({ + const inputTexture = this.createTextureTracked({ size: copySize, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING, format: 'r32float' }); - this.trackForCleanup(inputTexture); this.queue.writeTexture( { texture: inputTexture }, initialData, @@ -1237,12 +1223,11 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { } createUniformBufferAndBindGroupEntryForBaseArrayLayer(z) { - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ usage: GPUBufferUsage.UNIFORM, size: 4, mappedAtCreation: true }); - this.trackForCleanup(buffer); new Uint32Array(buffer.getMappedRange()).set([z]); buffer.unmap(); return { @@ -1290,13 +1275,12 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { } // Initialize the depth aspect of the source texture - const depthTexture = this.device.createTexture({ + const depthTexture = this.createTextureTracked({ format, size: [copySize[0] << mipLevel, copySize[1] << mipLevel, copySize[2]], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, mipLevelCount: mipLevel + 1 }); - this.trackForCleanup(depthTexture); this.initializeDepthAspectWithRendering(depthTexture, format, copySize, mipLevel, initialData); // Copy the depth aspect of the texture into the destination buffer. @@ -1314,11 +1298,10 @@ class ImageCopyTest extends TextureTestMixin(GPUTest) { dataPaddingInBytes, kBufferSizeAlignment ); - const destinationBuffer = this.device.createBuffer({ + const destinationBuffer = this.createBufferTracked({ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST, size: destinationBufferSize }); - this.trackForCleanup(destinationBuffer); const copyEncoder = this.device.createCommandEncoder(); copyEncoder.copyTextureToBuffer( { @@ -1595,7 +1578,7 @@ fn((t) => { }; let textureHeight = 4 * info.blockHeight; let rowsPerImage = rowsPerImageEqualsCopyHeight ? copyHeight : copyHeight + 1; - const bytesPerRow = align(copyWidth * info.bytesPerBlock, 256); + const bytesPerRow = align(copyWidth * info.color.bytes, 256); if (dimension === '1d') { copySize.height = 1; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/queries/occlusionQuery.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/queries/occlusionQuery.spec.js index fc25802db43..550a0734cbb 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/queries/occlusionQuery.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/queries/occlusionQuery.spec.js @@ -253,15 +253,6 @@ class QueryStarterRenderBundle { } class OcclusionQueryTest extends GPUTest { - createBuffer(desc) { - return this.trackForCleanup(this.device.createBuffer(desc)); - } - createTexture(desc) { - return this.trackForCleanup(this.device.createTexture(desc)); - } - createQuerySet(desc) { - return this.trackForCleanup(this.device.createQuerySet(desc)); - } createVertexBuffer(data) { return this.makeBufferWithContents(data, GPUBufferUsage.VERTEX); } @@ -294,26 +285,26 @@ class OcclusionQueryTest extends GPUTest { const queryResolveBufferOffset = bufferOffset === 'non-zero' ? kRequiredQueryBufferOffsetAlignment : 0; - const queryResolveBuffer = this.createBuffer({ + const queryResolveBuffer = this.createBufferTracked({ size: numQueries * 8 + queryResolveBufferOffset, usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC }); - const readBuffer = this.createBuffer({ + const readBuffer = this.createBufferTracked({ size: numQueries * kBytesPerQuery, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST }); const vertexBuffer = this.createSingleTriangleVertexBuffer(0); - const renderTargetTexture = this.createTexture({ + const renderTargetTexture = this.createTextureTracked({ format: 'rgba8unorm', size: kTextureSize, usage: GPUTextureUsage.RENDER_ATTACHMENT }); const multisampleRenderTarget = sampleCount ? - this.createTexture({ + this.createTextureTracked({ size: kTextureSize, format: 'rgba8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT, @@ -322,7 +313,7 @@ class OcclusionQueryTest extends GPUTest { null; const depthStencilTexture = depthStencilFormat ? - this.createTexture({ + this.createTextureTracked({ format: depthStencilFormat, size: kTextureSize, usage: GPUTextureUsage.RENDER_ATTACHMENT @@ -390,7 +381,7 @@ class OcclusionQueryTest extends GPUTest { }); const querySetOffset = params?.querySetOffset === 'non-zero' ? 7 : 0; - const occlusionQuerySet = this.createQuerySet({ + const occlusionQuerySet = this.createQuerySetTracked({ type: 'occlusion', count: numQueries + querySetOffset }); @@ -958,8 +949,8 @@ fn(async (t) => { readBuffer } = t.setup({ numQueries: kNumQueries }); - const readBuffer2 = t.createBuffer(readBuffer); - const readBuffer3 = t.createBuffer(readBuffer); + const readBuffer2 = t.createBufferTracked(readBuffer); + const readBuffer3 = t.createBufferTracked(readBuffer); const renderSomething = (encoder) => { const pass = encoder.beginRenderPass(renderPassDescriptor); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/render/state_tracking.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/render/state_tracking.spec.js index 9b3363f3aea..8b3595f223e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/render/state_tracking.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/command_buffer/render/state_tracking.spec.js @@ -94,12 +94,11 @@ fn((t) => { // Initialize the vertex buffer with required vertex attributes (position: f32, color: f32x4) // Note that the maximum index in the test is 0x10000. const kVertexAttributesCount = 0x10000 + 1; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ usage: GPUBufferUsage.VERTEX, size: t.kVertexAttributeSize * kVertexAttributesCount, mappedAtCreation: true }); - t.trackForCleanup(vertexBuffer); const vertexAttributes = vertexBuffer.getMappedRange(); const kPositions = [-0.8, -0.4, 0.0, 0.4, 0.8, -0.4]; const kColors = [ @@ -131,7 +130,7 @@ fn((t) => { const renderPipeline = t.GetRenderPipelineForTest(t.kVertexAttributeSize); const outputTextureSize = [kPositions.length - 1, 1, 1]; - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: outputTextureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -205,12 +204,11 @@ fn((t) => { // Initialize the vertex buffer with required vertex attributes (position: f32, color: f32x4) const kVertexAttributesCount = 8; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ usage: GPUBufferUsage.VERTEX, size: t.kVertexAttributeSize * kVertexAttributesCount, mappedAtCreation: true }); - t.trackForCleanup(vertexBuffer); const vertexAttributes = vertexBuffer.getMappedRange(); for (let i = 0; i < kPositions.length; ++i) { const baseOffset = t.kVertexAttributeSize * i; @@ -225,7 +223,7 @@ fn((t) => { const renderPipeline = t.GetRenderPipelineForTest(t.kVertexAttributeSize); const outputTextureSize = [kPositions.length, 1, 1]; - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: outputTextureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -303,12 +301,11 @@ fn((t) => { // Initialize the vertex buffer with required vertex attributes (position: f32, color: f32x4) - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ usage: GPUBufferUsage.VERTEX, size: t.kVertexAttributeSize * kPositions.length, mappedAtCreation: true }); - t.trackForCleanup(vertexBuffer); // Note that kPositions[1], kColors[1], kPositions[5] and kColors[5] are not used. const vertexAttributes = vertexBuffer.getMappedRange(); for (let i = 0; i < kPositions.length; ++i) { @@ -326,7 +323,7 @@ fn((t) => { const kPointsCount = kPositions.length - 1; const outputTextureSize = [kPointsCount, 1, 1]; - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: outputTextureSize, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -502,7 +499,7 @@ fn((t) => { const kPointsCount = 4; const outputTextureSize = [kPointsCount, 1, 1]; - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [kPointsCount, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -562,12 +559,11 @@ fn((t) => { // Initialize the vertex buffer with required vertex attributes (position: f32, color: f32x4) - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ usage: GPUBufferUsage.VERTEX, size: t.kVertexAttributeSize * kPositions.length, mappedAtCreation: true }); - t.trackForCleanup(vertexBuffer); const vertexAttributes = vertexBuffer.getMappedRange(); for (let i = 0; i < kPositions.length; ++i) { const baseOffset = t.kVertexAttributeSize * i; @@ -585,7 +581,7 @@ fn((t) => { const kPointsCount = 4; const outputTextureSize = [kPointsCount, 1, 1]; - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [kPointsCount, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute/basic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute/basic.spec.js index 2875f8a0ac3..a6531609a6c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute/basic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute/basic.spec.js @@ -13,7 +13,7 @@ g.test('memcpy').fn((t) => { const src = t.makeBufferWithContents(data, GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); @@ -92,7 +92,7 @@ fn((t) => { t.params.dispatchSize; const bufferLength = dispatchSize * wgSize; const bufferByteSize = Uint32Array.BYTES_PER_ELEMENT * bufferLength; - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: bufferByteSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute_pipeline/overrides.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute_pipeline/overrides.spec.js index 35d8c437fd2..2586486c1c2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute_pipeline/overrides.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/compute_pipeline/overrides.spec.js @@ -13,7 +13,7 @@ class F extends GPUTest { constants, code) { - const dst = this.device.createBuffer({ + const dst = this.createBufferTracked({ size: expected.byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); @@ -146,6 +146,74 @@ fn(async (t) => { ); }); +g.test('computed'). +desc(`Test that computed overrides work correctly`). +fn(async (t) => { + const module = t.device.createShaderModule({ + code: ` + override c0: f32 = 0.; + override c1: f32 = 0.; + override c2: f32 = c0 * c1; + + struct Buf { + data : array, + } + + @group(0) @binding(0) var buf : Buf; + + @compute @workgroup_size(1) fn main() { + buf.data[0] = u32(c0); + buf.data[1] = u32(c1); + buf.data[2] = u32(c2); + } + ` + }); + + const expected = new Uint32Array([2, 4, 8]); + + const buffer = t.createBufferTracked({ + size: 3 * Uint32Array.BYTES_PER_ELEMENT, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + }); + + const descriptors = [ + { + layout: 'auto', + compute: { + module, + entryPoint: 'main', + constants: { + c0: 2, + c1: 4 + } + } + }]; + + + const pipeline = await t.device.createComputePipelineAsync(descriptors[0]); + const bindGroups = [ + t.device.createBindGroup({ + entries: [ + { + binding: 0, + resource: { buffer, offset: 0, size: 3 * Uint32Array.BYTES_PER_ELEMENT } + }], + + layout: pipeline.getBindGroupLayout(0) + })]; + + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroups[0]); + pass.dispatchWorkgroups(1); + pass.end(); + t.device.queue.submit([encoder.finish()]); + + t.expectGPUBufferValuesEqual(buffer, expected); +}); + g.test('precision'). desc( `Test that float number precision is preserved for constants as they are used for compute shader output of the storage buffer.` @@ -243,11 +311,11 @@ fn(async (t) => { const expects = [new Uint32Array([1]), new Uint32Array([2])]; const buffers = [ - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }), - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE })]; @@ -362,19 +430,19 @@ fn(async (t) => { const buffers = [ - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }), - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }), - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }), - t.device.createBuffer({ + t.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE })]; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/device/lost.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/device/lost.spec.js index e86b009d235..27231d3216f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/device/lost.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/device/lost.spec.js @@ -45,8 +45,8 @@ fn(async (t) => { const { lost } = await (async () => { const adapter = await getGPU(t.rec).requestAdapter(); assert(adapter !== null); - const lost = (await adapter.requestDevice()).lost; - return { lost }; + const device = await t.requestDeviceTracked(adapter); + return { lost: device.lost }; })(); await assertNotSettledWithinTime(lost, t.kDeviceLostTimeoutMS, 'device was unexpectedly lost'); @@ -58,7 +58,7 @@ desc(`'lost' is resolved, with reason='destroyed', on GPUDevice.destroy().`). fn(async (t) => { const adapter = await getGPU(t.rec).requestAdapter(); assert(adapter !== null); - const device = await adapter.requestDevice(); + const device = await t.requestDeviceTracked(adapter); t.expectDeviceDestroyed(device); device.destroy(); }); @@ -68,7 +68,7 @@ desc(`'lost' provides the same Promise and GPUDeviceLostInfo objects each time i fn(async (t) => { const adapter = await getGPU(t.rec).requestAdapter(); assert(adapter !== null); - const device = await adapter.requestDevice(); + const device = await t.requestDeviceTracked(adapter); // The promises should be the same promise object. const lostPromise1 = device.lost; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/labels.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/labels.spec.js index 7da653f5ac2..5d0f0df9d2b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/labels.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/labels.spec.js @@ -12,7 +12,7 @@ export const g = makeTestGroup(GPUTest); const kTestFunctions = { createBuffer: (t, label) => { - const buffer = t.device.createBuffer({ size: 16, usage: GPUBufferUsage.COPY_DST, label }); + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST, label }); t.expect(buffer.label === label); buffer.destroy(); t.expect(buffer.label === label); @@ -22,7 +22,7 @@ const kTestFunctions = { const gpu = getGPU(t.rec); const adapter = await gpu.requestAdapter(); t.expect(!!adapter); - const device = await adapter.requestDevice({ label }); + const device = await t.requestDeviceTracked(adapter, { label }); t.expect(!!device); t.expect(device.label === label); device.destroy(); @@ -30,7 +30,7 @@ const kTestFunctions = { }, createTexture: (t, label) => { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ label, size: [1, 1, 1], format: 'rgba8unorm', @@ -105,6 +105,14 @@ const kTestFunctions = { vertex: { module, entryPoint: 'foo' + }, + // Specify a color attachment so we have at least one render target. Otherwise, details here + // are not relevant to this test. + fragment: { + targets: [{ format: 'rgba8unorm' }], + module: t.device.createShaderModule({ + code: `@fragment fn main() -> @location(0) vec4f { return vec4f(0); }` + }) } }); t.expect(renderPipeline.label === label); @@ -142,6 +150,14 @@ const kTestFunctions = { vertex: { module, entryPoint: 'foo' + }, + // Specify a color attachment so we have at least one render target. Otherwise, details here + // are not relevant to this test. + fragment: { + targets: [{ format: 'rgba8unorm' }], + module: t.device.createShaderModule({ + code: `@fragment fn main() -> @location(0) vec4f { return vec4f(0); }` + }) } }); t.expect(renderPipeline.label === label); @@ -161,7 +177,7 @@ const kTestFunctions = { }, createQuerySet: (t, label) => { - const querySet = t.device.createQuerySet({ + const querySet = t.createQuerySetTracked({ label, type: 'occlusion', count: 1 @@ -172,7 +188,7 @@ const kTestFunctions = { }, beginRenderPass: (t, label) => { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ label, size: [1, 1, 1], format: 'rgba8unorm', @@ -214,7 +230,7 @@ const kTestFunctions = { }, createView: (t, label) => { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, 1], format: 'rgba8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT @@ -266,6 +282,14 @@ fn((t) => { vertex: { module, entryPoint: 'main' + }, + // Specify a color attachment so we have at least one render target. Otherwise, details here + // are not relevant to this test. + fragment: { + targets: [{ format: 'rgba8unorm' }], + module: t.device.createShaderModule({ + code: `@fragment fn main() -> @location(0) vec4f { return vec4f(0); }` + }) } }); const layout1 = pipeline.getBindGroupLayout(0); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/buffer/buffer_sync_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/buffer/buffer_sync_test.js index 7687ba27cd9..3b217fa7bd4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/buffer/buffer_sync_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/buffer/buffer_sync_test.js @@ -221,39 +221,35 @@ export class BufferSyncTest extends GPUTest { break; } - const dstBuffer = this.trackForCleanup( - this.device.createBuffer({ - size: Uint32Array.BYTES_PER_ELEMENT, - usage: - GPUBufferUsage.COPY_SRC | - GPUBufferUsage.COPY_DST | - GPUBufferUsage.STORAGE | - GPUBufferUsage.VERTEX | - GPUBufferUsage.INDEX | - GPUBufferUsage.INDIRECT | - GPUBufferUsage.UNIFORM - }) - ); + const dstBuffer = this.createBufferTracked({ + size: Uint32Array.BYTES_PER_ELEMENT, + usage: + GPUBufferUsage.COPY_SRC | + GPUBufferUsage.COPY_DST | + GPUBufferUsage.STORAGE | + GPUBufferUsage.VERTEX | + GPUBufferUsage.INDEX | + GPUBufferUsage.INDIRECT | + GPUBufferUsage.UNIFORM + }); return { srcBuffer, dstBuffer }; } // Create a buffer with 1 uint32 element, and initialize it to a specified value. async createBufferWithValue(initValue) { - const buffer = this.trackForCleanup( - this.device.createBuffer({ - mappedAtCreation: true, - size: Uint32Array.BYTES_PER_ELEMENT, - usage: - GPUBufferUsage.COPY_SRC | - GPUBufferUsage.COPY_DST | - GPUBufferUsage.STORAGE | - GPUBufferUsage.VERTEX | - GPUBufferUsage.INDEX | - GPUBufferUsage.INDIRECT | - GPUBufferUsage.UNIFORM - }) - ); + const buffer = this.createBufferTracked({ + mappedAtCreation: true, + size: Uint32Array.BYTES_PER_ELEMENT, + usage: + GPUBufferUsage.COPY_SRC | + GPUBufferUsage.COPY_DST | + GPUBufferUsage.STORAGE | + GPUBufferUsage.VERTEX | + GPUBufferUsage.INDEX | + GPUBufferUsage.INDIRECT | + GPUBufferUsage.UNIFORM + }); new Uint32Array(buffer.getMappedRange()).fill(initValue); buffer.unmap(); await this.queue.onSubmittedWorkDone(); @@ -262,20 +258,18 @@ export class BufferSyncTest extends GPUTest { // Create a buffer, and initialize it to the specified values. async createBufferWithValues(initValues) { - const buffer = this.trackForCleanup( - this.device.createBuffer({ - mappedAtCreation: true, - size: Uint32Array.BYTES_PER_ELEMENT * initValues.length, - usage: - GPUBufferUsage.COPY_SRC | - GPUBufferUsage.COPY_DST | - GPUBufferUsage.STORAGE | - GPUBufferUsage.VERTEX | - GPUBufferUsage.INDEX | - GPUBufferUsage.INDIRECT | - GPUBufferUsage.UNIFORM - }) - ); + const buffer = this.createBufferTracked({ + mappedAtCreation: true, + size: Uint32Array.BYTES_PER_ELEMENT * initValues.length, + usage: + GPUBufferUsage.COPY_SRC | + GPUBufferUsage.COPY_DST | + GPUBufferUsage.STORAGE | + GPUBufferUsage.VERTEX | + GPUBufferUsage.INDEX | + GPUBufferUsage.INDIRECT | + GPUBufferUsage.UNIFORM + }); const bufferView = new Uint32Array(buffer.getMappedRange()); bufferView.set(initValues); buffer.unmap(); @@ -287,13 +281,11 @@ export class BufferSyncTest extends GPUTest { async createTextureWithValue(initValue) { // This is not hot in profiles; optimize if this gets used more heavily. const data = new Uint32Array(1).fill(initValue); - const texture = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: 'r32uint', - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }) - ); + const texture = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: 'r32uint', + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }); this.device.queue.writeTexture( { texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } }, data, @@ -379,13 +371,11 @@ export class BufferSyncTest extends GPUTest { } beginSimpleRenderPass(encoder) { - const view = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ).createView(); + const view = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }).createView(); return encoder.beginRenderPass({ colorAttachments: [ { @@ -544,7 +534,7 @@ export class BufferSyncTest extends GPUTest { vertex: ` struct VertexOutput { @builtin(position) position : vec4, - @location(0) @interpolate(flat) data : u32, + @location(0) @interpolate(flat, either) data : u32, }; @vertex fn vert_main(@location(0) input: u32) -> VertexOutput { @@ -561,7 +551,7 @@ export class BufferSyncTest extends GPUTest { @group(0) @binding(0) var data : Data; - @fragment fn frag_main(@location(0) @interpolate(flat) input : u32) -> @location(0) vec4 { + @fragment fn frag_main(@location(0) @interpolate(flat, either) input : u32) -> @location(0) vec4 { data.a = input; return vec4(); // result does't matter } @@ -806,13 +796,11 @@ export class BufferSyncTest extends GPUTest { // Read and Write texture via BufferToTexture copy. encodeReadByB2TCopy(encoder, srcBuffer, dstBuffer) { - const tmpTexture = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: 'r32uint', - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }) - ); + const tmpTexture = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: 'r32uint', + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }); // The b2t copy is just encoded into command encoder, it doesn't write immediately. encoder.copyBufferToTexture( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/operation_context_helper.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/operation_context_helper.js index f3ddfa12bf9..96e1f2ef46e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/operation_context_helper.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/operation_context_helper.js @@ -168,13 +168,11 @@ export class OperationContextHelper { } makeDummyAttachment() { - const texture = this.t.trackForCleanup( - this.device.createTexture({ - format: this.kTextureFormat, - size: this.kTextureSize, - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const texture = this.t.createTextureTracked({ + format: this.kTextureFormat, + size: this.kTextureSize, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); return { view: texture.createView(), loadOp: 'load', diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js index a52c12f8e99..b92cb156cb1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.js @@ -49,13 +49,12 @@ fn((t) => { const hasStencil = formatInfo.stencil !== undefined; // The 3x3 depth stencil texture used for the tests. - const ds = t.device.createTexture({ + const ds = t.createTextureTracked({ label: 'testTexture', size: [3, 3], format, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(ds); // Fill the texture along the X axis with stencil values 1, 2, 3 and along the Y axis depth // values 0.1, 0.2, 0.3. The depth value is written using @builtin(frag_depth) while the @@ -105,13 +104,13 @@ fn((t) => { depthStencilAttachment: { view: ds.createView(), ...(hasDepth && { - depthStoreOp: 'store', depthLoadOp: 'clear', + depthStoreOp: 'store', depthClearValue: 0 }), ...(hasStencil && { - stencilStoreOp: 'store', stencilLoadOp: 'clear', + stencilStoreOp: 'store', stencilClearValue: 0 }) } @@ -217,20 +216,18 @@ fn((t) => { }); // Make fake stencil or depth textures to put in the bindgroup if the aspect is not readonly. - const fakeStencil = t.device.createTexture({ + const fakeStencil = t.createTextureTracked({ label: 'fakeStencil', format: 'r32uint', size: [1, 1], usage: GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(fakeStencil); - const fakeDepth = t.device.createTexture({ + const fakeDepth = t.createTextureTracked({ label: 'fakeDepth', format: 'r32float', size: [1, 1], usage: GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(fakeDepth); const stencilView = stencilReadOnly ? ds.createView({ aspect: 'stencil-only' }) : fakeStencil.createView(); @@ -254,15 +251,15 @@ fn((t) => { depthReadOnly ? { depthReadOnly: true } : { - depthStoreOp: 'store', - depthLoadOp: 'load' + depthLoadOp: 'load', + depthStoreOp: 'store' })), ...(hasStencil && ( stencilReadOnly ? { stencilReadOnly: true } : { - stencilStoreOp: 'store', - stencilLoadOp: 'load' + stencilLoadOp: 'load', + stencilStoreOp: 'store' })) } }); @@ -301,7 +298,7 @@ fn((t) => { }); - const resultTexture = t.device.createTexture({ + const resultTexture = t.createTextureTracked({ label: 'resultTexture', format: 'r32uint', usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/same_subresource.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/same_subresource.spec.js index ca575db19bf..60526aa029b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/same_subresource.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/memory_sync/texture/same_subresource.spec.js @@ -66,13 +66,11 @@ class TextureSyncTestHelper extends OperationContextHelper { { super(t); - this.texture = t.trackForCleanup( - t.device.createTexture({ - size: this.kTextureSize, - format: this.kTextureFormat, - ...textureCreationParams - }) - ); + this.texture = t.createTextureTracked({ + size: this.kTextureSize, + format: this.kTextureFormat, + ...textureCreationParams + }); } /** @@ -83,13 +81,11 @@ class TextureSyncTestHelper extends OperationContextHelper { this.ensureContext(context); switch (op) { case 't2t-copy':{ - const texture = this.t.trackForCleanup( - this.device.createTexture({ - size: this.kTextureSize, - format: this.kTextureFormat, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }) - ); + const texture = this.t.createTextureTracked({ + size: this.kTextureSize, + format: this.kTextureFormat, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }); assert(this.commandEncoder !== undefined); this.commandEncoder.copyTextureToTexture( @@ -106,20 +102,16 @@ class TextureSyncTestHelper extends OperationContextHelper { ...this.kTextureSize, 1] ); - const buffer = this.t.trackForCleanup( - this.device.createBuffer({ - size: byteLength, - usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST - }) - ); + const buffer = this.t.createBufferTracked({ + size: byteLength, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); - const texture = this.t.trackForCleanup( - this.device.createTexture({ - size: this.kTextureSize, - format: this.kTextureFormat, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }) - ); + const texture = this.t.createTextureTracked({ + size: this.kTextureSize, + format: this.kTextureFormat, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }); assert(this.commandEncoder !== undefined); this.commandEncoder.copyTextureToBuffer( @@ -137,13 +129,11 @@ class TextureSyncTestHelper extends OperationContextHelper { return texture; } case 'sample':{ - const texture = this.t.trackForCleanup( - this.device.createTexture({ - size: this.kTextureSize, - format: this.kTextureFormat, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING - }) - ); + const texture = this.t.createTextureTracked({ + size: this.kTextureSize, + format: this.kTextureFormat, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING + }); const bindGroupLayout = this.device.createBindGroupLayout({ entries: [ @@ -326,7 +316,7 @@ class TextureSyncTestHelper extends OperationContextHelper { break; } case 't2t-copy':{ - const texture = this.device.createTexture({ + const texture = this.t.createTextureTracked({ size: this.kTextureSize, format: this.kTextureFormat, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -376,12 +366,10 @@ class TextureSyncTestHelper extends OperationContextHelper { } } - const buffer = this.t.trackForCleanup( - this.device.createBuffer({ - size: fullTexelData.byteLength, - usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST - }) - ); + const buffer = this.t.createBufferTracked({ + size: fullTexelData.byteLength, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); this.queue.writeBuffer(buffer, 0, fullTexelData); @@ -395,14 +383,12 @@ class TextureSyncTestHelper extends OperationContextHelper { } case 'attachment-resolve':{ assert(this.commandEncoder !== undefined); - const renderTarget = this.t.trackForCleanup( - this.device.createTexture({ - format: this.kTextureFormat, - size: this.kTextureSize, - usage: GPUTextureUsage.RENDER_ATTACHMENT, - sampleCount: 4 - }) - ); + const renderTarget = this.t.createTextureTracked({ + format: this.kTextureFormat, + size: this.kTextureSize, + usage: GPUTextureUsage.RENDER_ATTACHMENT, + sampleCount: 4 + }); this.renderPassEncoder = this.commandEncoder.beginRenderPass({ colorAttachments: [ { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/onSubmittedWorkDone.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/onSubmittedWorkDone.spec.js index e6d6fae9b56..577b90c104d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/onSubmittedWorkDone.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/onSubmittedWorkDone.spec.js @@ -19,7 +19,7 @@ fn(async (t) => { g.test('with_work'). desc(`Await onSubmittedWorkDone once after submitting some work (writeBuffer).`). fn(async (t) => { - const buffer = t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_DST }); + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); t.queue.writeBuffer(buffer, 0, new Uint8Array(4)); await t.queue.onSubmittedWorkDone(); }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/reflection.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/reflection.spec.js index 3fd7746ebed..3e4d04ef244 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/reflection.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/reflection.spec.js @@ -44,7 +44,7 @@ fn((t) => { const { descriptor } = t.params; t.expectValidationError(() => { - const buffer = t.device.createBuffer(descriptor); + const buffer = t.createBufferTracked(descriptor); t.expect(buffer.size === descriptor.size); t.expect(buffer.usage === descriptor.usage); @@ -66,10 +66,8 @@ u.combine('descriptor', kBufferSubcases).filter((p) => !p.descriptor.invalid) fn((t) => { const { descriptor } = t.params; - const buffer = t.device.createBuffer(descriptor); - t.trackForCleanup(buffer); - const buffer2 = t.device.createBuffer(buffer); - t.trackForCleanup(buffer2); + const buffer = t.createBufferTracked(descriptor); + const buffer2 = t.createBufferTracked(buffer); const bufferAsObject = buffer; const buffer2AsObject = buffer2; @@ -164,7 +162,7 @@ fn((t) => { } t.expectValidationError(() => { - const texture = t.device.createTexture(descriptor); + const texture = t.createTextureTracked(descriptor); t.expect(texture.width === width); t.expect(texture.height === height); @@ -195,12 +193,10 @@ u.combine('descriptor', kTextureSubcases).filter((p) => !p.descriptor.invalid) fn((t) => { const { descriptor } = t.params; - const texture = t.device.createTexture(descriptor); - t.trackForCleanup(texture); + const texture = t.createTextureTracked(descriptor); const textureWithSize = texture; textureWithSize.size = [texture.width, texture.height, texture.depthOrArrayLayers]; - const texture2 = t.device.createTexture(textureWithSize); - t.trackForCleanup(texture2); + const texture2 = t.createTextureTracked(textureWithSize); const textureAsObject = texture; const texture2AsObject = texture2; @@ -217,14 +213,14 @@ fn((t) => { // MAINTENANCE_TODO: Check this if it is made possible by a spec change. // - // texture3 = t.device.createTexture({ + // texture3 = t.createTextureTracked({ // ...texture, // size: [texture.width, texture.height, texture.depthOrArrayLayers], // }); // // and this // - // texture3 = t.device.createTexture({ + // texture3 = t.createTextureTracked({ // size: [texture.width, texture.height, texture.depthOrArrayLayers], // ...texture, // }); @@ -249,7 +245,7 @@ fn((t) => { const { descriptor } = t.params; t.expectValidationError(() => { - const querySet = t.device.createQuerySet(descriptor); + const querySet = t.createQuerySetTracked(descriptor); t.expect(querySet.type === descriptor.type); t.expect(querySet.count === descriptor.count); @@ -270,10 +266,8 @@ u.combine('descriptor', kQuerySetSubcases).filter((p) => !p.descriptor.invalid) fn((t) => { const { descriptor } = t.params; - const querySet = t.device.createQuerySet(descriptor); - t.trackForCleanup(querySet); - const querySet2 = t.device.createQuerySet(querySet); - t.trackForCleanup(querySet2); + const querySet = t.createQuerySetTracked(descriptor); + const querySet2 = t.createQuerySetTracked(querySet); const querySetAsObject = querySet; const querySet2AsObject = querySet2; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/clear_value.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/clear_value.spec.js index 5c127533ba8..13b16de62e5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/clear_value.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/clear_value.spec.js @@ -64,12 +64,12 @@ fn((t) => { const kSize = [1, 1, 1]; const colorFormat = 'rgba8unorm'; - const stencilTexture = t.device.createTexture({ + const stencilTexture = t.createTextureTracked({ format: stencilFormat, size: kSize, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC }); - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: colorFormat, size: kSize, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC @@ -162,11 +162,10 @@ fn((t) => { renderPassEncoder.draw(6); renderPassEncoder.end(); - const destinationBuffer = t.device.createBuffer({ + const destinationBuffer = t.createBufferTracked({ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST, size: 4 }); - t.trackForCleanup(destinationBuffer); encoder.copyTextureToBuffer( { texture: stencilTexture, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/resolve.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/resolve.spec.js index abcbe24bd89..c9b1f20dfb2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/resolve.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/resolve.spec.js @@ -99,7 +99,7 @@ fn((t) => { const kResolveTargetSize = kSize << t.params.resolveTargetBaseMipLevel; for (let i = 0; i < t.params.numColorAttachments; i++) { - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kFormat, size: { width: kSize, height: kSize, depthOrArrayLayers: 1 }, sampleCount: 4, @@ -109,7 +109,7 @@ fn((t) => { }); if (t.params.slotsToResolve.includes(i)) { - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kFormat, size: { width: kSize, height: kSize, depthOrArrayLayers: 1 }, sampleCount: 4, @@ -118,7 +118,7 @@ fn((t) => { GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const resolveTarget = t.device.createTexture({ + const resolveTarget = t.createTextureTracked({ format: kFormat, size: { width: kResolveTargetSize, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeOp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeOp.spec.js index 16ce8466993..40e1e6a235e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeOp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeOp.spec.js @@ -65,7 +65,7 @@ combine('depthStencilStoreOperation', kStoreOps) fn((t) => { // Create a basic color attachment. const kColorFormat = 'rgba8unorm'; - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kColorFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -75,7 +75,7 @@ fn((t) => { // Create a basic depth/stencil attachment. const kDepthStencilFormat = 'depth32float'; - const depthStencilAttachment = t.device.createTexture({ + const depthStencilAttachment = t.createTextureTracked({ format: kDepthStencilFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -154,7 +154,7 @@ beforeAllSubcases((t) => { t.skipIfTextureFormatNotSupported(t.params.colorFormat); }). fn((t) => { - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: t.params.colorFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: t.params.arrayLayer + 1 }, mipLevelCount: kMipLevelCount, @@ -219,7 +219,7 @@ fn((t) => { for (let i = 0; i < t.params.colorAttachments; i++) { colorAttachments.push( - t.device.createTexture({ + t.createTextureTracked({ format: kColorFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -284,7 +284,7 @@ combine('mipLevel', kMipLevel). combine('arrayLayer', kArrayLayers) ). fn((t) => { - const depthStencilTexture = t.device.createTexture({ + const depthStencilTexture = t.createTextureTracked({ format: t.params.depthStencilFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: t.params.arrayLayer + 1 }, mipLevelCount: kMipLevelCount, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeop2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeop2.spec.js index 07894fcfc05..4ab2bba168e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeop2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pass/storeop2.spec.js @@ -19,7 +19,7 @@ paramsSimple([ { storeOp: 'discard', _expected: 0 }] ). fn((t) => { - const renderTexture = t.device.createTexture({ + const renderTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'r8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -64,9 +64,9 @@ fn((t) => { colorAttachments: [ { view: renderTexture.createView(), - storeOp: t.params.storeOp, clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: t.params.storeOp }] }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/culling_tests.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/culling_tests.spec.js index 12e919b64d8..1cf10b3edb0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/culling_tests.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/culling_tests.spec.js @@ -140,7 +140,7 @@ fn((t) => { const size = 4; const format = 'rgba8unorm'; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: size, height: size, depthOrArrayLayers: 1 }, format, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC @@ -151,7 +151,7 @@ fn((t) => { let depthStencilAttachment = undefined; let depthStencil = undefined; if (depthStencilFormat) { - depthTexture = t.device.createTexture({ + depthTexture = t.createTextureTracked({ size: { width: size, height: size, depthOrArrayLayers: 1 }, format: depthStencilFormat, usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/overrides.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/overrides.spec.js index be7a059954e..9598b6f5c7a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/overrides.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/overrides.spec.js @@ -14,7 +14,7 @@ class F extends GPUTest { vertex, fragment) { - const renderTarget = this.device.createTexture({ + const renderTarget = this.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -41,14 +41,14 @@ class F extends GPUTest { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', clearValue: { r: kClearValueResult.R, g: kClearValueResult.G, b: kClearValueResult.B, a: kClearValueResult.A }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); @@ -311,12 +311,12 @@ fn(async (t) => { t.params.fragmentConstants1 ); - const renderTarget0 = t.device.createTexture({ + const renderTarget0 = t.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const renderTarget1 = t.device.createTexture({ + const renderTarget1 = t.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -328,14 +328,14 @@ fn(async (t) => { colorAttachments: [ { view: renderTarget0.createView(), - storeOp: 'store', clearValue: { r: kClearValueResult.R, g: kClearValueResult.G, b: kClearValueResult.B, a: kClearValueResult.A }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); @@ -347,14 +347,14 @@ fn(async (t) => { colorAttachments: [ { view: renderTarget1.createView(), - storeOp: 'store', clearValue: { r: kClearValueResult.R, g: kClearValueResult.G, b: kClearValueResult.B, a: kClearValueResult.A }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/pipeline_output_targets.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/pipeline_output_targets.spec.js index 5fdd9a2b669..143c89814ed 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/pipeline_output_targets.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/pipeline_output_targets.spec.js @@ -79,7 +79,7 @@ fn((t) => { attachmentsFloatWriteValues; const renderTargets = range(attachmentCount, () => - t.device.createTexture({ + t.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -125,9 +125,9 @@ fn((t) => { null : { view: renderTargets[i].createView(), - storeOp: 'store', clearValue: { r: 0.5, g: 0.5, b: 0.5, a: 0.5 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' } ) }); @@ -170,7 +170,7 @@ fn((t) => { // extra channels are discarded const values = [0, 1, 0, 1]; - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -205,9 +205,9 @@ fn((t) => { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); @@ -381,7 +381,7 @@ fn((t) => { const componentCount = output.length; const info = kTextureFormatInfo[format]; - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ format, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -432,9 +432,9 @@ fn((t) => { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/primitive_topology.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/primitive_topology.spec.js index bcdcf5bf005..4d856ded882 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/primitive_topology.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/primitive_topology.spec.js @@ -281,7 +281,7 @@ function generateVertexBuffer(vertexLocations) { const kDefaultDrawCount = 6; class PrimitiveTopologyTest extends TextureTestMixin(GPUTest) { makeAttachmentTexture() { - return this.device.createTexture({ + return this.createTextureTracked({ format: kColorFormat, size: { width: kRTSize, height: kRTSize, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/sample_mask.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/sample_mask.spec.js index 54f89d1c40b..fed04b277ee 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/sample_mask.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/render_pipeline/sample_mask.spec.js @@ -8,6 +8,8 @@ Also tested: - The positions of samples in the standard sample patterns. - Per-sample interpolation sampling: @interpolate(perspective, sample). +TODO: Test sample_mask as an input. + TODO: add a test without a 0th color attachment (sparse color attachment), with different color attachments and alpha value output. The cross-platform behavior is unknown. could be any of: - coverage is always 100% @@ -19,7 +21,7 @@ Details could be found at: https://github.com/gpuweb/cts/issues/2201 import { assert, range } from '../../../../common/util/util.js'; import { GPUTest, TextureTestMixin } from '../../../gpu_test.js'; import { checkElementsPassPredicate, checkElementsEqual } from '../../../util/check_contents.js'; -import { TypeF32, TypeU32 } from '../../../util/conversion.js'; +import { Type } from '../../../util/conversion.js'; import { TexelView } from '../../../util/texture/texel_view.js'; const kColors = [ @@ -127,7 +129,7 @@ fragmentShaderOutputMaskOrAlphaToCoverageMask) const kSampleMaskTestShader = ` struct Varyings { @builtin(position) Position : vec4, - @location(0) @interpolate(flat) uvFlat : vec2, + @location(0) @interpolate(flat, either) uvFlat : vec2, @location(1) @interpolate(perspective, sample) uvInterpolated : vec2, } @@ -329,7 +331,7 @@ class F extends TextureTestMixin(GPUTest) { const renderTargetTextures = []; const resolveTargetTextures = []; for (let i = 0; i < colorTargetsCount; i++) { - const renderTargetTexture = this.device.createTexture({ + const renderTargetTexture = this.createTextureTracked({ format, size: { width: kRenderTargetSize, @@ -345,7 +347,7 @@ class F extends TextureTestMixin(GPUTest) { const resolveTargetTexture = sampleCount === 1 ? null : - this.device.createTexture({ + this.createTextureTracked({ format, size: { width: kRenderTargetSize, @@ -359,7 +361,7 @@ class F extends TextureTestMixin(GPUTest) { resolveTargetTextures.push(resolveTargetTexture); } - const depthStencilTexture = this.device.createTexture({ + const depthStencilTexture = this.createTextureTracked({ size: { width: kRenderTargetSize, height: kRenderTargetSize @@ -436,7 +438,7 @@ class F extends TextureTestMixin(GPUTest) { fragmentShaderOutputMask) { const buffer = this.copy2DTextureToBufferUsingComputePass( - TypeF32, // correspond to 'rgba8unorm' format + Type.f32, // correspond to 'rgba8unorm' format 4, texture.createView(), sampleCount @@ -462,7 +464,7 @@ class F extends TextureTestMixin(GPUTest) { const buffer = this.copy2DTextureToBufferUsingComputePass( // Use f32 as the scalar type for depth (depth24plus, depth32float) // Use u32 as the scalar type for stencil (stencil8) - aspect === 'depth-only' ? TypeF32 : TypeU32, + aspect === 'depth-only' ? Type.f32 : Type.u32, 1, depthStencilTexture.createView({ aspect }), sampleCount @@ -529,11 +531,10 @@ combine('fragmentShaderOutputMask', [ fn((t) => { const { sampleCount, rasterizationMask, sampleMask, fragmentShaderOutputMask } = t.params; - const fragmentMaskUniformBuffer = t.device.createBuffer({ + const fragmentMaskUniformBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(fragmentMaskUniformBuffer); t.device.queue.writeBuffer( fragmentMaskUniformBuffer, 0, @@ -645,11 +646,10 @@ fn(async (t) => { const sampleMask = 0xffffffff; const alphaValues = new Float32Array(4); // [alpha0, alpha1, 0, 0] - const alphaValueUniformBuffer = t.device.createBuffer({ + const alphaValueUniformBuffer = t.createBufferTracked({ size: alphaValues.byteLength, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(alphaValueUniformBuffer); const module = t.device.createShaderModule({ code: kSampleMaskTestShader }); const pipeline = t.device.createRenderPipeline({ @@ -703,7 +703,7 @@ fn(async (t) => { ); const colorBuffer = t.copy2DTextureToBufferUsingComputePass( - TypeF32, // correspond to 'rgba8unorm' format + Type.f32, // correspond to 'rgba8unorm' format 4, color.createView(), sampleCount @@ -715,7 +715,7 @@ fn(async (t) => { colorResultPromises.push(colorResult); const depthBuffer = t.copy2DTextureToBufferUsingComputePass( - TypeF32, // correspond to 'depth24plus-stencil8' format + Type.f32, // correspond to 'depth24plus-stencil8' format 1, depthStencil.createView({ aspect: 'depth-only' }), sampleCount @@ -727,7 +727,7 @@ fn(async (t) => { depthResultPromises.push(depthResult); const stencilBuffer = t.copy2DTextureToBufferUsingComputePass( - TypeU32, // correspond to 'depth24plus-stencil8' format + Type.u32, // correspond to 'depth24plus-stencil8' format 1, depthStencil.createView({ aspect: 'stencil-only' }), sampleCount diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/3d_texture_slices.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/3d_texture_slices.spec.js new file mode 100644 index 00000000000..6f2fac8d9ef --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/3d_texture_slices.spec.js @@ -0,0 +1,363 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Test rendering to 3d texture slices. +- Render to same slice on different render pass, different textures, or texture [1, 1, N]'s different mip levels +- Render to different slices at mip levels on same texture in render pass +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { kTextureFormatInfo } from '../../../format_info.js'; +import { GPUTest } from '../../../gpu_test.js'; +import { kBytesPerRowAlignment } from '../../../util/texture/layout.js'; + +const kSize = 4; +const kFormat = 'rgba8unorm'; + +class F extends GPUTest { + createShaderModule(attachmentCount = 1) { + let locations = ''; + let outputs = ''; + for (let i = 0; i < attachmentCount; i++) { + locations = locations + `@location(${i}) color${i} : vec4f, \n`; + outputs = outputs + `output.color${i} = vec4f(0.0, 1.0, 0.0, 1.0);\n`; + } + + return this.device.createShaderModule({ + code: ` + struct Output { + ${locations} + } + + @vertex + fn main_vs(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4 { + var pos : array, 3> = array, 3>( + // Triangle is slightly extended so its edge doesn't cut through pixel centers. + vec2(-1.0, 1.01), + vec2(1.01, -1.0), + vec2(-1.0, -1.0)); + return vec4(pos[VertexIndex], 0.0, 1.0); + } + + @fragment + fn main_fs() -> Output { + var output : Output; + ${outputs} + return output; + } + ` + }); + } + + getBufferSizeAndOffset( + attachmentWidth, + attachmentHeight, + attachmentCount) + { + const bufferSize = + (attachmentCount * attachmentHeight - 1) * kBytesPerRowAlignment + attachmentWidth * 4; + const bufferOffset = attachmentCount > 1 ? attachmentHeight * kBytesPerRowAlignment : 0; + return { bufferSize, bufferOffset }; + } + + checkAttachmentResult( + attachmentWidth, + attachmentHeight, + attachmentCount, + buffer) + { + const { bufferSize, bufferOffset } = this.getBufferSizeAndOffset( + attachmentWidth, + attachmentHeight, + attachmentCount + ); + const expectedData = new Uint8Array(bufferSize); + for (let i = 0; i < attachmentCount; i++) { + for (let j = 0; j < attachmentHeight; j++) { + for (let k = 0; k < attachmentWidth; k++) { + expectedData[i * bufferOffset + j * 256 + k * 4] = k <= j ? 0x00 : 0xff; + expectedData[i * bufferOffset + j * 256 + k * 4 + 1] = k <= j ? 0xff : 0x00; + expectedData[i * bufferOffset + j * 256 + k * 4 + 2] = 0x00; + expectedData[i * bufferOffset + j * 256 + k * 4 + 3] = 0xff; + } + } + } + + this.expectGPUBufferValuesEqual(buffer, expectedData); + } +} + +export const g = makeTestGroup(F); + +g.test('one_color_attachment,mip_levels'). +desc( + ` + Render to a 3d texture slice with mip levels. + ` +). +params((u) => u.combine('mipLevel', [0, 1, 2]).combine('depthSlice', [0, 1])). +fn((t) => { + const { mipLevel, depthSlice } = t.params; + + const texture = t.createTextureTracked({ + size: [kSize << mipLevel, kSize << mipLevel, 2 << mipLevel], + dimension: '3d', + format: kFormat, + mipLevelCount: mipLevel + 1, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }); + + const { bufferSize } = t.getBufferSizeAndOffset(kSize, kSize, 1); + + const buffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); + + const module = t.createShaderModule(); + + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { + module, + targets: [{ format: kFormat }] + }, + primitive: { topology: 'triangle-list' } + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: texture.createView({ + baseMipLevel: mipLevel, + mipLevelCount: 1 + }), + depthSlice, + clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, + loadOp: 'clear', + storeOp: 'store' + }] + + }); + pass.setPipeline(pipeline); + pass.draw(3); + pass.end(); + encoder.copyTextureToBuffer( + { texture, mipLevel, origin: { x: 0, y: 0, z: depthSlice } }, + { buffer, bytesPerRow: 256 }, + { width: kSize, height: kSize, depthOrArrayLayers: 1 } + ); + t.device.queue.submit([encoder.finish()]); + + t.checkAttachmentResult(kSize, kSize, 1, buffer); +}); + +g.test('multiple_color_attachments,same_mip_level'). +desc( + ` + Render to the different slices of 3d texture in multiple color attachments. + - Same 3d texture with different slices at same mip level + - Different 3d textures with same slice at same mip level + ` +). +params((u) => +u. +combine('sameTexture', [true, false]). +beginSubcases(). +combine('samePass', [true, false]). +combine('mipLevel', [0, 1]) +). +fn((t) => { + const { sameTexture, samePass, mipLevel } = t.params; + + const formatByteCost = kTextureFormatInfo[kFormat].colorRender.byteCost; + const maxAttachmentCountPerSample = Math.trunc( + t.device.limits.maxColorAttachmentBytesPerSample / formatByteCost + ); + const attachmentCount = Math.min( + maxAttachmentCountPerSample, + t.device.limits.maxColorAttachments + ); + + const descriptor = { + size: [kSize << mipLevel, kSize << mipLevel, 1 << attachmentCount << mipLevel], + dimension: '3d', + format: kFormat, + mipLevelCount: mipLevel + 1, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }; + + const texture = t.createTextureTracked(descriptor); + + const textures = []; + const colorAttachments = []; + for (let i = 0; i < attachmentCount; i++) { + if (sameTexture) { + textures.push(texture); + } else { + const diffTexture = t.createTextureTracked(descriptor); + textures.push(diffTexture); + } + + const colorAttachment = { + view: textures[i].createView({ + baseMipLevel: mipLevel, + mipLevelCount: 1 + }), + depthSlice: sameTexture ? i : 0, + clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, + loadOp: 'clear', + storeOp: 'store' + }; + + colorAttachments.push(colorAttachment); + } + + const encoder = t.device.createCommandEncoder(); + + if (samePass) { + const module = t.createShaderModule(attachmentCount); + + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { + module, + targets: new Array(attachmentCount).fill({ format: kFormat }) + }, + primitive: { topology: 'triangle-list' } + }); + + const pass = encoder.beginRenderPass({ colorAttachments }); + pass.setPipeline(pipeline); + pass.draw(3); + pass.end(); + } else { + const module = t.createShaderModule(); + + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { + module, + targets: [{ format: kFormat }] + }, + primitive: { topology: 'triangle-list' } + }); + + for (let i = 0; i < attachmentCount; i++) { + const pass = encoder.beginRenderPass({ colorAttachments: [colorAttachments[i]] }); + pass.setPipeline(pipeline); + pass.draw(3); + pass.end(); + } + } + + const { bufferSize, bufferOffset } = t.getBufferSizeAndOffset(kSize, kSize, attachmentCount); + const buffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); + for (let i = 0; i < attachmentCount; i++) { + encoder.copyTextureToBuffer( + { + texture: textures[i], + mipLevel, + origin: { x: 0, y: 0, z: sameTexture ? i : 0 } + }, + { buffer, bytesPerRow: 256, offset: bufferOffset * i }, + { width: kSize, height: kSize, depthOrArrayLayers: 1 } + ); + } + + t.device.queue.submit([encoder.finish()]); + + t.checkAttachmentResult(kSize, kSize, attachmentCount, buffer); +}); + +g.test('multiple_color_attachments,same_slice_with_diff_mip_levels'). +desc( + ` + Render to the same slice of a 3d texture at different mip levels in multiple color attachments. + - For texture size with 1x1xN, the same depth slice of different mip levels can be rendered. + ` +). +params((u) => u.combine('depthSlice', [0, 1])). +fn((t) => { + const { depthSlice } = t.params; + + const kBaseSize = 1; + + const formatByteCost = kTextureFormatInfo[kFormat].colorRender.byteCost; + const maxAttachmentCountPerSample = Math.trunc( + t.device.limits.maxColorAttachmentBytesPerSample / formatByteCost + ); + const attachmentCount = Math.min( + maxAttachmentCountPerSample, + t.device.limits.maxColorAttachments + ); + + const module = t.createShaderModule(attachmentCount); + + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { + module, + targets: new Array(attachmentCount).fill({ format: kFormat }) + }, + primitive: { topology: 'triangle-list' } + }); + + const texture = t.createTextureTracked({ + size: [kBaseSize, kBaseSize, depthSlice + 1 << attachmentCount], + dimension: '3d', + format: kFormat, + mipLevelCount: attachmentCount, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }); + + const colorAttachments = []; + for (let i = 0; i < attachmentCount; i++) { + const colorAttachment = { + view: texture.createView({ + baseMipLevel: i, + mipLevelCount: 1 + }), + depthSlice, + clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, + loadOp: 'clear', + storeOp: 'store' + }; + + colorAttachments.push(colorAttachment); + } + + const encoder = t.device.createCommandEncoder(); + + const pass = encoder.beginRenderPass({ colorAttachments }); + pass.setPipeline(pipeline); + pass.draw(3); + pass.end(); + + const { bufferSize, bufferOffset } = t.getBufferSizeAndOffset( + kBaseSize, + kBaseSize, + attachmentCount + ); + const buffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); + for (let i = 0; i < attachmentCount; i++) { + encoder.copyTextureToBuffer( + { texture, mipLevel: i, origin: { x: 0, y: 0, z: depthSlice } }, + { buffer, bytesPerRow: 256, offset: bufferOffset * i }, + { width: kBaseSize, height: kBaseSize, depthOrArrayLayers: 1 } + ); + } + + t.device.queue.submit([encoder.finish()]); + + t.checkAttachmentResult(kBaseSize, kBaseSize, attachmentCount, buffer); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/basic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/basic.spec.js index c549a195a78..004761ac4f4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/basic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/basic.spec.js @@ -10,12 +10,12 @@ import { checkElementsEqual } from '../../../util/check_contents.js'; export const g = makeTestGroup(GPUTest); g.test('clear').fn((t) => { - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: 'rgba8unorm', size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -45,12 +45,12 @@ g.test('clear').fn((t) => { }); g.test('fullscreen_quad').fn((t) => { - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: 'rgba8unorm', size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -94,9 +94,9 @@ g.test('fullscreen_quad').fn((t) => { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); @@ -146,17 +146,17 @@ fn(async (t) => { const { indexed, indirect } = t.params; const kBytesPerRow = 256; - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 3 * kBytesPerRow, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - const paramsBuffer = t.device.createBuffer({ + const paramsBuffer = t.createBufferTracked({ size: 8, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }); - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: 20, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST }); @@ -173,12 +173,11 @@ fn(async (t) => { let indexBuffer = null; if (indexed) { const kMaxIndices = 16 * 1024 * 1024; - indexBuffer = t.device.createBuffer({ + indexBuffer = t.createBufferTracked({ size: kMaxIndices * Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST, mappedAtCreation: true }); - t.trackForCleanup(indexBuffer); const indexData = new Uint32Array(indexBuffer.getMappedRange()); for (let i = 0; i < kMaxIndices; ++i) { indexData[i] = i; @@ -186,7 +185,7 @@ fn(async (t) => { indexBuffer.unmap(); } - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: 'rgba8unorm', size: { width: 3, height: 3, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -263,9 +262,9 @@ fn(async (t) => { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 0.0, g: 0.0, b: 1.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/color_target_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/color_target_state.spec.js index 4e0a49f507f..97630bc904d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/color_target_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/color_target_state.spec.js @@ -11,7 +11,7 @@ TODO: import { assert, unreachable } from '../../../../common/util/util.js'; import { kBlendFactors, kBlendOperations } from '../../../capability_info.js'; import { GPUConst } from '../../../constants.js'; -import { kEncodableTextureFormats, kTextureFormatInfo } from '../../../format_info.js'; +import { kRegularTextureFormats, kTextureFormatInfo } from '../../../format_info.js'; import { GPUTest, TextureTestMixin } from '../../../gpu_test.js'; import { clamp } from '../../../util/math.js'; import { TexelView } from '../../../util/texture/texel_view.js'; @@ -165,6 +165,7 @@ u // .combine('component', ['color', 'alpha']). combine('srcFactor', kBlendFactors). combine('dstFactor', kBlendFactors). +beginSubcases(). combine('operation', kBlendOperations). filter((t) => { if (t.operation === 'min' || t.operation === 'max') { @@ -172,7 +173,6 @@ filter((t) => { } return true; }). -beginSubcases(). combine('srcColor', [{ r: 0.11, g: 0.61, b: 0.81, a: 0.44 }]). combine('dstColor', [ { r: 0.51, g: 0.22, b: 0.71, a: 0.33 }, @@ -263,7 +263,7 @@ struct Uniform { } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [1, 1, 1], format: textureFormat @@ -318,9 +318,9 @@ struct Uniform { ); }); -const kBlendableFormats = kEncodableTextureFormats.filter((f) => { +const kBlendableFormats = kRegularTextureFormats.filter((f) => { const info = kTextureFormatInfo[f]; - return info.renderable && info.sampleType === 'float'; + return info.colorRender && info.color.type === 'float'; }); g.test('blending,formats'). @@ -374,7 +374,7 @@ fn((t) => { } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [1, 1, 1], format @@ -414,7 +414,7 @@ fn((t) => { blend: { color: blendComponent, alpha: blendComponent } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [kSize, kSize], format @@ -472,7 +472,7 @@ fn((t) => { blend: { color: blendComponent, alpha: blendComponent } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [kSize, kSize], format @@ -524,7 +524,7 @@ fn((t) => { blend: { color: blendComponent, alpha: blendComponent } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [kSize, kSize], format @@ -627,7 +627,7 @@ fn((t) => { writeMask: mask }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [kSize, kSize], format @@ -683,7 +683,7 @@ fn((t) => { writeMask: GPUColorWrite.RED }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [kSize, kSize], format @@ -779,7 +779,7 @@ fn((t) => { } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, size: [1, 1, 1], format diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth.spec.js index 19008f08505..85b3d8310c6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth.spec.js @@ -25,24 +25,20 @@ class DepthTest extends TextureTestMixin(GPUTest) { runDepthStateTest(testStates, expectedColor) { const renderTargetFormat = 'rgba8unorm'; - const renderTarget = this.trackForCleanup( - this.device.createTexture({ - format: renderTargetFormat, - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const renderTarget = this.createTextureTracked({ + format: renderTargetFormat, + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); const depthStencilFormat = 'depth24plus-stencil8'; - const depthTexture = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: depthStencilFormat, - sampleCount: 1, - mipLevelCount: 1, - usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST - }) - ); + const depthTexture = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: depthStencilFormat, + sampleCount: 1, + mipLevelCount: 1, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST + }); const depthStencilAttachment = { view: depthTexture.createView(), @@ -57,8 +53,8 @@ class DepthTest extends TextureTestMixin(GPUTest) { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', - loadOp: 'load' + loadOp: 'load', + storeOp: 'store' }], depthStencilAttachment @@ -347,14 +343,14 @@ fn((t) => { const { depthCompare, depthClearValue, _expected, format } = t.params; const colorAttachmentFormat = 'rgba8unorm'; - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: colorAttachmentFormat, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); const colorAttachmentView = colorAttachment.createView(); - const depthTexture = t.device.createTexture({ + const depthTexture = t.createTextureTracked({ size: { width: 1, height: 1 }, format, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING @@ -410,9 +406,9 @@ fn((t) => { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }], depthStencilAttachment @@ -439,7 +435,7 @@ desc( params((u) => u.combine('reversed', [false, true])). fn((t) => { const colorAttachmentFormat = 'rgba8unorm'; - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: colorAttachmentFormat, size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -447,7 +443,7 @@ fn((t) => { const colorAttachmentView = colorAttachment.createView(); const depthBufferFormat = 'depth32float'; - const depthTexture = t.device.createTexture({ + const depthTexture = t.createTextureTracked({ size: { width: 1, height: 1 }, format: depthBufferFormat, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING @@ -512,9 +508,9 @@ fn((t) => { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 0.5, g: 0.5, b: 0.5, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }], depthStencilAttachment: { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_bias.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_bias.spec.js index 59e5f83befa..2870516dd38 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_bias.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_bias.spec.js @@ -87,23 +87,19 @@ class DepthBiasTest extends TextureTestMixin(GPUTest) { unreachable(); } - const renderTarget = this.trackForCleanup( - this.device.createTexture({ - format: renderTargetFormat, - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const renderTarget = this.createTextureTracked({ + format: renderTargetFormat, + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); - const depthTexture = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: depthFormat, - sampleCount: 1, - mipLevelCount: 1, - usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC - }) - ); + const depthTexture = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: depthFormat, + sampleCount: 1, + mipLevelCount: 1, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }); const depthStencilAttachment = { view: depthTexture.createView(), @@ -119,8 +115,8 @@ class DepthBiasTest extends TextureTestMixin(GPUTest) { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', - loadOp: 'load' + loadOp: 'load', + storeOp: 'store' }], depthStencilAttachment diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_clip_clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_clip_clamp.spec.js index 28d639990d1..1b5784f4123 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_clip_clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/depth_clip_clamp.spec.js @@ -4,6 +4,7 @@ Tests for depth clipping, depth clamping (at various points in the pipeline), and maybe extended depth ranges as well. `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { assert } from '../../../../common/util/util.js'; import { kDepthStencilFormats, kTextureFormatInfo } from '../../../format_info.js'; import { GPUTest } from '../../../gpu_test.js'; import { @@ -52,6 +53,7 @@ beforeAllSubcases((t) => { fn(async (t) => { const { format, unclippedDepth, writeDepth, multisampled } = t.params; const info = kTextureFormatInfo[format]; + assert(!!info.depth); /** Number of depth values to test for both vertex output and frag_depth output. */ const kNumDepthValues = 8; @@ -90,7 +92,7 @@ fn(async (t) => { struct VFTest { @builtin(position) pos: vec4, - @location(0) @interpolate(flat) vertexIndex: u32, + @location(0) @interpolate(flat, either) vertexIndex: u32, }; @vertex @@ -127,7 +129,7 @@ fn(async (t) => { struct VFCheck { @builtin(position) pos: vec4, - @location(0) @interpolate(flat) vertexIndex: u32, + @location(0) @interpolate(flat, either) vertexIndex: u32, }; @vertex @@ -202,7 +204,7 @@ fn(async (t) => { fragment: { module, entryPoint: 'fcheck', targets: [{ format: 'r8unorm' }] } }); - const dsTexture = t.device.createTexture({ + const dsTexture = t.createTextureTracked({ format, size: [kNumTestPoints], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, @@ -215,32 +217,32 @@ fn(async (t) => { size: [kNumTestPoints], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC }; - const checkTexture = t.device.createTexture(checkTextureDesc); + const checkTexture = t.createTextureTracked(checkTextureDesc); const checkTextureView = checkTexture.createView(); const checkTextureMSView = multisampled ? - t.device.createTexture({ ...checkTextureDesc, sampleCount: 4 }).createView() : + t.createTextureTracked({ ...checkTextureDesc, sampleCount: 4 }).createView() : undefined; const dsActual = - !multisampled && info.bytesPerBlock ? - t.device.createBuffer({ - size: kNumTestPoints * info.bytesPerBlock, + !multisampled && info.depth.bytes ? + t.createBufferTracked({ + size: kNumTestPoints * info.depth.bytes, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ }) : undefined; const dsExpected = - !multisampled && info.bytesPerBlock ? - t.device.createBuffer({ - size: kNumTestPoints * info.bytesPerBlock, + !multisampled && info.depth.bytes ? + t.createBufferTracked({ + size: kNumTestPoints * info.depth.bytes, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ }) : undefined; - const checkBuffer = t.device.createBuffer({ + const checkBuffer = t.createBufferTracked({ size: kNumTestPoints, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ }); - const fragInputZFailedBuffer = t.device.createBuffer({ + const fragInputZFailedBuffer = t.createBufferTracked({ size: 4 * kNumTestPoints, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -270,7 +272,9 @@ fn(async (t) => { pass.end(); } if (dsActual) { - enc.copyTextureToBuffer({ texture: dsTexture }, { buffer: dsActual }, [kNumTestPoints]); + enc.copyTextureToBuffer({ texture: dsTexture, aspect: 'depth-only' }, { buffer: dsActual }, [ + kNumTestPoints] + ); } { const clearValue = [0, 0, 0, 0]; // Will see this color if the check passed. @@ -302,7 +306,11 @@ fn(async (t) => { } enc.copyTextureToBuffer({ texture: checkTexture }, { buffer: checkBuffer }, [kNumTestPoints]); if (dsExpected) { - enc.copyTextureToBuffer({ texture: dsTexture }, { buffer: dsExpected }, [kNumTestPoints]); + enc.copyTextureToBuffer( + { texture: dsTexture, aspect: 'depth-only' }, + { buffer: dsExpected }, + [kNumTestPoints] + ); } t.device.queue.submit([enc.finish()]); @@ -387,7 +395,7 @@ fn((t) => { struct VF { @builtin(position) pos: vec4, - @location(0) @interpolate(flat) vertexIndex: u32, + @location(0) @interpolate(flat, either) vertexIndex: u32, }; @vertex @@ -445,7 +453,7 @@ fn((t) => { fragment: { module, entryPoint: 'ftest', targets: [{ format: 'r8unorm' }] } }); - const dsTexture = t.device.createTexture({ + const dsTexture = t.createTextureTracked({ format, size: [kNumDepthValues], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, @@ -458,13 +466,13 @@ fn((t) => { size: [kNumDepthValues], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC }; - const testTexture = t.device.createTexture(testTextureDesc); + const testTexture = t.createTextureTracked(testTextureDesc); const testTextureView = testTexture.createView(); const testTextureMSView = multisampled ? - t.device.createTexture({ ...testTextureDesc, sampleCount: 4 }).createView() : + t.createTextureTracked({ ...testTextureDesc, sampleCount: 4 }).createView() : undefined; - const resultBuffer = t.device.createBuffer({ + const resultBuffer = t.createBufferTracked({ size: kNumDepthValues, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/draw.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/draw.spec.js index 541b8764851..5a6f780827c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/draw.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/draw.spec.js @@ -61,7 +61,7 @@ class DrawTest extends TextureTestMixin(GPUTest) { 1.0, 1.0]; - const renderTarget = this.device.createTexture({ + const renderTarget = this.createTextureTracked({ size: renderTargetSize, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, format: 'rgba8unorm' @@ -136,7 +136,7 @@ struct Output { } }); - const resultBuffer = this.device.createBuffer({ + const resultBuffer = this.createBufferTracked({ size: Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -579,14 +579,14 @@ fn((t) => { // The remaining 3 vertex attributes if (numAttributes === 16) { accumulateVariableDeclarationsInVertexShader = ` - @location(13) @interpolate(flat) outAttrib13 : vec4<${wgslFormat}>, + @location(13) @interpolate(flat, either) outAttrib13 : vec4<${wgslFormat}>, `; accumulateVariableAssignmentsInVertexShader = ` output.outAttrib13 = vec4<${wgslFormat}>(input.attrib12, input.attrib13, input.attrib14, input.attrib15); `; accumulateVariableDeclarationsInFragmentShader = ` - @location(13) @interpolate(flat) attrib13 : vec4<${wgslFormat}>, + @location(13) @interpolate(flat, either) attrib13 : vec4<${wgslFormat}>, `; accumulateVariableAssignmentsInFragmentShader = ` outBuffer.primitives[input.primitiveId].attrib12 = input.attrib13.x; @@ -596,14 +596,14 @@ fn((t) => { `; } else if (numAttributes === 14) { accumulateVariableDeclarationsInVertexShader = ` - @location(13) @interpolate(flat) outAttrib13 : vec4<${wgslFormat}>, + @location(13) @interpolate(flat, either) outAttrib13 : vec4<${wgslFormat}>, `; accumulateVariableAssignmentsInVertexShader = ` output.outAttrib13 = vec4<${wgslFormat}>(input.attrib12, input.attrib13, 0, 0); `; accumulateVariableDeclarationsInFragmentShader = ` - @location(13) @interpolate(flat) attrib13 : vec4<${wgslFormat}>, + @location(13) @interpolate(flat, either) attrib13 : vec4<${wgslFormat}>, `; accumulateVariableAssignmentsInFragmentShader = ` outBuffer.primitives[input.primitiveId].attrib12 = input.attrib13.x; @@ -625,9 +625,9 @@ ${vertexInputShaderLocations.map((i) => ` @location(${i}) attrib${i} : ${wgslFo struct Outputs { @builtin(position) Position : vec4, ${interStageScalarShaderLocations. - map((i) => ` @location(${i}) @interpolate(flat) outAttrib${i} : ${wgslFormat},`). + map((i) => ` @location(${i}) @interpolate(flat, either) outAttrib${i} : ${wgslFormat},`). join('\n')} - @location(${interStageScalarShaderLocations.length}) @interpolate(flat) primitiveId : u32, + @location(${interStageScalarShaderLocations.length}) @interpolate(flat, either) primitiveId : u32, ${accumulateVariableDeclarationsInVertexShader} }; @@ -650,9 +650,9 @@ ${accumulateVariableAssignmentsInVertexShader} code: ` struct Inputs { ${interStageScalarShaderLocations. - map((i) => ` @location(${i}) @interpolate(flat) attrib${i} : ${wgslFormat},`). + map((i) => ` @location(${i}) @interpolate(flat, either) attrib${i} : ${wgslFormat},`). join('\n')} - @location(${interStageScalarShaderLocations.length}) @interpolate(flat) primitiveId : u32, + @location(${interStageScalarShaderLocations.length}) @interpolate(flat, either) primitiveId : u32, ${accumulateVariableDeclarationsInFragmentShader} }; @@ -685,7 +685,7 @@ ${accumulateVariableAssignmentsInFragmentShader} } }); - const resultBuffer = t.device.createBuffer({ + const resultBuffer = t.createBufferTracked({ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, size: vertexCount * instanceCount * vertexInputShaderLocations.length * 4 }); @@ -708,8 +708,8 @@ ${accumulateVariableAssignmentsInFragmentShader} { // Dummy render attachment - not used (WebGPU doesn't allow using a render pass with no // attachments) - view: t.device. - createTexture({ + view: t. + createTextureTracked({ usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [1], format: 'rgba8unorm' diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/indirect_draw.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/indirect_draw.spec.js index 4bc9cf57275..665228b30db 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/indirect_draw.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/indirect_draw.spec.js @@ -204,7 +204,7 @@ fn((t) => { } }); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ size: [4, 4], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, format: kRenderTargetFormat diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/stencil.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/stencil.spec.js index 9868fa37c10..44bc3a24660 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/stencil.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/rendering/stencil.spec.js @@ -128,23 +128,19 @@ class StencilTest extends TextureTestMixin(GPUTest) { isSingleEncoderMultiplePass = false) { const renderTargetFormat = 'rgba8unorm'; - const renderTarget = this.trackForCleanup( - this.device.createTexture({ - format: renderTargetFormat, - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const renderTarget = this.createTextureTracked({ + format: renderTargetFormat, + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); - const depthTexture = this.trackForCleanup( - this.device.createTexture({ - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - format: depthStencilFormat, - sampleCount: 1, - mipLevelCount: 1, - usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST - }) - ); + const depthTexture = this.createTextureTracked({ + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + format: depthStencilFormat, + sampleCount: 1, + mipLevelCount: 1, + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST + }); const hasDepth = kTextureFormatInfo[depthStencilFormat].depth; const depthStencilAttachment = { @@ -160,8 +156,8 @@ class StencilTest extends TextureTestMixin(GPUTest) { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', - loadOp: 'load' + loadOp: 'load', + storeOp: 'store' }], depthStencilAttachment @@ -179,8 +175,8 @@ class StencilTest extends TextureTestMixin(GPUTest) { colorAttachments: [ { view: renderTarget.createView(), - storeOp: 'store', - loadOp: 'load' + loadOp: 'load', + storeOp: 'store' }], depthStencilAttachment diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/buffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/buffer.spec.js index fa7cbdbbbab..b6ebb69fd65 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/buffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/buffer.spec.js @@ -56,12 +56,11 @@ class F extends GPUTest { entryPoint: 'main' } }); - const outputTexture = this.device.createTexture({ + const outputTexture = this.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING }); - this.trackForCleanup(outputTexture); const bindGroup = this.device.createBindGroup({ layout: computePipeline.getBindGroupLayout(0), entries: [ @@ -176,11 +175,10 @@ fn((t) => { const bufferSize = 32; const appliedOffset = offset >= 0 ? offset : bufferSize + offset; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(buffer); const copySize = 12; const writeData = new Uint8Array(copySize); @@ -205,11 +203,10 @@ fn(async (t) => { const bufferSize = 32; const bufferUsage = t.GetBufferUsageFromMapMode(mapMode); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(buffer); await buffer.mapAsync(mapMode); const readData = new Uint8Array(buffer.getMappedRange()); @@ -235,11 +232,10 @@ fn(async (t) => { const appliedOffset = offset >= 0 ? offset : bufferSize + offset; const bufferUsage = t.GetBufferUsageFromMapMode(mapMode); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(buffer); const expectedData = new Uint8Array(bufferSize); { @@ -269,12 +265,11 @@ fn((t) => { const { bufferUsage } = t.params; const bufferSize = 32; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(buffer); const mapped = new Uint8Array(buffer.getMappedRange()); for (let i = 0; i < bufferSize; ++i) { @@ -303,12 +298,11 @@ fn((t) => { const bufferSize = 32; const appliedOffset = offset >= 0 ? offset : bufferSize + offset; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(buffer); const expectedData = new Uint8Array(bufferSize); { @@ -334,11 +328,10 @@ CopyBufferToBuffer(), the contents of the GPUBuffer have already been initialize fn((t) => { const bufferSize = 32; const bufferUsage = GPUBufferUsage.COPY_SRC; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(buffer); const expectedData = new Uint8Array(bufferSize); // copyBufferToBuffer() is called inside t.CheckGPUBufferContent(). @@ -356,20 +349,18 @@ fn((t) => { const textureSize = [8, 8, 1]; const dstTextureFormat = 'rgba8unorm'; - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: textureSize, format: dstTextureFormat, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST }); - t.trackForCleanup(dstTexture); const layout = getTextureCopyLayout(dstTextureFormat, '2d', textureSize); const srcBufferSize = layout.byteLength + bufferOffset; const srcBufferUsage = GPUBufferUsage.COPY_SRC; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: srcBufferSize, usage: srcBufferUsage }); - t.trackForCleanup(srcBuffer); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToTexture( @@ -402,13 +393,12 @@ fn((t) => { const { bufferOffset } = t.params; const bufferSize = bufferOffset + 8; const bufferUsage = GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE; - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: bufferSize, usage: bufferUsage }); - t.trackForCleanup(dstBuffer); - const querySet = t.device.createQuerySet({ type: 'occlusion', count: 1 }); + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: 1 }); const encoder = t.device.createCommandEncoder(); encoder.resolveQuerySet(querySet, 0, 1, dstBuffer, bufferOffset); t.queue.submit([encoder.finish()]); @@ -438,13 +428,12 @@ fn((t) => { const srcTextureFormat = 'r8uint'; const textureSize = [32, 16, arrayLayerCount]; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ format: srcTextureFormat, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, size: textureSize, mipLevelCount: copyMipLevel + 1 }); - t.trackForCleanup(srcTexture); const bytesPerRow = 256; const layout = getTextureCopyLayout(srcTextureFormat, '2d', textureSize, { @@ -454,11 +443,10 @@ fn((t) => { }); const dstBufferSize = layout.byteLength + Math.abs(bufferOffset); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: dstBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(dstBuffer); const encoder = t.device.createCommandEncoder(); @@ -513,11 +501,10 @@ fn((t) => { const { bufferOffset } = t.params; const boundBufferSize = 16; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferOffset + boundBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.UNIFORM }); - t.trackForCleanup(buffer); const computeShaderModule = t.device.createShaderModule({ code: ` @@ -549,11 +536,10 @@ paramsSubcasesOnly((u) => u.combine('bufferOffset', [0, 256])). fn((t) => { const { bufferOffset } = t.params; const boundBufferSize = 16; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferOffset + boundBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); - t.trackForCleanup(buffer); const computeShaderModule = t.device.createShaderModule({ code: ` @@ -585,11 +571,10 @@ paramsSubcasesOnly((u) => u.combine('bufferOffset', [0, 256])). fn((t) => { const { bufferOffset } = t.params; const boundBufferSize = 16; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferOffset + boundBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); - t.trackForCleanup(buffer); const computeShaderModule = t.device.createShaderModule({ code: ` @@ -644,18 +629,16 @@ fn((t) => { ); const bufferSize = 16 + bufferOffset; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(vertexBuffer); - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(outputTexture); const encoder = t.device.createCommandEncoder(); const renderPass = encoder.beginRenderPass({ @@ -711,18 +694,16 @@ fn((t) => { // The size of GPUBuffer must be at least 4. const bufferSize = 4 + bufferOffset; - const indexBuffer = t.device.createBuffer({ + const indexBuffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(indexBuffer); - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(outputTexture); const encoder = t.device.createCommandEncoder(); const renderPass = encoder.beginRenderPass({ @@ -778,18 +759,16 @@ fn((t) => { const kDrawIndexedIndirectParametersSize = 20; const bufferSize = Math.max(kDrawIndirectParametersSize, kDrawIndexedIndirectParametersSize) + bufferOffset; - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT }); - t.trackForCleanup(indirectBuffer); - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(outputTexture); // Initialize outputTexture to green. const encoder = t.device.createCommandEncoder(); @@ -808,11 +787,10 @@ fn((t) => { let indexBuffer = undefined; if (test_indexed_draw) { - indexBuffer = t.device.createBuffer({ + indexBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.INDEX }); - t.trackForCleanup(indexBuffer); renderPass.setIndexBuffer(indexBuffer, 'uint16'); renderPass.drawIndexedIndirect(indirectBuffer, bufferOffset); } else { @@ -854,13 +832,12 @@ fn((t) => { const kDispatchIndirectParametersSize = 12; const bufferSize = kDispatchIndirectParametersSize + bufferOffset; - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.INDIRECT }); - t.trackForCleanup(indirectBuffer); - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: @@ -868,7 +845,6 @@ fn((t) => { GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING }); - t.trackForCleanup(outputTexture); // Initialize outputTexture to green. const encoder = t.device.createCommandEncoder(); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_copy.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_copy.js index 08e878b4584..7616505410a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_copy.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_copy.js @@ -42,13 +42,12 @@ subresourceRange) => level ); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ dimension: params.dimension, size: [width, height, depth], format: params.format, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(dst); const commandEncoder = t.device.createCommandEncoder(); commandEncoder.copyTextureToTexture( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_ds_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_ds_test.js index a88c38e60ee..de13b278249 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_ds_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_ds_test.js @@ -120,7 +120,7 @@ subresourceRange) => viewDescriptor.baseMipLevel ); - const renderTexture = t.device.createTexture({ + const renderTexture = t.createTextureTracked({ size: [width, height, 1], format: 'r8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, @@ -130,7 +130,7 @@ subresourceRange) => let resolveTexture = undefined; let resolveTarget = undefined; if (params.sampleCount > 1) { - resolveTexture = t.device.createTexture({ + resolveTexture = t.createTextureTracked({ size: [width, height, 1], format: 'r8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC @@ -153,10 +153,10 @@ subresourceRange) => depthStencilAttachment: { view: texture.createView(viewDescriptor), - depthStoreOp: formatInfo.depth ? 'store' : undefined, depthLoadOp: formatInfo.depth ? 'load' : undefined, - stencilStoreOp: formatInfo.stencil ? 'store' : undefined, - stencilLoadOp: formatInfo.stencil ? 'load' : undefined + depthStoreOp: formatInfo.depth ? 'store' : undefined, + stencilLoadOp: formatInfo.stencil ? 'load' : undefined, + stencilStoreOp: formatInfo.stencil ? 'store' : undefined } }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_sampling.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_sampling.js index d55628a5bbe..12bb98fd826 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_sampling.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/by_sampling.js @@ -96,7 +96,7 @@ subresourceRange) => }); for (const layer of layers) { - const ubo = t.device.createBuffer({ + const ubo = t.createBufferTracked({ mappedAtCreation: true, size: 8, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST @@ -106,11 +106,10 @@ subresourceRange) => const byteLength = width * height * depth * ReadbackTypedArray.BYTES_PER_ELEMENT * rep.componentOrder.length; - const resultBuffer = t.device.createBuffer({ + const resultBuffer = t.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(resultBuffer); const viewDescriptor = { ...(!t.isCompatibility && { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/texture_zero_init_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/texture_zero_init_test.js index 2a6ee76438f..a9119df7ea2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/texture_zero_init_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/check_texture/texture_zero_init_test.js @@ -115,6 +115,14 @@ const initializedStateAsStencil = { [InitializedState.Canary]: 42 }; +function allAspectsCopyDst(info) { + return ( + (!info.color || info.color.copyDst) && ( + !info.depth || info.depth.copyDst) && ( + !info.stencil || info.stencil.copyDst)); + +} + export function getRequiredTextureUsage( format, sampleCount, @@ -159,10 +167,11 @@ readMethod) usage |= GPUConst.TextureUsage.RENDER_ATTACHMENT; } - if (!kTextureFormatInfo[format].copyDst) { + const info = kTextureFormatInfo[format]; + if (!allAspectsCopyDst(info)) { // Copies are not possible. We need OutputAttachment to initialize // canary data. - assert(kTextureFormatInfo[format].renderable); + if (info.color) assert(!!info.colorRender, 'not implemented for non-renderable color'); usage |= GPUConst.TextureUsage.RENDER_ATTACHMENT; } @@ -299,9 +308,9 @@ export class TextureZeroInitTest extends GPUTest { colorAttachments: [ { view: texture.createView(viewDescriptor), - storeOp: 'store', clearValue: initializedStateAsColor(state, this.p.format), - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }). @@ -344,17 +353,18 @@ export class TextureZeroInitTest extends GPUTest { const firstSubresource = subresourceRange.each().next().value; assert(typeof firstSubresource !== 'undefined'); + const textureSize = [this.textureWidth, this.textureHeight, this.textureDepth]; const [largestWidth, largestHeight, largestDepth] = virtualMipSize( this.p.dimension, - [this.textureWidth, this.textureHeight, this.textureDepth], + textureSize, firstSubresource.level ); const rep = kTexelRepresentationInfo[format]; const texelData = new Uint8Array(rep.pack(rep.encode(this.stateToTexelComponents[state]))); const { buffer, bytesPerRow, rowsPerImage } = createTextureUploadBuffer( + this, texelData, - this.device, format, this.p.dimension, [largestWidth, largestHeight, largestDepth] @@ -363,11 +373,7 @@ export class TextureZeroInitTest extends GPUTest { const commandEncoder = this.device.createCommandEncoder(); for (const { level, layer } of subresourceRange.each()) { - const [width, height, depth] = virtualMipSize( - this.p.dimension, - [this.textureWidth, this.textureHeight, this.textureDepth], - level - ); + const [width, height, depth] = virtualMipSize(this.p.dimension, textureSize, level); commandEncoder.copyBufferToTexture( { @@ -388,10 +394,11 @@ export class TextureZeroInitTest extends GPUTest { state, subresourceRange) { - if (this.p.sampleCount > 1 || !kTextureFormatInfo[this.p.format].copyDst) { + const info = kTextureFormatInfo[this.p.format]; + if (this.p.sampleCount > 1 || !allAspectsCopyDst(info)) { // Copies to multisampled textures not yet specified. // Use a storeOp for now. - assert(kTextureFormatInfo[this.p.format].renderable); + if (info.color) assert(!!info.colorRender, 'not implemented for non-renderable color'); this.initializeWithStoreOp(state, texture, subresourceRange); } else { this.initializeWithCopy(texture, state, subresourceRange); @@ -409,8 +416,8 @@ export class TextureZeroInitTest extends GPUTest { colorAttachments: [ { view: texture.createView(desc), - storeOp: 'discard', - loadOp: 'load' + loadOp: 'load', + storeOp: 'discard' }] }). @@ -517,17 +524,12 @@ unless(({ format, sampleCount, uninitializeMethod, readMethod }) => { const info = kTextureFormatInfo[format]; return ( - (usage & GPUConst.TextureUsage.RENDER_ATTACHMENT) !== 0 && !info.renderable || + (usage & GPUConst.TextureUsage.RENDER_ATTACHMENT) !== 0 && + info.color && + !info.colorRender || (usage & GPUConst.TextureUsage.STORAGE_BINDING) !== 0 && !info.color?.storage || sampleCount > 1 && !info.multisample); }). combine('nonPowerOfTwo', [false, true]). -combine('canaryOnCreation', [false, true]). -filter(({ canaryOnCreation, format }) => { - // We can only initialize the texture if it's encodable or renderable. - const canInitialize = format in kTextureFormatInfo || kTextureFormatInfo[format].renderable; - - // Filter out cases where we want canary values but can't initialize. - return !canaryOnCreation || canInitialize; -}); \ No newline at end of file +combine('canaryOnCreation', [false, true]); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/texture_zero.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/texture_zero.spec.js index 574a997516a..4b5116c81d6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/texture_zero.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/resource_init/texture_zero.spec.js @@ -53,7 +53,7 @@ fn((t) => { t.params.readMethod ); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [t.textureWidth, t.textureHeight, t.textureDepthOrArrayLayers], format: t.params.format, dimension: t.params.dimension, @@ -61,7 +61,6 @@ fn((t) => { mipLevelCount: t.params.mipLevelCount, sampleCount: t.params.sampleCount }); - t.trackForCleanup(texture); if (t.params.canaryOnCreation) { // Initialize some subresources with canary values diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/anisotropy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/anisotropy.spec.js index 8408f619f4b..65a1e4c7a6d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/anisotropy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/anisotropy.spec.js @@ -36,7 +36,7 @@ new Uint8Array([0x00, 0xff, 0x00, 0xff])]; class SamplerAnisotropicFilteringSlantedPlaneTest extends GPUTest { copyRenderTargetToBuffer(rt) { const byteLength = kRTSize * kBytesPerRow; - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -133,7 +133,7 @@ class SamplerAnisotropicFilteringSlantedPlaneTest extends GPUTest { layout: this.pipeline.getBindGroupLayout(0) }); - const colorAttachment = this.device.createTexture({ + const colorAttachment = this.createTextureTracked({ format: kColorAttachmentFormat, size: { width: kRTSize, height: kRTSize, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -145,9 +145,9 @@ class SamplerAnisotropicFilteringSlantedPlaneTest extends GPUTest { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); @@ -176,7 +176,7 @@ desc( fn(async (t) => { // init texture with only a top level mipmap const textureSize = 32; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ mipLevelCount: 1, size: { width: textureSize, height: textureSize, depthOrArrayLayers: 1 }, format: kTextureFormat, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/filter_mode.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/filter_mode.spec.js index 860eb03f8d1..fbfd981beb4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/filter_mode.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/sampling/filter_mode.spec.js @@ -41,7 +41,7 @@ class FilterModeTest extends TextureTestMixin(GPUTest) { usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST } ); - const renderTexture = this.device.createTexture({ + const renderTexture = this.createTextureTracked({ format, size: renderSize, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC @@ -1000,7 +1000,7 @@ fn((t) => { usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST } ); - const renderTexture = t.device.createTexture({ + const renderTexture = t.createTextureTracked({ format, size: [kRenderSize, 1], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/shader_module/compilation_info.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/shader_module/compilation_info.spec.js index 9f9a1fcba04..ee64ed60651 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/shader_module/compilation_info.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/shader_module/compilation_info.spec.js @@ -63,6 +63,17 @@ const kInvalidShaderSources = [ // Expected Error: unknown function 'unknown' return unknown(0.0, 0.0, 0.0, 1.0); }` +}, +{ + valid: false, + name: 'unicode-multi-byte-characters', + _errorLine: 1, + // This shader is simplistic enough to always result in the same error position. + // Generally, various backends may choose to report the error at different positions within the + // line, so it's difficult to meaningfully validate them. + _errorLinePos: 19, + _code: `/*🐈🐈🐈🐈🐈🐈🐈*/? +// Expected Error: invalid character found` }]; @@ -174,7 +185,7 @@ beginSubcases(). combine('sourceMapName', kSourceMapsKeys) ). fn(async (t) => { - const { _code, _errorLine, sourceMapName } = t.params; + const { _code, _errorLine, _errorLinePos, sourceMapName } = t.params; const shaderModule = t.expectGPUError('validation', () => { const sourceMap = kSourceMaps[sourceMapName]; @@ -191,14 +202,22 @@ fn(async (t) => { // If a line is reported, it should point at the correct line (1-based). t.expect( message.lineNum === 0 === (message.linePos === 0), - "GPUCompilationMessages that don't report a line number should not report a line position." + `Got message.lineNum ${message.lineNum}, .linePos ${message.linePos}, but GPUCompilationMessage should specify both or neither` ); - if (message.lineNum === 0 || message.lineNum === _errorLine) { + if (message.lineNum === 0) { foundAppropriateError = true; + break; + } - // Various backends may choose to report the error at different positions within the line, - // so it's difficult to meaningfully validate them. + if (message.lineNum === _errorLine) { + foundAppropriateError = true; + if (_errorLinePos !== undefined) { + t.expect( + message.linePos === _errorLinePos, + `Got message.linePos ${message.linePos}, expected ${_errorLinePos}` + ); + } break; } } @@ -239,10 +258,9 @@ fn(async (t) => { for (const message of info.messages) { // Any offsets and lengths should reference valid spans of the shader code. - t.expect(message.offset <= _code.length, 'Message offset should be within the shader source'); t.expect( - message.offset + message.length <= _code.length, - 'Message offset and length should be within the shader source' + message.offset <= _code.length && message.offset + message.length <= _code.length, + 'message.offset and .length should be within the shader source' ); // If a valid line number and position are given, the offset should point the the same @@ -255,9 +273,10 @@ fn(async (t) => { lineOffset += 1; } + const expectedOffset = lineOffset + message.linePos - 1; t.expect( - message.offset === lineOffset + message.linePos - 1, - 'lineNum and linePos should point to the same location as offset' + message.offset === expectedOffset, + `message.lineNum (${message.lineNum}) and .linePos (${message.linePos}) point to a different offset (${lineOffset} + ${message.linePos} - 1 = ${expectedOffset}) than .offset (${message.offset})` ); } } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_only.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_only.spec.js new file mode 100644 index 00000000000..4212c665bfe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_only.spec.js @@ -0,0 +1,622 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Tests for the behavior of read-only storage textures. + +TODO: +- Test mipmap level > 0 +- Test resource usage transitions with read-only storage textures +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { unreachable, assert } from '../../../../common/util/util.js'; +import { Float16Array } from '../../../../external/petamoriken/float16/float16.js'; +import { kTextureDimensions } from '../../../capability_info.js'; +import { + + kColorTextureFormats, + kTextureFormatInfo } from +'../../../format_info.js'; +import { GPUTest } from '../../../gpu_test.js'; +import { kValidShaderStages } from '../../../util/shader.js'; + +function ComponentCount(format) { + switch (format) { + case 'r32float': + case 'r32sint': + case 'r32uint': + return 1; + case 'rg32float': + case 'rg32sint': + case 'rg32uint': + return 2; + case 'rgba32float': + case 'rgba32sint': + case 'rgba32uint': + case 'rgba8sint': + case 'rgba8uint': + case 'rgba8snorm': + case 'rgba8unorm': + case 'rgba16float': + case 'rgba16sint': + case 'rgba16uint': + case 'bgra8unorm': + return 4; + default: + unreachable(); + return 0; + } +} + +class F extends GPUTest { + InitTextureAndGetExpectedOutputBufferData( + storageTexture, + format) + { + const bytesPerBlock = kTextureFormatInfo[format].color.bytes; + assert(bytesPerBlock !== undefined); + + const width = storageTexture.width; + const height = storageTexture.height; + const depthOrArrayLayers = storageTexture.depthOrArrayLayers; + + const texelData = new ArrayBuffer(bytesPerBlock * width * height * depthOrArrayLayers); + const texelTypedDataView = this.GetTypedArrayBufferViewForTexelData(texelData, format); + const componentCount = ComponentCount(format); + const outputBufferData = new ArrayBuffer(4 * 4 * width * height * depthOrArrayLayers); + const outputBufferTypedData = this.GetTypedArrayBufferForOutputBufferData( + outputBufferData, + format + ); + + const SetData = ( + texelValue, + outputValue, + texelDataIndex, + component, + outputComponent = component) => + { + const texelComponentIndex = texelDataIndex * componentCount + component; + texelTypedDataView[texelComponentIndex] = texelValue; + const outputTexelComponentIndex = texelDataIndex * 4 + outputComponent; + outputBufferTypedData[outputTexelComponentIndex] = outputValue; + }; + for (let z = 0; z < depthOrArrayLayers; ++z) { + for (let y = 0; y < height; ++y) { + for (let x = 0; x < width; ++x) { + const texelDataIndex = z * width * height + y * width + x; + outputBufferTypedData[4 * texelDataIndex] = 0; + outputBufferTypedData[4 * texelDataIndex + 1] = 0; + outputBufferTypedData[4 * texelDataIndex + 2] = 0; + outputBufferTypedData[4 * texelDataIndex + 3] = 1; + for (let component = 0; component < componentCount; ++component) { + switch (format) { + case 'r32uint': + case 'rg32uint': + case 'rgba16uint': + case 'rgba32uint':{ + const texelValue = 4 * texelDataIndex + component + 1; + SetData(texelValue, texelValue, texelDataIndex, component); + break; + } + case 'rgba8uint':{ + const texelValue = (4 * texelDataIndex + component + 1) % 256; + SetData(texelValue, texelValue, texelDataIndex, component); + break; + } + case 'rgba8unorm':{ + const texelValue = (4 * texelDataIndex + component + 1) % 256; + const outputValue = texelValue / 255.0; + SetData(texelValue, outputValue, texelDataIndex, component); + break; + } + case 'bgra8unorm':{ + const texelValue = (4 * texelDataIndex + component + 1) % 256; + const outputValue = texelValue / 255.0; + // BGRA -> RGBA + assert(component < 4); + const outputComponent = [2, 1, 0, 3][component]; + SetData(texelValue, outputValue, texelDataIndex, component, outputComponent); + break; + } + case 'r32sint': + case 'rg32sint': + case 'rgba16sint': + case 'rgba32sint':{ + const texelValue = + (texelDataIndex & 1 ? 1 : -1) * (4 * texelDataIndex + component + 1); + SetData(texelValue, texelValue, texelDataIndex, component); + break; + } + case 'rgba8sint':{ + const texelValue = (4 * texelDataIndex + component + 1) % 256 - 128; + SetData(texelValue, texelValue, texelDataIndex, component); + break; + } + case 'rgba8snorm':{ + const texelValue = (4 * texelDataIndex + component + 1) % 256 - 128; + const outputValue = Math.max(texelValue / 127.0, -1.0); + SetData(texelValue, outputValue, texelDataIndex, component); + break; + } + case 'r32float': + case 'rg32float': + case 'rgba32float':{ + const texelValue = (4 * texelDataIndex + component + 1) / 10.0; + SetData(texelValue, texelValue, texelDataIndex, component); + break; + } + case 'rgba16float':{ + const texelValue = (4 * texelDataIndex + component + 1) / 10.0; + const f16Array = new Float16Array(1); + f16Array[0] = texelValue; + SetData(texelValue, f16Array[0], texelDataIndex, component); + break; + } + default: + unreachable(); + break; + } + } + } + } + } + this.queue.writeTexture( + { + texture: storageTexture + }, + texelData, + { + bytesPerRow: bytesPerBlock * width, + rowsPerImage: height + }, + [width, height, depthOrArrayLayers] + ); + + return outputBufferData; + } + + GetTypedArrayBufferForOutputBufferData(arrayBuffer, format) { + switch (kTextureFormatInfo[format].color.type) { + case 'uint': + return new Uint32Array(arrayBuffer); + case 'sint': + return new Int32Array(arrayBuffer); + case 'float': + case 'unfilterable-float': + return new Float32Array(arrayBuffer); + } + } + + GetTypedArrayBufferViewForTexelData(arrayBuffer, format) { + switch (format) { + case 'r32uint': + case 'rg32uint': + case 'rgba32uint': + return new Uint32Array(arrayBuffer); + case 'rgba8uint': + case 'rgba8unorm': + case 'bgra8unorm': + return new Uint8Array(arrayBuffer); + case 'rgba16uint': + return new Uint16Array(arrayBuffer); + case 'r32sint': + case 'rg32sint': + case 'rgba32sint': + return new Int32Array(arrayBuffer); + case 'rgba8sint': + case 'rgba8snorm': + return new Int8Array(arrayBuffer); + case 'rgba16sint': + return new Int16Array(arrayBuffer); + case 'r32float': + case 'rg32float': + case 'rgba32float': + return new Float32Array(arrayBuffer); + case 'rgba16float': + return new Float16Array(arrayBuffer); + default: + unreachable(); + return new Uint8Array(arrayBuffer); + } + } + + GetOutputBufferWGSLType(format) { + switch (kTextureFormatInfo[format].color.type) { + case 'uint': + return 'vec4u'; + case 'sint': + return 'vec4i'; + case 'float': + case 'unfilterable-float': + return 'vec4f'; + default: + unreachable(); + return ''; + } + } + + DoTransform( + storageTexture, + shaderStage, + format, + outputBuffer) + { + let declaration = ''; + switch (storageTexture.dimension) { + case '1d': + declaration = 'texture_storage_1d'; + break; + case '2d': + declaration = + storageTexture.depthOrArrayLayers > 1 ? 'texture_storage_2d_array' : 'texture_storage_2d'; + break; + case '3d': + declaration = 'texture_storage_3d'; + break; + } + const textureDeclaration = ` + @group(0) @binding(0) var readOnlyTexture: ${declaration}<${format}, read>; + `; + const bindingResourceDeclaration = ` + ${textureDeclaration} + @group(0) @binding(1) + var outputBuffer : array<${this.GetOutputBufferWGSLType(format)}>; + `; + + const bindGroupEntries = [ + { + binding: 0, + resource: storageTexture.createView() + }, + { + binding: 1, + resource: { + buffer: outputBuffer + } + }]; + + + const commandEncoder = this.device.createCommandEncoder(); + + switch (shaderStage) { + case 'compute':{ + let textureLoadCoord = ''; + switch (storageTexture.dimension) { + case '1d': + textureLoadCoord = 'invocationID.x'; + break; + case '2d': + textureLoadCoord = + storageTexture.depthOrArrayLayers > 1 ? + `vec2u(invocationID.x, invocationID.y), invocationID.z` : + `vec2u(invocationID.x, invocationID.y)`; + break; + case '3d': + textureLoadCoord = 'invocationID'; + break; + } + + const computeShader = ` + ${bindingResourceDeclaration} + @compute + @workgroup_size( + ${storageTexture.width}, ${storageTexture.height}, ${storageTexture.depthOrArrayLayers}) + fn main( + @builtin(local_invocation_id) invocationID: vec3u, + @builtin(local_invocation_index) invocationIndex: u32) { + let initialValue = textureLoad(readOnlyTexture, ${textureLoadCoord}); + outputBuffer[invocationIndex] = initialValue; + }`; + const computePipeline = this.device.createComputePipeline({ + compute: { + module: this.device.createShaderModule({ + code: computeShader + }) + }, + layout: 'auto' + }); + const bindGroup = this.device.createBindGroup({ + layout: computePipeline.getBindGroupLayout(0), + entries: bindGroupEntries + }); + + const computePassEncoder = commandEncoder.beginComputePass(); + computePassEncoder.setPipeline(computePipeline); + computePassEncoder.setBindGroup(0, bindGroup); + computePassEncoder.dispatchWorkgroups(1); + computePassEncoder.end(); + break; + } + case 'fragment':{ + let textureLoadCoord = ''; + switch (storageTexture.dimension) { + case '1d': + textureLoadCoord = 'textureCoord.x'; + break; + case '2d': + textureLoadCoord = + storageTexture.depthOrArrayLayers > 1 ? 'textureCoord, z' : 'textureCoord'; + break; + case '3d': + textureLoadCoord = 'vec3u(textureCoord, z)'; + break; + } + + const fragmentShader = ` + ${bindingResourceDeclaration} + @fragment + fn main(@builtin(position) fragCoord: vec4f) -> @location(0) vec4f { + let textureCoord = vec2u(fragCoord.xy); + let storageTextureTexelCountPerImage = ${storageTexture.width * storageTexture.height}u; + for (var z = 0u; z < ${storageTexture.depthOrArrayLayers}; z++) { + let initialValue = textureLoad(readOnlyTexture, ${textureLoadCoord}); + let outputIndex = + storageTextureTexelCountPerImage * z + textureCoord.y * ${storageTexture.width} + + textureCoord.x; + outputBuffer[outputIndex] = initialValue; + } + return vec4f(0.0, 1.0, 0.0, 1.0); + }`; + const vertexShader = ` + @vertex + fn main(@builtin(vertex_index) vertexIndex : u32) -> @builtin(position) vec4f { + var pos = array( + vec2f(-1.0, -1.0), + vec2f(-1.0, 1.0), + vec2f( 1.0, -1.0), + vec2f(-1.0, 1.0), + vec2f( 1.0, -1.0), + vec2f( 1.0, 1.0)); + return vec4f(pos[vertexIndex], 0.0, 1.0); + } + `; + const renderPipeline = this.device.createRenderPipeline({ + layout: 'auto', + vertex: { + module: this.device.createShaderModule({ + code: vertexShader + }) + }, + fragment: { + module: this.device.createShaderModule({ + code: fragmentShader + }), + targets: [ + { + format: 'rgba8unorm' + }] + + }, + primitive: { + topology: 'triangle-list' + } + }); + + const bindGroup = this.device.createBindGroup({ + layout: renderPipeline.getBindGroupLayout(0), + entries: bindGroupEntries + }); + + const placeholderColorTexture = this.createTextureTracked({ + size: [storageTexture.width, storageTexture.height, 1], + usage: GPUTextureUsage.RENDER_ATTACHMENT, + format: 'rgba8unorm' + }); + + const renderPassEncoder = commandEncoder.beginRenderPass({ + colorAttachments: [ + { + view: placeholderColorTexture.createView(), + loadOp: 'clear', + clearValue: { r: 0, g: 0, b: 0, a: 0 }, + storeOp: 'store' + }] + + }); + renderPassEncoder.setPipeline(renderPipeline); + renderPassEncoder.setBindGroup(0, bindGroup); + renderPassEncoder.draw(6); + renderPassEncoder.end(); + break; + } + case 'vertex':{ + // For each texel location (coordX, coordY), draw one point at (coordX + 0.5, coordY + 0.5) + // in the storageTexture.width * storageTexture.height grid, and save all the texel values + // at (coordX, coordY, z) (z >= 0 && z < storageTexture.depthOrArrayLayers) into the + // corresponding vertex shader outputs. + let vertexOutputs = ''; + for (let layer = 0; layer < storageTexture.depthOrArrayLayers; ++layer) { + vertexOutputs = vertexOutputs.concat( + ` + @location(${layer + 1}) @interpolate(flat, either) + vertex_out${layer}: ${this.GetOutputBufferWGSLType(format)},` + ); + } + + let loadFromTextureWGSL = ''; + switch (storageTexture.dimension) { + case '1d': + loadFromTextureWGSL = ` + output.vertex_out0 = textureLoad(readOnlyTexture, coordX);`; + break; + case '2d': + if (storageTexture.depthOrArrayLayers === 1) { + loadFromTextureWGSL = ` + output.vertex_out0 = textureLoad(readOnlyTexture, vec2u(coordX, coordY));`; + } else { + for (let z = 0; z < storageTexture.depthOrArrayLayers; ++z) { + loadFromTextureWGSL = loadFromTextureWGSL.concat(` + output.vertex_out${z} = + textureLoad(readOnlyTexture, vec2u(coordX, coordY), ${z});`); + } + } + break; + case '3d': + for (let z = 0; z < storageTexture.depthOrArrayLayers; ++z) { + loadFromTextureWGSL = loadFromTextureWGSL.concat(` + output.vertex_out${z} = textureLoad(readOnlyTexture, vec3u(coordX, coordY, ${z}));`); + } + break; + } + + let outputToBufferWGSL = ''; + for (let layer = 0; layer < storageTexture.depthOrArrayLayers; ++layer) { + outputToBufferWGSL = outputToBufferWGSL.concat( + ` + let outputIndex${layer} = + storageTextureTexelCountPerImage * ${layer}u + + fragmentInput.tex_coord.y * ${storageTexture.width}u + fragmentInput.tex_coord.x; + outputBuffer[outputIndex${layer}] = fragmentInput.vertex_out${layer};` + ); + } + + const shader = ` + ${bindingResourceDeclaration} + struct VertexOutput { + @builtin(position) my_pos: vec4f, + @location(0) @interpolate(flat, either) tex_coord: vec2u, + ${vertexOutputs} + } + @vertex + fn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput { + var output : VertexOutput; + let coordX = vertexIndex % ${storageTexture.width}u; + let coordY = vertexIndex / ${storageTexture.width}u; + // Each vertex in the mesh take an even step along X axis from -1.0 to 1.0. + let posXStep = f32(${2.0 / storageTexture.width}); + // As well as along Y axis. + let posYStep = f32(${2.0 / storageTexture.height}); + // And the vertex located in the middle of the step, i.e. with a bias of 0.5 step. + let outputPosX = -1.0 + posXStep * 0.5 + posXStep * f32(coordX); + let outputPosY = -1.0 + posYStep * 0.5 + posYStep * f32(coordY); + output.my_pos = vec4f(outputPosX, outputPosY, 0.0, 1.0); + output.tex_coord = vec2u(coordX, coordY); + ${loadFromTextureWGSL} + return output; + } + @fragment + fn fs_main(fragmentInput : VertexOutput) -> @location(0) vec4f { + let storageTextureTexelCountPerImage = ${storageTexture.width * storageTexture.height}u; + ${outputToBufferWGSL} + return vec4f(0.0, 1.0, 0.0, 1.0); + } + `; + + const renderPipeline = this.device.createRenderPipeline({ + layout: 'auto', + vertex: { + module: this.device.createShaderModule({ + code: shader + }) + }, + fragment: { + module: this.device.createShaderModule({ + code: shader + }), + targets: [ + { + format: 'rgba8unorm' + }] + + }, + primitive: { + topology: 'point-list' + } + }); + + const bindGroup = this.device.createBindGroup({ + layout: renderPipeline.getBindGroupLayout(0), + entries: bindGroupEntries + }); + + const placeholderColorTexture = this.createTextureTracked({ + size: [storageTexture.width, storageTexture.height, 1], + usage: GPUTextureUsage.RENDER_ATTACHMENT, + format: 'rgba8unorm' + }); + + const renderPassEncoder = commandEncoder.beginRenderPass({ + colorAttachments: [ + { + view: placeholderColorTexture.createView(), + loadOp: 'clear', + clearValue: { r: 0, g: 0, b: 0, a: 0 }, + storeOp: 'store' + }] + + }); + renderPassEncoder.setPipeline(renderPipeline); + renderPassEncoder.setBindGroup(0, bindGroup); + renderPassEncoder.draw(storageTexture.width * storageTexture.height); + renderPassEncoder.end(); + break; + } + } + + this.queue.submit([commandEncoder.finish()]); + } +} + +export const g = makeTestGroup(F); + +g.test('basic'). +desc( + `The basic functionality tests for read-only storage textures. In the test we read data from + the read-only storage texture, write the data into an output storage buffer, and check if the + data in the output storage buffer is exactly what we expect.` +). +params((u) => +u. +combine('format', kColorTextureFormats). +filter( + (p) => p.format === 'bgra8unorm' || kTextureFormatInfo[p.format].color?.storage === true +). +combine('shaderStage', kValidShaderStages). +combine('dimension', kTextureDimensions). +combine('depthOrArrayLayers', [1, 2]). +unless((p) => p.dimension === '1d' && p.depthOrArrayLayers > 1) +). +beforeAllSubcases((t) => { + if (t.params.format === 'bgra8unorm') { + t.selectDeviceOrSkipTestCase('bgra8unorm-storage'); + } + if (t.isCompatibility) { + t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format); + } +}). +fn((t) => { + const { format, shaderStage, dimension, depthOrArrayLayers } = t.params; + + const kWidth = 8; + const height = dimension === '1d' ? 1 : 8; + const storageTexture = t.createTextureTracked({ + format, + dimension, + size: [kWidth, height, depthOrArrayLayers], + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING + }); + + const expectedData = t.InitTextureAndGetExpectedOutputBufferData(storageTexture, format); + + const outputBuffer = t.createBufferTracked({ + size: 4 * 4 * kWidth * height * depthOrArrayLayers, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + }); + + t.DoTransform(storageTexture, shaderStage, format, outputBuffer); + + switch (kTextureFormatInfo[format].color.type) { + case 'uint': + t.expectGPUBufferValuesEqual(outputBuffer, new Uint32Array(expectedData)); + break; + case 'sint': + t.expectGPUBufferValuesEqual(outputBuffer, new Int32Array(expectedData)); + break; + case 'float': + case 'unfilterable-float': + t.expectGPUBufferValuesEqual(outputBuffer, new Float32Array(expectedData)); + break; + default: + unreachable(); + break; + } +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_write.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_write.spec.js index 15f734afe9e..09f80f255c4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_write.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/storage_texture/read_write.spec.js @@ -208,7 +208,7 @@ class F extends GPUTest { }); - const dummyColorTexture = device.createTexture({ + const placeholderColorTexture = this.createTextureTracked({ size: [rwTexture.width, rwTexture.height, 1], usage: GPUTextureUsage.RENDER_ATTACHMENT, format: 'rgba8unorm' @@ -217,7 +217,7 @@ class F extends GPUTest { const renderPassEncoder = commandEncoder.beginRenderPass({ colorAttachments: [ { - view: dummyColorTexture.createView(), + view: placeholderColorTexture.createView(), loadOp: 'clear', clearValue: { r: 0, g: 0, b: 0, a: 0 }, storeOp: 'store' @@ -315,6 +315,9 @@ combine('textureDimension', kTextureDimensions). combine('depthOrArrayLayers', [1, 2]). unless((p) => p.textureDimension === '1d' && p.depthOrArrayLayers > 1) ). +beforeAllSubcases((t) => { + t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format); +}). fn((t) => { const { format, shaderStage, textureDimension, depthOrArrayLayers } = t.params; @@ -323,7 +326,7 @@ fn((t) => { const kWidth = t.isCompatibility ? 8 : 16; const height = textureDimension === '1d' ? 1 : 8; const textureSize = [kWidth, height, depthOrArrayLayers]; - const storageTexture = t.device.createTexture({ + const storageTexture = t.createTextureTracked({ format, dimension: textureDimension, size: textureSize, @@ -347,7 +350,7 @@ fn((t) => { t.RecordCommandsToTransform(t.device, shaderStage, commandEncoder, storageTexture); const expectedData = t.GetExpectedData(shaderStage, storageTexture, initialData); - const readbackBuffer = t.device.createBuffer({ + const readbackBuffer = t.createBufferTracked({ size: expectedData.byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/format_reinterpretation.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/format_reinterpretation.spec.js index f942724585c..4544b91dc5d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/format_reinterpretation.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/format_reinterpretation.spec.js @@ -148,13 +148,11 @@ fn((t) => { }); // Create an rgba8unorm output texture. - const outputTexture = t.trackForCleanup( - t.device.createTexture({ - format: 'rgba8unorm', - size: [kTextureSize, kTextureSize], - usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC - }) - ); + const outputTexture = t.createTextureTracked({ + format: 'rgba8unorm', + size: [kTextureSize, kTextureSize], + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC + }); // Execute a compute pass to load data from the reinterpreted view and // write out to the rgba8unorm texture. @@ -221,29 +219,25 @@ fn((t) => { const inputTexelView = makeInputTexelView(format); // Create the renderTexture as |format|. - const renderTexture = t.trackForCleanup( - t.device.createTexture({ - format, - size: [kTextureSize, kTextureSize], - usage: - GPUTextureUsage.RENDER_ATTACHMENT | ( - sampleCount > 1 ? GPUTextureUsage.TEXTURE_BINDING : GPUTextureUsage.COPY_SRC), - viewFormats: [viewFormat], - sampleCount - }) - ); + const renderTexture = t.createTextureTracked({ + format, + size: [kTextureSize, kTextureSize], + usage: + GPUTextureUsage.RENDER_ATTACHMENT | ( + sampleCount > 1 ? GPUTextureUsage.TEXTURE_BINDING : GPUTextureUsage.COPY_SRC), + viewFormats: [viewFormat], + sampleCount + }); const resolveTexture = sampleCount === 1 ? undefined : - t.trackForCleanup( - t.device.createTexture({ - format, - size: [kTextureSize, kTextureSize], - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, - viewFormats: [viewFormat] - }) - ); + t.createTextureTracked({ + format, + size: [kTextureSize, kTextureSize], + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, + viewFormats: [viewFormat] + }); // Create the sample source with the contents of the input texel view. // We will sample this texture into |renderTexture|. It uses the same format to keep the same @@ -295,13 +289,11 @@ fn((t) => { // If the render target is multisampled, we'll manually resolve it to check // the contents. const singleSampleRenderTexture = resolveTexture ? - t.trackForCleanup( - t.device.createTexture({ - format, - size: [kTextureSize, kTextureSize], - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT - }) - ) : + t.createTextureTracked({ + format, + size: [kTextureSize, kTextureSize], + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }) : renderTexture; if (resolveTexture) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/write.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/write.spec.js index 185407105c0..6a7d07def4d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/write.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/texture_view/write.spec.js @@ -136,13 +136,11 @@ sampleCount) // The size of which equals that of format texture we are testing, // so that we have the same number of fragments and texels. const kPlaceholderTextureFormat = 'rgba8unorm'; - const placeholderTexture = t.trackForCleanup( - t.device.createTexture({ - format: kPlaceholderTextureFormat, - size: [kTextureSize, kTextureSize], - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const placeholderTexture = t.createTextureTracked({ + format: kPlaceholderTextureFormat, + size: [kTextureSize, kTextureSize], + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); const pipeline = t.device.createRenderPipeline({ layout: 'auto', @@ -210,14 +208,12 @@ sampleCount) method === 'render-pass-store' ? view : t. - trackForCleanup( - t.device.createTexture({ - format, - size: [kTextureSize, kTextureSize], - usage: GPUTextureUsage.RENDER_ATTACHMENT, - sampleCount: 4 - }) - ). + createTextureTracked({ + format, + size: [kTextureSize, kTextureSize], + usage: GPUTextureUsage.RENDER_ATTACHMENT, + sampleCount: 4 + }). createView(); const resolveView = method === 'render-pass-store' ? undefined : view; const multisampleCount = method === 'render-pass-store' ? sampleCount : 4; @@ -344,14 +340,12 @@ fn((t) => { GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.RENDER_ATTACHMENT); - const texture = t.trackForCleanup( - t.device.createTexture({ - format, - usage, - size: [kTextureSize, kTextureSize], - sampleCount - }) - ); + const texture = t.createTextureTracked({ + format, + usage, + size: [kTextureSize, kTextureSize], + sampleCount + }); const view = texture.createView(); const expectedTexelView = writeTextureAndGetExpectedTexelView( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/uncapturederror.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/uncapturederror.spec.js index 3c7615f9611..361d9793161 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/uncapturederror.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/uncapturederror.spec.js @@ -2,22 +2,24 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` Tests for GPUDevice.onuncapturederror. -`;import { Fixture } from '../../../common/framework/fixture.js'; -import { makeTestGroup } from '../../../common/framework/test_group.js'; +`;import { makeTestGroup } from '../../../common/framework/test_group.js'; +import { kGeneratableErrorScopeFilters } from '../../capability_info.js'; +import { ErrorTest } from '../../error_test.js'; -export const g = makeTestGroup(Fixture); - -g.test('constructor'). -desc( - `GPUUncapturedErrorEvent constructor options (also tests constructing GPUOutOfMemoryError/GPUValidationError)` -). -unimplemented(); +export const g = makeTestGroup(ErrorTest); g.test('iff_uncaptured'). desc( `{validation, out-of-memory} error should fire uncapturederror iff not captured by a scope.` ). -unimplemented(); +params((u) => u.combine('errorType', kGeneratableErrorScopeFilters)). +fn(async (t) => { + const { errorType } = t.params; + const uncapturedErrorEvent = await t.expectUncapturedError(() => { + t.generateError(errorType); + }); + t.expect(t.isInstanceOfError(errorType, uncapturedErrorEvent.error)); +}); g.test('only_original_device_is_event_target'). desc( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/correctness.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/correctness.spec.js index 0973299a73e..0ede885b848 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/correctness.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/correctness.spec.js @@ -202,7 +202,7 @@ ${vsChecks} } struct VSOutputs { - @location(0) @interpolate(flat) result : i32, + @location(0) @interpolate(flat, either) result : i32, @builtin(position) position : vec4, }; @@ -221,7 +221,7 @@ struct VSOutputs { return output; } -@fragment fn fsMain(@location(0) @interpolate(flat) result : i32) +@fragment fn fsMain(@location(0) @interpolate(flat, either) result : i32) -> @location(0) i32 { return result; } @@ -282,7 +282,7 @@ struct VSOutputs { vertexCount, instanceCount) { - const testTexture = this.device.createTexture({ + const testTexture = this.createTextureTracked({ format: 'r32sint', size: [vertexCount, instanceCount], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/index_format.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/index_format.spec.js index 60ffb5bc369..f64f2ec63cd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/index_format.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/vertex_state/index_format.spec.js @@ -119,13 +119,13 @@ class IndexFormatTest extends GPUTest { pipeline = this.MakeRenderPipeline(primitiveTopology); } - const colorAttachment = this.device.createTexture({ + const colorAttachment = this.createTextureTracked({ format: kTextureFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const result = this.device.createBuffer({ + const result = this.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -233,13 +233,13 @@ fn((t) => { const pipeline32 = t.MakeRenderPipeline(kPrimitiveTopology, indexFormat32); const pipeline16 = t.MakeRenderPipeline(kPrimitiveTopology, indexFormat16); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kTextureFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const result = t.device.createBuffer({ + const result = t.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -290,13 +290,13 @@ fn((t) => { const kPrimitiveTopology = 'triangle-strip'; const pipeline = t.MakeRenderPipeline(kPrimitiveTopology, indexFormat); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kTextureFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const result = t.device.createBuffer({ + const result = t.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -350,13 +350,13 @@ fn((t) => { const expectedTextureValues = t.CreateExpectedUint8Array(kBottomLeftTriangle); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kTextureFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const result = t.device.createBuffer({ + const result = t.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/create.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/create.spec.js index d28cee735aa..743bfced8db 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/create.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/create.spec.js @@ -38,7 +38,7 @@ fn((t) => { const usage = BufferUsage.COPY_SRC; t.expectGPUError( 'validation', - () => t.device.createBuffer({ size, usage, mappedAtCreation }), + () => t.createBufferTracked({ size, usage, mappedAtCreation }), !isValid ); }); @@ -51,7 +51,7 @@ fn((t) => { const size = t.makeLimitVariant('maxBufferSize', { mult: 1, add: sizeAddition }); const isValid = size <= t.device.limits.maxBufferSize; const usage = BufferUsage.COPY_SRC; - t.expectGPUError('validation', () => t.device.createBuffer({ size, usage }), !isValid); + t.expectGPUError('validation', () => t.createBufferTracked({ size, usage }), !isValid); }); const kInvalidUsage = 0x8000; @@ -79,7 +79,7 @@ fn((t) => { t.expectGPUError( 'validation', - () => t.device.createBuffer({ size: kBufferSizeAlignment * 2, usage, mappedAtCreation }), + () => t.createBufferTracked({ size: kBufferSizeAlignment * 2, usage, mappedAtCreation }), !isValid ); }); @@ -109,5 +109,5 @@ u.combineWithParams([ fn((t) => { const { _valid, usage, size } = t.params; - t.expectGPUError('validation', () => t.device.createBuffer({ size, usage }), !_valid); + t.expectGPUError('validation', () => t.createBufferTracked({ size, usage }), !_valid); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/destroy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/destroy.spec.js index 59b6c9500db..41728df009d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/destroy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/destroy.spec.js @@ -17,7 +17,7 @@ u // ). fn((t) => { const { usage } = t.params; - const buf = t.device.createBuffer({ + const buf = t.createBufferTracked({ size: 4, usage }); @@ -48,7 +48,7 @@ combineWithParams([ ) ). fn((t) => { - const buf = t.device.createBuffer(t.params); + const buf = t.createBufferTracked(t.params); buf.destroy(); buf.destroy(); @@ -81,7 +81,7 @@ unless((p) => p.mappedAtCreation === false && p.mapMode === undefined) ). fn(async (t) => { const { usage, mapMode, mappedAtCreation, unmapBeforeDestroy } = t.params; - const buf = t.device.createBuffer({ + const buf = t.createBufferTracked({ size: 4, usage, mappedAtCreation diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/mapping.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/mapping.spec.js index 3d27f025676..49b4d27ad0d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/mapping.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/buffer/mapping.spec.js @@ -27,8 +27,10 @@ class F extends ValidationTest { this.expectValidationError(() => { p = buffer.mapAsync(mode, offset, size); }, expectation.validationError); + let caught = false; let rejectedEarly = false; + let microtaskBRan = false; // If mapAsync rejected early, microtask A will run before B. // If not, B will run before A. p.catch(() => { @@ -38,20 +40,31 @@ class F extends ValidationTest { queueMicrotask(() => { // Microtask B rejectedEarly = caught; + microtaskBRan = true; }); - try { - // This await will always complete after microtasks A and B are both done. - await p; - assert(expectation.rejectName === null, 'mapAsync unexpectedly passed'); - } catch (ex) { - assert(ex instanceof Error, 'mapAsync rejected with non-error'); - assert(typeof ex.stack === 'string', 'mapAsync rejected without a stack'); - assert(expectation.rejectName === ex.name, `mapAsync rejected unexpectedly with: ${ex}`); - assert( - expectation.earlyRejection === rejectedEarly, - 'mapAsync rejected at an unexpected timing' - ); - } + + // These handlers should always run after microtasks A and B are both done. + await p.then( + () => { + unreachable('mapAsync unexpectedly passed'); + }, + (ex) => { + const suffix = `\n Rejection: ${ex}`; + + this.expect(microtaskBRan, 'scheduling problem?: microtaskB has not run yet' + suffix); + assert(ex instanceof Error, 'mapAsync rejected with non-error' + suffix); + this.expect(typeof ex.stack === 'string', 'mapAsync rejected without a stack' + suffix); + this.expect( + expectation.rejectName === ex.name, + 'mapAsync rejected with wrong exception name' + suffix + ); + if (expectation.earlyRejection) { + this.expect(rejectedEarly, 'expected early mapAsync rejection, got deferred' + suffix); + } else { + this.expect(!rejectedEarly, 'expected deferred mapAsync rejection, got early' + suffix); + } + } + ); } } @@ -72,12 +85,12 @@ class F extends ValidationTest { createMappableBuffer(type, size) { switch (type) { case GPUMapMode.READ: - return this.device.createBuffer({ + return this.createBufferTracked({ size, usage: GPUBufferUsage.MAP_READ }); case GPUMapMode.WRITE: - return this.device.createBuffer({ + return this.createBufferTracked({ size, usage: GPUBufferUsage.MAP_WRITE }); @@ -115,7 +128,7 @@ combine('usage', kBufferUsages) fn(async (t) => { const { mapMode, validUsage, usage } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage }); @@ -181,7 +194,7 @@ paramsSubcasesOnly([ fn(async (t) => { const { mapMode, validUsage } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: validUsage, mappedAtCreation: true @@ -464,7 +477,7 @@ u.combine('bufferUsage', kBufferUsages).combine('mapMode', kMapModeOptions) fn(async (t) => { const { bufferUsage, mapMode } = t.params; const bufferSize = 16; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: bufferUsage, size: bufferSize, mappedAtCreation: true @@ -496,7 +509,7 @@ so the Content process doesn't necessarily know the buffer is invalid.` ). fn((t) => { const buffer = t.expectGPUError('validation', () => - t.device.createBuffer({ + t.createBufferTracked({ mappedAtCreation: true, size: 16, usage: 0xffff_ffff // Invalid usage @@ -550,7 +563,7 @@ fn(async (t) => { // It is invalid to call getMappedRange when the buffer is unmapped after mappedAtCreation. { - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: GPUBufferUsage.MAP_READ, size: 16, mappedAtCreation: true @@ -597,7 +610,7 @@ fn(async (t) => { const bufferSize = 16; const offset = 8; const subrangeSize = bufferSize - offset; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, mappedAtCreation: true @@ -640,7 +653,7 @@ fn(async (t) => { // It is invalid to call getMappedRange when the buffer is destroyed when mapped at creation. { - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: GPUBufferUsage.MAP_READ, size: 16, mappedAtCreation: true @@ -704,7 +717,7 @@ combine('size', [0, kSizeAlignment, kSizeAlignment / 2]) ). fn((t) => { const { offset, size } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST, mappedAtCreation: true @@ -750,7 +763,7 @@ paramsSubcasesOnly([ ). fn((t) => { const { bufferSize, offset, size } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_DST, mappedAtCreation: true @@ -912,7 +925,7 @@ combineWithParams([ ). fn(async (t) => { const { offset1, size1, offset2, size2, remapBetweenCalls } = t.params; - const buffer = t.device.createBuffer({ size: 80, usage: GPUBufferUsage.MAP_READ }); + const buffer = t.createBufferTracked({ size: 80, usage: GPUBufferUsage.MAP_READ }); await buffer.mapAsync(GPUMapMode.READ); t.testGetMappedRangeCall(true, buffer, offset1, size1); @@ -930,13 +943,13 @@ fn(async (t) => { t.testGetMappedRangeCall(success, buffer, offset2, size2); }); -g.test('getMappedRange,disjoinRanges_many'). +g.test('getMappedRange,disjointRanges_many'). desc('Test getting a lot of small ranges, and that the disjoint check checks them all.'). fn(async (t) => { const kStride = 256; const kNumStrides = 256; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: kStride * kNumStrides, usage: GPUBufferUsage.MAP_READ }); @@ -963,7 +976,7 @@ desc( fn(async (t) => { // It is valid to call unmap after creation of an unmapped buffer. { - const buffer = t.device.createBuffer({ size: 16, usage: GPUBufferUsage.MAP_READ }); + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.MAP_READ }); buffer.unmap(); } @@ -977,7 +990,7 @@ fn(async (t) => { // It is valid to call unmap after unmapping a mappedAtCreation buffer. { - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: GPUBufferUsage.MAP_READ, size: 16, mappedAtCreation: true @@ -995,7 +1008,7 @@ desc( fn(async (t) => { // It is valid to call unmap after destruction of an unmapped buffer. { - const buffer = t.device.createBuffer({ size: 16, usage: GPUBufferUsage.MAP_READ }); + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.MAP_READ }); buffer.destroy(); buffer.unmap(); } @@ -1010,7 +1023,7 @@ fn(async (t) => { // It is valid to call unmap after destroying a mappedAtCreation buffer. { - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: GPUBufferUsage.MAP_READ, size: 16, mappedAtCreation: true @@ -1028,7 +1041,7 @@ u // ). fn((t) => { const { bufferUsage } = t.params; - const buffer = t.device.createBuffer({ size: 16, usage: bufferUsage, mappedAtCreation: true }); + const buffer = t.createBufferTracked({ size: 16, usage: bufferUsage, mappedAtCreation: true }); buffer.unmap(); }); @@ -1066,7 +1079,7 @@ desc( ). fn(async (t) => { let buffer = null; - buffer = t.device.createBuffer({ + buffer = t.createBufferTracked({ size: 256, usage: GPUBufferUsage.COPY_DST, mappedAtCreation: true diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/query_types.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/query_types.spec.js index 44097d184c3..64cffceb1ea 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/query_types.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/query_types.spec.js @@ -39,7 +39,7 @@ fn((t) => { const shouldException = type === 'timestamp' && !featureContainsTimestampQuery; t.shouldThrow(shouldException ? 'TypeError' : false, () => { - t.device.createQuerySet({ type, count }); + t.createQuerySetTracked({ type, count }); }); }); @@ -66,7 +66,7 @@ beforeAllSubcases((t) => { fn((t) => { const { featureContainsTimestampQuery } = t.params; - const querySet = t.device.createQuerySet({ + const querySet = t.createQuerySetTracked({ type: featureContainsTimestampQuery ? 'timestamp' : 'occlusion', count: 2 }); @@ -99,13 +99,11 @@ fn((t) => { { const encoder = t.createEncoder('non-pass'); const view = t. - trackForCleanup( - t.device.createTexture({ - size: [16, 16, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ). + createTextureTracked({ + size: [16, 16, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }). createView(); encoder.encoder. beginRenderPass({ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/texture_formats.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/texture_formats.spec.js index 4e88bfc4fff..b7beccf59c6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/texture_formats.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/features/texture_formats.spec.js @@ -38,7 +38,7 @@ fn((t) => { const formatInfo = kTextureFormatInfo[format]; t.shouldThrow(enable_required_feature ? false : 'TypeError', () => { - t.device.createTexture({ + t.createTextureTracked({ format, size: [formatInfo.blockWidth, formatInfo.blockHeight, 1], usage: GPUTextureUsage.TEXTURE_BINDING @@ -69,7 +69,7 @@ fn((t) => { const formatInfo = kTextureFormatInfo[format]; t.shouldThrow(enable_required_feature ? false : 'TypeError', () => { - t.device.createTexture({ + t.createTextureTracked({ format, size: [formatInfo.blockWidth, formatInfo.blockHeight, 1], usage: GPUTextureUsage.TEXTURE_BINDING, @@ -107,7 +107,7 @@ fn((t) => { const textureFormat = enable_required_feature ? format : 'rgba8unorm'; const formatInfo = kTextureFormatInfo[format]; - const testTexture = t.device.createTexture({ + const testTexture = t.createTextureTracked({ format: textureFormat, size: [formatInfo.blockWidth, formatInfo.blockHeight, 1], usage: GPUTextureUsage.TEXTURE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js index 6a23a9450fd..3fbe58f5d6d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js @@ -355,12 +355,12 @@ export class LimitTestsImpl extends GPUTestBase { requiredFeatures) { if (shouldReject) { - this.shouldReject('OperationError', adapter.requestDevice({ requiredLimits }), { + this.shouldReject('OperationError', this.requestDeviceTracked(adapter, { requiredLimits }), { allowMissingStack: true }); return undefined; } else { - return await adapter.requestDevice({ requiredLimits, requiredFeatures }); + return this.requestDeviceTracked(adapter, { requiredLimits, requiredFeatures }); } } @@ -718,11 +718,19 @@ export class LimitTestsImpl extends GPUTestBase { } _createRenderPipelineDescriptor(module) { + const { device } = this; return { layout: 'auto', vertex: { module, entryPoint: 'mainVS' + }, + // Specify a color attachment so we have at least one render target. + fragment: { + targets: [{ format: 'rgba8unorm' }], + module: device.createShaderModule({ + code: `@fragment fn main() -> @location(0) vec4f { return vec4f(0); }` + }) } }; } @@ -879,25 +887,21 @@ export class LimitTestsImpl extends GPUTestBase { /** * Creates an GPURenderCommandsMixin setup with some initial state. */ - _getGPURenderCommandsMixin(encoderType) { + #getGPURenderCommandsMixin(encoderType) { const { device } = this; switch (encoderType) { case 'render':{ - const buffer = this.trackForCleanup( - device.createBuffer({ - size: 16, - usage: GPUBufferUsage.UNIFORM - }) - ); + const buffer = this.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.UNIFORM + }); - const texture = this.trackForCleanup( - device.createTexture({ - size: [1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const texture = this.createTextureTracked({ + size: [1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); const layout = device.createBindGroupLayout({ entries: [ @@ -920,7 +924,7 @@ export class LimitTestsImpl extends GPUTestBase { }); const encoder = device.createCommandEncoder(); - const mixin = encoder.beginRenderPass({ + const passEncoder = encoder.beginRenderPass({ colorAttachments: [ { view: texture.createView(), @@ -931,10 +935,10 @@ export class LimitTestsImpl extends GPUTestBase { }); return { - mixin, + passEncoder, bindGroup, prep() { - mixin.end(); + passEncoder.end(); }, test() { encoder.finish(); @@ -944,12 +948,10 @@ export class LimitTestsImpl extends GPUTestBase { } case 'renderBundle':{ - const buffer = this.trackForCleanup( - device.createBuffer({ - size: 16, - usage: GPUBufferUsage.UNIFORM - }) - ); + const buffer = this.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.UNIFORM + }); const layout = device.createBindGroupLayout({ entries: [ @@ -971,16 +973,16 @@ export class LimitTestsImpl extends GPUTestBase { }); - const mixin = device.createRenderBundleEncoder({ + const passEncoder = device.createRenderBundleEncoder({ colorFormats: ['rgba8unorm'] }); return { - mixin, + passEncoder, bindGroup, prep() {}, test() { - mixin.finish(); + passEncoder.finish(); } }; break; @@ -989,17 +991,23 @@ export class LimitTestsImpl extends GPUTestBase { } /** - * Tests a method on GPURenderCommandsMixin - * The function will be called with the mixin. + * Test a method on GPURenderCommandsMixin or GPUBindingCommandsMixin + * The function will be called with the passEncoder. */ - async testGPURenderCommandsMixin( + async testGPURenderAndBindingCommandsMixin( encoderType, fn, + + + + + + shouldError, msg = '') { - const { mixin, prep, test } = this._getGPURenderCommandsMixin(encoderType); - fn({ mixin }); + const { passEncoder, prep, test, bindGroup } = this.#getGPURenderCommandsMixin(encoderType); + fn({ passEncoder, bindGroup }); prep(); await this.expectValidationError(test, shouldError, msg); @@ -1008,17 +1016,15 @@ export class LimitTestsImpl extends GPUTestBase { /** * Creates GPUBindingCommandsMixin setup with some initial state. */ - _getGPUBindingCommandsMixin(encoderType) { + #getGPUBindingCommandsMixin(encoderType) { const { device } = this; switch (encoderType) { case 'compute':{ - const buffer = this.trackForCleanup( - device.createBuffer({ - size: 16, - usage: GPUBufferUsage.UNIFORM - }) - ); + const buffer = this.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.UNIFORM + }); const layout = device.createBindGroupLayout({ entries: [ @@ -1041,12 +1047,12 @@ export class LimitTestsImpl extends GPUTestBase { }); const encoder = device.createCommandEncoder(); - const mixin = encoder.beginComputePass(); + const passEncoder = encoder.beginComputePass(); return { - mixin, + passEncoder, bindGroup, prep() { - mixin.end(); + passEncoder.end(); }, test() { encoder.finish(); @@ -1055,15 +1061,15 @@ export class LimitTestsImpl extends GPUTestBase { break; } case 'render': - return this._getGPURenderCommandsMixin('render'); + return this.#getGPURenderCommandsMixin('render'); case 'renderBundle': - return this._getGPURenderCommandsMixin('renderBundle'); + return this.#getGPURenderCommandsMixin('renderBundle'); } } /** * Tests a method on GPUBindingCommandsMixin - * The function pass will be called with the mixin and a bindGroup + * The function pass will be called with the passEncoder and a bindGroup */ async testGPUBindingCommandsMixin( encoderType, @@ -1071,8 +1077,8 @@ export class LimitTestsImpl extends GPUTestBase { shouldError, msg = '') { - const { mixin, bindGroup, prep, test } = this._getGPUBindingCommandsMixin(encoderType); - fn({ mixin, bindGroup }); + const { passEncoder, bindGroup, prep, test } = this.#getGPUBindingCommandsMixin(encoderType); + fn({ passEncoder, bindGroup }); prep(); await this.expectValidationError(test, shouldError, msg); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroups.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroups.spec.js index fad769f242a..f239b560fa9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroups.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroups.spec.js @@ -198,8 +198,8 @@ fn(async (t) => { const lastIndex = testValue - 1; await t.testGPUBindingCommandsMixin( encoderType, - ({ mixin, bindGroup }) => { - mixin.setBindGroup(lastIndex, bindGroup); + ({ passEncoder, bindGroup }) => { + passEncoder.setBindGroup(lastIndex, bindGroup); }, shouldError, `shouldError: ${shouldError}, actualLimit: ${actualLimit}, testValue: ${lastIndex}` diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.js new file mode 100644 index 00000000000..d417400974a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.js @@ -0,0 +1,298 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { kRenderEncoderTypes, kMaximumLimitBaseParams, + makeLimitTestGroup } from + +'./limit_utils.js'; + +const kVertexBufferBindGroupPreferences = ['vertexBuffers', 'bindGroups']; + + +const kLayoutTypes = ['auto', 'explicit']; + + +/** + * Given testValue, choose more vertex buffers or more bind groups based on preference + */ +function getNumBindGroupsAndNumVertexBuffers( +device, +preference, +testValue) +{ + switch (preference) { + case 'bindGroups':{ + const numBindGroups = Math.min(testValue, device.limits.maxBindGroups); + const numVertexBuffers = Math.max(0, testValue - numBindGroups); + return { numVertexBuffers, numBindGroups }; + } + case 'vertexBuffers':{ + const numVertexBuffers = Math.min(testValue, device.limits.maxVertexBuffers); + const numBindGroups = Math.max(0, testValue - numVertexBuffers); + return { numVertexBuffers, numBindGroups }; + } + } +} + +function createLayout(device, layoutType, numBindGroups) { + switch (layoutType) { + case 'auto': + return 'auto'; + case 'explicit':{ + const bindGroupLayouts = new Array(numBindGroups); + if (numBindGroups > 0) { + bindGroupLayouts.fill(device.createBindGroupLayout({ entries: [] })); + bindGroupLayouts[numBindGroups - 1] = device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.VERTEX, + buffer: {} + }] + + }); + } + return device.createPipelineLayout({ bindGroupLayouts }); + } + } +} + +/** + * Generate a render pipeline that can be used to test maxBindGroupsPlusVertexBuffers + */ +function getPipelineDescriptor( +device, +preference, +testValue, +layoutType) +{ + // Get the numVertexBuffers and numBindGroups we could use given testValue as a total. + // We will only use 1 of each but we'll use the last index. + const { numVertexBuffers, numBindGroups } = getNumBindGroupsAndNumVertexBuffers( + device, + preference, + testValue + ); + + const layout = createLayout(device, layoutType, numBindGroups); + + const [bindGroupDecl, bindGroupUsage] = + numBindGroups === 0 ? + ['', ''] : + [`@group(${numBindGroups - 1}) @binding(0) var u: f32;`, `_ = u;`]; + + const [attribDecl, attribUsage] = + numVertexBuffers === 0 ? + ['', ''] : + ['@location(0) v: vec4f', `_ = v; // will use vertex buffer ${numVertexBuffers - 1}`]; + + const code = ` + ${bindGroupDecl} + + @vertex fn vs(${attribDecl}) -> @builtin(position) vec4f { + ${bindGroupUsage} + ${attribUsage} + return vec4f(0); + } + + @fragment fn fs() -> @location(0) vec4f { + return vec4f(0); + } + `; + + const module = device.createShaderModule({ code }); + const buffers = new Array(numVertexBuffers); + if (numVertexBuffers > 0) { + buffers[numVertexBuffers - 1] = { + arrayStride: 16, + attributes: [{ shaderLocation: 0, offset: 0, format: 'float32' }] + }; + } + + return { + code, + descriptor: { + layout, + vertex: { + module, + buffers + }, + fragment: { + module, + targets: [{ format: 'rgba8unorm' }] + } + } + }; +} + +const kExtraLimits = { + maxBindGroups: 'adapterLimit', + maxVertexBuffers: 'adapterLimit' +}; + +const limit = 'maxBindGroupsPlusVertexBuffers'; +export const { g, description } = makeLimitTestGroup(limit); + +g.test('createRenderPipeline,at_over'). +desc(`Test using at and over ${limit} limit in createRenderPipeline(Async).`). +params( + kMaximumLimitBaseParams. + combine('async', [false, true]). + beginSubcases(). + combine('preference', kVertexBufferBindGroupPreferences). + combine('layoutType', kLayoutTypes) +). +fn(async (t) => { + const { limitTest, testValueName, async, preference, layoutType } = t.params; + await t.testDeviceWithRequestedMaximumLimits( + limitTest, + testValueName, + async ({ device, testValue, shouldError, actualLimit }) => { + const maxUsableBindGroupsPlusVertexBuffers = + device.limits.maxBindGroups + device.limits.maxVertexBuffers; + t.skipIf( + maxUsableBindGroupsPlusVertexBuffers < actualLimit, + `can not test because the max usable bindGroups + vertexBuffers (${maxUsableBindGroupsPlusVertexBuffers}) is < maxBindGroupsAndVertexBuffers (${actualLimit})` + ); + t.skipIf( + maxUsableBindGroupsPlusVertexBuffers === actualLimit && testValue > actualLimit, + `can not test because the max usable bindGroups + vertexBuffers (${maxUsableBindGroupsPlusVertexBuffers}) === maxBindGroupsAndVertexBuffers (${actualLimit}) + but the testValue (${testValue}) > maxBindGroupsAndVertexBuffers (${actualLimit})` + ); + + const { code, descriptor } = getPipelineDescriptor( + device, + preference, + testValue, + layoutType + ); + + await t.testCreateRenderPipeline( + descriptor, + async, + shouldError, + `testValue: ${testValue}, actualLimit: ${actualLimit}, shouldError: ${shouldError}\n${code}` + ); + }, + kExtraLimits + ); +}); + +g.test('draw,at_over'). +desc(`Test using at and over ${limit} limit draw/drawIndexed/drawIndirect/drawIndexedIndirect`). +params( + kMaximumLimitBaseParams. + combine('encoderType', kRenderEncoderTypes). + beginSubcases(). + combine('preference', kVertexBufferBindGroupPreferences). + combine('drawType', ['draw', 'drawIndexed', 'drawIndirect', 'drawIndexedIndirect']) +). +fn(async (t) => { + const { limitTest, testValueName, encoderType, drawType, preference } = t.params; + await t.testDeviceWithRequestedMaximumLimits( + limitTest, + testValueName, + async ({ device, testValue, shouldError, actualLimit }) => { + const maxUsableVertexBuffers = Math.min( + device.limits.maxVertexBuffers, + device.limits.maxVertexAttributes + ); + const maxUsableBindGroupsPlusVertexBuffers = + device.limits.maxBindGroups + maxUsableVertexBuffers; + t.skipIf( + maxUsableBindGroupsPlusVertexBuffers < actualLimit, + `can not test because the max usable bindGroups + vertexBuffers (${maxUsableBindGroupsPlusVertexBuffers}) is < maxBindGroupsAndVertexBuffers (${actualLimit})` + ); + t.skipIf( + maxUsableBindGroupsPlusVertexBuffers === actualLimit && testValue > actualLimit, + `can not test because the max usable bindGroups + vertexBuffers (${maxUsableBindGroupsPlusVertexBuffers}) === maxBindGroupsAndVertexBuffers (${actualLimit}) + but the testValue (${testValue}) > maxBindGroupsAndVertexBuffers (${actualLimit})` + ); + + // Get the numVertexBuffers and numBindGroups we could use given testValue as a total. + // We will only use 1 of each but we'll use the last index. + const { numVertexBuffers, numBindGroups } = getNumBindGroupsAndNumVertexBuffers( + device, + preference, + testValue + ); + + const module = device.createShaderModule({ + code: ` + @vertex fn vs() -> @builtin(position) vec4f { + return vec4f(0); + } + @fragment fn fs() -> @location(0) vec4f { + return vec4f(0); + } + ` + }); + const pipeline = device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { module, targets: [{ format: 'rgba8unorm' }] } + }); + + const vertexBuffer = t.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.VERTEX + }); + + await t.testGPURenderAndBindingCommandsMixin( + encoderType, + ({ bindGroup, passEncoder }) => { + // Set the last vertex buffer and clear it. This should have no effect + // unless there is a bug in bookkeeping in the implementation. + passEncoder.setVertexBuffer(device.limits.maxVertexBuffers - 1, vertexBuffer); + passEncoder.setVertexBuffer(device.limits.maxVertexBuffers - 1, null); + + // Set the last bindGroup and clear it. This should have no effect + // unless there is a bug in bookkeeping in the implementation. + passEncoder.setBindGroup(device.limits.maxBindGroups - 1, bindGroup); + passEncoder.setBindGroup(device.limits.maxBindGroups - 1, null); + + if (numVertexBuffers) { + passEncoder.setVertexBuffer(numVertexBuffers - 1, vertexBuffer); + } + + if (numBindGroups) { + passEncoder.setBindGroup(numBindGroups - 1, bindGroup); + } + + passEncoder.setPipeline(pipeline); + + const indirectBuffer = t.createBufferTracked({ + size: 20, + usage: GPUBufferUsage.INDIRECT + }); + + const indexBuffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.INDEX + }); + + switch (drawType) { + case 'draw': + passEncoder.draw(0); + break; + case 'drawIndexed': + passEncoder.setIndexBuffer(indexBuffer, 'uint16'); + passEncoder.drawIndexed(0); + break; + case 'drawIndirect': + passEncoder.drawIndirect(indirectBuffer, 0); + break; + case 'drawIndexedIndirect': + passEncoder.setIndexBuffer(indexBuffer, 'uint16'); + passEncoder.drawIndexedIndirect(indirectBuffer, 0); + break; + } + }, + shouldError, + `testValue: ${testValue}, actualLimit: ${actualLimit}, shouldError: ${shouldError}` + ); + + vertexBuffer.destroy(); + }, + kExtraLimits + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBufferSize.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBufferSize.spec.js index ab2d5215d5d..8d611e34805 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBufferSize.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxBufferSize.spec.js @@ -11,14 +11,13 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, testValue, actualLimit, shouldError }) => { + async ({ testValue, actualLimit, shouldError }) => { await t.testForValidationErrorWithPossibleOutOfMemoryError( () => { - const buffer = device.createBuffer({ + t.createBufferTracked({ usage: GPUBufferUsage.VERTEX, size: testValue }); - buffer.destroy(); }, shouldError, `size: ${testValue}, limit: ${actualLimit}` diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.spec.js index 508b436deee..8c90ce0ac9f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.spec.js @@ -132,13 +132,11 @@ testValue) function createTextures(t, targets) { return targets.map(({ format }) => - t.trackForCleanup( - t.device.createTexture({ - size: [1, 1], - format, - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ) + t.createTextureTracked({ + size: [1, 1], + format, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }) ); } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachments.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachments.spec.js index 80fa8fdd7cf..d32ae9e836f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachments.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxColorAttachments.spec.js @@ -59,13 +59,11 @@ fn(async (t) => { const encoder = device.createCommandEncoder(); const textures = range(testValue, (_) => - t.trackForCleanup( - device.createTexture({ - size: [1, 1], - format: 'r8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ) + t.createTextureTracked({ + size: [1, 1], + format: 'r8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }) ); const pass = encoder.beginRenderPass({ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.js index 6c43c8da1cb..3b2e6686852 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.js @@ -39,7 +39,7 @@ fn(async (t) => { const counts = [1, 1, 1]; counts[axis] = testValue; - const buffer = device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.STORAGE }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxInterStageShaderComponents.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxInterStageShaderComponents.spec.js index 8da125b1dfa..7b994ab8a84 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxInterStageShaderComponents.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxInterStageShaderComponents.spec.js @@ -2,10 +2,6 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { range } from '../../../../../common/util/util.js';import { kMaximumLimitBaseParams, makeLimitTestGroup } from './limit_utils.js'; -function getTypeForNumComponents(numComponents) { - return numComponents > 1 ? `vec${numComponents}f` : 'f32'; -} - function getPipelineDescriptor( device, testValue, @@ -15,38 +11,40 @@ sampleIndex, sampleMaskIn, sampleMaskOut) { - const maxVertexShaderOutputComponents = testValue - (pointList ? 1 : 0); - const maxFragmentShaderInputComponents = - testValue - (frontFacing ? 1 : 0) - (sampleIndex ? 1 : 0) - (sampleMaskIn ? 1 : 0); + const success = testValue <= device.limits.maxInterStageShaderComponents; - const maxInterStageVariables = device.limits.maxInterStageShaderVariables; - const numComponents = Math.min(maxVertexShaderOutputComponents, maxFragmentShaderInputComponents); + const maxVertexOutputComponents = + device.limits.maxInterStageShaderComponents - (pointList ? 1 : 0); + const maxFragmentInputComponents = + device.limits.maxInterStageShaderComponents - ( + frontFacing ? 1 : 0) - ( + sampleIndex ? 1 : 0) - ( + sampleMaskIn ? 1 : 0); + const maxOutputComponents = Math.min(maxVertexOutputComponents, maxFragmentInputComponents); + const maxInterStageVariables = Math.floor(maxOutputComponents / 4); + const maxUserDefinedVertexComponents = Math.floor(maxVertexOutputComponents / 4) * 4; + const maxUserDefinedFragmentComponents = Math.floor(maxFragmentInputComponents / 4) * 4; - const num4ComponentVaryings = Math.floor(numComponents / 4); - const lastVaryingNumComponents = numComponents % 4; + const numInterStageVariables = success ? maxInterStageVariables : maxInterStageVariables + 1; + const numUserDefinedComponents = numInterStageVariables * 4; const varyings = ` - ${range(num4ComponentVaryings, (i) => `@location(${i}) v4_${i}: vec4f,`).join('\n')} - ${ - lastVaryingNumComponents > 0 ? - `@location(${num4ComponentVaryings}) vx: ${getTypeForNumComponents( - lastVaryingNumComponents - )},` : - `` - } + ${range(numInterStageVariables, (i) => `@location(${i}) v4_${i}: vec4f,`).join('\n')} `; const code = ` // test value : ${testValue} // maxInterStageShaderComponents : ${device.limits.maxInterStageShaderComponents} - // num components in vertex shader : ${numComponents}${pointList ? ' + point-list' : ''} - // num components in fragment shader : ${numComponents}${frontFacing ? ' + front-facing' : ''}${ - sampleIndex ? ' + sample_index' : '' - }${sampleMaskIn ? ' + sample_mask' : ''} - // maxVertexShaderOutputComponents : ${maxVertexShaderOutputComponents} - // maxFragmentShaderInputComponents : ${maxFragmentShaderInputComponents} + // num components in vertex shader : ${numUserDefinedComponents}${ + pointList ? ' + point-list' : '' + } + // num components in fragment shader : ${numUserDefinedComponents}${ + frontFacing ? ' + front-facing' : '' + }${sampleIndex ? ' + sample_index' : ''}${sampleMaskIn ? ' + sample_mask' : ''} + // maxUserDefinedVertexShaderOutputComponents : ${maxUserDefinedVertexComponents} + // maxUserDefinedFragmentShaderInputComponents : ${maxUserDefinedFragmentComponents} // maxInterStageVariables: : ${maxInterStageVariables} - // num used inter stage variables : ${Math.ceil(numComponents / 4)} + // num used inter stage variables : ${numInterStageVariables} struct VSOut { @builtin(position) p: vec4f, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.js index 93052a8d725..a86bcfbe639 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.js @@ -110,12 +110,10 @@ fn(async (t) => { } device.pushErrorScope('out-of-memory'); - const storageBuffer = t.trackForCleanup( - device.createBuffer({ - usage: GPUBufferUsage.STORAGE, - size - }) - ); + const storageBuffer = t.createBufferTracked({ + usage: GPUBufferUsage.STORAGE, + size + }); const outOfMemoryError = await device.popErrorScope(); if (!outOfMemoryError) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureArrayLayers.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureArrayLayers.spec.js index 7a9cc1e2308..a3aae929339 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureArrayLayers.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureArrayLayers.spec.js @@ -11,9 +11,9 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, testValue, shouldError }) => { + async ({ testValue, shouldError }) => { await t.testForValidationErrorWithPossibleOutOfMemoryError(() => { - const texture = device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, testValue], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension1D.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension1D.spec.js index 3d4608dde35..ba69cbbc852 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension1D.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension1D.spec.js @@ -11,9 +11,9 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, testValue, shouldError }) => { + async ({ testValue, shouldError }) => { await t.testForValidationErrorWithPossibleOutOfMemoryError(() => { - const texture = device.createTexture({ + const texture = t.createTextureTracked({ size: [testValue, 1, 1], format: 'rgba8unorm', dimension: '1d', diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension2D.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension2D.spec.js index 5f3b3a4def2..27ed1efc1a0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension2D.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension2D.spec.js @@ -14,14 +14,14 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, shouldError, testValue, actualLimit }) => { + async ({ shouldError, testValue, actualLimit }) => { for (let dimensionIndex = 0; dimensionIndex < 2; ++dimensionIndex) { const size = [1, 1, 1]; size[dimensionIndex] = testValue; await t.testForValidationErrorWithPossibleOutOfMemoryError( () => { - const texture = device.createTexture({ + const texture = t.createTextureTracked({ size, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension3D.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension3D.spec.js index 74108cc85ed..bf44a37221d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension3D.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxTextureDimension3D.spec.js @@ -11,13 +11,13 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, shouldError, testValue }) => { + async ({ shouldError, testValue }) => { for (let dimensionIndex = 0; dimensionIndex < 3; ++dimensionIndex) { const size = [2, 2, 2]; size[dimensionIndex] = testValue; await t.testForValidationErrorWithPossibleOutOfMemoryError(() => { - const texture = device.createTexture({ + const texture = t.createTextureTracked({ size, format: 'rgba8unorm', dimension: '3d', diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxUniformBufferBindingSize.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxUniformBufferBindingSize.spec.js index 40b22ed60bb..aa39c0a5291 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxUniformBufferBindingSize.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxUniformBufferBindingSize.spec.js @@ -47,12 +47,10 @@ fn(async (t) => { } device.pushErrorScope('out-of-memory'); - const uniformBuffer = t.trackForCleanup( - device.createBuffer({ - usage: GPUBufferUsage.UNIFORM, - size - }) - ); + const uniformBuffer = t.createBufferTracked({ + usage: GPUBufferUsage.UNIFORM, + size + }); const outOfMemoryError = await device.popErrorScope(); if (!outOfMemoryError) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxVertexBuffers.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxVertexBuffers.spec.js index 860c40687e8..1f9ffc43965 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxVertexBuffers.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/maxVertexBuffers.spec.js @@ -1,41 +1,23 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { range } from '../../../../../common/util/util.js';import { kRenderEncoderTypes, kMaximumLimitBaseParams, makeLimitTestGroup } from './limit_utils.js'; +**/import { kRenderEncoderTypes, kMaximumLimitBaseParams, makeLimitTestGroup } from './limit_utils.js';function getPipelineDescriptor(device, testValue) { + const module = device.createShaderModule({ + code: ` + @vertex fn vs(@location(0) p: vec4f) -> @builtin(position) vec4f { + return p; + }` + }); + const buffers = new Array(testValue); + buffers[testValue - 1] = { + arrayStride: 16, + attributes: [{ shaderLocation: 0, offset: 0, format: 'float32' }] + }; -const kPipelineTypes = ['withoutLocations', 'withLocations']; - - -function getPipelineDescriptor( -device, -pipelineType, -testValue) -{ - const code = - pipelineType === 'withLocations' ? - ` - struct VSInput { - ${range(testValue, (i) => `@location(${i}) p${i}: f32,`).join('\n')} - } - @vertex fn vs(v: VSInput) -> @builtin(position) vec4f { - let x = ${range(testValue, (i) => `v.p${i}`).join(' + ')}; - return vec4f(x, 0, 0, 1); - } - ` : - ` - @vertex fn vs() -> @builtin(position) vec4f { - return vec4f(0); - } - `; - const module = device.createShaderModule({ code }); return { layout: 'auto', vertex: { module, - entryPoint: 'vs', - buffers: range(testValue, (i) => ({ - arrayStride: 32, - attributes: [{ shaderLocation: i, offset: 0, format: 'float32' }] - })) + buffers } }; } @@ -45,18 +27,22 @@ export const { g, description } = makeLimitTestGroup(limit); g.test('createRenderPipeline,at_over'). desc(`Test using at and over ${limit} limit in createRenderPipeline(Async)`). -params( - kMaximumLimitBaseParams.combine('async', [false, true]).combine('pipelineType', kPipelineTypes) -). +params(kMaximumLimitBaseParams.combine('async', [false, true])). fn(async (t) => { - const { limitTest, testValueName, async, pipelineType } = t.params; + const { limitTest, testValueName, async } = t.params; await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, testValue, shouldError }) => { - const pipelineDescriptor = getPipelineDescriptor(device, pipelineType, testValue); + async ({ device, testValue, shouldError, actualLimit }) => { + const pipelineDescriptor = getPipelineDescriptor(device, testValue); + const lastIndex = testValue - 1; - await t.testCreateRenderPipeline(pipelineDescriptor, async, shouldError); + await t.testCreateRenderPipeline( + pipelineDescriptor, + async, + shouldError, + `lastIndex: ${lastIndex}, actualLimit: ${actualLimit}, shouldError: ${shouldError}` + ); } ); }); @@ -69,18 +55,18 @@ fn(async (t) => { await t.testDeviceWithRequestedMaximumLimits( limitTest, testValueName, - async ({ device, testValue, shouldError, actualLimit }) => { + async ({ testValue, shouldError, actualLimit }) => { const lastIndex = testValue - 1; - const buffer = device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.VERTEX }); - await t.testGPURenderCommandsMixin( + await t.testGPURenderAndBindingCommandsMixin( encoderType, - ({ mixin }) => { - mixin.setVertexBuffer(lastIndex, buffer); + ({ passEncoder }) => { + passEncoder.setVertexBuffer(lastIndex, buffer); }, shouldError, `lastIndex: ${lastIndex}, actualLimit: ${actualLimit}, shouldError: ${shouldError}` diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.spec.js index 5735818916e..7281f6dcbcf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.spec.js @@ -70,12 +70,10 @@ fn(async (t) => { requestedLimit, testValue, async ({ device, testValue, shouldError }) => { - const storageBuffer = t.trackForCleanup( - device.createBuffer({ - size: testValue * 2, - usage: GPUBufferUsage.STORAGE - }) - ); + const storageBuffer = t.createBufferTracked({ + size: testValue * 2, + usage: GPUBufferUsage.STORAGE + }); const layout = device.createBindGroupLayout({ entries: [ @@ -123,7 +121,7 @@ fn(async (t) => { requestedLimit, testValue, async ({ device, testValue, shouldError }) => { - const buffer = device.createBuffer({ + const buffer = t.createBufferTracked({ size: testValue * 2, usage: GPUBufferUsage.STORAGE }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.spec.js index 93d2b3eacf7..88181bdfbea 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.spec.js @@ -73,12 +73,10 @@ fn(async (t) => { requestedLimit, testValue, async ({ device, testValue, shouldError }) => { - const buffer = t.trackForCleanup( - device.createBuffer({ - size: testValue * 2, - usage: GPUBufferUsage.UNIFORM - }) - ); + const buffer = t.createBufferTracked({ + size: testValue * 2, + usage: GPUBufferUsage.UNIFORM + }); const layout = device.createBindGroupLayout({ entries: [ @@ -126,7 +124,7 @@ fn(async (t) => { requestedLimit, testValue, async ({ device, testValue, shouldError }) => { - const buffer = device.createBuffer({ + const buffer = t.createBufferTracked({ size: testValue * 2, usage: GPUBufferUsage.UNIFORM }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/compute_pipeline.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/compute_pipeline.spec.js index 3d2c5a7641b..a9ad3c44761 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/compute_pipeline.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/compute_pipeline.spec.js @@ -5,9 +5,16 @@ createComputePipeline and createComputePipelineAsync validation tests. Note: entry point matching tests are in shader_module/entry_point.spec.ts `;import { makeTestGroup } from '../../../common/framework/test_group.js'; +import { keysOf } from '../../../common/util/data_tables.js'; import { kValue } from '../../util/constants.js'; import { getShaderWithEntryPoint } from '../../util/shader.js'; +import { + kAPIResources, + getWGSLShaderForResource, + getAPIBindGroupLayoutForResource, + doResourcesMatch } from +'./utils.js'; import { ValidationTest } from './validation_test.js'; class F extends ValidationTest { @@ -689,4 +696,47 @@ fn((t) => { testFn(1, 1, true); testFn(maxVec4Count + 1, 0, false); testFn(0, maxMat4Count + 1, false); +}); + +g.test('resource_compatibility'). +desc( + 'Tests validation of resource (bind group) compatibility between pipeline layout and WGSL shader' +). +params((u) => +u // +.combine('apiResource', keysOf(kAPIResources)). +beginSubcases(). +combine('isAsync', [true, false]). +combine('wgslResource', keysOf(kAPIResources)) +). +fn((t) => { + const apiResource = kAPIResources[t.params.apiResource]; + const wgslResource = kAPIResources[t.params.wgslResource]; + t.skipIf( + wgslResource.storageTexture !== undefined && + wgslResource.storageTexture.access !== 'write-only' && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'Storage textures require language feature' + ); + + const layout = t.device.createPipelineLayout({ + bindGroupLayouts: [ + getAPIBindGroupLayoutForResource(t.device, GPUShaderStage.COMPUTE, apiResource)] + + }); + + const descriptor = { + layout, + compute: { + module: t.device.createShaderModule({ + code: getWGSLShaderForResource('compute', wgslResource) + }), + entryPoint: 'main' + } + }; + t.doCreateComputePipelineTest( + t.params.isAsync, + doResourcesMatch(apiResource, wgslResource), + descriptor + ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js index 283fe97fd24..33ac087f50e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js @@ -187,7 +187,7 @@ fn((t) => { usage: appliedUsage, sampleCount: info.resource === 'sampledTexMS' ? 4 : 1 }; - const resource = t.device.createTexture(descriptor).createView(); + const resource = t.createTextureTracked(descriptor).createView(); const shouldError = (usage & info.usage) === 0; t.expectValidationError(() => { @@ -241,7 +241,7 @@ fn((t) => { entries: [ { binding: 0, - resource: t.device.createTexture(goodDescriptor).createView() + resource: t.createTextureTracked(goodDescriptor).createView() }], layout: bindGroupLayout @@ -266,7 +266,7 @@ fn((t) => { t.expectValidationError(() => { t.device.createBindGroup({ - entries: [{ binding: 0, resource: t.device.createTexture(badDescriptor).createView() }], + entries: [{ binding: 0, resource: t.createTextureTracked(badDescriptor).createView() }], layout: bindGroupLayout }); }); @@ -322,7 +322,7 @@ fn((t) => { depthOrArrayLayers = 1; } - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height, depthOrArrayLayers }, format: 'rgba8unorm', usage, @@ -380,7 +380,7 @@ fn((t) => { }); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, @@ -438,7 +438,7 @@ fn((t) => { entries: [{ binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'storage' } }] }); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 1024, usage: GPUBufferUsage.STORAGE }); @@ -491,7 +491,7 @@ fn((t) => { }); - const storageBuffer = t.device.createBuffer({ + const storageBuffer = t.createBufferTracked({ size, usage: GPUBufferUsage.STORAGE }); @@ -742,7 +742,7 @@ fn((t) => { }); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage @@ -786,7 +786,7 @@ fn((t) => { }); const MIP_LEVEL_COUNT = 4; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.STORAGE_BINDING, @@ -832,7 +832,7 @@ fn((t) => { }); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16, depthOrArrayLayers: 1 }, format: resourceFormat, usage: GPUTextureUsage.STORAGE_BINDING @@ -885,7 +885,7 @@ fn((t) => { }); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 4, usage }); @@ -945,7 +945,7 @@ fn((t) => { const usage = type === 'uniform' ? GPUBufferUsage.UNIFORM : GPUBufferUsage.STORAGE; const isValid = offset % minAlignment === 0; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 1024, usage }); @@ -1004,7 +1004,7 @@ fn((t) => { const isValid = bindingSize <= maxBindingSize; // MAINTENANCE_TODO: Allocating the max size seems likely to fail. Refactor test. - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: maxBindingSize, usage }); @@ -1061,7 +1061,7 @@ fn((t) => { isValid = effectiveBindingSize % 4 === 0; } - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createTexture.spec.js index 9bfc8c17786..ac9785edb42 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createTexture.spec.js @@ -6,7 +6,7 @@ import { assert, makeValueTestVariant } from '../../../common/util/util.js'; import { kTextureDimensions, kTextureUsages } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { - kTextureFormats, + kAllTextureFormats, kTextureFormatInfo, kCompressedTextureFormats, kUncompressedTextureFormats, @@ -95,7 +95,7 @@ fn((t) => { const success = zeroArgument === 'none'; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -104,7 +104,9 @@ desc( `Test every dimension type on every format. Note that compressed formats and depth/stencil formats are not valid for 1D/3D dimension types.` ). params((u) => -u.combine('dimension', [undefined, ...kTextureDimensions]).combine('format', kTextureFormats) +u // +.combine('dimension', [undefined, ...kTextureDimensions]). +combine('format', kAllTextureFormats) ). beforeAllSubcases((t) => { const { format } = t.params; @@ -124,7 +126,7 @@ fn((t) => { }; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !textureDimensionAndFormatCompatible(dimension, format)); }); @@ -136,7 +138,7 @@ desc( params((u) => u. combine('dimension', [undefined, ...kTextureDimensions]). -combine('format', kTextureFormats). +combine('format', kAllTextureFormats). beginSubcases(). combine('mipLevelCount', [1, 2, 3, 6, 7]) // Filter out incompatible dimension type and format combinations. @@ -183,7 +185,7 @@ fn((t) => { const success = mipLevelCount <= maxMipLevelCount(descriptor); t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -241,11 +243,11 @@ fn((t) => { const mipLevelCount = maxMipLevelCount(descriptor); descriptor.mipLevelCount = mipLevelCount; - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); descriptor.mipLevelCount = mipLevelCount + 1; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }); }); @@ -260,7 +262,7 @@ fn((t) => { }; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }); }); @@ -271,7 +273,7 @@ desc( params((u) => u. combine('dimension', [undefined, '2d']). -combine('format', kTextureFormats). +combine('format', kAllTextureFormats). beginSubcases(). combine('sampleCount', [0, 1, 2, 4, 8, 16, 32, 256]) ). @@ -297,10 +299,10 @@ fn((t) => { usage }; - const success = sampleCount === 1 || sampleCount === 4 && info.multisample && info.renderable; + const success = sampleCount === 1 || sampleCount === 4 && info.multisample; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -318,7 +320,7 @@ desc( params((u) => u. combine('dimension', [undefined, ...kTextureDimensions]). -combine('format', kTextureFormats). +combine('format', kAllTextureFormats). beginSubcases(). combine('sampleCount', [1, 4]). combine('arrayLayerCount', [1, 2]). @@ -388,7 +390,7 @@ fn((t) => { (usage & GPUConst.TextureUsage.STORAGE_BINDING) === 0; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -407,7 +409,7 @@ fn((t) => { const { dimension, size, shouldError } = t.params; t.expectValidationError(() => { - t.device.createTexture({ + t.createTextureTracked({ size, dimension, sampleCount: 4, @@ -447,7 +449,7 @@ fn((t) => { usage: GPUTextureUsage.TEXTURE_BINDING }; - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }); g.test('texture_size,default_value_and_smallest_size,compressed_format'). @@ -489,7 +491,7 @@ fn((t) => { }; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !_success); }); @@ -529,7 +531,7 @@ fn((t) => { width <= t.device.limits.maxTextureDimension1D && height === 1 && depthOrArrayLayers === 1; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -584,7 +586,7 @@ fn((t) => { size[2] <= t.device.limits.maxTextureArrayLayers; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -773,7 +775,7 @@ fn((t) => { size[2] <= t.device.limits.maxTextureArrayLayers; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -827,7 +829,7 @@ fn((t) => { size[2] <= maxTextureDimension3D; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -1021,7 +1023,7 @@ fn((t) => { size[2] <= maxTextureDimension3D; t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -1032,7 +1034,7 @@ desc( params((u) => u. combine('dimension', [undefined, ...kTextureDimensions]). -combine('format', kTextureFormats). +combine('format', kAllTextureFormats). beginSubcases() // If usage0 and usage1 are the same, then the usage being test is a single usage. Otherwise, it is a combined usage. .combine('usage0', kTextureUsages). @@ -1064,19 +1066,16 @@ fn((t) => { // Note that we unconditionally test copy usages for all formats. We don't check copySrc/copyDst in kTextureFormatInfo in capability_info.js // if (!info.copySrc && (usage & GPUTextureUsage.COPY_SRC) !== 0) success = false; // if (!info.copyDst && (usage & GPUTextureUsage.COPY_DST) !== 0) success = false; - if ( - (usage & GPUTextureUsage.STORAGE_BINDING) !== 0 && - !isTextureFormatUsableAsStorageFormat(format, t.isCompatibility)) - - success = false; - if ( - (!info.renderable || appliedDimension !== '2d' && appliedDimension !== '3d') && - (usage & GPUTextureUsage.RENDER_ATTACHMENT) !== 0) - - success = false; + if (usage & GPUTextureUsage.STORAGE_BINDING) { + if (!isTextureFormatUsableAsStorageFormat(format, t.isCompatibility)) success = false; + } + if (usage & GPUTextureUsage.RENDER_ATTACHMENT) { + if (appliedDimension === '1d') success = false; + if (info.color && !info.colorRender) success = false; + } t.expectValidationError(() => { - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }, !success); }); @@ -1090,10 +1089,10 @@ combine('formatFeature', kFeaturesForFormats). combine('viewFormatFeature', kFeaturesForFormats). beginSubcases(). expand('format', ({ formatFeature }) => -filterFormatsByFeature(formatFeature, kTextureFormats) +filterFormatsByFeature(formatFeature, kAllTextureFormats) ). expand('viewFormat', ({ viewFormatFeature }) => -filterFormatsByFeature(viewFormatFeature, kTextureFormats) +filterFormatsByFeature(viewFormatFeature, kAllTextureFormats) ) ). beforeAllSubcases((t) => { @@ -1110,7 +1109,7 @@ fn((t) => { // Test the viewFormat in the list. t.expectValidationError(() => { - t.device.createTexture({ + t.createTextureTracked({ format, size: [blockWidth, blockHeight], usage: GPUTextureUsage.TEXTURE_BINDING, @@ -1120,7 +1119,7 @@ fn((t) => { // Test the viewFormat and the texture format in the list. t.expectValidationError(() => { - t.device.createTexture({ + t.createTextureTracked({ format, size: [blockWidth, blockHeight], usage: GPUTextureUsage.TEXTURE_BINDING, @@ -1130,7 +1129,7 @@ fn((t) => { // Test the viewFormat multiple times in the list. t.expectValidationError(() => { - t.device.createTexture({ + t.createTextureTracked({ format, size: [blockWidth, blockHeight], usage: GPUTextureUsage.TEXTURE_BINDING, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createView.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createView.spec.js index 0a2c8916dd9..9ba5d20d5f4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createView.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/createView.spec.js @@ -10,7 +10,7 @@ import { '../../capability_info.js'; import { kTextureFormatInfo, - kTextureFormats, + kAllTextureFormats, kFeaturesForFormats, filterFormatsByFeature, viewCompatible } from @@ -39,10 +39,10 @@ combine('textureFormatFeature', kFeaturesForFormats). combine('viewFormatFeature', kFeaturesForFormats). beginSubcases(). expand('textureFormat', ({ textureFormatFeature }) => -filterFormatsByFeature(textureFormatFeature, kTextureFormats) +filterFormatsByFeature(textureFormatFeature, kAllTextureFormats) ). expand('viewFormat', ({ viewFormatFeature }) => -filterFormatsByFeature(viewFormatFeature, [undefined, ...kTextureFormats]) +filterFormatsByFeature(viewFormatFeature, [undefined, ...kAllTextureFormats]) ). combine('useViewFormatList', [false, true]) ). @@ -59,7 +59,7 @@ fn((t) => { const compatible = viewFormat === undefined || viewCompatible(t.isCompatibility, textureFormat, viewFormat); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: textureFormat, size: [blockWidth, blockHeight], usage: GPUTextureUsage.TEXTURE_BINDING, @@ -104,7 +104,7 @@ fn((t) => { size, usage: GPUTextureUsage.TEXTURE_BINDING }; - const texture = t.device.createTexture(textureDescriptor); + const texture = t.createTextureTracked(textureDescriptor); const view = { dimension: viewDimension }; const reified = reifyTextureViewDescriptor(textureDescriptor, view); @@ -124,7 +124,7 @@ desc( ). params((u) => u // -.combine('format', kTextureFormats). +.combine('format', kAllTextureFormats). combine('aspect', kTextureAspects) ). beforeAllSubcases((t) => { @@ -135,7 +135,7 @@ fn((t) => { const { format, aspect } = t.params; const info = kTextureFormatInfo[format]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format, size: [info.blockWidth, info.blockHeight, 1], usage: GPUTextureUsage.TEXTURE_BINDING @@ -239,7 +239,7 @@ fn((t) => { const viewDescriptor = { dimension: viewDimension, baseArrayLayer, arrayLayerCount }; const success = validateCreateViewLayersLevels(textureDescriptor, viewDescriptor); - const texture = t.device.createTexture(textureDescriptor); + const texture = t.createTextureTracked(textureDescriptor); t.expectValidationError(() => { texture.createView(viewDescriptor); }, !success); @@ -288,7 +288,7 @@ fn((t) => { const viewDescriptor = { dimension: viewDimension, baseMipLevel, mipLevelCount }; const success = validateCreateViewLayersLevels(textureDescriptor, viewDescriptor); - const texture = t.device.createTexture(textureDescriptor); + const texture = t.createTextureTracked(textureDescriptor); t.debug(`${mipLevelCount} ${success}`); t.expectValidationError(() => { texture.createView(viewDescriptor); @@ -316,7 +316,7 @@ fn((t) => { t.skipIfTextureViewDimensionNotSupported(dimension); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'rgba8unorm', size, usage: GPUTextureUsage.TEXTURE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/debugMarker.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/debugMarker.spec.js index c042630d6bf..23cab3ed06f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/debugMarker.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/debugMarker.spec.js @@ -8,12 +8,11 @@ import { ValidationTest } from './validation_test.js'; class F extends ValidationTest { beginRenderPass(commandEncoder) { - const attachmentTexture = this.device.createTexture({ + const attachmentTexture = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 16, height: 16, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT }); - this.trackForCleanup(attachmentTexture); return commandEncoder.beginRenderPass({ colorAttachments: [ { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginComputePass.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginComputePass.spec.js index 6ba98492918..bc3123b01f5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginComputePass.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginComputePass.spec.js @@ -40,7 +40,7 @@ fn((t) => { const isValid = queryType === 'timestamp'; const timestampWrites = { - querySet: t.device.createQuerySet({ type: queryType, count: 2 }), + querySet: t.createQuerySetTracked({ type: queryType, count: 2 }), beginningOfPassWriteIndex: 0, endOfPassWriteIndex: 1 }; @@ -97,7 +97,7 @@ fn((t) => { const querySetCount = 2; const timestampWrites = { - querySet: t.device.createQuerySet({ type: 'timestamp', count: querySetCount }), + querySet: t.createQuerySetTracked({ type: 'timestamp', count: querySetCount }), beginningOfPassWriteIndex, endOfPassWriteIndex }; @@ -129,10 +129,12 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const timestampQuerySet = sourceDevice.createQuerySet({ - type: 'timestamp', - count: 1 - }); + const timestampQuerySet = t.trackForCleanup( + sourceDevice.createQuerySet({ + type: 'timestamp', + count: 1 + }) + ); const timestampWrites = { querySet: timestampQuerySet, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginRenderPass.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginRenderPass.spec.js index 8003268d991..a4b4dbc56d5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginRenderPass.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/beginRenderPass.spec.js @@ -125,7 +125,7 @@ fn((t) => { const depthStencilTexture = mismatched ? t.getDeviceMismatchedTexture(descriptor) : - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); const encoder = t.createEncoder('non-pass'); const pass = encoder.encoder.beginRenderPass({ @@ -157,11 +157,12 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const occlusionQuerySet = sourceDevice.createQuerySet({ - type: 'occlusion', - count: 1 - }); - t.trackForCleanup(occlusionQuerySet); + const occlusionQuerySet = t.trackForCleanup( + sourceDevice.createQuerySet({ + type: 'occlusion', + count: 1 + }) + ); const encoder = t.createEncoder('render pass', { occlusionQuerySet }); encoder.validateFinish(!mismatched); @@ -182,17 +183,19 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const timestampQuerySet = sourceDevice.createQuerySet({ - type: 'timestamp', - count: 1 - }); + const timestampQuerySet = t.trackForCleanup( + sourceDevice.createQuerySet({ + type: 'timestamp', + count: 1 + }) + ); const timestampWrites = { querySet: timestampQuerySet, beginningOfPassWriteIndex: 0 }; - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'rgba8unorm', size: { width: 4, height: 4, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/clearBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/clearBuffer.spec.js index 839a82741bf..09c32b11ec7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/clearBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/clearBuffer.spec.js @@ -65,11 +65,12 @@ fn((t) => { const sourceDevice = mismatched ? t.mismatchedDevice : t.device; const size = 8; - const buffer = sourceDevice.createBuffer({ - size, - usage: GPUBufferUsage.COPY_DST - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size, + usage: GPUBufferUsage.COPY_DST + }) + ); t.TestClearBuffer({ buffer, @@ -89,7 +90,7 @@ paramsSubcasesOnly([ fn((t) => { const { offset, size } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -111,7 +112,7 @@ u // fn((t) => { const { usage } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage }); @@ -146,7 +147,7 @@ paramsSubcasesOnly([ fn((t) => { const { size, _isSuccess: isSuccess } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -180,7 +181,7 @@ paramsSubcasesOnly([ fn((t) => { const { offset, _isSuccess: isSuccess } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -204,7 +205,7 @@ paramsSubcasesOnly([ fn((t) => { const { offset, size } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -232,7 +233,7 @@ paramsSubcasesOnly([ fn((t) => { const { offset, size, _isSuccess = false } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 32, usage: GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/compute_pass.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/compute_pass.spec.js index d810e8757a8..4616892ea50 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/compute_pass.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/compute_pass.spec.js @@ -31,7 +31,7 @@ class F extends ValidationTest { } this.device.pushErrorScope('validation'); - const buffer = this.device.createBuffer(descriptor); + const buffer = this.createBufferTracked(descriptor); void this.device.popErrorScope(); if (state === 'valid') { @@ -203,11 +203,12 @@ fn((t) => { const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const buffer = sourceDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.INDIRECT - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.INDIRECT + }) + ); const { encoder, validateFinish } = t.createEncoder('compute pass'); encoder.setPipeline(pipeline); @@ -243,11 +244,10 @@ fn((t) => { const layout = t.device.createPipelineLayout({ bindGroupLayouts: [] }); const pipeline = t.createNoOpComputePipeline(layout); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: bufferUsage }); - t.trackForCleanup(buffer); const success = (GPUBufferUsage.INDIRECT & bufferUsage) !== 0; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyBufferToBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyBufferToBuffer.spec.js index a7aa2b5b791..699fa6163c3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyBufferToBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyBufferToBuffer.spec.js @@ -109,18 +109,20 @@ fn((t) => { const { srcMismatched, dstMismatched } = t.params; const srcBufferDevice = srcMismatched ? t.mismatchedDevice : t.device; - const srcBuffer = srcBufferDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.COPY_SRC - }); - t.trackForCleanup(srcBuffer); + const srcBuffer = t.trackForCleanup( + srcBufferDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.COPY_SRC + }) + ); const dstBufferDevice = dstMismatched ? t.mismatchedDevice : t.device; - const dstBuffer = dstBufferDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.COPY_DST - }); - t.trackForCleanup(dstBuffer); + const dstBuffer = t.trackForCleanup( + dstBufferDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.COPY_DST + }) + ); t.TestCopyBufferToBuffer({ srcBuffer, @@ -141,11 +143,11 @@ combine('dstUsage', kBufferUsages) fn((t) => { const { srcUsage, dstUsage } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 16, usage: srcUsage }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 16, usage: dstUsage }); @@ -174,11 +176,11 @@ paramsSubcasesOnly([ fn((t) => { const { copySize, _isSuccess: isSuccess } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_SRC }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -209,11 +211,11 @@ paramsSubcasesOnly([ fn((t) => { const { srcOffset, dstOffset, _isSuccess: isSuccess } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_SRC }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -246,11 +248,11 @@ paramsSubcasesOnly([ fn((t) => { const { srcOffset, dstOffset, copySize } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_SRC }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST }); @@ -281,11 +283,11 @@ paramsSubcasesOnly([ fn((t) => { const { srcOffset, dstOffset, copySize, _isSuccess = false } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 32, usage: GPUBufferUsage.COPY_SRC }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 32, usage: GPUBufferUsage.COPY_DST }); @@ -310,7 +312,7 @@ paramsSubcasesOnly([ fn((t) => { const { srcOffset, dstOffset, copySize } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyTextureToTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyTextureToTexture.spec.js index 00bf4e83d81..844d81d28d0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyTextureToTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/copyTextureToTexture.spec.js @@ -6,7 +6,7 @@ copyTextureToTexture tests. import { kTextureUsages, kTextureDimensions } from '../../../../capability_info.js'; import { kTextureFormatInfo, - kTextureFormats, + kAllTextureFormats, kCompressedTextureFormats, kDepthStencilFormats, kFeaturesForFormats, @@ -128,20 +128,22 @@ fn((t) => { const format = 'rgba8unorm'; const srcTextureDevice = srcMismatched ? t.mismatchedDevice : t.device; - const srcTexture = srcTextureDevice.createTexture({ - size, - format, - usage: GPUTextureUsage.COPY_SRC - }); - t.trackForCleanup(srcTexture); + const srcTexture = t.trackForCleanup( + srcTextureDevice.createTexture({ + size, + format, + usage: GPUTextureUsage.COPY_SRC + }) + ); const dstTextureDevice = dstMismatched ? t.mismatchedDevice : t.device; - const dstTexture = dstTextureDevice.createTexture({ - size, - format, - usage: GPUTextureUsage.COPY_DST - }); - t.trackForCleanup(dstTexture); + const dstTexture = t.trackForCleanup( + dstTextureDevice.createTexture({ + size, + format, + usage: GPUTextureUsage.COPY_DST + }) + ); t.TestCopyTextureToTexture( { texture: srcTexture }, @@ -180,14 +182,14 @@ unless((p) => p.dimension === '1d' && (p.srcLevelCount !== 1 || p.dstLevelCount fn((t) => { const { srcLevelCount, dstLevelCount, srcCopyLevel, dstCopyLevel, dimension } = t.params; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: { width: 32, height: 1, depthOrArrayLayers: 1 }, dimension, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC, mipLevelCount: srcLevelCount }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 32, height: 1, depthOrArrayLayers: 1 }, dimension, format: 'rgba8unorm', @@ -220,12 +222,12 @@ combine('dstUsage', kTextureUsages) fn((t) => { const { srcUsage, dstUsage } = t.params; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: srcUsage }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: dstUsage @@ -255,16 +257,22 @@ u // .combine('srcSampleCount', [1, 4]). combine('dstSampleCount', [1, 4]) ). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && (t.params.srcSampleCount !== 1 || t.params.dstSampleCount !== 1), + 'multisample textures are not copyable in compatibility mode' + ); +}). fn((t) => { const { srcSampleCount, dstSampleCount } = t.params; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: srcSampleCount }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, @@ -307,6 +315,9 @@ combine('dstCopyOrigin', [ expand('copyWidth', (p) => [32 - Math.max(p.srcCopyOrigin.x, p.dstCopyOrigin.x), 16]). expand('copyHeight', (p) => [16 - Math.max(p.srcCopyOrigin.y, p.dstCopyOrigin.y), 8]) ). +beforeAllSubcases((t) => { + t.skipIf(t.isCompatibility, 'multisample textures are not copyable in compatibility mode'); +}). fn((t) => { const { srcCopyOrigin, dstCopyOrigin, copyWidth, copyHeight } = t.params; @@ -315,13 +326,13 @@ fn((t) => { // Currently we don't support multisampled 2D array textures and the mipmap level count of the // multisampled textures must be 1. - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, sampleCount: 4 }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, @@ -351,10 +362,10 @@ combine('srcFormatFeature', kFeaturesForFormats). combine('dstFormatFeature', kFeaturesForFormats). beginSubcases(). expand('srcFormat', ({ srcFormatFeature }) => -filterFormatsByFeature(srcFormatFeature, kTextureFormats) +filterFormatsByFeature(srcFormatFeature, kAllTextureFormats) ). expand('dstFormat', ({ dstFormatFeature }) => -filterFormatsByFeature(dstFormatFeature, kTextureFormats) +filterFormatsByFeature(dstFormatFeature, kAllTextureFormats) ) ). beforeAllSubcases((t) => { @@ -376,13 +387,13 @@ fn((t) => { depthOrArrayLayers: 1 }; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: textureSize, format: srcFormat, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: textureSize, format: dstFormat, usage: GPUTextureUsage.COPY_DST @@ -446,13 +457,13 @@ fn((t) => { t.params; const kMipLevelCount = 3; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: { width: srcTextureSize.width, height: srcTextureSize.height, depthOrArrayLayers: 1 }, format, mipLevelCount: kMipLevelCount, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: dstTextureSize.width, height: dstTextureSize.height, depthOrArrayLayers: 1 }, format, mipLevelCount: kMipLevelCount, @@ -543,14 +554,14 @@ fn((t) => { } const kFormat = 'rgba8unorm'; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: textureSize, format: kFormat, dimension, mipLevelCount, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: textureSize, format: kFormat, dimension, @@ -660,7 +671,7 @@ fn((t) => { const kArrayLayerCount = 7; - const testTexture = t.device.createTexture({ + const testTexture = t.createTextureTracked({ size: { width: 16, height: 16, depthOrArrayLayers: kArrayLayerCount }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -702,12 +713,12 @@ fn((t) => { const kTextureSize = { width: 16, height: 8, depthOrArrayLayers: 1 }; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: kTextureSize, format, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: kTextureSize, format, usage: GPUTextureUsage.COPY_DST @@ -788,14 +799,14 @@ fn((t) => { }; const kMipLevelCount = 4; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: kTextureSize, format, dimension, mipLevelCount: kMipLevelCount, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: kTextureSize, format, dimension, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/index_access.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/index_access.spec.js index 744c7e20de8..efa6da6a249 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/index_access.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/index_access.spec.js @@ -40,7 +40,7 @@ class F extends ValidationTest { } beginRenderPass(encoder) { - const colorAttachment = this.device.createTexture({ + const colorAttachment = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/draw.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/draw.spec.js index 823a327118f..3de590f6938 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/draw.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/draw.spec.js @@ -772,7 +772,7 @@ fn((t) => { const { bundleFirstHalf, bundleSecondHalf, maxDrawCount, drawCount } = t.params; const colorFormat = 'rgba8unorm'; - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: colorFormat, mipLevelCount: 1, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/dynamic_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/dynamic_state.spec.js index 048f33029aa..ec000e480d7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/dynamic_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/dynamic_state.spec.js @@ -47,7 +47,7 @@ class F extends ValidationTest { v, attachmentSize = { width: 1, height: 1, depthOrArrayLayers: 1 }) { - const attachment = this.device.createTexture({ + const attachment = this.createTextureTracked({ format: 'rgba8unorm', size: attachmentSize, usage: GPUTextureUsage.RENDER_ATTACHMENT @@ -76,7 +76,7 @@ class F extends ValidationTest { s, attachmentSize = { width: 1, height: 1, depthOrArrayLayers: 1 }) { - const attachment = this.device.createTexture({ + const attachment = this.createTextureTracked({ format: 'rgba8unorm', size: attachmentSize, usage: GPUTextureUsage.RENDER_ATTACHMENT @@ -107,7 +107,7 @@ class F extends ValidationTest { } createDummyRenderPassEncoder() { - const attachment = this.device.createTexture({ + const attachment = this.createTextureTracked({ format: 'rgba8unorm', size: [1, 1, 1], usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/indirect_draw.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/indirect_draw.spec.js index 476f2ba73ac..4aa743bfbbc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/indirect_draw.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/indirect_draw.spec.js @@ -13,7 +13,7 @@ const kIndirectDrawTestParams = kRenderEncodeTypeParams.combine('indexed', [true class F extends ValidationTest { makeIndexBuffer() { - return this.device.createBuffer({ + return this.createBufferTracked({ size: 16, usage: GPUBufferUsage.INDEX }); @@ -63,11 +63,12 @@ fn((t) => { const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const indirectBuffer = sourceDevice.createBuffer({ - size: 256, - usage: GPUBufferUsage.INDIRECT - }); - t.trackForCleanup(indirectBuffer); + const indirectBuffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 256, + usage: GPUBufferUsage.INDIRECT + }) + ); const { encoder, validateFinish } = t.createEncoder(encoderType); encoder.setPipeline(t.createNoOpRenderPipeline()); @@ -96,7 +97,7 @@ paramsSubcasesOnly( ). fn((t) => { const { encoderType, indexed, usage } = t.params; - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: 256, usage }); @@ -123,7 +124,7 @@ paramsSubcasesOnly(kIndirectDrawTestParams.combine('indirectOffset', [0, 2, 4])) fn((t) => { const { encoderType, indexed, indirectOffset } = t.params; const pipeline = t.createNoOpRenderPipeline(); - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: 256, usage: GPUBufferUsage.INDIRECT }); @@ -183,7 +184,7 @@ paramsSubcasesOnly( fn((t) => { const { encoderType, indexed, indirectOffset, bufferSize, _valid } = t.params; const pipeline = t.createNoOpRenderPipeline(); - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.INDIRECT }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setIndexBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setIndexBuffer.spec.js index 03eea8fce80..2aa0313d44d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setIndexBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setIndexBuffer.spec.js @@ -40,11 +40,12 @@ fn((t) => { const { encoderType, mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const indexBuffer = sourceDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.INDEX - }); - t.trackForCleanup(indexBuffer); + const indexBuffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.INDEX + }) + ); const { encoder, validateFinish } = t.createEncoder(encoderType); encoder.setIndexBuffer(indexBuffer, 'uint32'); @@ -66,7 +67,7 @@ paramsSubcasesOnly( ). fn((t) => { const { encoderType, usage } = t.params; - const indexBuffer = t.device.createBuffer({ + const indexBuffer = t.createBufferTracked({ size: 16, usage }); @@ -91,7 +92,7 @@ paramsSubcasesOnly( ). fn((t) => { const { encoderType, indexFormat, offset } = t.params; - const indexBuffer = t.device.createBuffer({ + const indexBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.INDEX }); @@ -113,7 +114,7 @@ Tests offset and size cannot be larger than index buffer size. paramsSubcasesOnly(buildBufferOffsetAndSizeOOBTestParams(4, 256)). fn((t) => { const { encoderType, offset, size, _valid } = t.params; - const indexBuffer = t.device.createBuffer({ + const indexBuffer = t.createBufferTracked({ size: 256, usage: GPUBufferUsage.INDEX }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setVertexBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setVertexBuffer.spec.js index b5cc30706b7..ee895eab70a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setVertexBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/setVertexBuffer.spec.js @@ -69,11 +69,12 @@ fn((t) => { const { encoderType, mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const vertexBuffer = sourceDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.VERTEX - }); - t.trackForCleanup(vertexBuffer); + const vertexBuffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.VERTEX + }) + ); const { encoder, validateFinish } = t.createEncoder(encoderType); encoder.setVertexBuffer(0, vertexBuffer); @@ -95,7 +96,7 @@ paramsSubcasesOnly( ). fn((t) => { const { encoderType, usage } = t.params; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ size: 16, usage }); @@ -114,7 +115,7 @@ Tests offset must be a multiple of 4. paramsSubcasesOnly(kRenderEncodeTypeParams.combine('offset', [0, 2, 4])). fn((t) => { const { encoderType, offset } = t.params; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.VERTEX }); @@ -133,7 +134,7 @@ Tests offset and size cannot be larger than vertex buffer size. paramsSubcasesOnly(buildBufferOffsetAndSizeOOBTestParams(4, 256)). fn((t) => { const { encoderType, offset, size, _valid } = t.params; - const vertexBuffer = t.device.createBuffer({ + const vertexBuffer = t.createBufferTracked({ size: 256, usage: GPUBufferUsage.VERTEX }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/state_tracking.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/state_tracking.spec.js index 8d1e0184e7b..585fbed539b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/state_tracking.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/render/state_tracking.spec.js @@ -8,7 +8,7 @@ import { ValidationTest } from '../../../validation_test.js'; class F extends ValidationTest { getVertexBuffer() { - return this.device.createBuffer({ + return this.createBufferTracked({ size: 256, usage: GPUBufferUsage.VERTEX }); @@ -55,7 +55,7 @@ class F extends ValidationTest { } beginRenderPass(commandEncoder) { - const attachmentTexture = this.device.createTexture({ + const attachmentTexture = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 16, height: 16, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/setBindGroup.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/setBindGroup.spec.js index bbf30240d12..99c009d9162 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/setBindGroup.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/cmds/setBindGroup.spec.js @@ -150,10 +150,12 @@ fn((t) => { const { encoderType, useU32Array, mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const buffer = sourceDevice.createBuffer({ - size: 4, - usage: GPUBufferUsage.STORAGE - }); + const buffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 4, + usage: GPUBufferUsage.STORAGE + }) + ); const layout = sourceDevice.createBindGroupLayout({ entries: [ @@ -247,12 +249,12 @@ fn((t) => { }); - const uniformBuffer = t.device.createBuffer({ + const uniformBuffer = t.createBufferTracked({ size: 2 * kMinDynamicBufferOffsetAlignment + 8, usage: GPUBufferUsage.UNIFORM }); - const storageBuffer = t.device.createBuffer({ + const storageBuffer = t.createBufferTracked({ size: 2 * kMinDynamicBufferOffsetAlignment + 8, usage: GPUBufferUsage.STORAGE }); @@ -419,7 +421,7 @@ fn((t) => { const usage = type === 'uniform' ? GPUBufferUsage.UNIFORM : GPUBufferUsage.STORAGE; const isValid = dynamicOffset % minAlignment === 0; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 3 * kMinDynamicBufferOffsetAlignment, usage }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js index b635fe1594d..23e8bb03456 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js @@ -169,29 +169,29 @@ beforeAllSubcases((t) => { fn((t) => { const { command, finishBeforeCommand } = t.params; - const srcBuffer = t.device.createBuffer({ + const srcBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_SRC | GPUTextureUsage.COPY_DST }); - const dstBuffer = t.device.createBuffer({ + const dstBuffer = t.createBufferTracked({ size: 16, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.QUERY_RESOLVE }); const textureSize = { width: 1, height: 1 }; const textureFormat = 'rgba8unorm'; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: textureSize, format: textureFormat, usage: GPUTextureUsage.COPY_SRC }); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: textureSize, format: textureFormat, usage: GPUTextureUsage.COPY_DST }); - const querySet = t.device.createQuerySet({ + const querySet = t.createQuerySetTracked({ type: command === 'writeTimestamp' ? 'timestamp' : 'occlusion', count: 1 }); @@ -301,11 +301,11 @@ combine('finishBeforeCommand', [false, true]) fn((t) => { const { command, finishBeforeCommand } = t.params; - const querySet = t.device.createQuerySet({ type: 'occlusion', count: 1 }); + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: 1 }); const encoder = t.device.createCommandEncoder(); const renderPass = beginRenderPassWithQuerySet(t, encoder, querySet); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 12, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX }); @@ -436,7 +436,7 @@ combine('finishBeforeCommand', [false, true]) fn((t) => { const { command, finishBeforeCommand } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 12, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX }); @@ -537,7 +537,7 @@ fn((t) => { const encoder = t.device.createCommandEncoder(); const computePass = encoder.beginComputePass(); - const indirectBuffer = t.device.createBuffer({ + const indirectBuffer = t.createBufferTracked({ size: 12, usage: GPUBufferUsage.INDIRECT }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_state.spec.js index eec8feb8f3b..778320403a3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/encoder_state.spec.js @@ -35,12 +35,11 @@ class F extends ValidationTest { } createAttachmentTextureView() { - const texture = this.device.createTexture({ + const texture = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 1, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT }); - this.trackForCleanup(texture); return texture.createView(); } } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js index b468feda508..18eec164ad8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js @@ -32,6 +32,23 @@ const kComputeCmds = ['dispatch', 'dispatchIndirect']; const kRenderCmds = ['draw', 'drawIndexed', 'drawIndirect', 'drawIndexedIndirect']; +const kPipelineTypes = ['auto0', 'explicit']; + +const kBindingTypes = ['auto0', 'auto1', 'explicit']; + + +const kEmptyBindGroup0Ndx = 0; +const kEmptyBindGroup1Ndx = 1; +const kNonEmptyBindGroup0Ndx = 2; +const kNonEmptyBindGroup1Ndx = 3; + +// Swaps 2 array elements in place. +function swapArrayElements(array, ndx1, ndx2) { + const t = array[ndx1]; + array[ndx1] = array[ndx2]; + array[ndx2] = t; +} + // Test resource type compatibility in pipeline and bind group // [1]: Need to add externalTexture const kResourceTypes = [ @@ -56,14 +73,14 @@ combine('callWithZero', [true, false]); class F extends ValidationTest { getIndexBuffer() { - return this.device.createBuffer({ + return this.createBufferTracked({ size: 8 * Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.INDEX }); } getIndirectBuffer(indirectParams) { - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ mappedAtCreation: true, size: indirectParams.length * Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST @@ -277,6 +294,134 @@ class F extends ValidationTest { validateFinish(success); } + + runDefaultLayoutBindingTest({ + visibility, + empty, + pipelineType, + bindingType, + swap, + success, + makePipelinesFn, + doCommandFn + + + + + + + + + + + + + + + + }) { + const { device } = this; + const explicitEmptyBindGroupLayout = device.createBindGroupLayout({ + entries: [] + }); + const explicitBindGroupLayout = device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility, + buffer: {} + }] + + }); + const explicitPipelineLayout = device.createPipelineLayout({ + bindGroupLayouts: [ + explicitEmptyBindGroupLayout, + explicitEmptyBindGroupLayout, + explicitBindGroupLayout, + explicitBindGroupLayout] + + }); + + const [pipelineAuto0, pipelineAuto1, pipelineExplicit] = makePipelinesFn( + this, + explicitPipelineLayout + ); + + const buffer = this.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.UNIFORM + }); + + let emptyBindGroupLayouts; + let nonEmptyBindGroupLayouts; + const pipeline = pipelineType === 'auto0' ? pipelineAuto0 : pipelineExplicit; + + // Gets a bindGroupLayout either from the explicit layout passed in + // or one of the 2 `layout: 'auto'` pipelines. + const getBindGroupLayout = ( + explicitBindGroupLayout, + bindGroupIndex) => + + bindingType === 'explicit' ? + explicitBindGroupLayout : + bindingType === 'auto0' ? + pipelineAuto0.getBindGroupLayout(bindGroupIndex) : + pipelineAuto1.getBindGroupLayout(bindGroupIndex); + + if (empty) { + // Testing empty: + // - emptyBindGroupLayout comes from a possibly incompatible place. + // - nonEmptyBindGroupLayout comes from the pipeline we'll render/compute with. + emptyBindGroupLayouts = [ + getBindGroupLayout(explicitEmptyBindGroupLayout, kEmptyBindGroup0Ndx), + getBindGroupLayout(explicitEmptyBindGroupLayout, kEmptyBindGroup1Ndx)]; + + if (swap) { + swapArrayElements(emptyBindGroupLayouts, 0, 1); + } + nonEmptyBindGroupLayouts = [ + pipeline.getBindGroupLayout(kNonEmptyBindGroup0Ndx), + pipeline.getBindGroupLayout(kNonEmptyBindGroup1Ndx)]; + + } else { + // Testing non-empty: + // - nonEmptyBindGroupLayout comes from a possibly incompatible place. + // - emptyBindGroupLayout comes from the pipeline we'll render/compute with. + nonEmptyBindGroupLayouts = [ + getBindGroupLayout(explicitBindGroupLayout, kNonEmptyBindGroup0Ndx), + getBindGroupLayout(explicitBindGroupLayout, kNonEmptyBindGroup1Ndx)]; + + if (swap) { + swapArrayElements(nonEmptyBindGroupLayouts, 0, 1); + } + emptyBindGroupLayouts = [ + pipeline.getBindGroupLayout(kEmptyBindGroup0Ndx), + pipeline.getBindGroupLayout(kEmptyBindGroup1Ndx)]; + + } + + const emptyBindGroups = emptyBindGroupLayouts.map((layout) => + device.createBindGroup({ + layout, + entries: [] + }) + ); + + const nonEmptyBindGroups = nonEmptyBindGroupLayouts.map((layout) => + device.createBindGroup({ + layout, + entries: [{ binding: 0, resource: { buffer } }] + }) + ); + + const encoder = device.createCommandEncoder(); + + doCommandFn({ t: this, encoder, pipeline, emptyBindGroups, nonEmptyBindGroups }); + + this.expectValidationError(() => { + encoder.finish(); + }, !success); + } } export const g = makeTestGroup(F); @@ -763,7 +908,7 @@ fn((t) => { const encoder = t.device.createCommandEncoder(); - const attachmentTexture = t.device.createTexture({ + const attachmentTexture = t.createTextureTracked({ format: 'rgba8unorm', size: { width: 16, height: 16, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT @@ -792,4 +937,174 @@ fn((t) => { t.expectValidationError(() => { encoder.finish(); }, !success); +}); + +// pipelineType specifies which pipeline to try to render/compute with +// auto0 = the first `layout: 'auto'` pipeline +// explicit = a pipeline crated with an explicit pipeline layout using explicit bind group layouts +// +// bindingType specifies where to get bindGroupLayouts to use to create bindGroups +// auto0 = the first `layout: 'auto'` pipeline +// auto1 = the second `layout: 'auto'` pipeline +// explicit = a pipeline crated with an explicit pipeline layout using explicit bind group layouts +// +// swap specifies to swap the bindgroups we're testing. We test 2 of each type, 2 empty bindgroups and +// 2 non-empty bindgroups. The 2 empty bindgroups, when swapped should still be compatible. Similarly +// the 2 non-empty bindgroups, when swapped, should still be compatible. +const kPipelineTypesAndBindingTypeParams = [ +{ pipelineType: 'auto0', bindingType: 'auto0', swap: false, _success: true }, +{ pipelineType: 'explicit', bindingType: 'explicit', swap: false, _success: true }, +{ pipelineType: 'explicit', bindingType: 'auto0', swap: false, _success: false }, +{ pipelineType: 'auto0', bindingType: 'explicit', swap: false, _success: false }, +{ pipelineType: 'auto0', bindingType: 'auto1', swap: false, _success: false }, +{ pipelineType: 'auto0', bindingType: 'auto0', swap: true, _success: true }]; + + +g.test('default_bind_group_layouts_never_match,compute_pass'). +desc( + ` + Test that bind groups created with default bind group layouts never match other layouts, including empty bind groups. + + * Test that a pipeline with an explicit layout can not be used with a bindGroup from an auto layout + * Test that a pipeline with an auto layout can not be used with a bindGroup from an explicit layout + * Test that an auto layout from one pipeline can not be used with an auto layout from a different pipeline. + * Test matching bindgroup layouts on the same default layout pipeline are compatible. In other words if + you only define group(2) then group(0)'s empty layout and group(1)'s empty layout should be compatible. + Similarly if group(2) and group(3) have the same types of resources they should be compatible. + ` +). +params((u) => +u. +combineWithParams(kPipelineTypesAndBindingTypeParams). +combine('empty', [false, true]). +combine('computeCommand', ['dispatchIndirect', 'dispatch']) +). +fn((t) => { + const { pipelineType, bindingType, swap, _success: success, computeCommand, empty } = t.params; + + t.runDefaultLayoutBindingTest({ + visibility: GPUShaderStage.COMPUTE, + empty, + pipelineType, + bindingType, + swap, + success, + makePipelinesFn: (t, explicitPipelineLayout) => { + return ['auto', 'auto', explicitPipelineLayout].map((layout) => + t.device.createComputePipeline({ + layout, + compute: { + module: t.device.createShaderModule({ + code: ` + @group(2) @binding(0) var u1: vec4f; + @group(3) @binding(0) var u2: vec4f; + @compute @workgroup_size(2) fn main() { _ = u1; _ = u2; } + ` + }), + entryPoint: 'main' + } + }) + ); + }, + doCommandFn: ({ t, encoder, pipeline, emptyBindGroups, nonEmptyBindGroups }) => { + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(kEmptyBindGroup0Ndx, emptyBindGroups[0]); + pass.setBindGroup(kEmptyBindGroup1Ndx, emptyBindGroups[1]); + pass.setBindGroup(kNonEmptyBindGroup0Ndx, nonEmptyBindGroups[0]); + pass.setBindGroup(kNonEmptyBindGroup1Ndx, nonEmptyBindGroups[1]); + t.doCompute(pass, computeCommand, true); + pass.end(); + } + }); +}); + +g.test('default_bind_group_layouts_never_match,render_pass'). +desc( + ` + Test that bind groups created with default bind group layouts never match other layouts, including empty bind groups. + + * Test that a pipeline with an explicit layout can not be used with a bindGroup from an auto layout + * Test that a pipeline with an auto layout can not be used with a bindGroup from an explicit layout + * Test that an auto layout from one pipeline can not be used with an auto layout from a different pipeline. + * Test matching bindgroup layouts on the same default layout pipeline are compatible. In other words if + you only define group(2) then group(0)'s empty layout and group(1)'s empty layout should be compatible. + Similarly if group(2) and group(3) have the same types of resources they should be compatible. + ` +). +params((u) => +u. +combineWithParams(kPipelineTypesAndBindingTypeParams). +combine('empty', [false, true]). +combine('renderCommand', [ +'draw', +'drawIndexed', +'drawIndirect', +'drawIndexedIndirect'] +) +). +fn((t) => { + const { pipelineType, bindingType, swap, _success: success, renderCommand, empty } = t.params; + + t.runDefaultLayoutBindingTest({ + visibility: GPUShaderStage.VERTEX, + empty, + pipelineType, + bindingType, + swap, + success, + makePipelinesFn: (t, explicitPipelineLayout) => { + return ['auto', 'auto', explicitPipelineLayout].map( + (layout) => { + const colorFormat = 'rgba8unorm'; + return t.device.createRenderPipeline({ + layout, + vertex: { + module: t.device.createShaderModule({ + code: ` + @group(2) @binding(0) var u1: vec4f; + @group(3) @binding(0) var u2: vec4f; + @vertex fn main() -> @builtin(position) vec4f { return u1 + u2; } + ` + }), + entryPoint: 'main' + }, + fragment: { + module: t.device.createShaderModule({ + code: `@fragment fn main() {}` + }), + entryPoint: 'main', + targets: [{ format: colorFormat, writeMask: 0 }] + } + }); + } + ); + }, + doCommandFn: ({ t, encoder, pipeline, emptyBindGroups, nonEmptyBindGroups }) => { + const attachmentTexture = t.createTextureTracked({ + format: 'rgba8unorm', + size: { width: 16, height: 16, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); + + const renderPass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: attachmentTexture.createView(), + clearValue: [0, 0, 0, 0], + loadOp: 'clear', + storeOp: 'store' + }] + + }); + + renderPass.setPipeline(pipeline); + renderPass.setBindGroup(kEmptyBindGroup0Ndx, emptyBindGroups[0]); + renderPass.setBindGroup(kEmptyBindGroup1Ndx, emptyBindGroups[1]); + renderPass.setBindGroup(kNonEmptyBindGroup0Ndx, nonEmptyBindGroups[0]); + renderPass.setBindGroup(kNonEmptyBindGroup1Ndx, nonEmptyBindGroups[1]); + t.doRender(renderPass, renderCommand, true); + renderPass.end(); + } + }); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/common.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/common.js index bd14a510243..8e42dae1507 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/common.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/common.js @@ -5,7 +5,7 @@ t, type, count) { - return t.device.createQuerySet({ + return t.createQuerySetTracked({ type, count }); @@ -16,8 +16,8 @@ t, encoder, querySet) { - const view = t.device. - createTexture({ + const view = t. + createTextureTracked({ format: 'rgba8unorm', size: { width: 16, height: 16, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/general.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/general.spec.js index 984da884301..31625ee2a1d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/general.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/general.spec.js @@ -159,11 +159,12 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const querySet = sourceDevice.createQuerySet({ - type: 'timestamp', - count: 2 - }); - t.trackForCleanup(querySet); + const querySet = t.trackForCleanup( + sourceDevice.createQuerySet({ + type: 'timestamp', + count: 2 + }) + ); const encoder = t.createEncoder('non-pass'); try { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/resolveQuerySet.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/resolveQuerySet.spec.js index d0b19e4e04f..a2a1fbe85e2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/resolveQuerySet.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/encoding/queries/resolveQuerySet.spec.js @@ -57,8 +57,8 @@ paramsSubcasesOnly([ fn((t) => { const { firstQuery, queryCount } = t.params; - const querySet = t.device.createQuerySet({ type: 'occlusion', count: kQueryCount }); - const destination = t.device.createBuffer({ + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: kQueryCount }); + const destination = t.createBufferTracked({ size: kQueryCount * 8, usage: GPUBufferUsage.QUERY_RESOLVE }); @@ -83,8 +83,8 @@ GPUConst.BufferUsage.QUERY_RESOLVE // control case ]) ). fn((t) => { - const querySet = t.device.createQuerySet({ type: 'occlusion', count: kQueryCount }); - const destination = t.device.createBuffer({ + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: kQueryCount }); + const destination = t.createBufferTracked({ size: kQueryCount * 8, usage: t.params.bufferUsage }); @@ -104,8 +104,8 @@ Tests that resolve query set with invalid destinationOffset: paramsSubcasesOnly((u) => u.combine('destinationOffset', [0, 128, 256, 384])). fn((t) => { const { destinationOffset } = t.params; - const querySet = t.device.createQuerySet({ type: 'occlusion', count: kQueryCount }); - const destination = t.device.createBuffer({ + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: kQueryCount }); + const destination = t.createBufferTracked({ size: 512, usage: GPUBufferUsage.QUERY_RESOLVE }); @@ -133,8 +133,8 @@ u.combineWithParams([ ). fn((t) => { const { queryCount, bufferSize, destinationOffset, _success } = t.params; - const querySet = t.device.createQuerySet({ type: 'occlusion', count: queryCount }); - const destination = t.device.createBuffer({ + const querySet = t.createQuerySetTracked({ type: 'occlusion', count: queryCount }); + const destination = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.QUERY_RESOLVE }); @@ -162,18 +162,20 @@ fn((t) => { const kQueryCount = 1; const querySetDevice = querySetMismatched ? t.mismatchedDevice : t.device; - const querySet = querySetDevice.createQuerySet({ - type: 'occlusion', - count: kQueryCount - }); - t.trackForCleanup(querySet); + const querySet = t.trackForCleanup( + querySetDevice.createQuerySet({ + type: 'occlusion', + count: kQueryCount + }) + ); const bufferDevice = bufferMismatched ? t.mismatchedDevice : t.device; - const buffer = bufferDevice.createBuffer({ - size: kQueryCount * 8, - usage: GPUBufferUsage.QUERY_RESOLVE - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + bufferDevice.createBuffer({ + size: kQueryCount * 8, + usage: GPUBufferUsage.QUERY_RESOLVE + }) + ); const encoder = t.createEncoder('non-pass'); encoder.encoder.resolveQuerySet(querySet, 0, kQueryCount, buffer, 0); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/error_scope.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/error_scope.spec.js index cfca6157fc4..790a171d2c1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/error_scope.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/error_scope.spec.js @@ -7,113 +7,11 @@ Note these must create their own device, not use GPUTest (that one already has e TODO: (POSTV1) Test error scopes of different threads and make sure they go to the right place. TODO: (POSTV1) Test that unhandled errors go the right device, and nowhere if the device was dropped. -`;import { Fixture } from '../../../common/framework/fixture.js'; -import { makeTestGroup } from '../../../common/framework/test_group.js'; -import { getGPU } from '../../../common/util/navigator_gpu.js'; -import { assert, raceWithRejectOnTimeout } from '../../../common/util/util.js'; +`;import { makeTestGroup } from '../../../common/framework/test_group.js'; import { kErrorScopeFilters, kGeneratableErrorScopeFilters } from '../../capability_info.js'; +import { ErrorTest } from '../../error_test.js'; -class ErrorScopeTests extends Fixture { - _device = undefined; - - get device() { - assert(this._device !== undefined); - return this._device; - } - - async init() { - await super.init(); - const gpu = getGPU(this.rec); - const adapter = await gpu.requestAdapter(); - assert(adapter !== null); - - // We need to max out the adapter limits related to texture dimensions to more reliably cause an - // OOM error when asked for it, so set that on the device now. - const device = this.trackForCleanup( - await adapter.requestDevice({ - requiredLimits: { - maxTextureDimension2D: adapter.limits.maxTextureDimension2D, - maxTextureArrayLayers: adapter.limits.maxTextureArrayLayers - } - }) - ); - assert(device !== null); - this._device = device; - } - - // Generates an error of the given filter type. For now, the errors are generated by calling a - // known code-path to cause the error. This can be updated in the future should there be a more - // direct way to inject errors. - generateError(filter) { - switch (filter) { - case 'out-of-memory': - this.trackForCleanup( - this.device.createTexture({ - // One of the largest formats. With the base limits, the texture will be 256 GiB. - format: 'rgba32float', - usage: GPUTextureUsage.COPY_DST, - size: [ - this.device.limits.maxTextureDimension2D, - this.device.limits.maxTextureDimension2D, - this.device.limits.maxTextureArrayLayers] - - }) - ); - break; - case 'validation': - // Generating a validation error by passing in an invalid usage when creating a buffer. - this.trackForCleanup( - this.device.createBuffer({ - size: 1024, - usage: 0xffff // Invalid GPUBufferUsage - }) - ); - break; - } - // MAINTENANCE_TODO: This is a workaround for Chromium not flushing. Remove when not needed. - this.device.queue.submit([]); - } - - // Checks whether the error is of the type expected given the filter. - isInstanceOfError(filter, error) { - switch (filter) { - case 'out-of-memory': - return error instanceof GPUOutOfMemoryError; - case 'validation': - return error instanceof GPUValidationError; - case 'internal': - return error instanceof GPUInternalError; - } - } - - // Expect an uncapturederror event to occur. Note: this MUST be awaited, because - // otherwise it could erroneously pass by capturing an error from later in the test. - async expectUncapturedError(fn) { - return this.immediateAsyncExpectation(() => { - // MAINTENANCE_TODO: Make arbitrary timeout value a test runner variable - const TIMEOUT_IN_MS = 1000; - - const promise = new Promise((resolve) => { - const eventListener = (event) => { - this.debug(`Got uncaptured error event with ${event.error}`); - resolve(event); - }; - - this.device.addEventListener('uncapturederror', eventListener, { once: true }); - }); - - fn(); - - return raceWithRejectOnTimeout( - promise, - TIMEOUT_IN_MS, - 'Timeout occurred waiting for uncaptured error' - ); - }); - } -} - -export const g = makeTestGroup(ErrorScopeTests); +export const g = makeTestGroup(ErrorTest); g.test('simple'). desc( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/gpu_external_texture_expiration.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/gpu_external_texture_expiration.spec.js index 0b271d6afd6..09a949ad857 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/gpu_external_texture_expiration.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/gpu_external_texture_expiration.spec.js @@ -20,7 +20,7 @@ class GPUExternalTextureExpireTest extends ValidationTest { const kWidth = 16; const kFormat = 'rgba8unorm'; - const colorAttachment = this.device.createTexture({ + const colorAttachment = this.createTextureTracked({ format: kFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_related.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_related.spec.js index d22e39eecba..602a59a4333 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_related.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_related.spec.js @@ -42,7 +42,7 @@ fn((t) => { const submit = state !== 'invalid'; const success = state === 'valid'; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 2, height: 2, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -69,13 +69,14 @@ fn((t) => { const { method, mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const buffer = sourceDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }) + ); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 2, height: 2, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -116,7 +117,7 @@ GPUConst.BufferUsage.COPY_SRC | GPUConst.BufferUsage.COPY_DST] fn((t) => { const { method, usage } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 16, usage }); @@ -126,7 +127,7 @@ fn((t) => { (usage & GPUBufferUsage.COPY_SRC) !== 0 : (usage & GPUBufferUsage.COPY_DST) !== 0; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 2, height: 2, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -193,7 +194,7 @@ fn((t) => { const info = kTextureFormatInfo[format]; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 512 * 8 * 16, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -207,7 +208,7 @@ fn((t) => { if (bytesPerRow !== undefined && bytesPerRow > 0 && bytesPerRow % 256 === 0) success = true; const size = [info.blockWidth, _textureHeightInBlocks * info.blockHeight, 1]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, dimension, format, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_texture_copies.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_texture_copies.spec.js index 9ea44a36d45..ea2ace9f940 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_texture_copies.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/buffer_texture_copies.spec.js @@ -78,14 +78,14 @@ fn((t) => { const { format, aspect } = t.params; const textureSize = { width: 1, height: 1, depthOrArrayLayers: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: textureSize, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST }); const uploadBufferSize = 32; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: uploadBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -142,7 +142,7 @@ beforeAllSubcases((t) => { fn((t) => { const { format, aspect, copyType, copySize } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: copySize, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -159,11 +159,11 @@ fn((t) => { align(texelAspectSize * copySize.width, kBufferCopyAlignment); assert(minimumBufferSize > kBufferCopyAlignment); - const bigEnoughBuffer = t.device.createBuffer({ + const bigEnoughBuffer = t.createBufferTracked({ size: minimumBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - const smallerBuffer = t.device.createBuffer({ + const smallerBuffer = t.createBufferTracked({ size: minimumBufferSize - kBufferCopyAlignment, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -251,7 +251,7 @@ fn((t) => { const textureSize = { width: 4, height: 4, depthOrArrayLayers: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: textureSize, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -268,7 +268,7 @@ fn((t) => { align(texelAspectSize * textureSize.width, kBufferCopyAlignment); assert(minimumBufferSize > kBufferCopyAlignment); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: align(minimumBufferSize + offset, kBufferCopyAlignment), usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -329,7 +329,7 @@ fn((t) => { if (sampleCount > 1) { usage |= GPUTextureUsage.RENDER_ATTACHMENT; } - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16 }, sampleCount, format: 'bgra8unorm', @@ -337,7 +337,7 @@ fn((t) => { }); const uploadBufferSize = 32; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: uploadBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); @@ -383,14 +383,14 @@ filter((p) => p._textureUsageValid || p._bufferUsageValid) fn((t) => { const { copyType, textureUsage, _textureUsageValid, bufferUsage, _bufferUsageValid } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16 }, format: 'rgba8unorm', usage: textureUsage }); const uploadBufferSize = 32; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: uploadBufferSize, usage: bufferUsage }); @@ -429,19 +429,21 @@ fn((t) => { const { copyType, bufMismatched, texMismatched } = t.params; const uploadBufferSize = 32; - const buffer = (bufMismatched ? t.mismatchedDevice : t.device).createBuffer({ - size: uploadBufferSize, - usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + (bufMismatched ? t.mismatchedDevice : t.device).createBuffer({ + size: uploadBufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }) + ); const textureSize = { width: 1, height: 1, depthOrArrayLayers: 1 }; - const texture = (texMismatched ? t.mismatchedDevice : t.device).createTexture({ - size: textureSize, - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }); - t.trackForCleanup(texture); + const texture = t.trackForCleanup( + (texMismatched ? t.mismatchedDevice : t.device).createTexture({ + size: textureSize, + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }) + ); const isValid = !bufMismatched && !texMismatched; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/image_copy.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/image_copy.js index 3cffa6b3ce0..639b1a8de93 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/image_copy.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/image_copy.js @@ -39,11 +39,10 @@ export class ImageCopyTest extends ValidationTest { break; } case 'CopyB2T':{ - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: dataSize, usage: GPUBufferUsage.COPY_SRC }); - this.trackForCleanup(buffer); const encoder = this.device.createCommandEncoder(); encoder.copyBufferToTexture({ buffer, ...textureDataLayout }, textureCopyView, size); @@ -67,11 +66,10 @@ export class ImageCopyTest extends ValidationTest { 'copyTextureToBuffer is not supported for compressed texture formats in compatibility mode.' ); } - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: dataSize, usage: GPUBufferUsage.COPY_DST }); - this.trackForCleanup(buffer); const encoder = this.device.createCommandEncoder(); encoder.copyTextureToBuffer(textureCopyView, { buffer, ...textureDataLayout }, size); @@ -113,7 +111,7 @@ export class ImageCopyTest extends ValidationTest { height: align(Math.max(1, size.height + origin.y), info.blockHeight), depthOrArrayLayers: Math.max(1, size.depthOrArrayLayers + origin.z) }; - return this.device.createTexture({ + return this.createTextureTracked({ size: alignedSize, dimension, format, @@ -255,9 +253,9 @@ export function formatCopyableWithMethod({ format, method }) { return supportedAspects.length > 0; } if (method === 'CopyT2B') { - return info.copySrc; + return info.color.copySrc; } else { - return info.copyDst; + return info.color.copyDst; } } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/layout_related.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/layout_related.spec.js index 8246aebf289..86fdd728468 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/layout_related.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/layout_related.spec.js @@ -60,7 +60,7 @@ fn((t) => { const format = 'rgba8unorm'; const copyHeight = copyHeightInBlocks * kTextureFormatInfo[format].blockHeight; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, dimension, format, @@ -102,7 +102,7 @@ combineWithParams([ fn((t) => { const { method, bytesPerRow, rowsPerImage, depthOrArrayLayers, _success } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -260,7 +260,7 @@ fn((t) => { const info = kTextureFormatInfo[format]; const size = { width: info.blockWidth, height: info.blockHeight, depthOrArrayLayers: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -303,7 +303,7 @@ fn((t) => { const info = kTextureFormatInfo[format]; const size = { width: info.blockWidth, height: info.blockHeight, depthOrArrayLayers: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST @@ -466,7 +466,7 @@ fn((t) => { const offset = offsetInBlocks * info.color.bytes; const dataSize = dataSizeInBlocks * info.color.bytes; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/texture_related.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/texture_related.spec.js index 7b535935c3c..a42cccac4dd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/texture_related.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/image_copy/texture_related.spec.js @@ -77,11 +77,13 @@ fn((t) => { const { method, mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const texture = sourceDevice.createTexture({ - size: { width: 4, height: 4, depthOrArrayLayers: 1 }, - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST - }); + const texture = t.trackForCleanup( + sourceDevice.createTexture({ + size: { width: 4, height: 4, depthOrArrayLayers: 1 }, + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST + }) + ); t.testRun( { texture }, @@ -125,7 +127,7 @@ fn((t) => { const { usage0, usage1, method, size, dimension } = t.params; const usage = usage0 | usage1; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, dimension, format: 'rgba8unorm', @@ -164,7 +166,7 @@ combine('sampleCount', [1, 4]) fn((t) => { const { sampleCount, method } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 4, height: 4, depthOrArrayLayers: 1 }, sampleCount, format: 'rgba8unorm', @@ -211,7 +213,7 @@ combine('mipLevel', [0, 1, 3, 4]) fn((t) => { const { mipLevelCount, mipLevel, method, size, dimension } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, dimension, mipLevelCount, @@ -287,7 +289,7 @@ fn((t) => { size.height = 1; } - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, dimension, format, @@ -303,11 +305,7 @@ fn((t) => { success = false; } - const levelSize = virtualMipSize( - dimension, - [size.width, size.height, size.depthOrArrayLayers], - mipLevel - ); + const levelSize = virtualMipSize(dimension, size, mipLevel); const copySize = [ levelSize[0] + copyWidthModifier * info.blockWidth, levelSize[1] + copyHeightModifier * info.blockHeight, @@ -440,7 +438,7 @@ fn((t) => { const texture = t.createAlignedTexture(format, size, origin, dimension); const bytesPerRow = align( - Math.max(1, Math.ceil(size.width / info.blockWidth)) * info.bytesPerBlock, + Math.max(1, Math.ceil(size.width / info.blockWidth)) * info.color.bytes, 256 ); const rowsPerImage = Math.ceil(size.height / info.blockHeight); @@ -514,7 +512,7 @@ fn((t) => { } } - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: textureSize, dimension, mipLevelCount: dimension === '1d' ? 1 : 3, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/create.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/create.spec.js index 283b92abecd..ce6b4c87913 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/create.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/create.spec.js @@ -29,6 +29,6 @@ fn((t) => { const { type, count } = t.params; t.expectValidationError(() => { - t.device.createQuerySet({ type, count }); + t.createQuerySetTracked({ type, count }); }, count > kMaxQueryCount); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/destroy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/destroy.spec.js index 58e8b03d47a..a05d00a1125 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/destroy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/query_set/destroy.spec.js @@ -8,7 +8,7 @@ import { ValidationTest } from '../validation_test.js'; export const g = makeTestGroup(ValidationTest); g.test('twice').fn((t) => { - const qset = t.device.createQuerySet({ type: 'occlusion', count: 1 }); + const qset = t.createQuerySetTracked({ type: 'occlusion', count: 1 }); qset.destroy(); qset.destroy(); @@ -19,7 +19,7 @@ desc('Test that invalid querysets may be destroyed without generating validation fn(async (t) => { t.device.pushErrorScope('validation'); - const invalidQuerySet = t.device.createQuerySet({ + const invalidQuerySet = t.createQuerySetTracked({ type: 'occlusion', count: 4097 // 4096 is the limit }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/buffer_mapped.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/buffer_mapped.spec.js index 1647ebd351a..13ff2526e4c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/buffer_mapped.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/buffer_mapped.spec.js @@ -33,8 +33,8 @@ class F extends ValidationTest { const mapMode = usage & GPUBufferUsage.MAP_READ ? GPUMapMode.READ : GPUMapMode.WRITE; // Create a mappable buffer, and one that will remain unmapped for comparison. - const mappableBuffer = this.device.createBuffer(bufferDesc); - const unmappedBuffer = this.device.createBuffer(bufferDesc); + const mappableBuffer = this.createBufferTracked(bufferDesc); + const unmappedBuffer = this.createBufferTracked(bufferDesc); // Run the given operation before the buffer is mapped. Should succeed. callback(mappableBuffer); @@ -72,7 +72,7 @@ class F extends ValidationTest { // Create a buffer that's mappedAtCreation. bufferDesc.mappedAtCreation = true; - const mappedBuffer = this.device.createBuffer(bufferDesc); + const mappedBuffer = this.createBufferTracked(bufferDesc); // Run the operation with the mappedAtCreation buffer. Should fail. this.expectValidationError(() => { @@ -110,12 +110,12 @@ desc( both when used as the source and destination.` ). fn(async (t) => { - const sourceBuffer = t.device.createBuffer({ + const sourceBuffer = t.createBufferTracked({ size: 8, usage: GPUBufferUsage.COPY_SRC }); - const destBuffer = t.device.createBuffer({ + const destBuffer = t.createBufferTracked({ size: 8, usage: GPUBufferUsage.COPY_DST }); @@ -146,7 +146,7 @@ desc( fn(async (t) => { const size = { width: 1, height: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_DST @@ -169,7 +169,7 @@ desc( fn(async (t) => { const size = { width: 1, height: 1 }; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC @@ -240,13 +240,13 @@ paramsSubcasesOnly([ fn(async (t) => { const { order, mappedAtCreation, _shouldError: shouldError } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC, mappedAtCreation }); - const targetBuffer = t.device.createBuffer({ + const targetBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/copyToTexture/CopyExternalImageToTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/copyToTexture/CopyExternalImageToTexture.spec.js index a66b9a77472..d42c8529cec 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/copyToTexture/CopyExternalImageToTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/copyToTexture/CopyExternalImageToTexture.spec.js @@ -14,7 +14,7 @@ import { raceWithRejectOnTimeout, unreachable, assert } from '../../../../../com import { kTextureUsages } from '../../../../capability_info.js'; import { kTextureFormatInfo, - kTextureFormats, + kAllTextureFormats, kValidTextureFormatsForCopyE2T } from '../../../../format_info.js'; import { kResourceStates } from '../../../../gpu_test.js'; @@ -296,7 +296,7 @@ fn(async (t) => { unreachable(); } - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT @@ -335,7 +335,7 @@ combine('copySize', [ fn(async (t) => { const { closed, copySize } = t.params; const imageBitmap = await t.createImageBitmap(t.getImageData(1, 1)); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT @@ -390,7 +390,7 @@ fn((t) => { return; } - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT @@ -460,7 +460,7 @@ combine('copySize', [ fn(async (t) => { const { state, copySize } = t.params; const offscreenCanvas = createOffscreenCanvas(t, 1, 1); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT @@ -549,11 +549,13 @@ fn(async (t) => { const sourceDevice = mismatched ? t.mismatchedDevice : t.device; const copySize = { width: 1, height: 1, depthOrArrayLayers: 1 }; - const texture = sourceDevice.createTexture({ - size: copySize, - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT - }); + const texture = t.trackForCleanup( + sourceDevice.createTexture({ + size: copySize, + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT + }) + ); const imageBitmap = await t.createImageBitmap(t.getImageData(1, 1)); @@ -580,7 +582,7 @@ combine('copySize', [ fn(async (t) => { const { usage, copySize } = t.params; const imageBitmap = await t.createImageBitmap(t.getImageData(1, 1)); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format: 'rgba8unorm', usage @@ -614,7 +616,7 @@ combine('copySize', [ fn(async (t) => { const { sampleCount, copySize } = t.params; const imageBitmap = await t.createImageBitmap(t.getImageData(1, 1)); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, sampleCount, format: 'bgra8unorm', @@ -644,7 +646,7 @@ combine('copySize', [ fn(async (t) => { const { mipLevel, copySize } = t.params; const imageBitmap = await t.createImageBitmap(t.getImageData(1, 1)); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: kDefaultWidth, height: kDefaultHeight, depthOrArrayLayers: kDefaultDepth }, mipLevelCount: kDefaultMipLevelCount, format: 'bgra8unorm', @@ -669,7 +671,7 @@ desc( ). params((u) => u. -combine('format', kTextureFormats). +combine('format', kAllTextureFormats). beginSubcases(). combine('copySize', [ { width: 0, height: 0, depthOrArrayLayers: 0 }, @@ -689,7 +691,7 @@ fn(async (t) => { // createTexture with all possible texture format may have validation error when using // compressed texture format. t.device.pushErrorScope('validation'); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT @@ -724,7 +726,7 @@ expand('copySize', generateCopySizeForSrcOOB) fn(async (t) => { const { srcOrigin, copySize } = t.params; const imageBitmap = await t.createImageBitmap(t.getImageData(kDefaultWidth, kDefaultHeight)); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: kDefaultWidth + 1, height: kDefaultHeight + 1, @@ -775,7 +777,7 @@ fn(async (t) => { const imageBitmap = await t.createImageBitmap( t.getImageData(kDefaultWidth + 1, kDefaultHeight + 1) ); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: { width: kDefaultWidth, height: kDefaultHeight, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/buffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/buffer.spec.js index aa740c9200a..214f77fe2ef 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/buffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/buffer.spec.js @@ -17,12 +17,10 @@ Tests that using a destroyed buffer in writeBuffer fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const buffer = t.trackForCleanup( - t.device.createBuffer({ - size: 4, - usage: GPUBufferUsage.COPY_DST - }) - ); + const buffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.COPY_DST + }); if (destroyed) { buffer.destroy(); @@ -40,12 +38,8 @@ Tests that using a destroyed buffer in copyBufferToBuffer fails. ). paramsSubcasesOnly((u) => u.combine('destroyed', ['none', 'src', 'dst', 'both'])). fn((t) => { - const src = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_SRC }) - ); - const dst = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_DST }) - ); + const src = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC }); + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToBuffer(src, 0, dst, 0, dst.size); @@ -83,16 +77,12 @@ Tests that using a destroyed buffer in copyBufferToTexture fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const buffer = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_SRC }) - ); - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_DST - }) - ); + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC }); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_DST + }); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToTexture({ buffer }, { texture }, [1, 1, 1]); @@ -117,16 +107,12 @@ Tests that using a destroyed buffer in copyTextureToBuffer fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_SRC - }) - ); - const buffer = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_DST }) - ); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_SRC + }); + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); const encoder = t.device.createCommandEncoder(); encoder.copyTextureToBuffer({ texture }, { buffer }, [1, 1, 1]); @@ -156,12 +142,10 @@ combine('encoderType', ['compute pass', 'render pass', 'render bundle']) fn((t) => { const { destroyed, encoderType } = t.params; const { device } = t; - const buffer = t.trackForCleanup( - t.device.createBuffer({ - size: 4, - usage: GPUBufferUsage.UNIFORM - }) - ); + const buffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.UNIFORM + }); const layout = device.createBindGroupLayout({ entries: [ @@ -205,12 +189,10 @@ combine('encoderType', ['render pass', 'render bundle']) ). fn((t) => { const { destroyed, encoderType } = t.params; - const vertexBuffer = t.trackForCleanup( - t.device.createBuffer({ - size: 4, - usage: GPUBufferUsage.VERTEX - }) - ); + const vertexBuffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.VERTEX + }); const { encoder, finish } = t.createEncoder(encoderType); encoder.setVertexBuffer(0, vertexBuffer); @@ -239,12 +221,10 @@ combine('encoderType', ['render pass', 'render bundle']) ). fn((t) => { const { destroyed, encoderType } = t.params; - const indexBuffer = t.trackForCleanup( - t.device.createBuffer({ - size: 4, - usage: GPUBufferUsage.INDEX - }) - ); + const indexBuffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.INDEX + }); const { encoder, finish } = t.createEncoder(encoderType); encoder.setIndexBuffer(indexBuffer, 'uint16'); @@ -269,18 +249,14 @@ Tests that using a destroyed buffer referenced via resolveQuerySet fails paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const querySet = t.trackForCleanup( - t.device.createQuerySet({ - type: 'occlusion', - count: 1 - }) - ); - const querySetBuffer = t.trackForCleanup( - t.device.createBuffer({ - size: 8, - usage: GPUBufferUsage.QUERY_RESOLVE - }) - ); + const querySet = t.createQuerySetTracked({ + type: 'occlusion', + count: 1 + }); + const querySetBuffer = t.createBufferTracked({ + size: 8, + usage: GPUBufferUsage.QUERY_RESOLVE + }); const encoder = t.device.createCommandEncoder(); encoder.resolveQuerySet(querySet, 0, 1, querySetBuffer, 0); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/query_set.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/query_set.spec.js index ac8f810f160..cfe51ac8230 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/query_set.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/query_set.spec.js @@ -63,13 +63,11 @@ fn((t) => { } { - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); const encoder = t.createEncoder('non-pass'); encoder.encoder. beginRenderPass({ @@ -98,7 +96,7 @@ paramsSubcasesOnly((u) => u.combine('querySetState', ['valid', 'destroyed'])). fn((t) => { const querySet = t.createQuerySetWithState(t.params.querySetState); - const buffer = t.device.createBuffer({ size: 8, usage: GPUBufferUsage.QUERY_RESOLVE }); + const buffer = t.createBufferTracked({ size: 8, usage: GPUBufferUsage.QUERY_RESOLVE }); const encoder = t.createEncoder('non-pass'); encoder.encoder.resolveQuerySet(querySet, 0, 1, buffer, 0); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/texture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/texture.spec.js index 2f640238067..d2af1ee5ca9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/texture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/destroyed/texture.spec.js @@ -18,13 +18,11 @@ Tests that using a destroyed texture in writeTexture fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_DST - }) - ); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_DST + }); if (destroyed) { texture.destroy(); @@ -45,20 +43,16 @@ Tests that using a destroyed texture in copyTextureToTexture fails. ). paramsSubcasesOnly((u) => u.combine('destroyed', ['none', 'src', 'dst', 'both'])). fn((t) => { - const src = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_SRC - }) - ); - const dst = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_DST - }) - ); + const src = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_SRC + }); + const dst = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_DST + }); const encoder = t.device.createCommandEncoder(); encoder.copyTextureToTexture({ texture: src }, { texture: dst }, [1, 1, 1]); @@ -96,16 +90,12 @@ Tests that using a destroyed texture in copyBufferToTexture fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const buffer = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_SRC }) - ); - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_DST - }) - ); + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC }); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_DST + }); const encoder = t.device.createCommandEncoder(); encoder.copyBufferToTexture({ buffer }, { texture }, [1, 1, 1]); @@ -130,16 +120,12 @@ Tests that using a destroyed texture in copyTextureToBuffer fails. paramsSubcasesOnly((u) => u.combine('destroyed', [false, true])). fn((t) => { const { destroyed } = t.params; - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.COPY_SRC - }) - ); - const buffer = t.trackForCleanup( - t.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_DST }) - ); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.COPY_SRC + }); + const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); const encoder = t.device.createCommandEncoder(); encoder.copyTextureToBuffer({ texture }, { buffer }, [1, 1, 1]); @@ -170,13 +156,11 @@ combine('bindingType', ['texture', 'storageTexture']) fn((t) => { const { destroyed, encoderType, bindingType } = t.params; const { device } = t; - const texture = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING - }) - ); + const texture = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING + }); const layout = device.createBindGroupLayout({ entries: [ @@ -227,31 +211,25 @@ fn((t) => { const { textureToDestroy } = t.params; const { device } = t; - const colorAttachment = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - sampleCount: 4, - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const colorAttachment = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + sampleCount: 4, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); - const resolveAttachment = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const resolveAttachment = t.createTextureTracked({ + size: [1, 1, 1], + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); - const depthStencilAttachment = t.trackForCleanup( - t.device.createTexture({ - size: [1, 1, 1], - format: 'depth32float', - sampleCount: 4, - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const depthStencilAttachment = t.createTextureTracked({ + size: [1, 1, 1], + format: 'depth32float', + sampleCount: 4, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); const encoder = device.createCommandEncoder(); const pass = encoder.beginRenderPass({ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/submit.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/submit.spec.js index fc31992d580..19e0f6fdf3d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/submit.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/submit.spec.js @@ -8,7 +8,31 @@ Note: buffer map state is tested in ./buffer_mapped.spec.ts. `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { ValidationTest } from '../validation_test.js'; -export const g = makeTestGroup(ValidationTest); + + + + + +class F extends ValidationTest { + createCommandBuffer(options = {}) { + const device = options.device ?? this.device; + + let cb; + + this.expectValidationError(() => { + const encoder = device.createCommandEncoder(); + if (options.valid === false) { + // Popping a debug group when none are pushed results in an invalid command buffer. + encoder.popDebugGroup(); + } + cb = encoder.finish(); + }, options.valid === false); + + return cb; + } +} + +export const g = makeTestGroup(F); g.test('command_buffer,device_mismatch'). desc( @@ -31,17 +55,75 @@ fn((t) => { const { cb0Mismatched, cb1Mismatched } = t.params; const mismatched = cb0Mismatched || cb1Mismatched; - const encoder0 = cb0Mismatched ? - t.mismatchedDevice.createCommandEncoder() : - t.device.createCommandEncoder(); - const cb0 = encoder0.finish(); - - const encoder1 = cb1Mismatched ? - t.mismatchedDevice.createCommandEncoder() : - t.device.createCommandEncoder(); - const cb1 = encoder1.finish(); + const cb0 = t.createCommandBuffer({ device: cb0Mismatched ? t.mismatchedDevice : t.device }); + const cb1 = t.createCommandBuffer({ device: cb1Mismatched ? t.mismatchedDevice : t.device }); t.expectValidationError(() => { t.device.queue.submit([cb0, cb1]); }, mismatched); +}); + +g.test('command_buffer,duplicate_buffers'). +desc( + ` + Tests submit cannot be called with the same command buffer listed multiple times: + ` +). +fn((t) => { + const cb = t.createCommandBuffer(); + + t.expectValidationError(() => { + t.device.queue.submit([cb, cb]); + }, true); +}); + +g.test('command_buffer,submit_invalidates'). +desc( + ` + Tests that calling submit invalidates the command buffers passed to it: + ` +). +fn((t) => { + const cb = t.createCommandBuffer(); + + // Initial submit of a valid command buffer should pass. + t.device.queue.submit([cb]); + + // Subsequent submits of the same command buffer should fail. + t.expectValidationError(() => { + t.device.queue.submit([cb]); + }); +}); + +g.test('command_buffer,invalid_submit_invalidates'). +desc( + ` + Tests that calling submit invalidates all command buffers passed to it, even + if they're part of an invalid submit. + ` +). +fn((t) => { + const cb1 = t.createCommandBuffer(); + const cb1_invalid = t.createCommandBuffer({ valid: false }); + + // Submit should fail because on of the command buffers is invalid + t.expectValidationError(() => { + t.device.queue.submit([cb1, cb1_invalid]); + }); + + // Subsequent submits of the previously valid command buffer should fail. + t.expectValidationError(() => { + t.device.queue.submit([cb1]); + }); + + // The order of the invalid and valid command buffers in the submit array should not matter. + const cb2 = t.createCommandBuffer(); + const cb2_invalid = t.createCommandBuffer({ valid: false }); + + t.expectValidationError(() => { + t.device.queue.submit([cb2_invalid, cb2]); + }); + t.expectValidationError(() => { + t.device.queue.submit([cb2]); + }); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeBuffer.spec.js index f7cff5bb79c..823c6dc68fd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeBuffer.spec.js @@ -60,7 +60,7 @@ fn((t) => { function runTest(arrayType, testBuffer) { const elementSize = arrayType.BYTES_PER_ELEMENT; const bufferSize = 16 * elementSize; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.COPY_DST }); @@ -168,7 +168,7 @@ paramsSubcasesOnly([ ]). fn((t) => { const { usage, _valid } = t.params; - const buffer = t.device.createBuffer({ size: 16, usage }); + const buffer = t.createBufferTracked({ size: 16, usage }); const data = new Uint8Array(16); t.expectValidationError(() => { @@ -186,11 +186,12 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const buffer = sourceDevice.createBuffer({ - size: 16, - usage: GPUBufferUsage.COPY_DST - }); - t.trackForCleanup(buffer); + const buffer = t.trackForCleanup( + sourceDevice.createBuffer({ + size: 16, + usage: GPUBufferUsage.COPY_DST + }) + ); const data = new Uint8Array(16); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeTexture.spec.js index 31727c7945e..c3b6ed739fe 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/queue/writeTexture.spec.js @@ -43,7 +43,7 @@ paramsSubcasesOnly([ ). fn((t) => { const { usage } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16 }, usage, format: 'rgba8unorm' @@ -67,7 +67,7 @@ desc( params((u) => u.combine('sampleCount', [1, 4])). fn((t) => { const { sampleCount } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 16, height: 16 }, sampleCount, format: 'bgra8unorm', @@ -94,12 +94,13 @@ fn((t) => { const { mismatched } = t.params; const sourceDevice = mismatched ? t.mismatchedDevice : t.device; - const texture = sourceDevice.createTexture({ - size: { width: 16, height: 16 }, - format: 'bgra8unorm', - usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT - }); - t.trackForCleanup(texture); + const texture = t.trackForCleanup( + sourceDevice.createTexture({ + size: { width: 16, height: 16 }, + format: 'bgra8unorm', + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT + }) + ); const data = new Uint8Array(16); const size = [1, 1]; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/attachment_compatibility.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/attachment_compatibility.spec.js index 6579343b49c..baac9bdb586 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/attachment_compatibility.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/attachment_compatibility.spec.js @@ -85,15 +85,13 @@ const kFeaturesForDepthStencilAttachmentFormats = getFeaturesForFormats([ class F extends ValidationTest { createAttachmentTextureView(format, sampleCount) { - return this.device. - createTexture({ + return this.createTextureTracked({ // Size matching the "arbitrary" size used by ValidationTest helpers. size: [16, 16, 1], format, usage: GPUTextureUsage.RENDER_ATTACHMENT, sampleCount - }). - createView(); + }).createView(); } createColorAttachment( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/render_pass_descriptor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/render_pass_descriptor.spec.js index 94633c2f707..05cd5bd402c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/render_pass_descriptor.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/render_pass_descriptor.spec.js @@ -17,7 +17,7 @@ import { import { ValidationTest } from '../validation_test.js'; class F extends ValidationTest { - createTexture( + createTestTexture( options = @@ -40,7 +40,7 @@ class F extends ValidationTest { usage = GPUTextureUsage.RENDER_ATTACHMENT } = options; - return this.device.createTexture({ + return this.createTextureTracked({ size: { width, height, depthOrArrayLayers: arrayLayerCount }, format, dimension, @@ -98,7 +98,7 @@ const kArrayLayerCount = 10; g.test('attachments,one_color_attachment'). desc(`Test that a render pass works with only one color attachment.`). fn((t) => { - const colorTexture = t.createTexture({ format: 'rgba8unorm' }); + const colorTexture = t.createTestTexture({ format: 'rgba8unorm' }); const descriptor = { colorAttachments: [t.getColorAttachment(colorTexture)] }; @@ -109,7 +109,7 @@ fn((t) => { g.test('attachments,one_depth_stencil_attachment'). desc(`Test that a render pass works with only one depthStencil attachment.`). fn((t) => { - const depthStencilTexture = t.createTexture({ format: 'depth24plus-stencil8' }); + const depthStencilTexture = t.createTestTexture({ format: 'depth24plus-stencil8' }); const descriptor = { colorAttachments: [], depthStencilAttachment: t.getDepthStencilAttachment(depthStencilTexture) @@ -147,7 +147,7 @@ fn((t) => { for (let i = 0; i < colorAttachments.length; i++) { if (colorAttachments[i] !== undefined) { isEmptyColorTargets = false; - const colorTexture = t.createTexture(); + const colorTexture = t.createTestTexture(); colorAttachments[i] = t.getColorAttachment(colorTexture); } } @@ -156,7 +156,7 @@ fn((t) => { t.tryRenderPass(_success, { colorAttachments, depthStencilAttachment: hasDepthStencilAttachment ? - t.getDepthStencilAttachment(t.createTexture({ format: 'depth24plus-stencil8' })) : + t.getDepthStencilAttachment(t.createTestTexture({ format: 'depth24plus-stencil8' })) : undefined }); }); @@ -181,7 +181,7 @@ fn((t) => { const colorAttachments = []; for (let i = 0; i < colorAttachmentsCount; i++) { - const colorTexture = t.createTexture({ format: 'r8unorm' }); + const colorTexture = t.createTestTexture({ format: 'r8unorm' }); colorAttachments.push(t.getColorAttachment(colorTexture)); } @@ -218,7 +218,7 @@ fn((t) => { const colorAttachments = []; for (let i = 0; i < attachmentCount; i++) { - const colorTexture = t.createTexture({ format }); + const colorTexture = t.createTestTexture({ format }); colorAttachments.push(t.getColorAttachment(colorTexture)); } const shouldError = @@ -272,7 +272,7 @@ fn((t) => { const colorAttachments = []; for (const format of formats) { - const colorTexture = t.createTexture({ format }); + const colorTexture = t.createTestTexture({ format }); colorAttachments.push(t.getColorAttachment(colorTexture)); } @@ -297,7 +297,7 @@ combine('depthSlice', [undefined, 0, 0xffffffff]) ). fn((t) => { const { dimension, depthSlice } = t.params; - const texture = t.createTexture({ dimension }); + const texture = t.createTestTexture({ dimension }); const colorAttachment = t.getColorAttachment(texture); if (depthSlice !== undefined) { @@ -336,7 +336,7 @@ expand('depthSlice', ({ mipLevel }) => { fn((t) => { const { mipLevel, depthSlice } = t.params; - const texture = t.createTexture({ + const texture = t.createTestTexture({ dimension: '3d', width: 16, height: 1, @@ -388,12 +388,12 @@ fn((t) => { dimension: '3d', arrayLayerCount }; - const texture = t.createTexture(texDescriptor); + const texture = t.createTestTexture(texDescriptor); const colorAttachments = []; for (let i = 0; i < arrayLayerCount; i++) { const colorAttachment = t.getColorAttachment( - sameTexture ? texture : t.createTexture(texDescriptor) + sameTexture ? texture : t.createTestTexture(texDescriptor) ); colorAttachment.depthSlice = sameDepthSlice ? 0 : i; colorAttachments.push(colorAttachment); @@ -434,7 +434,7 @@ fn((t) => { arrayLayerCount: 1 << mipLevelCount, mipLevelCount }; - const texture = t.createTexture(texDescriptor); + const texture = t.createTestTexture(texDescriptor); const viewDescriptor = { baseMipLevel: 0, @@ -470,15 +470,15 @@ desc( ` ). fn((t) => { - const colorTexture1x1A = t.createTexture({ width: 1, height: 1, format: 'rgba8unorm' }); - const colorTexture1x1B = t.createTexture({ width: 1, height: 1, format: 'rgba8unorm' }); - const colorTexture2x2 = t.createTexture({ width: 2, height: 2, format: 'rgba8unorm' }); - const depthStencilTexture1x1 = t.createTexture({ + const colorTexture1x1A = t.createTestTexture({ width: 1, height: 1, format: 'rgba8unorm' }); + const colorTexture1x1B = t.createTestTexture({ width: 1, height: 1, format: 'rgba8unorm' }); + const colorTexture2x2 = t.createTestTexture({ width: 2, height: 2, format: 'rgba8unorm' }); + const depthStencilTexture1x1 = t.createTestTexture({ width: 1, height: 1, format: 'depth24plus-stencil8' }); - const depthStencilTexture2x2 = t.createTexture({ + const depthStencilTexture2x2 = t.createTestTexture({ width: 2, height: 2, format: 'depth24plus-stencil8' @@ -524,8 +524,8 @@ fn((t) => { g.test('attachments,color_depth_mismatch'). desc(`Test that attachments match whether they are used for color or depth stencil.`). fn((t) => { - const colorTexture = t.createTexture({ format: 'rgba8unorm' }); - const depthStencilTexture = t.createTexture({ format: 'depth24plus-stencil8' }); + const colorTexture = t.createTestTexture({ format: 'rgba8unorm' }); + const depthStencilTexture = t.createTestTexture({ format: 'depth24plus-stencil8' }); { // Using depth-stencil for color @@ -568,14 +568,14 @@ fn((t) => { const COLOR_FORMAT = 'rgba8unorm'; const DEPTH_STENCIL_FORMAT = 'depth24plus-stencil8'; - const colorTexture = t.createTexture({ + const colorTexture = t.createTestTexture({ format: COLOR_FORMAT, width: 32, height: 32, mipLevelCount: MIP_LEVEL_COUNT, arrayLayerCount: ARRAY_LAYER_COUNT }); - const depthStencilTexture = t.createTexture({ + const depthStencilTexture = t.createTestTexture({ format: DEPTH_STENCIL_FORMAT, width: 32, height: 32, @@ -645,14 +645,14 @@ fn((t) => { const COLOR_FORMAT = 'rgba8unorm'; const DEPTH_STENCIL_FORMAT = 'depth24plus-stencil8'; - const colorTexture = t.createTexture({ + const colorTexture = t.createTestTexture({ format: COLOR_FORMAT, width: 32, height: 32, mipLevelCount: MIP_LEVEL_COUNT, arrayLayerCount: ARRAY_LAYER_COUNT }); - const depthStencilTexture = t.createTexture({ + const depthStencilTexture = t.createTestTexture({ format: DEPTH_STENCIL_FORMAT, width: 32, height: 32, @@ -707,8 +707,8 @@ desc( ` ). fn((t) => { - const colorTexture = t.createTexture({ sampleCount: 1 }); - const resolveTargetTexture = t.createTexture({ sampleCount: 1 }); + const colorTexture = t.createTestTexture({ sampleCount: 1 }); + const resolveTargetTexture = t.createTestTexture({ sampleCount: 1 }); const descriptor = { colorAttachments: [ @@ -734,8 +734,8 @@ desc( ` ). fn((t) => { - const colorTexture = t.createTexture({ sampleCount: 1 }); - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); + const colorTexture = t.createTestTexture({ sampleCount: 1 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); { // It is allowed to use a multisampled color attachment without setting resolve target @@ -764,8 +764,8 @@ desc( ` ). fn((t) => { - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const multisampledResolveTargetTexture = t.createTexture({ sampleCount: 4 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const multisampledResolveTargetTexture = t.createTestTexture({ sampleCount: 4 }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = multisampledResolveTargetTexture.createView(); @@ -785,8 +785,8 @@ desc( ` ). fn((t) => { - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ arrayLayerCount: 2 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ arrayLayerCount: 2 }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTargetTexture.createView({ dimension: '2d-array' }); @@ -806,8 +806,8 @@ desc( ` ). fn((t) => { - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ mipLevelCount: 2 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ mipLevelCount: 2 }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTargetTexture.createView(); @@ -835,8 +835,8 @@ paramsSimple([ fn((t) => { const { usage } = t.params; - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ usage }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ usage }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTargetTexture.createView(); @@ -854,8 +854,8 @@ desc(`Test that a resolve target that has a error is invalid for color attachmen fn((t) => { const ARRAY_LAYER_COUNT = 1; - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ arrayLayerCount: ARRAY_LAYER_COUNT }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ arrayLayerCount: ARRAY_LAYER_COUNT }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); t.expectValidationError(() => { @@ -881,8 +881,8 @@ desc( ` ). fn((t) => { - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ sampleCount: 1 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ sampleCount: 1 }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTargetTexture.createView(); @@ -897,8 +897,8 @@ fn((t) => { g.test('resolveTarget,different_format'). desc(`Test that a resolve target that has a different format is invalid.`). fn((t) => { - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ format: 'bgra8unorm' }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); + const resolveTargetTexture = t.createTestTexture({ format: 'bgra8unorm' }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTargetTexture.createView(); @@ -918,8 +918,12 @@ desc( ). fn((t) => { const size = 16; - const multisampledColorTexture = t.createTexture({ width: size, height: size, sampleCount: 4 }); - const resolveTargetTexture = t.createTexture({ + const multisampledColorTexture = t.createTestTexture({ + width: size, + height: size, + sampleCount: 4 + }); + const resolveTargetTexture = t.createTestTexture({ width: size * 2, height: size * 2, mipLevelCount: 2 @@ -962,7 +966,7 @@ desc( ` ). fn((t) => { - const multisampledDepthStencilTexture = t.createTexture({ + const multisampledDepthStencilTexture = t.createTestTexture({ sampleCount: 4, format: 'depth24plus-stencil8' }); @@ -970,11 +974,11 @@ fn((t) => { { // It is not allowed to use a depth stencil attachment whose sample count is different from // the one of the color attachment. - const depthStencilTexture = t.createTexture({ + const depthStencilTexture = t.createTestTexture({ sampleCount: 1, format: 'depth24plus-stencil8' }); - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); const descriptor = { colorAttachments: [t.getColorAttachment(multisampledColorTexture)], depthStencilAttachment: t.getDepthStencilAttachment(depthStencilTexture) @@ -983,7 +987,7 @@ fn((t) => { t.tryRenderPass(false, descriptor); } { - const colorTexture = t.createTexture({ sampleCount: 1 }); + const colorTexture = t.createTestTexture({ sampleCount: 1 }); const descriptor = { colorAttachments: [t.getColorAttachment(colorTexture)], depthStencilAttachment: t.getDepthStencilAttachment(multisampledDepthStencilTexture) @@ -994,7 +998,7 @@ fn((t) => { { // It is allowed to use a multisampled depth stencil attachment whose sample count is equal to // the one of the color attachment. - const multisampledColorTexture = t.createTexture({ sampleCount: 4 }); + const multisampledColorTexture = t.createTestTexture({ sampleCount: 4 }); const descriptor = { colorAttachments: [t.getColorAttachment(multisampledColorTexture)], depthStencilAttachment: t.getDepthStencilAttachment(multisampledDepthStencilTexture) @@ -1055,13 +1059,11 @@ fn((t) => { stencilStoreOp } = t.params; - const depthAttachment = t.trackForCleanup( - t.device.createTexture({ - format, - size: { width: 1, height: 1, depthOrArrayLayers: 1 }, - usage: GPUTextureUsage.RENDER_ATTACHMENT - }) - ); + const depthAttachment = t.createTextureTracked({ + format, + size: { width: 1, height: 1, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); const depthAttachmentView = depthAttachment.createView(); const encoder = t.device.createCommandEncoder(); @@ -1125,7 +1127,7 @@ combine('depthClearValue', [undefined, -1.0, 0.0, 0.5, 1.0, 1.5]) fn((t) => { const { depthLoadOp, depthClearValue } = t.params; - const depthStencilTexture = t.createTexture({ + const depthStencilTexture = t.createTestTexture({ format: depthLoadOp === undefined ? 'stencil8' : 'depth24plus-stencil8' }); const depthStencilAttachment = t.getDepthStencilAttachment(depthStencilTexture); @@ -1136,7 +1138,7 @@ fn((t) => { } const descriptor = { - colorAttachments: [t.getColorAttachment(t.createTexture())], + colorAttachments: [t.getColorAttachment(t.createTestTexture())], depthStencilAttachment }; @@ -1167,8 +1169,8 @@ fn((t) => { const { format } = t.params; const info = kTextureFormatInfo[format]; - const multisampledColorTexture = t.createTexture({ format, sampleCount: 4 }); - const resolveTarget = t.createTexture({ format }); + const multisampledColorTexture = t.createTestTexture({ format, sampleCount: 4 }); + const resolveTarget = t.createTestTexture({ format }); const colorAttachment = t.getColorAttachment(multisampledColorTexture); colorAttachment.resolveTarget = resolveTarget.createView(); @@ -1196,14 +1198,14 @@ fn((t) => { const { queryType } = t.params; const timestampWrites = { - querySet: t.device.createQuerySet({ type: queryType, count: 2 }), + querySet: t.createQuerySetTracked({ type: queryType, count: 2 }), beginningOfPassWriteIndex: 0, endOfPassWriteIndex: 1 }; const isValid = queryType === 'timestamp'; - const colorTexture = t.createTexture(); + const colorTexture = t.createTestTexture(); const descriptor = { colorAttachments: [t.getColorAttachment(colorTexture)], timestampWrites @@ -1231,7 +1233,7 @@ fn((t) => { const querySetCount = 2; const timestampWrites = { - querySet: t.device.createQuerySet({ type: 'timestamp', count: querySetCount }), + querySet: t.createQuerySetTracked({ type: 'timestamp', count: querySetCount }), beginningOfPassWriteIndex, endOfPassWriteIndex }; @@ -1241,7 +1243,7 @@ fn((t) => { beginningOfPassWriteIndex === undefined || beginningOfPassWriteIndex < querySetCount) && ( endOfPassWriteIndex === undefined || endOfPassWriteIndex < querySetCount); - const colorTexture = t.createTexture(); + const colorTexture = t.createTestTexture(); const descriptor = { colorAttachments: [t.getColorAttachment(colorTexture)], timestampWrites @@ -1261,12 +1263,12 @@ beforeAllSubcases((t) => { fn((t) => { const { queryType } = t.params; - const querySet = t.device.createQuerySet({ + const querySet = t.createQuerySetTracked({ type: queryType, count: 1 }); - const colorTexture = t.createTexture(); + const colorTexture = t.createTestTexture(); const descriptor = { colorAttachments: [t.getColorAttachment(colorTexture)], occlusionQuerySet: querySet diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/resolve.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/resolve.spec.js index b9d60091f8f..183d8bd6594 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/resolve.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pass/resolve.spec.js @@ -108,7 +108,7 @@ fn((t) => { // color attachment with resolve target. if (resolveSlot === colorAttachmentSlot) { // Create the color attachment with resolve target with the configurable parameters. - const resolveSourceColorAttachment = t.device.createTexture({ + const resolveSourceColorAttachment = t.createTextureTracked({ format: colorAttachmentFormat, size: { width: colorAttachmentWidth, @@ -119,7 +119,7 @@ fn((t) => { usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const resolveTarget = t.device.createTexture({ + const resolveTarget = t.createTextureTracked({ format: resolveTargetFormat, size: { width: resolveTargetWidth, @@ -149,7 +149,7 @@ fn((t) => { } else { // Create a basic texture to fill other color attachment slots. This texture's dimensions // and sample count must match the resolve source color attachment to be valid. - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: otherAttachmentFormat, size: { width: colorAttachmentWidth, @@ -160,7 +160,7 @@ fn((t) => { usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - const resolveTarget = t.device.createTexture({ + const resolveTarget = t.createTextureTracked({ format: otherAttachmentFormat, size: { width: colorAttachmentWidth, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/common.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/common.js index 2b4283b32c6..6785346a2f3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/common.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/common.js @@ -6,6 +6,8 @@ kDefaultVertexShaderCode } from '../../../util/shader.js'; import { ValidationTest } from '../validation_test.js'; + + const values = [0, 1, 0, 1]; export class CreateRenderPipelineValidationTest extends ValidationTest { getDescriptor( @@ -19,17 +21,16 @@ export class CreateRenderPipelineValidationTest extends ValidationTest { {}) { - const defaultTargets = [{ format: 'rgba8unorm' }]; const { primitive = {}, - targets = defaultTargets, + targets = [{ format: 'rgba8unorm' }], multisample = {}, depthStencil, fragmentShaderCode = getFragmentShaderCodeWithOutput([ { values, plainType: getPlainTypeInfo( - kTextureFormatInfo[targets[0] ? targets[0].format : 'rgba8unorm'].sampleType + kTextureFormatInfo[targets[0] ? targets[0].format : 'rgba8unorm'].color.type ), componentCount: 4 }] diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/depth_stencil_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/depth_stencil_state.spec.js index d47041b4fc1..8be7ee6e884 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/depth_stencil_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/depth_stencil_state.spec.js @@ -5,7 +5,11 @@ This test dedicatedly tests validation of GPUDepthStencilState of createRenderPi `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { unreachable } from '../../../../common/util/util.js'; import { kCompareFunctions, kStencilOperations } from '../../../capability_info.js'; -import { kTextureFormats, kTextureFormatInfo, kDepthStencilFormats } from '../../../format_info.js'; +import { + kAllTextureFormats, + kTextureFormatInfo, + kDepthStencilFormats } from +'../../../format_info.js'; import { getFragmentShaderCodeWithOutput } from '../../../util/shader.js'; import { CreateRenderPipelineValidationTest } from './common.js'; @@ -14,7 +18,11 @@ export const g = makeTestGroup(CreateRenderPipelineValidationTest); g.test('format'). desc(`The texture format in depthStencilState must be a depth/stencil format.`). -params((u) => u.combine('isAsync', [false, true]).combine('format', kTextureFormats)). +params((u) => +u // +.combine('isAsync', [false, true]). +combine('format', kAllTextureFormats) +). beforeAllSubcases((t) => { const { format } = t.params; const info = kTextureFormatInfo[format]; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/fragment_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/fragment_state.spec.js index 6e7a46e943c..1b0f0dd08a0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/fragment_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/fragment_state.spec.js @@ -3,22 +3,24 @@ **/export const description = ` This test dedicatedly tests validation of GPUFragmentState of createRenderPipeline. `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { range } from '../../../../common/util/util.js'; +import { assert, range } from '../../../../common/util/util.js'; import { kBlendFactors, kBlendOperations, kMaxColorAttachmentsToTest } from '../../../capability_info.js'; import { - kTextureFormats, + kAllTextureFormats, kRenderableColorTextureFormats, kTextureFormatInfo, - computeBytesPerSampleFromFormats } from + computeBytesPerSampleFromFormats, + kColorTextureFormats } from '../../../format_info.js'; import { getFragmentShaderCodeWithOutput, getPlainTypeInfo, - kDefaultFragmentShaderCode } from + kDefaultFragmentShaderCode, + kDefaultVertexShaderCode } from '../../../util/shader.js'; import { kTexelRepresentationInfo } from '../../../util/texture/texel_data.js'; @@ -49,9 +51,60 @@ fn((t) => { t.doCreateRenderPipelineTest(isAsync, false, badDescriptor); }); +g.test('targets_format_is_color_format'). +desc( + `Tests that color target state format must be a color format, regardless of how the + fragment shader writes to it.` +). +params((u) => +u +// Test all non-color texture formats, plus 'rgba8unorm' as a control case. +.combine('format', kAllTextureFormats). +filter(({ format }) => { + return format === 'rgba8unorm' || !kTextureFormatInfo[format].color; +}). +combine('isAsync', [false, true]). +beginSubcases(). +combine('fragOutType', ['f32', 'u32', 'i32']) +). +beforeAllSubcases((t) => { + const { format } = t.params; + const info = kTextureFormatInfo[format]; + t.skipIfTextureFormatNotSupported(t.params.format); + t.selectDeviceOrSkipTestCase(info.feature); +}). +fn((t) => { + const { isAsync, format, fragOutType } = t.params; + + const fragmentShaderCode = getFragmentShaderCodeWithOutput([ + { values, plainType: fragOutType, componentCount: 4 }] + ); + + const success = format === 'rgba8unorm' && fragOutType === 'f32'; + t.doCreateRenderPipelineTest(isAsync, success, { + vertex: { + module: t.device.createShaderModule({ code: kDefaultVertexShaderCode }), + entryPoint: 'main' + }, + fragment: { + module: t.device.createShaderModule({ code: fragmentShaderCode }), + entryPoint: 'main', + targets: [{ format }] + }, + layout: 'auto' + }); +}); + g.test('targets_format_renderable'). -desc(`Tests that color target state format must have RENDER_ATTACHMENT capability.`). -params((u) => u.combine('isAsync', [false, true]).combine('format', kTextureFormats)). +desc( + `Tests that color target state format must have RENDER_ATTACHMENT capability + (tests only color formats).` +). +params((u) => +u // +.combine('isAsync', [false, true]). +combine('format', kColorTextureFormats) +). beforeAllSubcases((t) => { const { format } = t.params; const info = kTextureFormatInfo[format]; @@ -158,22 +211,10 @@ combineWithParams([ // become 4 and 4+4+8+16+1 > 32. Re-ordering this so the R8Unorm's are at the end, however // is allowed: 4+8+16+1+1 < 32. { - formats: [ - 'r8unorm', - 'r32float', - 'rgba8unorm', - 'rgba32float', - 'r8unorm'] - + formats: ['r8unorm', 'r32float', 'rgba8unorm', 'rgba32float', 'r8unorm'] }, { - formats: [ - 'r32float', - 'rgba8unorm', - 'rgba32float', - 'r8unorm', - 'r8unorm'] - + formats: ['r32float', 'rgba8unorm', 'rgba32float', 'r8unorm', 'r8unorm'] }] ). beginSubcases(). @@ -203,8 +244,7 @@ g.test('targets_format_filterable'). desc( ` Tests that color target state format must be filterable if blend is not undefined. - - TODO: info.colorRender.blend now directly says whether the format is blendable. Use that.` + ` ). params((u) => u. @@ -232,7 +272,9 @@ fn((t) => { }); - t.doCreateRenderPipelineTest(isAsync, !hasBlend || info.color.type === 'float', descriptor); + const supportsBlend = info.colorRender?.blend; + assert(supportsBlend !== undefined); + t.doCreateRenderPipelineTest(isAsync, !hasBlend || supportsBlend, descriptor); }); g.test('targets_blend'). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/inter_stage.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/inter_stage.spec.js index f6280ccf76b..cd26b00af05 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/inter_stage.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/inter_stage.spec.js @@ -5,12 +5,23 @@ Interface matching between vertex and fragment shader validation for createRende `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { range } from '../../../../common/util/util.js'; + import { CreateRenderPipelineValidationTest } from './common.js'; function getVarName(i) { return `v${i}`; } +function skipIfDisallowedInterpolationParameter(t, ...wgsl) { + if (t.isCompatibility) { + for (const s of wgsl) { + if (s.includes('linear') || s.includes('sample')) { + t.skip(`unsupported interpolation parameter in compat: ${wgsl}`); + } + } + } +} + class InterStageMatchingValidationTest extends CreateRenderPipelineValidationTest { getVertexStateWithOutputs(outputs) { return { @@ -146,8 +157,8 @@ fn((t) => { const { isAsync, output, input } = t.params; const descriptor = t.getDescriptorWithStates( - t.getVertexStateWithOutputs([`@location(0) @interpolate(flat) vout0: ${output}`]), - t.getFragmentStateWithInputs([`@location(0) @interpolate(flat) fin0: ${input}`]) + t.getVertexStateWithOutputs([`@location(0) @interpolate(flat, either) vout0: ${output}`]), + t.getFragmentStateWithInputs([`@location(0) @interpolate(flat, either) fin0: ${input}`]) ); t.doCreateRenderPipelineTest(isAsync, output === input, descriptor); @@ -167,8 +178,8 @@ u.combine('isAsync', [false, true]).combineWithParams([ { output: '', input: '@interpolate(linear)' }, { output: '@interpolate(perspective)', input: '@interpolate(perspective)' }, { output: '@interpolate(linear)', input: '@interpolate(perspective)' }, -{ output: '@interpolate(flat)', input: '@interpolate(perspective)' }, -{ output: '@interpolate(linear)', input: '@interpolate(flat)' }, +{ output: '@interpolate(flat, either)', input: '@interpolate(perspective)' }, +{ output: '@interpolate(linear)', input: '@interpolate(flat, either)' }, { output: '@interpolate(linear, center)', input: '@interpolate(linear, center)', @@ -176,6 +187,9 @@ u.combine('isAsync', [false, true]).combineWithParams([ }] ) ). +beforeAllSubcases((t) => { + skipIfDisallowedInterpolationParameter(t, t.params.output, t.params.input); +}). fn((t) => { const { isAsync, output, input, _success, _compat_success } = t.params; @@ -209,7 +223,7 @@ u.combine('isAsync', [false, true]).combineWithParams([ _success: true, _compat_success: false }, -{ output: '@interpolate(flat)', input: '@interpolate(flat)' }, +{ output: '@interpolate(flat, either)', input: '@interpolate(flat, either)' }, { output: '@interpolate(perspective)', input: '@interpolate(perspective, sample)' }, { output: '@interpolate(perspective, center)', input: '@interpolate(perspective, sample)' }, { @@ -219,6 +233,9 @@ u.combine('isAsync', [false, true]).combineWithParams([ { output: '@interpolate(perspective, centroid)', input: '@interpolate(perspective)' }] ) ). +beforeAllSubcases((t) => { + skipIfDisallowedInterpolationParameter(t, t.params.output, t.params.input); +}). fn((t) => { const { isAsync, output, input, _success, _compat_success } = t.params; @@ -262,11 +279,14 @@ desc( ). params((u) => u.combine('isAsync', [false, true]).combineWithParams([ -// Number of user-defined output scalar components in test shader = device.limits.maxInterStageShaderComponents + numScalarDelta. +// Number of user-defined output scalar components in test shader = +// Math.floor((device.limits.maxInterStageShaderComponents + numScalarDelta) / 4) * 4. { numScalarDelta: 0, topology: 'triangle-list', _success: true }, { numScalarDelta: 1, topology: 'triangle-list', _success: false }, { numScalarDelta: 0, topology: 'point-list', _success: false }, -{ numScalarDelta: -1, topology: 'point-list', _success: true }] +{ numScalarDelta: -1, topology: 'point-list', _success: false }, +{ numScalarDelta: -3, topology: 'point-list', _success: false }, +{ numScalarDelta: -4, topology: 'point-list', _success: true }] ) ). fn((t) => { @@ -301,18 +321,20 @@ desc( ). params((u) => u.combine('isAsync', [false, true]).combineWithParams([ -// Number of user-defined input scalar components in test shader = device.limits.maxInterStageShaderComponents + numScalarDelta. +// Number of user-defined input scalar components in test shader = +// Math.floor((device.limits.maxInterStageShaderComponents + numScalarDelta) / 4) * 4. { numScalarDelta: 0, useExtraBuiltinInputs: false }, { numScalarDelta: 1, useExtraBuiltinInputs: false }, { numScalarDelta: 0, useExtraBuiltinInputs: true }, { numScalarDelta: -3, useExtraBuiltinInputs: true }, -{ numScalarDelta: -2, useExtraBuiltinInputs: true }] +{ numScalarDelta: -4, useExtraBuiltinInputs: true }] ) ). fn((t) => { const { isAsync, numScalarDelta, useExtraBuiltinInputs } = t.params; - const numScalarComponents = t.device.limits.maxInterStageShaderComponents + numScalarDelta; + const numScalarComponents = + Math.floor((t.device.limits.maxInterStageShaderComponents + numScalarDelta) / 4) * 4; const numExtraComponents = useExtraBuiltinInputs ? t.isCompatibility ? 2 : 3 : 0; const numUsedComponents = numScalarComponents + numExtraComponents; const success = numUsedComponents <= t.device.limits.maxInterStageShaderComponents; @@ -330,12 +352,12 @@ fn((t) => { } if (useExtraBuiltinInputs) { - inputs.push( - '@builtin(front_facing) front_facing_in: bool', - '@builtin(sample_mask) sample_mask_in: u32' - ); + inputs.push('@builtin(front_facing) front_facing_in: bool'); if (!t.isCompatibility) { - inputs.push('@builtin(sample_index) sample_index_in: u32'); + inputs.push( + '@builtin(sample_mask) sample_mask_in: u32', + '@builtin(sample_index) sample_index_in: u32' + ); } } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/misc.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/misc.spec.js index 79dddb51e03..38bc1f34534 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/misc.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/misc.spec.js @@ -19,6 +19,20 @@ fn((t) => { t.doCreateRenderPipelineTest(isAsync, true, descriptor); }); +g.test('no_attachment'). +desc(`Test that createRenderPipeline fails without any attachment.`). +params((u) => u.combine('isAsync', [false, true])). +fn((t) => { + const { isAsync } = t.params; + + const descriptor = t.getDescriptor({ + noFragment: true, + depthStencil: undefined + }); + + t.doCreateRenderPipelineTest(isAsync, false, descriptor); +}); + g.test('vertex_state_only'). desc( `Tests creating vertex-state-only render pipeline. A vertex-only render pipeline has no fragment @@ -34,7 +48,11 @@ combine('depthStencilFormat', [ 'depth32float', ''] ). -combine('hasColor', [false, true]) +combine('hasColor', [false, true]). +unless(({ depthStencilFormat, hasColor }) => { + // Render pipeline needs at least one attachement + return hasColor === false && depthStencilFormat === ''; +}) ). fn((t) => { const { isAsync, depthStencilFormat, hasColor } = t.params; @@ -95,4 +113,38 @@ fn((t) => { }; t.doCreateRenderPipelineTest(isAsync, !mismatched, descriptor); +}); + +g.test('external_texture'). +desc('Tests createRenderPipeline() with an external_texture'). +fn((t) => { + const shader = t.device.createShaderModule({ + code: ` + @vertex + fn vertexMain() -> @builtin(position) vec4f { + return vec4f(1); + } + + @group(0) @binding(0) var myTexture: texture_external; + + @fragment + fn fragmentMain() -> @location(0) vec4f { + let result = textureLoad(myTexture, vec2u(1, 1)); + return vec4f(1); + } + ` + }); + + const descriptor = { + layout: 'auto', + vertex: { + module: shader + }, + fragment: { + module: shader, + targets: [{ format: 'rgba8unorm' }] + } + }; + + t.doCreateRenderPipelineTest(false, true, descriptor); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/resource_compatibility.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/resource_compatibility.spec.js new file mode 100644 index 00000000000..d2e6a38930d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/resource_compatibility.spec.js @@ -0,0 +1,102 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Tests for resource compatibilty between pipeline layout and shader modules + `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { + kAPIResources, + getWGSLShaderForResource, + getAPIBindGroupLayoutForResource, + doResourcesMatch } from +'../utils.js'; + +import { CreateRenderPipelineValidationTest } from './common.js'; + +export const g = makeTestGroup(CreateRenderPipelineValidationTest); + +g.test('resource_compatibility'). +desc( + 'Tests validation of resource (bind group) compatibility between pipeline layout and WGSL shader' +). +params((u) => +u // +.combine('stage', ['vertex', 'fragment']). +combine('apiResource', keysOf(kAPIResources)). +filter((t) => { + const res = kAPIResources[t.apiResource]; + if (t.stage === 'vertex') { + if (res.buffer && res.buffer.type === 'storage') { + return false; + } + if (res.storageTexture && res.storageTexture.access !== 'read-only') { + return false; + } + } + return true; +}). +beginSubcases(). +combine('isAsync', [true, false]). +combine('wgslResource', keysOf(kAPIResources)) +). +fn((t) => { + const apiResource = kAPIResources[t.params.apiResource]; + const wgslResource = kAPIResources[t.params.wgslResource]; + t.skipIf( + wgslResource.storageTexture !== undefined && + wgslResource.storageTexture.access !== 'write-only' && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'Storage textures require language feature' + ); + t.skipIf( + t.params.stage === 'vertex' && ( + wgslResource.buffer !== undefined && wgslResource.buffer.type === 'storage' || + wgslResource.storageTexture !== undefined && + wgslResource.storageTexture.access !== 'read-only'), + 'Storage buffers and textures cannot be used in vertex shaders' + ); + const emptyVS = ` +@vertex +fn main() -> @builtin(position) vec4f { + return vec4f(); +} +`; + const emptyFS = ` +@fragment +fn main() -> @location(0) vec4f { + return vec4f(); +} +`; + + const code = getWGSLShaderForResource(t.params.stage, wgslResource); + const vsCode = t.params.stage === 'vertex' ? code : emptyVS; + const fsCode = t.params.stage === 'fragment' ? code : emptyFS; + const gpuStage = + t.params.stage === 'vertex' ? GPUShaderStage.VERTEX : GPUShaderStage.FRAGMENT; + const layout = t.device.createPipelineLayout({ + bindGroupLayouts: [getAPIBindGroupLayoutForResource(t.device, gpuStage, apiResource)] + }); + + const descriptor = { + layout, + vertex: { + module: t.device.createShaderModule({ + code: vsCode + }), + entryPoint: 'main' + }, + fragment: { + module: t.device.createShaderModule({ + code: fsCode + }), + entryPoint: 'main', + targets: [{ format: 'rgba8unorm' }] + } + }; + + t.doCreateRenderPipelineTest( + t.params.isAsync, + doResourcesMatch(apiResource, wgslResource), + descriptor + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/shader_module.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/shader_module.spec.js index 72b44e6811e..fc8c8e782d8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/shader_module.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/render_pipeline/shader_module.spec.js @@ -82,6 +82,13 @@ fn((t) => { }) : t.createInvalidShaderModule(), entryPoint: 'main' + }, + // Specify a color attachment so we have at least one render target. + fragment: { + targets: [{ format: 'rgba8unorm' }], + module: t.device.createShaderModule({ + code: `@fragment fn main() -> @location(0) vec4f { return vec4f(0); }` + }) } }); }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/buffer/in_pass_encoder.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/buffer/in_pass_encoder.spec.js index d4a6fac4dad..c68af3e3a32 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/buffer/in_pass_encoder.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/buffer/in_pass_encoder.spec.js @@ -63,7 +63,7 @@ export class BufferResourceUsageTest extends ValidationTest { } beginSimpleRenderPass(encoder) { - const colorTexture = this.device.createTexture({ + const colorTexture = this.createTextureTracked({ format: 'rgba8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [16, 16, 1] @@ -694,7 +694,7 @@ fn((t) => { renderPassEncoder.drawIndirect(buffer, offset); break; case 'indexedIndirect':{ - const indexBuffer = t.device.createBuffer({ + const indexBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.INDEX }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_pass_encoder.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_pass_encoder.spec.js index 7977c3fb9dd..d607ef1eeb3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_pass_encoder.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_pass_encoder.spec.js @@ -29,7 +29,7 @@ const kTextureBindingTypes = [ const SIZE = 32; class TextureUsageTracking extends ValidationTest { - createTexture( + createTestTexture( options = @@ -50,7 +50,7 @@ class TextureUsageTracking extends ValidationTest { usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING } = options; - return this.device.createTexture({ + return this.createTextureTracked({ size: { width, height, depthOrArrayLayers: arrayLayerCount }, mipLevelCount, sampleCount, @@ -147,7 +147,7 @@ class TextureUsageTracking extends ValidationTest { * Create two bind groups with one texture view. */ makeTwoBindGroupsWithOneTextureView(usage1, usage2) { - const view = this.createTexture({ + const view = this.createTestTexture({ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING }).createView(); const bindGroupLayouts = [ @@ -194,7 +194,7 @@ class TextureUsageTracking extends ValidationTest { const encoder = this.device.createCommandEncoder(); const pass = compute ? encoder.beginComputePass() : - this.beginSimpleRenderPass(encoder, this.createTexture().createView()); + this.beginSimpleRenderPass(encoder, this.createTestTexture().createView()); // Create pipeline. Note that bindings unused in pipeline should be validated too. const pipelineLayout = this.device.createPipelineLayout({ @@ -489,7 +489,7 @@ fn((t) => { 'multiple views of the same texture in a single draw/dispatch are not supported in compat, nor are sub ranges of layers' ); - const texture = t.createTexture({ + const texture = t.createTestTexture({ arrayLayerCount: TOTAL_LAYERS, mipLevelCount: TOTAL_LEVELS, usage: @@ -553,7 +553,7 @@ fn((t) => { encoder.beginComputePass() : t.beginSimpleRenderPass( encoder, - type1 === 'render-target' ? view1 : t.createTexture().createView() + type1 === 'render-target' ? view1 : t.createTestTexture().createView() ); const bgls = []; @@ -721,7 +721,7 @@ fn((t) => { t.skipIf(t.isCompatibility, 'sub ranges of layers are not supported in compat mode'); - const texture = t.createTexture({ + const texture = t.createTestTexture({ arrayLayerCount: TOTAL_LAYERS, mipLevelCount: TOTAL_LEVELS, format @@ -759,7 +759,7 @@ fn((t) => { encoder.beginRenderPass({ colorAttachments: [ { - view: t.createTexture({ width: size, height: size }).createView(), + view: t.createTestTexture({ width: size, height: size }).createView(), clearValue: { r: 0.0, g: 1.0, b: 0.0, a: 1.0 }, loadOp: 'clear', storeOp: 'store' @@ -768,10 +768,10 @@ fn((t) => { depthStencilAttachment: depthStencilFormat ? { view: view1, - depthStoreOp: view1HasDepth ? 'discard' : undefined, depthLoadOp: view1HasDepth ? 'load' : undefined, - stencilStoreOp: view1HasStencil ? 'discard' : undefined, - stencilLoadOp: view1HasStencil ? 'load' : undefined + depthStoreOp: view1HasDepth ? 'discard' : undefined, + stencilLoadOp: view1HasStencil ? 'load' : undefined, + stencilStoreOp: view1HasStencil ? 'discard' : undefined } : undefined }); @@ -867,8 +867,8 @@ fn((t) => { } = t.params; const usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING; - const view = t.createTexture({ usage }).createView(); - const view2 = secondUseConflicts ? view : t.createTexture({ usage }).createView(); + const view = t.createTestTexture({ usage }).createView(); + const view2 = secondUseConflicts ? view : t.createTestTexture({ usage }).createView(); const bgl = t.device.createBindGroupLayout({ entries: [ @@ -901,7 +901,7 @@ fn((t) => { ); pass.end(); } else { - const pass = t.beginSimpleRenderPass(encoder, t.createTexture().createView()); + const pass = t.beginSimpleRenderPass(encoder, t.createTestTexture().createView()); pass.setBindGroup(0, bindGroup); pass.end(); } @@ -944,8 +944,8 @@ fn((t) => { GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.STORAGE_BINDING; - const view = t.createTexture({ usage }).createView(); - const view2 = secondUseConflicts ? view : t.createTexture({ usage }).createView(); + const view = t.createTestTexture({ usage }).createView(); + const view2 = secondUseConflicts ? view : t.createTestTexture({ usage }).createView(); const bgl = t.device.createBindGroupLayout({ entries: [{ binding: 0, visibility: readVisibility, ...readEntry }] }); @@ -991,9 +991,11 @@ combine('entry', [ fn((t) => { const { compute, callDrawOrDispatch, entry } = t.params; - const sampledView = t.createTexture().createView(); + const sampledView = t.createTestTexture().createView(); const sampledStorageView = t. - createTexture({ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING }). + createTestTexture({ + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING + }). createView(); // Create bindGroup0. It has two bindings. These two bindings use different views/subresources. @@ -1027,7 +1029,7 @@ fn((t) => { const encoder = t.device.createCommandEncoder(); const pass = compute ? encoder.beginComputePass() : - t.beginSimpleRenderPass(encoder, t.createTexture().createView()); + t.beginSimpleRenderPass(encoder, t.createTestTexture().createView()); // Set bindGroup0 and bindGroup1. bindGroup0 is replaced by bindGroup1 in the current pass. // But bindings in bindGroup0 should be validated too. @@ -1123,7 +1125,7 @@ fn((t) => { GPUTextureUsage[_usage0] | GPUTextureUsage[_usage1] | GPUTextureUsage.RENDER_ATTACHMENT : GPUTextureUsage[_usage0] | GPUTextureUsage[_usage1]; const view = t. - createTexture({ + createTestTexture({ usage, sampleCount: _sampleCount }). @@ -1150,7 +1152,9 @@ fn((t) => { // As a result, only one binding's type is 'render-target' at most. const pass = t.beginSimpleRenderPass( encoder, - type0 === 'render-target' || type1 === 'render-target' ? view : t.createTexture().createView() + type0 === 'render-target' || type1 === 'render-target' ? + view : + t.createTestTexture().createView() ); const bindingsInBundle = [binding0InBundle, binding1InBundle]; @@ -1234,7 +1238,9 @@ fn((t) => { } const view = t. - createTexture({ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING }). + createTestTexture({ + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING + }). createView(); const bindGroup0 = t.createBindGroup(0, view, readOnlyUsage, '2d', { sampleType: 'unfilterable-float', @@ -1302,7 +1308,7 @@ fn((t) => { encoder.beginRenderPass({ colorAttachments: [ { - view: t.createTexture().createView(), + view: t.createTestTexture().createView(), clearValue: { r: 0.0, g: 1.0, b: 0.0, a: 1.0 }, loadOp: 'clear', storeOp: 'store' @@ -1381,7 +1387,7 @@ fn((t) => { break; case 'indirect': { - const indirectBuffer = t.device.createBuffer({ size: 4, usage: GPUBufferUsage.INDIRECT }); + const indirectBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.INDIRECT }); pass.dispatchWorkgroupsIndirect(indirectBuffer, 0); } break; @@ -1531,7 +1537,7 @@ fn((t) => { 'r32float' ); - const attachment = t.createTexture().createView(); + const attachment = t.createTestTexture().createView(); let pass = t.beginSimpleRenderPass(encoder, attachment); pass.setPipeline(pipelineUsingBG0); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_common.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_common.spec.js index 5ba4ecfcf7c..0821bb7954f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_common.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_common.spec.js @@ -117,7 +117,7 @@ unless((t) => t.inSamePass && t.level0 !== t.level1) fn((t) => { const { layer0, level0, layer1, level1, inSamePass } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, kTextureLayers], @@ -197,7 +197,7 @@ fn((t) => { inSamePass } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT | @@ -233,7 +233,7 @@ fn((t) => { } else { renderPass.end(); - const texture2 = t.device.createTexture({ + const texture2 = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1], @@ -309,7 +309,7 @@ fn((t) => { inSamePass } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'depth24plus-stencil8', usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers], @@ -354,7 +354,7 @@ fn((t) => { } else { renderPass.end(); - const texture2 = t.device.createTexture({ + const texture2 = t.createTextureTracked({ format: 'rgba8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1], @@ -435,7 +435,7 @@ combine('inSamePass', [true, false]) fn((t) => { const { bg0Levels, bg0Layers, bg1Levels, bg1Layers, bgUsage0, bgUsage1, inSamePass } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers], @@ -458,7 +458,7 @@ fn((t) => { const bindGroup0 = t.createBindGroupForTest(bg0, bgUsage0, 'unfilterable-float'); const bindGroup1 = t.createBindGroupForTest(bg1, bgUsage1, 'unfilterable-float'); - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1], @@ -543,7 +543,7 @@ fn((t) => { const { view0Levels, view0Layers, view1Levels, view1Layers, aspect0, aspect1, inSamePass } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'depth24plus-stencil8', usage: GPUTextureUsage.TEXTURE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers], @@ -571,7 +571,7 @@ fn((t) => { const bindGroup0 = t.createBindGroupForTest(bindGroupView0, 'sampled-texture', sampleType0); const bindGroup1 = t.createBindGroupForTest(bindGroupView1, 'sampled-texture', sampleType1); - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'rgba8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1], diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_misc.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_misc.spec.js index 0b7733c9d68..e052daeb2a8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_misc.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/resource_usages/texture/in_render_misc.spec.js @@ -15,7 +15,7 @@ class F extends ValidationTest { createBindGroupLayoutForTest( textureUsage, sampleType, - visibility = GPUShaderStage['FRAGMENT']) + visibility = GPUShaderStage.FRAGMENT) { const bindGroupLayoutEntry = { binding: 0, @@ -60,7 +60,7 @@ class F extends ValidationTest { textureView, textureUsage, sampleType, - visibility = GPUShaderStage['FRAGMENT']) + visibility = GPUShaderStage.FRAGMENT) { return this.device.createBindGroup({ layout: this.createBindGroupLayoutForTest(textureUsage, sampleType, visibility), @@ -91,7 +91,7 @@ combine('view2Binding', kTextureBindingTypes) fn((t) => { const { useDifferentTextureAsTexture2, baseLayer2, view1Binding, view2Binding } = t.params; - const texture0 = t.device.createTexture({ + const texture0 = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers] @@ -106,7 +106,7 @@ fn((t) => { const bindGroup1 = t.createBindGroupForTest(textureView0, view2Binding, 'unfilterable-float'); const texture2 = useDifferentTextureAsTexture2 ? - t.device.createTexture({ + t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers] @@ -124,7 +124,7 @@ fn((t) => { 'unfilterable-float' ); - const unusedColorTexture = t.device.createTexture({ + const unusedColorTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1] @@ -166,7 +166,7 @@ combine('depthStencilReadOnly', [true, false]) ). fn((t) => { const { bindAspect, depthStencilReadOnly } = t.params; - const depthStencilTexture = t.device.createTexture({ + const depthStencilTexture = t.createTextureTracked({ format: 'depth24plus-stencil8', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1], @@ -184,7 +184,7 @@ fn((t) => { bindAspect === 'depth-only' ? 'depth' : 'uint' ); - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING, size: [kTextureSize, kTextureSize, 1], @@ -241,7 +241,7 @@ fn((t) => { t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures'); } - const texture0 = t.device.createTexture({ + const texture0 = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING, size: [kTextureSize, kTextureSize, kTextureLayers] @@ -268,7 +268,7 @@ fn((t) => { ); const encoder = t.device.createCommandEncoder(); - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1] @@ -415,7 +415,7 @@ fn((t) => { } }); - const writableStorageTexture = t.device.createTexture({ + const writableStorageTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.STORAGE_BINDING, size: [kTextureSize, kTextureSize, 1] @@ -494,7 +494,7 @@ filter( fn((t) => { const { usage0, usage1 } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.COPY_SRC | @@ -541,7 +541,7 @@ fn((t) => { case 'readonly-storage-texture': case 'writeonly-storage-texture': case 'readwrite-storage-texture':{ - const colorTexture = t.device.createTexture({ + const colorTexture = t.createTextureTracked({ format: 'r32float', usage: GPUTextureUsage.RENDER_ATTACHMENT, size: [kTextureSize, kTextureSize, 1] diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/state/device_lost/destroy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/state/device_lost/destroy.spec.js index e8a43b50f71..9e3a68faf2f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/state/device_lost/destroy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/state/device_lost/destroy.spec.js @@ -135,7 +135,7 @@ combine('mappedAtCreation', [true, false]) fn(async (t) => { const { awaitLost, usageType, usageCopy, mappedAtCreation } = t.params; await t.executeAfterDestroy(() => { - t.device.createBuffer({ + t.createBufferTracked({ size: 16, usage: kBufferUsageInfo[usageType] | kBufferUsageCopyInfo[usageCopy], mappedAtCreation @@ -173,7 +173,7 @@ fn(async (t) => { const { awaitLost, format, usageType, usageCopy } = t.params; const { blockWidth, blockHeight } = kTextureFormatInfo[format]; await t.executeAfterDestroy(() => { - t.device.createTexture({ + t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: kTextureUsageTypeInfo[usageType] | kTextureUsageCopyInfo[usageCopy], format @@ -212,7 +212,7 @@ fn(async (t) => { const { awaitLost, format, usageType, usageCopy } = t.params; const { blockWidth, blockHeight } = kTextureFormatInfo[format]; await t.executeAfterDestroy(() => { - t.device.createTexture({ + t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: kTextureUsageTypeInfo[usageType] | kTextureUsageCopyInfo[usageCopy], format @@ -249,7 +249,7 @@ beforeAllSubcases((t) => { fn(async (t) => { const { awaitLost, format, usageType, usageCopy } = t.params; const { blockWidth, blockHeight } = kTextureFormatInfo[format]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: kTextureUsageTypeInfo[usageType] | kTextureUsageCopyInfo[usageCopy], format @@ -289,7 +289,7 @@ beforeAllSubcases((t) => { fn(async (t) => { const { awaitLost, format, usageType, usageCopy } = t.params; const { blockWidth, blockHeight } = kTextureFormatInfo[format]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: kTextureUsageTypeInfo[usageType] | kTextureUsageCopyInfo[usageCopy], format @@ -664,7 +664,7 @@ beforeAllSubcases((t) => { fn(async (t) => { const { awaitLost, type } = t.params; await t.executeAfterDestroy(() => { - t.device.createQuerySet({ type, count: 4 }); + t.createQuerySetTracked({ type, count: 4 }); }, awaitLost); }); @@ -722,11 +722,11 @@ params((u) => u.combine('stage', kCommandValidationStages).combine('awaitLost', fn(async (t) => { const { stage, awaitLost } = t.params; const kBufferSize = 16; - const src = t.device.createBuffer({ + const src = t.createBufferTracked({ size: kBufferSize, usage: GPUBufferUsage.COPY_SRC }); - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: kBufferSize, usage: GPUBufferUsage.COPY_DST }); @@ -754,13 +754,13 @@ fn(async (t) => { blockHeight } = kTextureFormatInfo[format]; const src = { - buffer: t.device.createBuffer({ + buffer: t.createBufferTracked({ size: bytesPerBlock, usage: GPUBufferUsage.COPY_SRC }) }; const dst = { - texture: t.device.createTexture({ + texture: t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUTextureUsage.COPY_DST, format @@ -791,14 +791,14 @@ fn(async (t) => { blockHeight } = kTextureFormatInfo[format]; const src = { - texture: t.device.createTexture({ + texture: t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUTextureUsage.COPY_SRC, format }) }; const dst = { - buffer: t.device.createBuffer({ + buffer: t.createBufferTracked({ size: bytesPerBlock, usage: GPUBufferUsage.COPY_DST }) @@ -824,14 +824,14 @@ fn(async (t) => { const format = 'rgba32uint'; const { blockWidth, blockHeight } = kTextureFormatInfo[format]; const src = { - texture: t.device.createTexture({ + texture: t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUTextureUsage.COPY_SRC, format }) }; const dst = { - texture: t.device.createTexture({ + texture: t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUBufferUsage.COPY_DST, format @@ -856,7 +856,7 @@ params((u) => u.combine('stage', kCommandValidationStages).combine('awaitLost', fn(async (t) => { const { stage, awaitLost } = t.params; const kBufferSize = 16; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: kBufferSize, usage: GPUBufferUsage.COPY_SRC }); @@ -894,7 +894,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const { type, stage, awaitLost } = t.params; - const querySet = t.device.createQuerySet({ type, count: 2 }); + const querySet = t.createQuerySetTracked({ type, count: 2 }); await t.executeCommandsAfterDestroy(stage, awaitLost, 'non-pass', (maker) => { try { @@ -1022,7 +1022,7 @@ Tests writeBuffer on queue on destroyed device. params((u) => u.combine('numElements', [4, 8, 16]).combine('awaitLost', [true, false])). fn(async (t) => { const { numElements, awaitLost } = t.params; - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: numElements, usage: GPUBufferUsage.COPY_DST }); @@ -1050,7 +1050,7 @@ fn(async (t) => { color: { bytes: bytesPerBlock } } = kTextureFormatInfo[format]; const data = new Uint8Array(bytesPerBlock); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUTextureUsage.COPY_DST, format @@ -1089,7 +1089,7 @@ fn(async (t) => { color: { bytes: bytesPerBlock } } = kTextureFormatInfo[format]; const data = new Uint8Array(bytesPerBlock); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: blockWidth, height: blockHeight }, usage: GPUTextureUsage.COPY_DST, format @@ -1120,7 +1120,7 @@ combine('awaitLost', [true, false]) fn(async (t) => { const { canvasType, contextType, awaitLost } = t.params; const canvas = createCanvas(t, canvasType, 1, 1); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 1, height: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST @@ -1156,7 +1156,7 @@ fn(async (t) => { } const imageBitmap = await createImageBitmap(new ImageData(new Uint8ClampedArray(4), 1, 1)); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width: 1, height: 1 }, format: 'bgra8unorm', usage: GPUTextureUsage.COPY_DST diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js index 57e1c5a23e5..b34e15b402b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js @@ -55,7 +55,7 @@ fn((t) => { format: 'bgra8unorm', usage: GPUConst.TextureUsage.STORAGE }; - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }); g.test('create_bind_group_layout'). @@ -81,37 +81,6 @@ fn((t) => { }); }); -g.test('create_shader_module_with_bgra8unorm_storage'). -desc( - ` -Test that it is valid to declare the format of a storage texture as bgra8unorm in a shader module if -the feature bgra8unorm-storage is enabled. -` -). -beforeAllSubcases((t) => { - t.selectDeviceOrSkipTestCase('bgra8unorm-storage'); -}). -params((u) => u.combine('shaderType', ['fragment', 'compute'])). -fn((t) => { - const { shaderType } = t.params; - - t.testCreateShaderModuleWithBGRA8UnormStorage(shaderType, true); -}); - -g.test('create_shader_module_without_bgra8unorm_storage'). -desc( - ` -Test that it is invalid to declare the format of a storage texture as bgra8unorm in a shader module -if the feature bgra8unorm-storage is not enabled. -` -). -params((u) => u.combine('shaderType', ['fragment', 'compute'])). -fn((t) => { - const { shaderType } = t.params; - - t.testCreateShaderModuleWithBGRA8UnormStorage(shaderType, false); -}); - g.test('configure_storage_usage_on_canvas_context_without_bgra8unorm_storage'). desc( ` diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/destroy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/destroy.spec.js index 7f17d036838..645d76c5db7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/destroy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/destroy.spec.js @@ -29,7 +29,7 @@ desc('Test that invalid textures may be destroyed without generating validation fn(async (t) => { t.device.pushErrorScope('validation'); - const invalidTexture = t.device.createTexture({ + const invalidTexture = t.createTextureTracked({ size: [t.device.limits.maxTextureDimension2D + 1, 1, 1], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING @@ -89,8 +89,8 @@ fn((t) => { usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT }; - const colorTexture = t.device.createTexture(colorTextureDesc); - const depthStencilTexture = t.device.createTexture(depthStencilTextureDesc); + const colorTexture = t.createTextureTracked(colorTextureDesc); + const depthStencilTexture = t.createTextureTracked(depthStencilTextureDesc); if (colorTextureState === 'destroyedBeforeEncode') { colorTexture.destroy(); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/float32_filterable.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/float32_filterable.spec.js index 05575673f92..e744790d05f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/float32_filterable.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/float32_filterable.spec.js @@ -51,7 +51,7 @@ fn((t) => { t.expectValidationError(() => { t.device.createBindGroup({ - entries: [{ binding: 0, resource: t.device.createTexture(textureDesc).createView() }], + entries: [{ binding: 0, resource: t.createTextureTracked(textureDesc).createView() }], layout }); }, shouldError); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/rg11b10ufloat_renderable.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/rg11b10ufloat_renderable.spec.js index 29e796d6185..267ef8d024c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/rg11b10ufloat_renderable.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/texture/rg11b10ufloat_renderable.spec.js @@ -28,7 +28,7 @@ fn((t) => { sampleCount, usage: GPUConst.TextureUsage.RENDER_ATTACHMENT }; - t.device.createTexture(descriptor); + t.createTextureTracked(descriptor); }); g.test('begin_render_pass_single_sampled'). @@ -42,7 +42,7 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase('rg11b10ufloat-renderable'); }). fn((t) => { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, 1], format: 'rg11b10ufloat', sampleCount: 1, @@ -74,13 +74,13 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase('rg11b10ufloat-renderable'); }). fn((t) => { - const renderTexture = t.device.createTexture({ + const renderTexture = t.createTextureTracked({ size: [1, 1, 1], format: 'rg11b10ufloat', sampleCount: 4, usage: GPUConst.TextureUsage.RENDER_ATTACHMENT }); - const resolveTexture = t.device.createTexture({ + const resolveTexture = t.createTextureTracked({ size: [1, 1, 1], format: 'rg11b10ufloat', sampleCount: 1, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/utils.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/utils.js new file mode 100644 index 00000000000..de27f6773a2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/utils.js @@ -0,0 +1,275 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/ + + + + + + + +/** + * Returns an array of possible resources + */ +function generateResources() { + const resources = [ + // Buffers + { + buffer: { type: 'uniform' }, + code: `var res : array`, + staticUse: `res[0]` + }, + { + buffer: { type: 'storage' }, + code: `var res : array`, + staticUse: `res[0]` + }, + { + buffer: { type: 'read-only-storage' }, + code: `var res : array`, + staticUse: `res[0]` + }, + + // Samplers + { + sampler: { type: 'filtering' }, + code: `var res : sampler` + }, + { + sampler: { type: 'non-filtering' }, + code: `var res : sampler` + }, + { + sampler: { type: 'comparison' }, + code: `var res : sampler_comparison` + }, + // Multisampled textures + { + texture: { sampleType: 'depth', viewDimension: '2d', multisampled: true }, + code: `var res : texture_depth_multisampled_2d` + }, + { + texture: { sampleType: 'unfilterable-float', viewDimension: '2d', multisampled: true }, + code: `var res : texture_multisampled_2d` + }, + { + texture: { sampleType: 'sint', viewDimension: '2d', multisampled: true }, + code: `var res : texture_multisampled_2d` + }, + { + texture: { sampleType: 'uint', viewDimension: '2d', multisampled: true }, + code: `var res : texture_multisampled_2d` + }]; + + + // Sampled textures + const sampleDims = [ + '1d', + '2d', + '2d-array', + '3d', + 'cube', + 'cube-array']; + + const sampleTypes = ['float', 'unfilterable-float', 'sint', 'uint']; + const sampleWGSL = ['f32', 'f32', 'i32', 'u32']; + for (const dim of sampleDims) { + let i = 0; + for (const type of sampleTypes) { + resources.push({ + texture: { sampleType: type, viewDimension: dim, multisampled: false }, + code: `var res : texture_${dim.replace('-', '_')}<${sampleWGSL[i++]}>` + }); + } + } + + // Depth textures + const depthDims = ['2d', '2d-array', 'cube', 'cube-array']; + for (const dim of depthDims) { + resources.push({ + texture: { sampleType: 'depth', viewDimension: dim, multisampled: false }, + code: `var res : texture_depth_${dim.replace('-', '_')}` + }); + } + + // Storage textures + // Only cover r32uint, r32sint, and r32float here for ease of testing. + const storageDims = ['1d', '2d', '2d-array', '3d']; + const formats = ['r32float', 'r32sint', 'r32uint']; + const accesses = ['write-only', 'read-only', 'read-write']; + for (const dim of storageDims) { + for (const format of formats) { + for (const access of accesses) { + resources.push({ + storageTexture: { access, format, viewDimension: dim }, + code: `var res : texture_storage_${dim.replace('-', '_')}<${format},${access. + replace('-only', ''). + replace('-', '_')}>` + }); + } + } + } + + return resources; +} + +/** + * Returns a string suitable as a Record key. + */ +function resourceKey(res) { + if (res.buffer) { + return `${res.buffer.type}_buffer`; + } + if (res.sampler) { + return `${res.sampler.type}_sampler`; + } + if (res.texture) { + return `texture_${res.texture.sampleType}_${res.texture.viewDimension}_${res.texture.multisampled}`; + } + if (res.storageTexture) { + return `storage_texture_${res.storageTexture.viewDimension}_${res.storageTexture.format}_${res.storageTexture.access}`; + } + if (res.externalTexture) { + return `external_texture`; + } + return ``; +} + +/** + * Resource array converted to a Record for nicer test parameterization names. + */ +export const kAPIResources = Object.fromEntries( + generateResources().map((x) => [resourceKey(x), x]) +); + +/** + * Generates a shader of the specified stage using the specified resource at binding (0,0). + */ +export function getWGSLShaderForResource(stage, resource) { + let code = `@group(0) @binding(0) ${resource.code};\n`; + + code += `@${stage}`; + if (stage === 'compute') { + code += `@workgroup_size(1)`; + } + + let retTy = ''; + let retVal = ''; + if (stage === 'vertex') { + retTy = ' -> @builtin(position) vec4f'; + retVal = 'return vec4f();'; + } else if (stage === 'fragment') { + retTy = ' -> @location(0) vec4f'; + retVal = 'return vec4f();'; + } + code += ` +fn main() ${retTy} { + _ = ${resource.staticUse ?? 'res'}; + ${retVal} +} +`; + + return code; +} + +/** + * Generates a bind group layout for for the given resource at binding 0. + */ +export function getAPIBindGroupLayoutForResource( +device, +stage, +resource) +{ + const entry = { + binding: 0, + visibility: stage + }; + if (resource.buffer) { + entry.buffer = resource.buffer; + } + if (resource.sampler) { + entry.sampler = resource.sampler; + } + if (resource.texture) { + entry.texture = resource.texture; + } + if (resource.storageTexture) { + entry.storageTexture = resource.storageTexture; + } + if (resource.externalTexture) { + entry.externalTexture = resource.externalTexture; + } + + const entries = [entry]; + return device.createBindGroupLayout({ entries }); +} + +/** + * Returns true if the sample types are compatible. + */ +function doSampleTypesMatch(api, wgsl) { + if (api === 'float' || api === 'unfilterable-float') { + return wgsl === 'float' || wgsl === 'unfilterable-float'; + } + return api === wgsl; +} + +/** + * Returns true if the access modes are compatible. + */ +function doAccessesMatch(api, wgsl) { + if (api === 'read-write') { + return wgsl === 'read-write' || wgsl === 'write-only'; + } + return api === wgsl; +} + +/** + * Returns true if the resources are compatible. + */ +export function doResourcesMatch(api, wgsl) { + if (api.buffer) { + if (!wgsl.buffer) { + return false; + } + return api.buffer.type === wgsl.buffer.type; + } + if (api.sampler) { + if (!wgsl.sampler) { + return false; + } + return ( + api.sampler.type === wgsl.sampler.type || + api.sampler.type !== 'comparison' && wgsl.sampler.type !== 'comparison'); + + } + if (api.texture) { + if (!wgsl.texture) { + return false; + } + const aType = api.texture.sampleType; + const wType = wgsl.texture.sampleType; + return ( + doSampleTypesMatch(aType, wType) && + api.texture.viewDimension === wgsl.texture.viewDimension && + api.texture.multisampled === wgsl.texture.multisampled); + + } + if (api.storageTexture) { + if (!wgsl.storageTexture) { + return false; + } + const aAccess = api.storageTexture.access; + const wAccess = wgsl.storageTexture.access; + return ( + doAccessesMatch(aAccess, wAccess) && + api.storageTexture.format === wgsl.storageTexture.format && + api.storageTexture.viewDimension === wgsl.storageTexture.viewDimension); + + } + if (api.externalTexture) { + return wgsl.externalTexture !== undefined; + } + + return false; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/validation_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/validation_test.js index f602556d0a7..7c45d95d0e4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/validation_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/validation/validation_test.js @@ -31,11 +31,11 @@ export class ValidationTest extends GPUTest { switch (state) { case 'valid': - return this.trackForCleanup(this.device.createTexture(descriptor)); + return this.createTextureTracked(descriptor); case 'invalid': return this.getErrorTexture(); case 'destroyed':{ - const texture = this.device.createTexture(descriptor); + const texture = this.createTextureTracked(descriptor); texture.destroy(); return texture; } @@ -57,13 +57,13 @@ export class ValidationTest extends GPUTest { switch (state) { case 'valid': - return this.trackForCleanup(this.device.createBuffer(descriptor)); + return this.createBufferTracked(descriptor); case 'invalid':{ // Make the buffer invalid because of an invalid combination of usages but keep the // descriptor passed as much as possible (for mappedAtCreation and friends). this.device.pushErrorScope('validation'); - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ ...descriptor, usage: descriptor.usage | GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_SRC }); @@ -71,7 +71,7 @@ export class ValidationTest extends GPUTest { return buffer; } case 'destroyed':{ - const buffer = this.device.createBuffer(descriptor); + const buffer = this.createBufferTracked(descriptor); buffer.destroy(); return buffer; } @@ -90,14 +90,14 @@ export class ValidationTest extends GPUTest { switch (state) { case 'valid': - return this.trackForCleanup(this.device.createQuerySet(descriptor)); + return this.createQuerySetTracked(descriptor); case 'invalid':{ // Make the queryset invalid because of the count out of bounds. descriptor.count = kMaxQueryCount + 1; - return this.expectGPUError('validation', () => this.device.createQuerySet(descriptor)); + return this.expectGPUError('validation', () => this.createQuerySetTracked(descriptor)); } case 'destroyed':{ - const queryset = this.device.createQuerySet(descriptor); + const queryset = this.createQuerySetTracked(descriptor); queryset.destroy(); return queryset; } @@ -106,16 +106,12 @@ export class ValidationTest extends GPUTest { /** Create an arbitrarily-sized GPUBuffer with the STORAGE usage. */ getStorageBuffer() { - return this.trackForCleanup( - this.device.createBuffer({ size: 1024, usage: GPUBufferUsage.STORAGE }) - ); + return this.createBufferTracked({ size: 1024, usage: GPUBufferUsage.STORAGE }); } /** Create an arbitrarily-sized GPUBuffer with the UNIFORM usage. */ getUniformBuffer() { - return this.trackForCleanup( - this.device.createBuffer({ size: 1024, usage: GPUBufferUsage.UNIFORM }) - ); + return this.createBufferTracked({ size: 1024, usage: GPUBufferUsage.UNIFORM }); } /** Return an invalid GPUBuffer. */ @@ -141,43 +137,37 @@ export class ValidationTest extends GPUTest { sampleCount > 1 ? GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT : GPUTextureUsage.TEXTURE_BINDING; - return this.trackForCleanup( - this.device.createTexture({ - size: { width: 16, height: 16, depthOrArrayLayers: 1 }, - format: 'rgba8unorm', - usage, - sampleCount - }) - ); + return this.createTextureTracked({ + size: { width: 16, height: 16, depthOrArrayLayers: 1 }, + format: 'rgba8unorm', + usage, + sampleCount + }); } /** Return an arbitrarily-configured GPUTexture with the `STORAGE_BINDING` usage. */ getStorageTexture(format) { - return this.trackForCleanup( - this.device.createTexture({ - size: { width: 16, height: 16, depthOrArrayLayers: 1 }, - format, - usage: GPUTextureUsage.STORAGE_BINDING - }) - ); + return this.createTextureTracked({ + size: { width: 16, height: 16, depthOrArrayLayers: 1 }, + format, + usage: GPUTextureUsage.STORAGE_BINDING + }); } /** Return an arbitrarily-configured GPUTexture with the `RENDER_ATTACHMENT` usage. */ getRenderTexture(sampleCount = 1) { - return this.trackForCleanup( - this.device.createTexture({ - size: { width: 16, height: 16, depthOrArrayLayers: 1 }, - format: 'rgba8unorm', - usage: GPUTextureUsage.RENDER_ATTACHMENT, - sampleCount - }) - ); + return this.createTextureTracked({ + size: { width: 16, height: 16, depthOrArrayLayers: 1 }, + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT, + sampleCount + }); } /** Return an invalid GPUTexture. */ getErrorTexture() { this.device.pushErrorScope('validation'); - const texture = this.device.createTexture({ + const texture = this.createTextureTracked({ size: { width: 0, height: 0, depthOrArrayLayers: 0 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING @@ -278,9 +268,9 @@ export class ValidationTest extends GPUTest { getDeviceMismatchedBindingResource(bindingType) { switch (bindingType) { case 'uniformBuf': - return { buffer: this.getDeviceMismatchedStorageBuffer() }; - case 'storageBuf': return { buffer: this.getDeviceMismatchedUniformBuffer() }; + case 'storageBuf': + return { buffer: this.getDeviceMismatchedStorageBuffer() }; case 'filtSamp': return this.mismatchedDevice.createSampler({ minFilter: 'linear' }); case 'nonFiltSamp': diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/capability_info.js b/tests/wpt/webgpu/tests/webgpu/webgpu/capability_info.js index eb330bb567a..b3fad3b6f37 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/capability_info.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/capability_info.js @@ -713,7 +713,7 @@ const [kLimitInfoKeys, kLimitInfoDefaults, kLimitInfoData] = 'maxBufferSize': [, 268435456, 268435456, kMaxUnsignedLongLongValue], 'maxVertexAttributes': [, 16, 16], 'maxVertexBufferArrayStride': [, 2048, 2048], - 'maxInterStageShaderComponents': [, 60, 60], + 'maxInterStageShaderComponents': [, 64, 60], 'maxInterStageShaderVariables': [, 16, 15], 'maxColorAttachments': [, 8, 4], @@ -811,7 +811,9 @@ export const kFeatureNameInfo = 'indirect-first-instance': {}, 'shader-f16': {}, 'rg11b10ufloat-renderable': {}, - 'float32-filterable': {} + 'float32-filterable': {}, + 'clip-distances': {}, + 'dual-source-blending': {} }; /** List of all GPUFeatureName values. */ export const kFeatureNames = keysOf(kFeatureNameInfo); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroup.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroup.spec.js index 63cc2770883..93428792198 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroup.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroup.spec.js @@ -133,14 +133,13 @@ filter( fn((t) => { const { dimension, textureBindingViewDimension, viewDimension, depthOrArrayLayers } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, ...(dimension && { dimension }), ...(textureBindingViewDimension && { textureBindingViewDimension }) }); // MAINTENANCE_TODO: remove cast once textureBindingViewDimension is added to IDL - t.trackForCleanup(texture); const effectiveTextureBindingViewDimension = getEffectiveTextureBindingViewDimension( dimension, @@ -169,7 +168,7 @@ fn((t) => { const resource = texture.createView({ dimension: viewDimension }); const shouldError = effectiveTextureBindingViewDimension !== effectiveViewDimension; - t.expectValidationError(() => { + t.expectValidationErrorInCompatibilityMode(() => { t.device.createBindGroup({ layout, entries: [{ binding: 0, resource }] diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroupLayout.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroupLayout.spec.js index b6d9057cd02..93871e42a2b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroupLayout.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/createBindGroupLayout.spec.js @@ -18,7 +18,7 @@ params((u) => u.combine('format', kCompatModeUnsupportedStorageTextureFormats)). fn((t) => { const { format } = t.params; - t.expectValidationError(() => { + t.expectValidationErrorInCompatibilityMode(() => { t.device.createBindGroupLayout({ entries: [ { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToBuffer.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToBuffer.spec.js index 30db0b1a40f..3bb4e513d8c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToBuffer.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToBuffer.spec.js @@ -19,26 +19,25 @@ beforeAllSubcases((t) => { fn((t) => { const { format } = t.params; - const { blockWidth, blockHeight, bytesPerBlock } = kTextureFormatInfo[format]; + const info = kTextureFormatInfo[format]; - const texture = t.device.createTexture({ - size: [blockWidth, blockHeight, 1], + const textureSize = [info.blockWidth, info.blockHeight, 1]; + const texture = t.createTextureTracked({ + size: textureSize, format, usage: GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(texture); - const bytesPerRow = align(bytesPerBlock, 256); + const bytesPerRow = align(info.color.bytes, 256); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: bytesPerRow, usage: GPUBufferUsage.COPY_DST }); - t.trackForCleanup(buffer); const encoder = t.device.createCommandEncoder(); - encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow }, [blockWidth, blockHeight, 1]); - t.expectGPUError('validation', () => { + encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow }, textureSize); + t.expectGPUErrorInCompatibilityMode('validation', () => { encoder.finish(); }); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToTexture.spec.js index 07c16b940f8..68ed041d58b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/cmds/copyTextureToTexture.spec.js @@ -24,19 +24,17 @@ fn((t) => { const { blockWidth, blockHeight } = kTextureFormatInfo[format]; - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: [blockWidth, blockHeight, 1], format, usage: GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(srcTexture); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: [blockWidth, blockHeight, 1], format, usage: GPUTextureUsage.COPY_DST }); - t.trackForCleanup(dstTexture); const encoder = t.device.createCommandEncoder(); encoder.copyTextureToTexture({ texture: srcTexture }, { texture: dstTexture }, [ @@ -44,7 +42,7 @@ fn((t) => { blockHeight, 1] ); - t.expectGPUError('validation', () => { + t.expectGPUErrorInCompatibilityMode('validation', () => { encoder.finish(); }); }); @@ -66,21 +64,19 @@ fn((t) => { t.skipIfTextureFormatNotSupported(format); - const srcTexture = t.device.createTexture({ + const srcTexture = t.createTextureTracked({ size: [blockWidth, blockHeight, 1], format, sampleCount: 4, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(srcTexture); - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ size: [blockWidth, blockHeight, 1], format, sampleCount: 4, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT }); - t.trackForCleanup(dstTexture); const encoder = t.device.createCommandEncoder(); encoder.copyTextureToTexture({ texture: srcTexture }, { texture: dstTexture }, [ @@ -88,7 +84,7 @@ fn((t) => { blockHeight, 1] ); - t.expectGPUError('validation', () => { + t.expectGPUErrorInCompatibilityMode('validation', () => { encoder.finish(); }); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js index 8a3d64fe549..394bff640ab 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js @@ -243,14 +243,13 @@ t, textureType, bindConfig) { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [2, 1, 1], mipLevelCount: 2, format: 'rgba8unorm', usage: textureType === 'storage' ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(texture); const module = getRenderShaderModule(t.device, textureType, bindConfig); const pipeline = t.device.createRenderPipeline({ @@ -274,14 +273,13 @@ t, textureType, bindConfig) { - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [2, 1, 1], mipLevelCount: 2, format: 'rgba8unorm', usage: textureType === 'storage' ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(texture); const module = getComputeShaderModule(t.device, textureType, bindConfig); const pipeline = t.device.createComputePipeline({ @@ -337,7 +335,7 @@ fn((t) => { encoder.setPipeline(pipeline); const { shouldSucceed } = fn(t.device, pipeline, encoder, texture); kDrawUseCases[useCase](t, encoder); - validateFinish(shouldSucceed); + validateFinish(!t.isCompatibility || shouldSucceed); }); g.test('twoDifferentTextureViews,render_pass,unused'). @@ -399,7 +397,7 @@ fn((t) => { encoder.setPipeline(pipeline); const { shouldSucceed } = fn(t.device, pipeline, encoder, texture); kDispatchUseCases[useCase](t, encoder); - validateFinish(shouldSucceed); + validateFinish(!t.isCompatibility || shouldSucceed); }); g.test('twoDifferentTextureViews,compute_pass,unused'). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/depth_stencil_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/depth_stencil_state.spec.js index d2d997aaa43..0f344c06f6d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/depth_stencil_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/depth_stencil_state.spec.js @@ -48,6 +48,6 @@ fn((t) => { } }; - const success = !depthBiasClamp; + const success = !t.isCompatibility || !depthBiasClamp; t.doCreateRenderPipelineTest(async, success, pipelineDescriptor); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.js index b3c41daafa0..1d020f82ba8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.js @@ -120,7 +120,7 @@ fn((t) => { } }; const isValid = cases[caseName](targets); - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => t.device.createRenderPipeline(pipelineDescriptor), !isValid diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/shader_module.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/shader_module.spec.js deleted file mode 100644 index a35d0199c89..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/shader_module.spec.js +++ /dev/null @@ -1,281 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = ` -Tests limitations of createRenderPipeline related to shader modules in compat mode. -`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; -import { kCompatModeUnsupportedStorageTextureFormats } from '../../../../format_info.js'; -import { CompatibilityTest } from '../../../compatibility_test.js'; - -export const g = makeTestGroup(CompatibilityTest); - -g.test('sample_mask'). -desc( - ` -Tests that you can not create a render pipeline with a shader module that uses sample_mask in compat mode. - -- Test that a pipeline with a shader that uses sample_mask fails. -- Test that a pipeline that references a module that has a shader that uses sample_mask - but the pipeline does not reference that shader succeeds. - ` -). -params((u) => -u.combine('entryPoint', ['fsWithoutSampleMaskUsage', 'fsWithSampleMaskUsage']) -). -fn((t) => { - const { entryPoint } = t.params; - - const module = t.device.createShaderModule({ - code: ` - @vertex fn vs() -> @builtin(position) vec4f { - return vec4f(1); - } - struct Output { - @builtin(sample_mask) mask_out: u32, - @location(0) color : vec4f, - } - @fragment fn fsWithoutSampleMaskUsage() -> @location(0) vec4f { - return vec4f(1.0, 1.0, 1.0, 1.0); - } - @fragment fn fsWithSampleMaskUsage() -> Output { - var o: Output; - // We need to make sure this sample_mask isn't optimized out even if its value equals "no op". - o.mask_out = 0xFFFFFFFFu; - o.color = vec4f(1.0, 1.0, 1.0, 1.0); - return o; - } - ` - }); - - const pipelineDescriptor = { - layout: 'auto', - vertex: { - module, - entryPoint: 'vs' - }, - fragment: { - module, - entryPoint, - targets: [ - { - format: 'rgba8unorm' - }] - - }, - multisample: { - count: 4 - } - }; - - const isValid = entryPoint === 'fsWithoutSampleMaskUsage'; - t.expectGPUError( - 'validation', - () => t.device.createRenderPipeline(pipelineDescriptor), - !isValid - ); -}); - -g.test('sample_index'). -desc( - ` -Tests that you can not create a render pipeline with a shader module that uses sample_index in compat mode. - -- Test that a pipeline with a shader that uses sample_index fails. -- Test that a pipeline that references a module that has a shader that uses sample_index - but the pipeline does not reference that shader succeeds. - ` -). -params((u) => -u.combine('entryPoint', ['fsWithoutSampleIndexUsage', 'fsWithSampleIndexUsage']) -). -fn((t) => { - const { entryPoint } = t.params; - - const module = t.device.createShaderModule({ - code: ` - @vertex fn vs() -> @builtin(position) vec4f { - return vec4f(1); - } - @fragment fn fsWithoutSampleIndexUsage() -> @location(0) vec4f { - return vec4f(0); - } - @fragment fn fsWithSampleIndexUsage(@builtin(sample_index) sampleIndex: u32) -> @location(0) vec4f { - _ = sampleIndex; - return vec4f(0); - } - ` - }); - - const pipelineDescriptor = { - layout: 'auto', - vertex: { - module, - entryPoint: 'vs' - }, - fragment: { - module, - entryPoint, - targets: [ - { - format: 'rgba8unorm' - }] - - }, - multisample: { - count: 4 - } - }; - - const isValid = entryPoint === 'fsWithoutSampleIndexUsage'; - t.expectGPUError( - 'validation', - () => t.device.createRenderPipeline(pipelineDescriptor), - !isValid - ); -}); - -g.test('interpolate'). -desc( - ` -Tests that you can not create a render pipeline with a shader module that uses interpolate(linear) nor interpolate(...,sample) in compat mode. - -- Test that a pipeline with a shader that uses interpolate(linear) or interpolate(sample) fails. -- Test that a pipeline that references a module that has a shader that uses interpolate(linear/sample) - but the pipeline does not reference that shader succeeds. - ` -). -params((u) => -u. -combine('interpolate', [ -'', -'@interpolate(linear)', -'@interpolate(linear, sample)', -'@interpolate(perspective, sample)'] -). -combine('entryPoint', [ -'fsWithoutInterpolationUsage', -'fsWithInterpolationUsage1', -'fsWithInterpolationUsage2', -'fsWithInterpolationUsage3'] -) -). -fn((t) => { - const { entryPoint, interpolate } = t.params; - - const module = t.device.createShaderModule({ - code: ` - struct Vertex { - @builtin(position) pos: vec4f, - @location(0) ${interpolate} color : vec4f, - }; - @vertex fn vs() -> Vertex { - var v: Vertex; - v.pos = vec4f(1); - v.color = vec4f(1); - return v; - } - @fragment fn fsWithoutInterpolationUsage() -> @location(0) vec4f { - return vec4f(1); - } - @fragment fn fsWithInterpolationUsage1(v: Vertex) -> @location(0) vec4f { - return vec4f(1); - } - @fragment fn fsWithInterpolationUsage2(v: Vertex) -> @location(0) vec4f { - return v.pos; - } - @fragment fn fsWithInterpolationUsage3(v: Vertex) -> @location(0) vec4f { - return v.color; - } - ` - }); - - const pipelineDescriptor = { - layout: 'auto', - vertex: { - module, - entryPoint: 'vs' - }, - fragment: { - module, - entryPoint, - targets: [ - { - format: 'rgba8unorm' - }] - - } - }; - - const isValid = entryPoint === 'fsWithoutInterpolationUsage' || interpolate === ''; - t.expectGPUError( - 'validation', - () => t.device.createRenderPipeline(pipelineDescriptor), - !isValid - ); -}); - -g.test('unsupportedStorageTextureFormats,computePipeline'). -desc( - ` -Tests that you can not create a compute pipeline with unsupported storage texture formats in compat mode. - ` -). -params((u) => -u // -.combine('format', kCompatModeUnsupportedStorageTextureFormats). -combine('async', [false, true]) -). -fn((t) => { - const { format, async } = t.params; - - const module = t.device.createShaderModule({ - code: ` - @group(0) @binding(0) var s: texture_storage_2d<${format}, read>; - @compute @workgroup_size(1) fn cs() { - _ = textureLoad(s, vec2u(0)); - } - ` - }); - - const pipelineDescriptor = { - layout: 'auto', - compute: { - module, - entryPoint: 'cs' - } - }; - t.doCreateComputePipelineTest(async, false, pipelineDescriptor); -}); - -g.test('unsupportedStorageTextureFormats,renderPipeline'). -desc( - ` -Tests that you can not create a render pipeline with unsupported storage texture formats in compat mode. - ` -). -params((u) => -u // -.combine('format', kCompatModeUnsupportedStorageTextureFormats). -combine('async', [false, true]) -). -fn((t) => { - const { format, async } = t.params; - - const module = t.device.createShaderModule({ - code: ` - @group(0) @binding(0) var s: texture_storage_2d<${format}, read>; - @vertex fn vs() -> @builtin(position) vec4f { - _ = textureLoad(s, vec2u(0)); - return vec4f(0); - } - ` - }); - - const pipelineDescriptor = { - layout: 'auto', - vertex: { - module, - entryPoint: 'vs' - } - }; - t.doCreateRenderPipelineTest(async, false, pipelineDescriptor); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/vertex_state.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/vertex_state.spec.js index d5ba060e836..47b962f608c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/vertex_state.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/render_pipeline/vertex_state.spec.js @@ -34,7 +34,9 @@ fn((t) => { const numAttribs = t.device.limits.maxVertexAttributes - numAttribsToReserve; const numBuiltinsUsed = (useVertexIndex ? 1 : 0) + (useInstanceIndex ? 1 : 0); - const isValid = numAttribs + numBuiltinsUsed <= t.device.limits.maxVertexAttributes; + const isValidInCompat = numAttribs + numBuiltinsUsed <= t.device.limits.maxVertexAttributes; + const isValidInCore = numAttribs <= t.device.limits.maxVertexAttributes; + const isValid = t.isCompatibility ? isValidInCompat : isValidInCore; const inputs = range(numAttribs, (i) => `@location(${i}) v${i}: vec4f`); const outputs = range(numAttribs, (i) => `v${i}`); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/shader_module/shader_module.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/shader_module/shader_module.spec.js new file mode 100644 index 00000000000..0de80fc9dc3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/shader_module/shader_module.spec.js @@ -0,0 +1,156 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Tests limitations of createShaderModule in compat mode. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { kCompatModeUnsupportedStorageTextureFormats } from '../../../../format_info.js'; +import { CompatibilityTest } from '../../../compatibility_test.js'; + +export const g = makeTestGroup(CompatibilityTest); + +g.test('sample_mask'). +desc(`Tests that you can not create a shader module that uses sample_mask in compat mode.`). +fn((t) => { + t.expectGPUErrorInCompatibilityMode( + 'validation', + () => + t.device.createShaderModule({ + code: ` + @vertex fn vs() -> @builtin(position) vec4f { + return vec4f(1); + } + struct Output { + @builtin(sample_mask) mask_out: u32, + @location(0) color : vec4f, + } + @fragment fn fsWithSampleMaskUsage() -> Output { + var o: Output; + // We need to make sure this sample_mask isn't optimized out even if its value equals "no op". + o.mask_out = 0xFFFFFFFFu; + o.color = vec4f(1.0, 1.0, 1.0, 1.0); + return o; + } + ` + }), + true + ); +}); + +g.test('sample_index'). +desc(`Tests that you can not create a shader module that uses sample_index in compat mode.`). +fn((t) => { + t.expectGPUErrorInCompatibilityMode( + 'validation', + () => + t.device.createShaderModule({ + code: ` + @vertex fn vs() -> @builtin(position) vec4f { + return vec4f(1); + } + @fragment fn fsWithSampleIndexUsage(@builtin(sample_index) sampleIndex: u32) -> @location(0) vec4f { + _ = sampleIndex; + return vec4f(0); + } + ` + }), + true + ); +}); + +g.test('interpolate'). +desc( + `Tests that you can not create a shader module that uses interpolate(linear), interpolate(...,sample), + interpolate(flat), nor interpolate(flat, first) in compat mode.` +). +params((u) => +u.combineWithParams([ +{ success: true, interpolate: '' }, +{ success: false, interpolate: '@interpolate(linear)' }, +{ success: false, interpolate: '@interpolate(linear, sample)' }, +{ success: false, interpolate: '@interpolate(perspective, sample)' }, +{ success: false, interpolate: '@interpolate(flat)' }, +{ success: false, interpolate: '@interpolate(flat, first)' }, +{ success: true, interpolate: '@interpolate(flat, either)' }] +) +). +fn((t) => { + const { interpolate, success } = t.params; + + t.expectGPUErrorInCompatibilityMode( + 'validation', + () => + t.device.createShaderModule({ + code: ` + struct Vertex { + @builtin(position) pos: vec4f, + @location(0) ${interpolate} color : vec4f, + }; + @vertex fn vs() -> Vertex { + var v: Vertex; + v.pos = vec4f(1); + v.color = vec4f(1); + return v; + } + @fragment fn fsWithInterpolationUsage(v: Vertex) -> @location(0) vec4f { + return v.color; + } + ` + }), + !success + ); +}); + +g.test('unsupportedStorageTextureFormats'). +desc( + `Tests that you can not create a shader module with unsupported storage texture formats in compat mode.` +). +params((u) => u.combine('format', kCompatModeUnsupportedStorageTextureFormats)). +fn((t) => { + const { format } = t.params; + + t.expectGPUErrorInCompatibilityMode( + 'validation', + () => + t.device.createShaderModule({ + code: ` + @group(0) @binding(0) var s: texture_storage_2d<${format}, read>; + @compute @workgroup_size(1) fn cs() { + _ = textureLoad(s, vec2u(0)); + } + ` + }), + true + ); +}); + +const kDepthTextureTypeToParams = { + texture_depth_2d: 'vec2u(0), 0', + texture_depth_2d_array: 'vec2u(0), 0, 0', + texture_depth_multisampled_2d: 'vec2u(0), 0' +}; +const kDepthTextureTypes = keysOf(kDepthTextureTypeToParams); + +g.test('textureLoad_with_depth_textures'). +desc( + `Tests that you can not create a shader module that uses textureLoad with a depth texture in compat mode.` +). +params((u) => u.combine('type', kDepthTextureTypes)). +fn((t) => { + const { type } = t.params; + const params = kDepthTextureTypeToParams[type]; + + t.expectGPUErrorInCompatibilityMode( + 'validation', + () => + t.device.createShaderModule({ + code: ` + @group(0) @binding(0) var t: ${type}; + @compute @workgroup_size(1) fn cs() { + _ = textureLoad(t, ${params}); + } + ` + }), + true + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/createTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/createTexture.spec.js index 65bc50e0722..b5006cedd0a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/createTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/createTexture.spec.js @@ -3,10 +3,13 @@ **/export const description = ` Tests that you can not use bgra8unorm-srgb in compat mode. Tests that textureBindingViewDimension must compatible with texture dimension -`; -import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { kTextureDimensions, kTextureViewDimensions } from '../../../../capability_info.js'; -import { kColorTextureFormats, kCompatModeUnsupportedStorageTextureFormats, kTextureFormatInfo } from '../../../../format_info.js'; +import { + kColorTextureFormats, + kCompatModeUnsupportedStorageTextureFormats, + kTextureFormatInfo } from +'../../../../format_info.js'; import { getTextureDimensionFromView } from '../../../../util/texture/base.js'; import { CompatibilityTest } from '../../../compatibility_test.js'; @@ -15,10 +18,10 @@ export const g = makeTestGroup(CompatibilityTest); g.test('unsupportedTextureFormats'). desc(`Tests that you can not create a bgra8unorm-srgb texture in compat mode.`). fn((t) => { - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => - t.device.createTexture({ + t.createTextureTracked({ size: [1, 1, 1], format: 'bgra8unorm-srgb', usage: GPUTextureUsage.TEXTURE_BINDING @@ -32,10 +35,10 @@ desc( `Tests that you can not create a bgra8unorm texture with a bgra8unorm-srgb viewFormat in compat mode.` ). fn((t) => { - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => - t.device.createTexture({ + t.createTextureTracked({ size: [1, 1, 1], format: 'bgra8unorm', viewFormats: ['bgra8unorm-srgb'], @@ -56,19 +59,23 @@ combine('textureBindingViewDimension', kTextureViewDimensions) ). fn((t) => { const { dimension, textureBindingViewDimension } = t.params; - const depthOrArrayLayers = textureBindingViewDimension === '1d' || textureBindingViewDimension === '2d' ? 1 : 6; + const depthOrArrayLayers = + dimension === '1d' || + textureBindingViewDimension === '1d' || + textureBindingViewDimension === '2d' ? + 1 : + 6; const shouldError = getTextureDimensionFromView(textureBindingViewDimension) !== dimension; - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => { - const texture = t.device.createTexture({ + t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, dimension, textureBindingViewDimension }); // MAINTENANCE_TODO: remove cast once textureBindingViewDimension is added to IDL - t.trackForCleanup(texture); }, shouldError ); @@ -91,16 +98,15 @@ fn((t) => { const shouldError = textureBindingViewDimension === '2d' && depthOrArrayLayers !== 1 || textureBindingViewDimension === 'cube' && depthOrArrayLayers !== 6; - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => { - const texture = t.device.createTexture({ + t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, textureBindingViewDimension }); // MAINTENANCE_TODO: remove cast once textureBindingViewDimension is added to IDL - t.trackForCleanup(texture); }, shouldError ); @@ -138,16 +144,15 @@ fn((t) => { { format: info.baseFormat, viewFormats: [format, info.baseFormat] }]; for (const { format, viewFormats } of formatPairs) { - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => { - const texture = t.device.createTexture({ + t.createTextureTracked({ size: [info.blockWidth, info.blockHeight], format, viewFormats, usage: GPUTextureUsage.TEXTURE_BINDING }); - t.trackForCleanup(texture); }, true ); @@ -159,10 +164,10 @@ desc(`Tests that you can not create unsupported storage texture formats in compa params((u) => u.combine('format', kCompatModeUnsupportedStorageTextureFormats)). fn((t) => { const { format } = t.params; - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => - t.device.createTexture({ + t.createTextureTracked({ size: [1, 1, 1], format, usage: GPUTextureUsage.STORAGE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/cubeArray.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/cubeArray.spec.js index ed3c96ec346..e703c8c67aa 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/cubeArray.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/api/validation/texture/cubeArray.spec.js @@ -11,14 +11,14 @@ desc('Test you cannot create a cube array texture view.'). params((u) => u.combine('dimension', ['cube', 'cube-array'])). fn((t) => { const { dimension } = t.params; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: [1, 1, 6], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING }); const isValid = dimension === 'cube'; - t.expectGPUError( + t.expectGPUErrorInCompatibilityMode( 'validation', () => texture.createView({ dimension, format: 'rgba8unorm' }), !isValid diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/compatibility_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/compatibility_test.js index 217dbc0ac10..f25366e61a7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/compat/compatibility_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/compat/compatibility_test.js @@ -3,8 +3,27 @@ **/import { ValidationTest } from '../api/validation/validation_test.js';export class CompatibilityTest extends ValidationTest { async init() { await super.init(); - if (!this.isCompatibility) { - this.skip('compatibility tests do not work on non-compatibility mode'); - } + } + + /** + * Expect a validation error inside the callback. + * except when not in compat mode. + * + * Tests should always do just one WebGPU call in the callback, to make sure that's what's tested. + */ + expectValidationErrorInCompatibilityMode(fn, shouldError = true) { + this.expectValidationError(fn, this.isCompatibility && shouldError); + } + + /** + * Expect the specified WebGPU error to be generated when running the provided function + * except when not in compat mode. + */ + expectGPUErrorInCompatibilityMode( + filter, + fn, + shouldError = true) + { + return this.expectGPUError(filter, fn, this.isCompatibility && shouldError); } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/constants.js b/tests/wpt/webgpu/tests/webgpu/webgpu/constants.js index 1a01173428a..5ed0f78310a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/constants.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/constants.js @@ -61,5 +61,5 @@ export const GPUConst = { export const kMaxUnsignedLongValue = 4294967295; export const kMaxUnsignedLongLongValue = Number.MAX_SAFE_INTEGER; -export const kInterpolationSampling = ['center', 'centroid', 'sample']; +export const kInterpolationSampling = ['center', 'centroid', 'sample', 'first', 'either']; export const kInterpolationType = ['perspective', 'linear', 'flat']; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/error_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/error_test.js new file mode 100644 index 00000000000..d8b363304c1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/error_test.js @@ -0,0 +1,110 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { Fixture } from '../common/framework/fixture.js';import { getGPU } from '../common/util/navigator_gpu.js';import { assert, raceWithRejectOnTimeout } from '../common/util/util.js'; + +/** + * A test class to help test error scopes and uncapturederror events. + */ +export class ErrorTest extends Fixture { + _device = undefined; + + get device() { + assert(this._device !== undefined); + return this._device; + } + + async init() { + await super.init(); + const gpu = getGPU(this.rec); + const adapter = await gpu.requestAdapter(); + assert(adapter !== null); + + // We need to max out the adapter limits related to texture dimensions to more reliably cause an + // OOM error when asked for it, so set that on the device now. + const device = await this.requestDeviceTracked(adapter, { + requiredLimits: { + maxTextureDimension2D: adapter.limits.maxTextureDimension2D, + maxTextureArrayLayers: adapter.limits.maxTextureArrayLayers + } + }); + assert(device !== null); + this._device = device; + } + + /** + * Generates an error of the given filter type. For now, the errors are generated by calling a + * known code-path to cause the error. This can be updated in the future should there be a more + * direct way to inject errors. + */ + generateError(filter) { + switch (filter) { + case 'out-of-memory': + this.trackForCleanup( + this.device.createTexture({ + // One of the largest formats. With the base limits, the texture will be 256 GiB. + format: 'rgba32float', + usage: GPUTextureUsage.COPY_DST, + size: [ + this.device.limits.maxTextureDimension2D, + this.device.limits.maxTextureDimension2D, + this.device.limits.maxTextureArrayLayers] + + }) + ); + break; + case 'validation': + // Generating a validation error by passing in an invalid usage when creating a buffer. + this.trackForCleanup( + this.device.createBuffer({ + size: 1024, + usage: 0xffff // Invalid GPUBufferUsage + }) + ); + break; + } + // MAINTENANCE_TODO: This is a workaround for Chromium not flushing. Remove when not needed. + this.device.queue.submit([]); + } + + /** + * Checks whether the error is of the type expected given the filter. + */ + isInstanceOfError(filter, error) { + switch (filter) { + case 'out-of-memory': + return error instanceof GPUOutOfMemoryError; + case 'validation': + return error instanceof GPUValidationError; + case 'internal': + return error instanceof GPUInternalError; + } + } + + /** + * Expect an uncapturederror event to occur. Note: this MUST be awaited, because + * otherwise it could erroneously pass by capturing an error from later in the test. + */ + async expectUncapturedError(fn) { + return this.immediateAsyncExpectation(() => { + // MAINTENANCE_TODO: Make arbitrary timeout value a test runner variable + const TIMEOUT_IN_MS = 1000; + + const promise = new Promise((resolve) => { + const eventListener = (event) => { + this.debug(`Got uncaptured error event with ${event.error}`); + resolve(event); + }; + + this.device.addEventListener('uncapturederror', eventListener, { once: true }); + }); + + fn(); + + return raceWithRejectOnTimeout( + promise, + TIMEOUT_IN_MS, + 'Timeout occurred waiting for uncaptured error' + ); + }); + } +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/examples.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/examples.spec.js index ca72493de67..680915ee5c1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/examples.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/examples.spec.js @@ -240,7 +240,7 @@ fn((t) => { const { textureCompressionBC } = t.params; const shouldError = !textureCompressionBC; t.shouldThrow(shouldError ? 'TypeError' : false, () => { - t.device.createTexture({ + t.createTextureTracked({ format: 'bc1-rgba-unorm', size: [4, 4, 1], usage: GPUTextureUsage.TEXTURE_BINDING @@ -266,7 +266,7 @@ fn((t) => { const shouldError = !textureCompressionETC2; t.shouldThrow(shouldError ? 'TypeError' : false, () => { - t.device.createTexture({ + t.createTextureTracked({ format: 'etc2-rgb8unorm', size: [4, 4, 1], usage: GPUTextureUsage.TEXTURE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/format_info.js b/tests/wpt/webgpu/tests/webgpu/webgpu/format_info.js index ca65bbe6b75..248078fc6c8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/format_info.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/format_info.js @@ -1,6 +1,6 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { keysOf } from '../common/util/data_tables.js';import { assert } from '../common/util/util.js'; +**/import { keysOf } from '../common/util/data_tables.js';import { assert, unreachable } from '../common/util/util.js'; import { align } from './util/math.js'; @@ -13,25 +13,26 @@ import { align } from './util/math.js'; * `formatTableWithDefaults`. This ensures keys are never missing, always explicitly `undefined`. * * All top-level keys must be defined here, or they won't be exposed at all. + * Documentation is also written here; this makes it propagate through to the end types. */ const kFormatUniversalDefaults = { + /** Texel block width. */ blockWidth: undefined, + /** Texel block height. */ blockHeight: undefined, color: undefined, depth: undefined, stencil: undefined, colorRender: undefined, + /** Whether the format can be used in a multisample texture. */ multisample: undefined, + /** Optional feature required to use this format, or `undefined` if none. */ feature: undefined, + /** The base format for srgb formats. Specified on both srgb and equivalent non-srgb formats. */ baseFormat: undefined, - sampleType: undefined, - copySrc: undefined, - copyDst: undefined, - bytesPerBlock: undefined, - renderable: false, - renderTargetPixelByteCost: undefined, - renderTargetComponentAlignment: undefined + /** @deprecated Use `.color.bytes`, `.depth.bytes`, or `.stencil.bytes`. */ + bytesPerBlock: undefined // IMPORTANT: // Add new top-level keys both here and in TextureFormatInfo_TypeCheck. @@ -67,7 +68,7 @@ function formatTableWithDefaults({ /** "plain color formats", plus rgb9e5ufloat. */ const kRegularTextureFormatInfo = formatTableWithDefaults({ - defaults: { blockWidth: 1, blockHeight: 1, copySrc: true, copyDst: true }, + defaults: { blockWidth: 1, blockHeight: 1 }, table: { // plain, 8 bits per component @@ -81,11 +82,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 1 }, colorRender: { blend: true, resolve: true, byteCost: 1, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r8snorm: { @@ -98,7 +95,6 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 1 }, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r8uint: { @@ -111,11 +107,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 1 }, colorRender: { blend: false, resolve: false, byteCost: 1, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r8sint: { @@ -128,11 +120,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 1 }, colorRender: { blend: false, resolve: false, byteCost: 1, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -146,11 +134,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: true, resolve: true, byteCost: 2, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg8snorm: { @@ -163,7 +147,6 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg8uint: { @@ -176,11 +159,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: false, resolve: false, byteCost: 2, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg8sint: { @@ -193,11 +172,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: false, resolve: false, byteCost: 2, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -211,12 +186,8 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, baseFormat: 'rgba8unorm', - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, 'rgba8unorm-srgb': { @@ -229,12 +200,8 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, baseFormat: 'rgba8unorm', - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba8snorm: { @@ -247,7 +214,6 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba8uint: { @@ -260,11 +226,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba8sint: { @@ -277,11 +239,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, bgra8unorm: { @@ -294,12 +252,8 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, baseFormat: 'bgra8unorm', - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, 'bgra8unorm-srgb': { @@ -312,12 +266,8 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 1 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, baseFormat: 'bgra8unorm', - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -333,11 +283,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: false, resolve: false, byteCost: 2, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r16sint: { @@ -350,11 +296,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: false, resolve: false, byteCost: 2, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r16float: { @@ -367,11 +309,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 2 }, colorRender: { blend: true, resolve: true, byteCost: 2, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -385,11 +323,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg16sint: { @@ -402,11 +336,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg16float: { @@ -419,11 +349,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 4, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -437,11 +363,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba16sint: { @@ -454,11 +376,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba16float: { @@ -471,11 +389,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 2 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -491,11 +405,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r32sint: { @@ -508,11 +418,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, r32float: { @@ -525,11 +431,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 4, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -543,11 +445,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg32sint: { @@ -560,11 +458,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg32float: { @@ -577,11 +471,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 8 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -595,11 +485,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 16 }, colorRender: { blend: false, resolve: false, byteCost: 16, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba32sint: { @@ -612,11 +498,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 16 }, colorRender: { blend: false, resolve: false, byteCost: 16, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgba32float: { @@ -629,11 +511,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 16 }, colorRender: { blend: false, resolve: false, byteCost: 16, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, @@ -649,11 +527,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: false, resolve: false, byteCost: 8, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rgb10a2unorm: { @@ -666,11 +540,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, colorRender: { blend: true, resolve: true, byteCost: 8, alignment: 4 }, - renderable: true, - get renderTargetComponentAlignment() {return this.colorRender.alignment;}, - get renderTargetPixelByteCost() {return this.colorRender.byteCost;}, multisample: true, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} }, rg11b10ufloat: { @@ -683,10 +553,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, multisample: false, - get sampleType() {return this.color.type;}, - get bytesPerBlock() {return this.color.bytes;}, - renderTargetPixelByteCost: 8, - renderTargetComponentAlignment: 4 + get bytesPerBlock() {return this.color.bytes;} }, // packed @@ -701,7 +568,6 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ bytes: 4 }, multisample: false, - get sampleType() {return this.color.type;}, get bytesPerBlock() {return this.color.bytes;} } } @@ -711,7 +577,7 @@ const kRegularTextureFormatInfo = formatTableWithDefaults({ // because one aspect can be sized and one can be unsized. This should be cleaned up, but is kept // this way during a migration phase. const kSizedDepthStencilFormatInfo = formatTableWithDefaults({ - defaults: { blockWidth: 1, blockHeight: 1, multisample: true, copySrc: true, renderable: true }, + defaults: { blockWidth: 1, blockHeight: 1, multisample: true }, table: { stencil8: { stencil: { @@ -722,8 +588,6 @@ const kSizedDepthStencilFormatInfo = formatTableWithDefaults({ readWriteStorage: false, bytes: 1 }, - sampleType: 'uint', - copyDst: true, bytesPerBlock: 1 }, depth16unorm: { @@ -735,8 +599,6 @@ const kSizedDepthStencilFormatInfo = formatTableWithDefaults({ readWriteStorage: false, bytes: 2 }, - sampleType: 'depth', - copyDst: true, bytesPerBlock: 2 }, depth32float: { @@ -748,8 +610,6 @@ const kSizedDepthStencilFormatInfo = formatTableWithDefaults({ readWriteStorage: false, bytes: 4 }, - sampleType: 'depth', - copyDst: false, bytesPerBlock: 4 } } @@ -765,11 +625,7 @@ const kUnsizedDepthStencilFormatInfo = formatTableWithDefaults({ storage: false, readWriteStorage: false, bytes: undefined - }, - copySrc: false, - copyDst: false, - sampleType: 'depth', - renderable: true + } }, 'depth24plus-stencil8': { depth: { @@ -787,11 +643,7 @@ const kUnsizedDepthStencilFormatInfo = formatTableWithDefaults({ storage: false, readWriteStorage: false, bytes: 1 - }, - copySrc: false, - copyDst: false, - sampleType: 'depth', - renderable: true + } }, 'depth32float-stencil8': { depth: { @@ -810,11 +662,7 @@ const kUnsizedDepthStencilFormatInfo = formatTableWithDefaults({ readWriteStorage: false, bytes: 1 }, - feature: 'depth32float-stencil8', - copySrc: false, - copyDst: false, - sampleType: 'depth', - renderable: true + feature: 'depth32float-stencil8' } } }); @@ -824,10 +672,7 @@ const kBCTextureFormatInfo = formatTableWithDefaults({ blockWidth: 4, blockHeight: 4, multisample: false, - feature: 'texture-compression-bc', - sampleType: 'float', - copySrc: true, - copyDst: true + feature: 'texture-compression-bc' }, table: { 'bc1-rgba-unorm': { @@ -1006,10 +851,7 @@ const kETC2TextureFormatInfo = formatTableWithDefaults({ blockWidth: 4, blockHeight: 4, multisample: false, - feature: 'texture-compression-etc2', - sampleType: 'float', - copySrc: true, - copyDst: true + feature: 'texture-compression-etc2' }, table: { 'etc2-rgb8unorm': { @@ -1138,10 +980,7 @@ const kETC2TextureFormatInfo = formatTableWithDefaults({ const kASTCTextureFormatInfo = formatTableWithDefaults({ defaults: { multisample: false, - feature: 'texture-compression-astc', - sampleType: 'float', - copySrc: true, - copyDst: true + feature: 'texture-compression-astc' }, table: { 'astc-4x4-unorm': { @@ -1600,13 +1439,6 @@ export const kAllTextureFormats = keysOf(kAllTextureFormatInfo); export const kRenderableColorTextureFormats = kRegularTextureFormats.filter( (v) => kColorTextureFormatInfo[v].colorRender ); -assert( - kRenderableColorTextureFormats.every( - (f) => - kAllTextureFormatInfo[f].renderTargetComponentAlignment !== undefined && - kAllTextureFormatInfo[f].renderTargetPixelByteCost !== undefined - ) -); /** Per-GPUTextureFormat-per-aspect info. */ @@ -1643,7 +1475,6 @@ assert( * This is not actually the type of values in kTextureFormatInfo; that type is fully const * so that it can be narrowed very precisely at usage sites by the compiler. * This type exists only as a type check on the inferred type of kTextureFormatInfo. - * Documentation is also written here, but not actually visible to the IDE. */ @@ -1671,24 +1502,6 @@ assert( - - - - - - - - - - - - - - - - - - @@ -1724,10 +1537,6 @@ const kTextureFormatInfo_TypeCheck = kTextureFormatInfo; -/** List of all GPUTextureFormat values. */ -// MAINTENANCE_TODO: dedup with kAllTextureFormats -export const kTextureFormats = keysOf(kAllTextureFormatInfo); - /** Valid GPUTextureFormats for `copyExternalImageToTexture`, by spec. */ export const kValidTextureFormatsForCopyE2T = [ 'r8unorm', @@ -1850,6 +1659,35 @@ aspect) return resolved; } +/** + * @returns the sample type of the specified aspect of the specified format. + */ +export function sampleTypeForFormatAndAspect( +format, +aspect) +{ + const info = kTextureFormatInfo[format]; + if (info.color) { + assert(aspect === 'all', `color format ${format} used with aspect ${aspect}`); + return info.color.type; + } else if (info.depth && info.stencil) { + if (aspect === 'depth-only') { + return info.depth.type; + } else if (aspect === 'stencil-only') { + return info.stencil.type; + } else { + unreachable(`depth-stencil format ${format} used with aspect ${aspect}`); + } + } else if (info.depth) { + assert(aspect !== 'stencil-only', `depth-only format ${format} used with aspect ${aspect}`); + return info.depth.type; + } else if (info.stencil) { + assert(aspect !== 'depth-only', `stencil-only format ${format} used with aspect ${aspect}`); + return info.stencil.type; + } + unreachable(); +} + /** * Gets all copyable aspects for copies between texture and buffer for specified depth/stencil format and copy type, by spec. */ @@ -1935,6 +1773,18 @@ export function isCompressedTextureFormat(format) { return format in kCompressedTextureFormatInfo; } +export function isDepthTextureFormat(format) { + return !!kTextureFormatInfo[format].depth; +} + +export function isStencilTextureFormat(format) { + return !!kTextureFormatInfo[format].stencil; +} + +export function isDepthOrStencilTextureFormat(format) { + return isDepthTextureFormat(format) || isStencilTextureFormat(format); +} + export const kCompatModeUnsupportedStorageTextureFormats = [ 'rg32float', 'rg32sint', @@ -1950,14 +1800,22 @@ isCompatibilityMode) return false; } } - return !!kTextureFormatInfo[format].color?.storage; + const info = kTextureFormatInfo[format]; + return !!(info.color?.storage || info.depth?.storage || info.stencil?.storage); } -export function isEncodableTextureformat(format) { - return format in kEncodableTextureFormatInfo; +export function isRegularTextureFormat(format) { + return format in kRegularTextureFormatInfo; } -export const kFeaturesForFormats = getFeaturesForFormats(kTextureFormats); +/** + * Returns true of format is both compressed and a float format, for example 'bc6h-rgb-ufloat'. + */ +export function isCompressedFloatTextureFormat(format) { + return isCompressedTextureFormat(format) && format.includes('float'); +} + +export const kFeaturesForFormats = getFeaturesForFormats(kAllTextureFormats); /** * Given an array of texture formats return the number of bytes per sample. diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/gpu_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/gpu_test.js index fbed9c6a56e..2fecbd4ccef 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/gpu_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/gpu_test.js @@ -38,7 +38,6 @@ import { isTextureFormatUsableAsStorageFormat } from './format_info.js'; -import { makeBufferWithContents } from './util/buffer.js'; import { checkElementsEqual, checkElementsBetween } from './util/check_contents.js'; import { CommandBufferMaker } from './util/command_buffer_maker.js'; @@ -59,7 +58,7 @@ import { textureContentIsOKByT2B } from './util/texture/texture_ok.js'; -import { createTextureFromTexelView, createTextureFromTexelViews } from './util/texture.js'; +import { createTextureFromTexelViews } from './util/texture.js'; import { reifyExtent3D, reifyOrigin3D } from './util/unions.js'; const devicePool = new DevicePool(); @@ -262,6 +261,19 @@ export class GPUTestSubcaseBatchState extends SubcaseBatchState { } } + skipIfTextureLoadNotSupportedForTextureType(...types) { + if (this.isCompatibility) { + for (const type of types) { + switch (type) { + case 'texture_depth_2d': + case 'texture_depth_2d_array': + case 'texture_depth_multisampled_2d': + this.skip(`${type} is not supported by textureLoad in compatibility mode`); + } + } + } + } + /** * Skips test if the given interpolation type or sampling is not supported. */ @@ -281,8 +293,32 @@ export class GPUTestSubcaseBatchState extends SubcaseBatchState { sampling === 'sample', 'interpolation type linear is not supported in compatibility mode' ); + this.skipIf( + type === 'flat' && (!sampling || sampling === 'first'), + 'interpolation type flat with sampling not set to either is not supported in compatibility mode' + ); } } + + /** Skips this test case if the `langFeature` is *not* supported. */ + skipIfLanguageFeatureNotSupported(langFeature) { + if (!this.hasLanguageFeature(langFeature)) { + this.skip(`WGSL language feature '${langFeature}' is not supported`); + } + } + + /** Skips this test case if the `langFeature` is supported. */ + skipIfLanguageFeatureSupported(langFeature) { + if (this.hasLanguageFeature(langFeature)) { + this.skip(`WGSL language feature '${langFeature}' is supported`); + } + } + + /** returns true iff the `langFeature` is supported */ + hasLanguageFeature(langFeature) { + const lf = getGPU(this.recorder).wgslLanguageFeatures; + return lf !== undefined && lf.has(langFeature); + } } /** @@ -335,11 +371,10 @@ export class GPUTestBase extends Fixture { assert(srcOffset % 4 === 0); assert(size % 4 === 0); - const dst = this.device.createBuffer({ + const dst = this.createBufferTracked({ size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(dst); const c = this.device.createCommandEncoder(); c.copyBufferToBuffer(src, srcOffset, dst, 0, size); @@ -458,6 +493,14 @@ export class GPUTestBase extends Fixture { } } + skipIfTextureFormatNotUsableAsStorageTexture(...formats) { + for (const format of formats) { + if (format && !isTextureFormatUsableAsStorageFormat(format, this.isCompatibility)) { + this.skip(`Texture with ${format} is not usable as a storage texture`); + } + } + } + /** Skips this test case if the `langFeature` is *not* supported. */ skipIfLanguageFeatureNotSupported(langFeature) { if (!this.hasLanguageFeature(langFeature)) { @@ -571,11 +614,10 @@ export class GPUTestBase extends Fixture { } // Copy into a buffer suitable for STORAGE usage. - const storageBuffer = this.device.createBuffer({ + const storageBuffer = this.createBufferTracked({ size: bufferSize, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(storageBuffer); // This buffer conveys the data we expect to see for a single value read. Since we read 32 bits at // a time, for values smaller than 32 bits we pad this expectation with repeated value data, or @@ -583,12 +625,11 @@ export class GPUTestBase extends Fixture { // than 32 bits, we assume they're a multiple of 32 bits and expect to read exact matches of // `expectedValue` as-is. const expectedDataSize = Math.max(4, valueSize); - const expectedDataBuffer = this.device.createBuffer({ + const expectedDataBuffer = this.createBufferTracked({ size: expectedDataSize, usage: GPUBufferUsage.STORAGE, mappedAtCreation: true }); - this.trackForCleanup(expectedDataBuffer); const expectedData = new Uint32Array(expectedDataBuffer.getMappedRange()); if (valueSize === 1) { const value = new Uint8Array(expectedValue)[0]; @@ -607,11 +648,10 @@ export class GPUTestBase extends Fixture { // The output buffer has one 32-bit entry per buffer row. An entry's value will be 1 if every // read from the corresponding row matches the expected data derived above, or 0 otherwise. - const resultBuffer = this.device.createBuffer({ + const resultBuffer = this.createBufferTracked({ size: numRows * 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - this.trackForCleanup(resultBuffer); const readsPerRow = Math.ceil(minBytesPerRow / expectedDataSize); const reducer = ` @@ -714,11 +754,10 @@ export class GPUTestBase extends Fixture { const rep = kTexelRepresentationInfo[format]; const expectedTexelData = rep.pack(rep.encode(exp)); - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(buffer); const commandEncoder = this.device.createCommandEncoder(); commandEncoder.copyTextureToBuffer( @@ -756,11 +795,10 @@ export class GPUTestBase extends Fixture { [1, 1], layout ); - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: byteLength, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(buffer); const commandEncoder = this.device.createCommandEncoder(); commandEncoder.copyTextureToBuffer( @@ -887,11 +925,10 @@ export class GPUTestBase extends Fixture { } }); - const storageBuffer = this.device.createBuffer({ + const storageBuffer = this.createBufferTracked({ size: sampleCount * type.size * componentCount * width * height, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC }); - this.trackForCleanup(storageBuffer); const uniformBuffer = this.makeBufferWithContents( new Uint32Array([origin.x, origin.y, width, height]), @@ -1019,13 +1056,37 @@ export class GPUTestBase extends Fixture { } } + /** Create a GPUBuffer and track it for cleanup at the end of the test. */ + createBufferTracked(descriptor) { + return this.trackForCleanup(this.device.createBuffer(descriptor)); + } + + /** Create a GPUTexture and track it for cleanup at the end of the test. */ + createTextureTracked(descriptor) { + return this.trackForCleanup(this.device.createTexture(descriptor)); + } + + /** Create a GPUQuerySet and track it for cleanup at the end of the test. */ + createQuerySetTracked(descriptor) { + return this.trackForCleanup(this.device.createQuerySet(descriptor)); + } + /** - * Create a GPUBuffer with the specified contents and usage. + * Creates a buffer with the contents of some TypedArray. + * The buffer size will always be aligned to 4 as we set mappedAtCreation === true when creating the + * buffer. * * MAINTENANCE_TODO: Several call sites would be simplified if this took ArrayBuffer as well. */ makeBufferWithContents(dataArray, usage) { - return this.trackForCleanup(makeBufferWithContents(this.device, dataArray, usage)); + const buffer = this.createBufferTracked({ + mappedAtCreation: true, + size: align(dataArray.byteLength, 4), + usage + }); + memcpy({ src: dataArray }, { dst: buffer.getMappedRange() }); + buffer.unmap(); + return buffer; } /** @@ -1099,14 +1160,12 @@ export class GPUTestBase extends Fixture { } case 'render pass':{ const makeAttachmentView = (format) => - this.trackForCleanup( - this.device.createTexture({ - size: [16, 16, 1], - format, - usage: GPUTextureUsage.RENDER_ATTACHMENT, - sampleCount: fullAttachmentInfo.sampleCount - }) - ).createView(); + this.createTextureTracked({ + size: [16, 16, 1], + format, + usage: GPUTextureUsage.RENDER_ATTACHMENT, + sampleCount: fullAttachmentInfo.sampleCount + }).createView(); let depthStencilAttachment = undefined; if (fullAttachmentInfo.depthStencilFormat !== undefined) { @@ -1174,11 +1233,17 @@ export class GPUTest extends GPUTestBase { this.mismatchedProvider = await this.sharedState.acquireMismatchedProvider(); } + /** GPUAdapter that the device was created from. */ + get adapter() { + assert(this.provider !== undefined, 'internal error: DeviceProvider missing'); + return this.provider.adapter; + } + /** * GPUDevice for the test to use. */ get device() { - assert(this.provider !== undefined, 'internal error: GPUDevice missing?'); + assert(this.provider !== undefined, 'internal error: DeviceProvider missing'); return this.provider.device; } @@ -1428,18 +1493,21 @@ Base) Base { + /** + * Creates a 1 mip level texture with the contents of a TexelView. + */ createTextureFromTexelView( texelView, desc) { - return this.trackForCleanup(createTextureFromTexelView(this.device, texelView, desc)); + return createTextureFromTexelViews(this, [texelView], desc); } createTextureFromTexelViewsMultipleMipmaps( texelViews, desc) { - return this.trackForCleanup(createTextureFromTexelViews(this.device, texelViews, desc)); + return createTextureFromTexelViews(this, texelViews, desc); } expectTexelViewComparisonIsOkInTexture( @@ -1564,24 +1632,22 @@ Base) const readbackPromisesPerTexturePerLayer = [actualTexture, expectedTexture].map( (texture, ndx) => { const attachmentSize = virtualMipSize('2d', [texture.width, texture.height, 1], mipLevel); - const attachment = this.device.createTexture({ + const attachment = this.createTextureTracked({ label: `readback${ndx}`, size: attachmentSize, format: 'rgba8unorm', usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT }); - this.trackForCleanup(attachment); const sampler = this.device.createSampler(); const numLayers = texture.depthOrArrayLayers; const readbackPromisesPerLayer = []; - const uniformBuffer = this.device.createBuffer({ + const uniformBuffer = this.createBufferTracked({ size: 4, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(uniformBuffer); for (let layer = 0; layer < numLayers; ++layer) { const viewDescriptor = { @@ -1721,11 +1787,10 @@ Base) { const { byteLength, bytesPerRow, rowsPerImage } = resultDataLayout; - const buffer = this.device.createBuffer({ + const buffer = this.createBufferTracked({ size: align(byteLength, 4), // this is necessary because we need to copy and map data from this buffer usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); - this.trackForCleanup(buffer); const mipSize = physicalMipSizeFromTexture(texture, mipLevel || 0); const encoder = this.device.createCommandEncoder(); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/inter_stage.js b/tests/wpt/webgpu/tests/webgpu/webgpu/inter_stage.js new file mode 100644 index 00000000000..e6eacfc1288 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/inter_stage.js @@ -0,0 +1,94 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { assert } from '../common/util/util.js'; + + + +const s_deviceToEitherSamplingIndex = new WeakMap(); + +/** + * Returns whether the device uses the first or last vertex for the + * provoking vertex when using @interpolate(flat, either) + */ +export async function getProvokingVertexForFlatInterpolationEitherSampling( +t) +{ + const { device } = t; + let sampling = s_deviceToEitherSamplingIndex.get(device); + if (!sampling) { + const module = device.createShaderModule({ + code: ` + struct VSOut { + @builtin(position) position: vec4f, + @location(0) @interpolate(flat, either) vertexIndex: u32, + }; + + @vertex fn vs( + @builtin(vertex_index) vertexIndex : u32, + ) -> VSOut { + let pos = array(vec2f(-1, 3), vec2f(3, -1), vec2f(-1, -1)); + var vsOutput: VSOut; + vsOutput.position = vec4f(pos[vertexIndex], 0, 1); + vsOutput.vertexIndex = vertexIndex; + return vsOutput; + } + + @fragment fn fs(@location(0) @interpolate(flat, either) vertexIndex: u32) -> @location(0) vec4u { + return vec4u(vertexIndex); + } + ` + }); + + const pipeline = device.createRenderPipeline({ + layout: 'auto', + vertex: { + module + }, + fragment: { + module, + targets: [{ format: 'rgba8uint' }] + } + }); + + const texture = t.createTextureTracked({ + format: 'rgba8uint', + size: [1, 1], + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC + }); + + const encoder = device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: texture.createView(), + clearValue: [255, 255, 255, 255], + loadOp: 'clear', + storeOp: 'store' + }] + + }); + pass.setPipeline(pipeline); + pass.draw(3); + pass.end(); + + const buffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ + }); + encoder.copyTextureToBuffer({ texture }, { buffer }, [1, 1]); + + const commandBuffer = encoder.finish(); + device.queue.submit([commandBuffer]); + + await buffer.mapAsync(GPUMapMode.READ); + const result = new Uint8Array(buffer.getMappedRange())[0]; + buffer.unmap(); + buffer.destroy(); + texture.destroy(); + + assert(result === 0 || result === 2, `expected result to be 0 or 2, was ${result}`); + sampling = result === 2 ? 'last' : 'first'; + s_deviceToEitherSamplingIndex.set(device, sampling); + } + return sampling; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/listing.js b/tests/wpt/webgpu/tests/webgpu/webgpu/listing.js index 1d4edb1bb87..998993c688e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/listing.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/listing.js @@ -1,4 +1,4 @@ -// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings.ts. +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. export const listing = [ { @@ -23,7 +23,7 @@ export const listing = [ "api", "operation", "adapter", - "requestAdapter" + "info" ] }, { @@ -31,7 +31,7 @@ export const listing = [ "api", "operation", "adapter", - "requestAdapterInfo" + "requestAdapter" ] }, { @@ -384,6 +384,14 @@ export const listing = [ "vertex_only_render_pipeline" ] }, + { + "file": [ + "api", + "operation", + "rendering", + "3d_texture_slices" + ] + }, { "file": [ "api", @@ -504,6 +512,14 @@ export const listing = [ "compilation_info" ] }, + { + "file": [ + "api", + "operation", + "storage_texture", + "read_only" + ] + }, { "file": [ "api", @@ -658,6 +674,15 @@ export const listing = [ "maxBindGroups" ] }, + { + "file": [ + "api", + "validation", + "capability_checks", + "limits", + "maxBindGroupsPlusVertexBuffers" + ] + }, { "file": [ "api", @@ -1458,6 +1483,14 @@ export const listing = [ "primitive_state" ] }, + { + "file": [ + "api", + "validation", + "render_pipeline", + "resource_compatibility" + ] + }, { "file": [ "api", @@ -1664,7 +1697,7 @@ export const listing = [ "api", "validation", "render_pipeline", - "shader_module" + "vertex_state" ] }, { @@ -1672,8 +1705,8 @@ export const listing = [ "compat", "api", "validation", - "render_pipeline", - "vertex_state" + "shader_module", + "shader_module" ] }, { @@ -1718,6 +1751,11 @@ export const listing = [ "constructable" ] }, + { + "file": [ + "print_environment" + ] + }, { "file": [ "shader" @@ -1731,6 +1769,56 @@ export const listing = [ ], "readme": "Tests that check the result of valid shader execution." }, + { + "file": [ + "shader", + "execution", + "expression", + "access", + "array", + "index" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "access", + "matrix", + "index" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "access", + "structure", + "index" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "access", + "vector", + "components" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "access", + "vector", + "index" + ] + }, { "file": [ "shader", @@ -1767,6 +1855,24 @@ export const listing = [ "af_matrix_addition" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "binary", + "af_matrix_matrix_multiplication" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "binary", + "af_matrix_scalar_multiplication" + ] + }, { "file": [ "shader", @@ -1776,6 +1882,15 @@ export const listing = [ "af_matrix_subtraction" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "binary", + "af_matrix_vector_multiplication" + ] + }, { "file": [ "shader", @@ -1803,6 +1918,24 @@ export const listing = [ "af_subtraction" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "binary", + "ai_arithmetic" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "binary", + "ai_comparison" + ] + }, { "file": [ "shader", @@ -3022,7 +3155,7 @@ export const listing = [ "expression", "call", "builtin", - "textureDimension" + "textureDimensions" ] }, { @@ -3255,6 +3388,16 @@ export const listing = [ "workgroupBarrier" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "call", + "builtin", + "workgroupUniformLoad" + ] + }, { "file": [ "shader", @@ -3265,6 +3408,41 @@ export const listing = [ "ptr_params" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "constructor", + "non_zero" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "constructor", + "zero_value" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "precedence" + ] + }, + { + "file": [ + "shader", + "execution", + "expression", + "unary", + "address_of_and_indirection" + ] + }, { "file": [ "shader", @@ -3283,6 +3461,15 @@ export const listing = [ "af_assignment" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "unary", + "ai_arithmetic" + ] + }, { "file": [ "shader", @@ -3292,6 +3479,15 @@ export const listing = [ "ai_assignment" ] }, + { + "file": [ + "shader", + "execution", + "expression", + "unary", + "ai_complement" + ] + }, { "file": [ "shader", @@ -3373,15 +3569,6 @@ export const listing = [ "i32_conversion" ] }, - { - "file": [ - "shader", - "execution", - "expression", - "unary", - "indirection" - ] - }, { "file": [ "shader", @@ -3487,6 +3674,13 @@ export const listing = [ "while" ] }, + { + "file": [ + "shader", + "execution", + "limits" + ] + }, { "file": [ "shader", @@ -3526,6 +3720,14 @@ export const listing = [ "coherence" ] }, + { + "file": [ + "shader", + "execution", + "memory_model", + "texture_intra_invocation_coherence" + ] + }, { "file": [ "shader", @@ -3579,6 +3781,14 @@ export const listing = [ "shared_structs" ] }, + { + "file": [ + "shader", + "execution", + "shader_io", + "user_io" + ] + }, { "file": [ "shader", @@ -3609,6 +3819,14 @@ export const listing = [ "compound" ] }, + { + "file": [ + "shader", + "execution", + "statement", + "discard" + ] + }, { "file": [ "shader", @@ -3617,6 +3835,13 @@ export const listing = [ "increment_decrement" ] }, + { + "file": [ + "shader", + "execution", + "value_init" + ] + }, { "file": [ "shader", @@ -3667,7 +3892,7 @@ export const listing = [ "shader", "validation", "decl", - "override" + "context_dependent_resolution" ] }, { @@ -3675,7 +3900,15 @@ export const listing = [ "shader", "validation", "decl", - "ptr_spelling" + "let" + ] + }, + { + "file": [ + "shader", + "validation", + "decl", + "override" ] }, { @@ -3690,8 +3923,27 @@ export const listing = [ "file": [ "shader", "validation", - "decl", - "var_access_mode" + "expression", + "access", + "array" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "access", + "matrix" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "access", + "structure" ] }, { @@ -3703,6 +3955,24 @@ export const listing = [ "vector" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "binary", + "add_sub_mul" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "binary", + "and_or_xor" + ] + }, { "file": [ "shader", @@ -3712,6 +3982,33 @@ export const listing = [ "bitwise_shift" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "binary", + "comparison" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "binary", + "div_rem" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "binary", + "parse" + ] + }, { "file": [ "shader", @@ -3742,6 +4039,26 @@ export const listing = [ "acosh" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "all" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "any" + ] + }, { "file": [ "shader", @@ -3872,6 +4189,46 @@ export const listing = [ "cosh" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "countLeadingZeros" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "countOneBits" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "countTrailingZeros" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "cross" + ] + }, { "file": [ "shader", @@ -3882,6 +4239,46 @@ export const listing = [ "degrees" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "derivatives" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "determinant" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "distance" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "dot" + ] + }, { "file": [ "shader", @@ -3922,6 +4319,46 @@ export const listing = [ "exp2" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "extractBits" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "faceForward" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "firstLeadingBit" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "firstTrailingBit" + ] + }, { "file": [ "shader", @@ -3932,6 +4369,46 @@ export const listing = [ "floor" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "fma" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "fract" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "frexp" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "insertBits" + ] + }, { "file": [ "shader", @@ -3942,6 +4419,16 @@ export const listing = [ "inverseSqrt" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "ldexp" + ] + }, { "file": [ "shader", @@ -3972,6 +4459,36 @@ export const listing = [ "log2" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "max" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "min" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "mix" + ] + }, { "file": [ "shader", @@ -3982,6 +4499,66 @@ export const listing = [ "modf" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "normalize" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pack2x16float" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pack2x16snorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pack2x16unorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pack4x8snorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pack4x8unorm" + ] + }, { "file": [ "shader", @@ -4022,6 +4599,26 @@ export const listing = [ "pack4xU8Clamp" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "pow" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "quantizeToF16" + ] + }, { "file": [ "shader", @@ -4032,6 +4629,36 @@ export const listing = [ "radians" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "reflect" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "refract" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "reverseBits" + ] + }, { "file": [ "shader", @@ -4052,6 +4679,16 @@ export const listing = [ "saturate" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "select" + ] + }, { "file": [ "shader", @@ -4082,6 +4719,16 @@ export const listing = [ "sinh" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "smoothstep" + ] + }, { "file": [ "shader", @@ -4092,6 +4739,16 @@ export const listing = [ "sqrt" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "step" + ] + }, { "file": [ "shader", @@ -4102,6 +4759,236 @@ export const listing = [ "tan" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "tanh" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureDimensions" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureGather" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureGatherCompare" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureLoad" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureNumLayers" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureNumLevels" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureNumSamples" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSample" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleBaseClampToEdge" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleBias" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleCompare" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleCompareLevel" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleGrad" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureSampleLevel" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "textureStore" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "transpose" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "trunc" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "unpack2x16float" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "unpack2x16snorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "unpack2x16unorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "unpack4x8snorm" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "unpack4x8unorm" + ] + }, { "file": [ "shader", @@ -4122,6 +5009,148 @@ export const listing = [ "unpack4xU8" ] }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "value_constructor" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "call", + "builtin", + "workgroupUniformLoad" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "early_evaluation" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "add_sub" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "and_or_xor" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "bitwise_shift" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "comparison" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "div_rem" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "matrix", + "mul" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "overload_resolution" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "precedence" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "unary", + "address_of_and_indirection" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "unary", + "arithmetic_negation" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "unary", + "bitwise_complement" + ] + }, + { + "file": [ + "shader", + "validation", + "expression", + "unary", + "logical_negation" + ] + }, + { + "file": [ + "shader", + "validation", + "extension", + "dual_source_blending" + ] + }, { "file": [ "shader", @@ -4130,6 +5159,14 @@ export const listing = [ "pointer_composite_access" ] }, + { + "file": [ + "shader", + "validation", + "extension", + "readonly_and_readwrite_storage_textures" + ] + }, { "file": [ "shader", @@ -4146,14 +5183,6 @@ export const listing = [ "restrictions" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "align" - ] - }, { "file": [ "shader", @@ -4162,14 +5191,6 @@ export const listing = [ "attribute" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "binary_ops" - ] - }, { "file": [ "shader", @@ -4178,30 +5199,6 @@ export const listing = [ "blankspace" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "break" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "break_if" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "builtin" - ] - }, { "file": [ "shader", @@ -4210,38 +5207,6 @@ export const listing = [ "comments" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "compound" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "const" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "const_assert" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "continuing" - ] - }, { "file": [ "shader", @@ -4250,14 +5215,6 @@ export const listing = [ "diagnostic" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "discard" - ] - }, { "file": [ "shader", @@ -4290,14 +5247,6 @@ export const listing = [ "must_use" ] }, - { - "file": [ - "shader", - "validation", - "parse", - "pipeline_stage" - ] - }, { "file": [ "shader", @@ -4314,6 +5263,14 @@ export const listing = [ "semicolon" ] }, + { + "file": [ + "shader", + "validation", + "parse", + "shadow_builtins" + ] + }, { "file": [ "shader", @@ -4326,16 +5283,8 @@ export const listing = [ "file": [ "shader", "validation", - "parse", - "unary_ops" - ] - }, - { - "file": [ - "shader", - "validation", - "parse", - "var_and_let" + "shader_io", + "align" ] }, { @@ -4402,6 +5351,14 @@ export const listing = [ "invariant" ] }, + { + "file": [ + "shader", + "validation", + "shader_io", + "layout_constraints" + ] + }, { "file": [ "shader", @@ -4410,6 +5367,14 @@ export const listing = [ "locations" ] }, + { + "file": [ + "shader", + "validation", + "shader_io", + "pipeline_stage" + ] + }, { "file": [ "shader", @@ -4426,6 +5391,134 @@ export const listing = [ "workgroup_size" ] }, + { + "file": [ + "shader", + "validation", + "statement", + "break" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "break_if" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "compound" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "const_assert" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "continue" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "continuing" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "discard" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "for" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "if" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "increment_decrement" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "loop" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "phony" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "return" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "statement_behavior" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "switch" + ] + }, + { + "file": [ + "shader", + "validation", + "statement", + "while" + ] + }, { "file": [ "shader", @@ -4434,6 +5527,54 @@ export const listing = [ "alias" ] }, + { + "file": [ + "shader", + "validation", + "types", + "array" + ] + }, + { + "file": [ + "shader", + "validation", + "types", + "atomics" + ] + }, + { + "file": [ + "shader", + "validation", + "types", + "enumerant" + ] + }, + { + "file": [ + "shader", + "validation", + "types", + "matrix" + ] + }, + { + "file": [ + "shader", + "validation", + "types", + "pointer" + ] + }, + { + "file": [ + "shader", + "validation", + "types", + "ref" + ] + }, { "file": [ "shader", @@ -4442,6 +5583,14 @@ export const listing = [ "struct" ] }, + { + "file": [ + "shader", + "validation", + "types", + "textures" + ] + }, { "file": [ "shader", diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/print_environment.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/print_environment.spec.js new file mode 100644 index 00000000000..d9bd5333261 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/print_environment.spec.js @@ -0,0 +1,80 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` + +Examples of writing CTS tests with various features. + +Start here when looking for examples of basic framework usage. +`;import { getResourcePath } from '../common/framework/resources.js'; +import { globalTestConfig } from '../common/framework/test_config.js'; +import { makeTestGroup } from '../common/framework/test_group.js'; +import { getDefaultRequestAdapterOptions } from '../common/util/navigator_gpu.js'; + +import { GPUTest } from './gpu_test.js'; + +export const g = makeTestGroup(GPUTest); + +/** console.log is disallowed by WPT. Work around it when we're not in WPT. */ +function consoleLogIfNotWPT(x) { + if (!('step_timeout' in globalThis)) { + const cons = console; + cons.log(x); + } +} + +g.test('info'). +desc( + `Test which prints what global scope (e.g. worker type) it's running in. +Typically, tests will check for the presence of the feature they need (like HTMLCanvasElement) +and skip if it's not available. + +Run this test under various configurations to see different results +(Window, worker scopes, Node, etc.) + +NOTE: If your test runtime elides logs when tests pass, you won't see the prints from this test +in the logs. On non-WPT runtimes, it will also print to the console with console.log. +WPT disallows console.log and doesn't support logs on passing tests, so this does nothing on WPT.` +). +fn(async (t) => { + // MAINTENANCE_TODO: Remove requestAdapterInfo when info is implemented. + const adapterInfo = t.adapter.info || (await t.adapter.requestAdapterInfo()); + const isCompatibilityMode = t.adapter. + isCompatibilityMode; + + const info = JSON.stringify( + { + userAgent: navigator.userAgent, + globalScope: Object.getPrototypeOf(globalThis).constructor.name, + globalTestConfig, + baseResourcePath: getResourcePath(''), + defaultRequestAdapterOptions: getDefaultRequestAdapterOptions(), + adapter: { + isFallbackAdapter: t.adapter.isFallbackAdapter, + isCompatibilityMode, + info: adapterInfo, + features: Array.from(t.adapter.features), + limits: t.adapter.limits + } + }, + // Flatten objects with prototype chains into plain objects, using `for..in`. (Otherwise, + // properties from the prototype chain will be ignored and things will print as `{}`.) + (_key, value) => { + if (value === undefined || value === null) return null; + if (typeof value !== 'object') return value; + if (value instanceof Array) return value; + + const valueObj = value; + return Object.fromEntries( + function* () { + for (const key in valueObj) { + yield [key, valueObj[key]]; + } + }() + ); + }, + 2 + ); + + t.info(info); + consoleLogIfNotWPT(info); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/array/index.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/array/index.spec.js new file mode 100644 index 00000000000..cdd3eec2034 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/array/index.spec.js @@ -0,0 +1,407 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for array indexing expressions +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { + False, + True, + Type, + + array, + f32, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { align } from '../../../../../util/math.js'; + +import { allInputSources, basicExpressionBuilder, run } from '../../expression.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('concrete_scalar'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of an array of concrete scalars`). +params((u) => +u. +combine( + 'inputSource', + // 'uniform' address space requires array stride to be multiple of 16 bytes + allInputSources.filter((s) => s !== 'uniform') +). +combine('elementType', ['i32', 'u32', 'f32', 'f16']). +combine('indexType', ['i32', 'u32']) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const cases = [ + { + input: [ + array( + /* 0 */elementType.create(10), + /* 1 */elementType.create(11), + /* 2 */elementType.create(12) + ), + indexType.create(0)], + + expected: elementType.create(10) + }, + { + input: [ + array( + /* 0 */elementType.create(20), + /* 1 */elementType.create(21), + /* 2 */elementType.create(22) + ), + indexType.create(1)], + + expected: elementType.create(21) + }, + { + input: [ + array( + /* 0 */elementType.create(30), + /* 1 */elementType.create(31), + /* 2 */elementType.create(32) + ), + indexType.create(2)], + + expected: elementType.create(32) + }]; + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [Type.array(3, elementType), indexType], + elementType, + t.params, + cases + ); +}); + +g.test('bool'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of an array of booleans`). +params((u) => +u. +combine( + 'inputSource', + // 'uniform' address space requires array stride to be multiple of 16 bytes + allInputSources.filter((s) => s !== 'uniform') +). +combine('indexType', ['i32', 'u32']) +). +fn(async (t) => { + const indexType = Type[t.params.indexType]; + const cases = [ + { + input: [array(True, False, True), indexType.create(0)], + expected: True + }, + { + input: [array(True, False, True), indexType.create(1)], + expected: False + }, + { + input: [array(True, False, True), indexType.create(2)], + expected: True + }]; + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [Type.array(3, Type.bool), indexType], + Type.bool, + t.params, + cases + ); +}); + +g.test('abstract_scalar'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of an array of scalars`). +params((u) => +u. +combine('elementType', ['abstract-int', 'abstract-float']). +combine('indexType', ['i32', 'u32']) +). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const cases = [ + { + input: [ + array( + /* 0 */elementType.create(0x10_00000000), + /* 1 */elementType.create(0x11_00000000), + /* 2 */elementType.create(0x12_00000000) + ), + indexType.create(0)], + + expected: f32(0x10) + }, + { + input: [ + array( + /* 0 */elementType.create(0x20_00000000), + /* 1 */elementType.create(0x21_00000000), + /* 2 */elementType.create(0x22_00000000) + ), + indexType.create(1)], + + expected: f32(0x21) + }, + { + input: [ + array( + /* 0 */elementType.create(0x30_00000000), + /* 1 */elementType.create(0x31_00000000), + /* 2 */elementType.create(0x32_00000000) + ), + indexType.create(2)], + + expected: f32(0x32) + }]; + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}] / 0x100000000`), + [Type.array(3, elementType), indexType], + Type.f32, + { inputSource: 'const' }, + cases + ); +}); + +g.test('runtime_sized'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of a runtime sized array`). +params((u) => +u. +combine('elementType', [ +'i32', +'u32', +'f32', +'f16', +'vec4i', +'vec2u', +'vec3f', +'vec2h'] +). +combine('indexType', ['i32', 'u32']) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(Type[t.params.elementType]).kind === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const elementType = Type[t.params.elementType]; + const valueArrayType = Type.array(0, elementType); + const indexType = Type[t.params.indexType]; + const indexArrayType = Type.array(0, indexType); + + const wgsl = ` +${scalarTypeOf(elementType).kind === 'f16' ? 'enable f16;' : ''} + +@group(0) @binding(0) var input_values : ${valueArrayType}; +@group(0) @binding(1) var input_indices : ${indexArrayType}; +@group(0) @binding(2) var output : ${valueArrayType}; + +@compute @workgroup_size(16) +fn main(@builtin(local_invocation_index) invocation_id : u32) { + let index = input_indices[invocation_id]; + output[invocation_id] = input_values[index]; +} +`; + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ code: wgsl }), + entryPoint: 'main' + } + }); + + const values = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53]; + const indices = [9, 0, 14, 10, 12, 4, 15, 3, 5, 6, 11, 2, 8, 13, 7, 1]; + + const inputValues = values.map((i) => elementType.create(i)); + const inputIndices = indices.map((i) => indexType.create(i)); + const expected = indices.map((i) => inputValues[i]); + + const bufferSize = (arr) => { + let offset = 0; + let alignment = 0; + for (const value of arr) { + alignment = Math.max(alignment, value.type.alignment); + offset = align(offset, value.type.alignment) + value.type.size; + } + return align(offset, alignment); + }; + + const toArray = (arr) => { + const array = new Uint8Array(bufferSize(arr)); + let offset = 0; + for (const value of arr) { + offset = align(offset, value.type.alignment); + value.copyTo(array, offset); + offset += value.type.size; + } + return array; + }; + + const inputArrayBuffer = t.makeBufferWithContents(toArray(inputValues), GPUBufferUsage.STORAGE); + const inputIndexBuffer = t.makeBufferWithContents( + toArray(inputIndices), + GPUBufferUsage.STORAGE + ); + const outputBuffer = t.createBufferTracked({ + size: bufferSize(expected), + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: { buffer: inputArrayBuffer } }, + { binding: 1, resource: { buffer: inputIndexBuffer } }, + { binding: 2, resource: { buffer: outputBuffer } }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.queue.submit([encoder.finish()]); + + t.expectGPUBufferValuesEqual(outputBuffer, toArray(expected)); +}); + +g.test('vector'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of an array of vectors`). +params((u) => +u. +combine('inputSource', allInputSources). +expand('elementType', (t) => +t.inputSource === 'uniform' ? +['vec4i', 'vec4u', 'vec4f'] : +['vec4i', 'vec4u', 'vec4f', 'vec4h'] +). +combine('indexType', ['i32', 'u32']) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'vec4h') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const cases = [ + { + input: [ + array( + /* 0 */elementType.create([0x10, 0x11, 0x12, 0x13]), + /* 1 */elementType.create([0x14, 0x15, 0x16, 0x17]), + /* 2 */elementType.create([0x18, 0x19, 0x1a, 0x1b]) + ), + indexType.create(0)], + + expected: elementType.create([0x10, 0x11, 0x12, 0x13]) + }, + { + input: [ + array( + /* 0 */elementType.create([0x20, 0x21, 0x22, 0x23]), + /* 1 */elementType.create([0x24, 0x25, 0x26, 0x27]), + /* 2 */elementType.create([0x28, 0x29, 0x2a, 0x2b]) + ), + indexType.create(1)], + + expected: elementType.create([0x24, 0x25, 0x26, 0x27]) + }, + { + input: [ + array( + /* 0 */elementType.create([0x30, 0x31, 0x32, 0x33]), + /* 1 */elementType.create([0x34, 0x35, 0x36, 0x37]), + /* 2 */elementType.create([0x38, 0x39, 0x3a, 0x3b]) + ), + indexType.create(2)], + + expected: elementType.create([0x38, 0x39, 0x3a, 0x3b]) + }]; + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [Type.array(3, elementType), indexType], + elementType, + t.params, + cases + ); +}); + +g.test('matrix'). +specURL('https://www.w3.org/TR/WGSL/#array-access-expr'). +desc(`Test indexing of an array of matrices`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('elementType', ['f16', 'f32']). +beginSubcases(). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]). +combine('indexType', ['i32', 'u32']). +filter((u) => { + if (u.inputSource !== 'uniform') { + return true; + } + const mat = Type.mat(u.columns, u.rows, Type[u.elementType]); + return (align(mat.size, mat.alignment) & 15) === 0; +}) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const buildMat = (index) => { + const elements = []; + for (let c = 0; c < t.params.rows; c++) { + for (let r = 0; r < t.params.columns; r++) { + elements.push(index * 100 + c * 10 + r); + } + } + return matrixType.create(elements); + }; + const matrices = [buildMat(0), buildMat(1), buildMat(2)]; + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [Type.array(3, matrixType), indexType], + matrixType, + t.params, + [ + { + input: [array(...matrices), indexType.create(1)], + expected: matrices[1] + }] + + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/matrix/index.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/matrix/index.spec.js new file mode 100644 index 00000000000..0f44f06305f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/matrix/index.spec.js @@ -0,0 +1,200 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for matrix indexing expressions +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { + MatrixValue, + + Type, + abstractFloat, + f32, + vec } from +'../../../../../util/conversion.js'; + +import { allInputSources, basicExpressionBuilder, run } from '../../expression.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('concrete_float_column'). +specURL('https://www.w3.org/TR/WGSL/#matrix-access-expr'). +desc(`Test indexing a column vector from a concrete matrix`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('elementType', ['f32', 'f16']). +combine('indexType', ['i32', 'u32']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const columnType = Type.vec(t.params.rows, elementType); + const elements = []; + for (let c = 0; c < t.params.columns; c++) { + const column = []; + for (let r = 0; r < t.params.rows; r++) { + column.push(elementType.create((c + 1) * 10 + (r + 1))); + } + elements.push(column); + } + const vector = new MatrixValue(elements); + const cases = []; + for (let c = 0; c < t.params.columns; c++) { + cases.push({ + input: [vector, indexType.create(c)], + expected: vec(...elements[c]) + }); + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [matrixType, indexType], + columnType, + t.params, + cases + ); +}); + +g.test('concrete_float_element'). +specURL('https://www.w3.org/TR/WGSL/#matrix-access-expr'). +desc(`Test indexing a single element from a concrete matrix`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('elementType', ['f32', 'f16']). +combine('indexType', ['i32', 'u32']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const columnValues = []; + for (let c = 0; c < t.params.columns; c++) { + const column = []; + for (let r = 0; r < t.params.rows; r++) { + column.push(elementType.create((c + 1) * 10 + (r + 1))); + } + columnValues.push(column); + } + const matrix = new MatrixValue(columnValues); + const cases = []; + for (let c = 0; c < t.params.columns; c++) { + for (let r = 0; r < t.params.rows; r++) { + cases.push({ + input: [matrix, indexType.create(c), indexType.create(r)], + expected: columnValues[c][r] + }); + } + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}][${ops[2]}]`), + [matrixType, indexType, indexType], + elementType, + t.params, + cases + ); +}); + +g.test('abstract_float_column'). +specURL('https://www.w3.org/TR/WGSL/#matrix-access-expr'). +desc(`Test indexing a column vector from a abstract-float matrix`). +params((u) => +u. +combine('indexType', ['i32', 'u32']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const indexType = Type[t.params.indexType]; + const matrixType = Type.mat(t.params.columns, t.params.rows, Type.abstractFloat); + const vecfColumnType = Type.vec(t.params.rows, Type.f32); + const values = []; + for (let c = 0; c < t.params.columns; c++) { + const column = []; + for (let r = 0; r < t.params.rows; r++) { + column.push((c + 1) * 10 + (r + 1)); + } + values.push(column); + } + const matrix = new MatrixValue( + values.map((column) => column.map((v) => abstractFloat(v * 0x100000000))) + ); + const cases = []; + for (let c = 0; c < t.params.columns; c++) { + cases.push({ + input: [matrix, indexType.create(c)], + expected: vec(...values[c].map((v) => f32(v))) + }); + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}] / 0x100000000`), + [matrixType, indexType], + vecfColumnType, + { inputSource: 'const' }, + cases + ); +}); + +g.test('abstract_float_element'). +specURL('https://www.w3.org/TR/WGSL/#matrix-access-expr'). +desc(`Test indexing a single element from a abstract-float matrix`). +params((u) => +u. +combine('indexType', ['i32', 'u32']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const indexType = Type[t.params.indexType]; + const matrixType = Type.mat(t.params.columns, t.params.rows, Type.abstractFloat); + const values = []; + for (let c = 0; c < t.params.columns; c++) { + const column = []; + for (let r = 0; r < t.params.rows; r++) { + column.push((c + 1) * 10 + (r + 1)); + } + values.push(column); + } + const matrix = new MatrixValue( + values.map((column) => column.map((v) => abstractFloat(v * 0x100000000))) + ); + const cases = []; + for (let c = 0; c < t.params.columns; c++) { + for (let r = 0; r < t.params.rows; r++) { + cases.push({ + input: [matrix, indexType.create(c), indexType.create(r)], + expected: f32(values[c][r]) + }); + } + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}][${ops[2]}] / 0x100000000`), + [matrixType, indexType, indexType], + Type.f32, + { inputSource: 'const' }, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/structure/index.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/structure/index.spec.js new file mode 100644 index 00000000000..cba9f759d71 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/structure/index.spec.js @@ -0,0 +1,516 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for structure member accessing expressions +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { Type, u32 } from '../../../../../util/conversion.js'; +import { align } from '../../../../../util/math.js'; +import { toComparator } from '../../expectation.js'; +import { structLayout, structStride } from '../../expression.js'; + +export const g = makeTestGroup(GPUTest); + +const kMemberTypes = [ +['bool'], +['u32'], +['vec3f'], +['i32', 'u32'], +['i32', 'f16', 'vec4i', 'mat3x2f'], +['bool', 'u32', 'f16', 'vec3f', 'vec2i'], +['i32', 'u32', 'f32', 'f16', 'vec3f', 'vec4i']]; + + +const kMemberTypesNoBool = kMemberTypes.filter((tys) => !tys.includes('bool')); + +async function run( +t, +wgsl, +expected, +input, +inputSource) +{ + const kMinStorageBufferSize = 4; + + const outputBufferSize = Math.max( + kMinStorageBufferSize, + structStride( + expected.map((v) => v.type), + 'storage_rw' + ) + ); + + const outputBuffer = t.createBufferTracked({ + size: outputBufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + }); + + const bindGroupEntries = [ + { + binding: 0, + resource: { buffer: outputBuffer } + }]; + + + if (input !== null) { + let inputData; + if (input instanceof Array) { + const inputTypes = input.map((v) => v.type); + const inputBufferSize = Math.max( + kMinStorageBufferSize, + structStride(inputTypes, inputSource) + ); + inputData = new Uint8Array(inputBufferSize); + structLayout(inputTypes, inputSource, (m) => { + input[m.index].copyTo(inputData, m.offset); + }); + } else { + inputData = new Uint8Array(input); + } + + const inputBuffer = t.makeBufferWithContents( + inputData, + GPUBufferUsage.COPY_SRC | ( + inputSource === 'uniform' ? GPUBufferUsage.UNIFORM : GPUBufferUsage.STORAGE) + ); + + bindGroupEntries.push({ + binding: 1, + resource: { buffer: inputBuffer } + }); + } + + // build the shader module + const module = t.device.createShaderModule({ code: wgsl }); + + // build the pipeline + const pipeline = await t.device.createComputePipelineAsync({ + layout: 'auto', + compute: { module, entryPoint: 'main' } + }); + + // build the bind group + const group = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: bindGroupEntries + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, group); + pass.dispatchWorkgroups(1); + pass.end(); + + t.queue.submit([encoder.finish()]); + + const checkExpectation = (outputData) => { + // The list of expectation failures + const errs = []; + + let offset = 0; + for (let i = 0; i < expected.length; i++) { + offset = align(offset, expected[i].type.alignment); + const got = expected[i].type.read(outputData, offset); + const cmp = toComparator(expected[i]).compare(got); + if (!cmp.matched) { + errs.push(`result ${i}:) + returned: ${cmp.got} + expected: ${cmp.expected}`); + } + offset += expected[i].type.size; + } + + return errs.length > 0 ? new Error(errs.join('\n\n')) : undefined; + }; + + t.expectGPUBufferValuesPassCheck(outputBuffer, checkExpectation, { + type: Uint8Array, + typedLength: outputBufferSize + }); +} + +g.test('buffer'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a value structure in a storage or uniform buffer`). +params((u) => +u. +combine('member_types', kMemberTypesNoBool). +combine('inputSource', ['uniform', 'storage']). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; +@group(0) @binding(1) var<${t.params.inputSource}> input : MyStruct; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +@workgroup_size(1) @compute +fn main() { + output = input.member_${t.params.member_index}; +} +`, + /* expected */[expected], + /* input */values, + /* inputSource */t.params.inputSource === 'uniform' ? 'uniform' : 'storage_r' + ); +}); + +g.test('buffer_align'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc( + `Test accessing of a value structure in a storage buffer that has members using the @align attribute` +). +params((u) => +u. +beginSubcases(). +combine('member_index', [0, 1, 2]). +combine('alignments', [ +[1, 1, 1], +[4, 4, 4], +[4, 8, 16], +[8, 4, 16], +[8, 16, 4]] +) +). +fn(async (t) => { + const memberTypes = ['i32', 'u32', 'f32']; + const values = memberTypes.map((ty, i) => Type[ty].create(i)); + const expected = values[t.params.member_index]; + const input = new Uint8Array(64); + let offset = 4; // pre : i32 + for (let i = 0; i < 3; i++) { + offset = align(offset, t.params.alignments[i]); + values[i].copyTo(input, offset); + offset += values[i].type.size; + } + await run( + t, + ` +@group(0) @binding(0) var output : ${expected.type}; +@group(0) @binding(1) var input : MyStruct; + +struct MyStruct { + pre : i32, + @align(${t.params.alignments[0]}) member_0 : ${memberTypes[0]}, + @align(${t.params.alignments[1]}) member_1 : ${memberTypes[1]}, + @align(${t.params.alignments[2]}) member_2 : ${memberTypes[2]}, + post : i32, +}; + +@workgroup_size(1) @compute +fn main() { +output = input.member_${t.params.member_index}; +} +`, + /* expected */[expected], + /* input */input, + /* inputSource */'storage_r' + ); +}); + +g.test('buffer_size'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc( + `Test accessing of a value structure in a storage buffer that has members using the @size attribute` +). +params((u) => +u. +beginSubcases(). +combine('member_index', [0, 1, 2]). +combine('sizes', [ +[4, 4, 4], +[4, 8, 16], +[8, 4, 16], +[8, 16, 4]] +) +). +fn(async (t) => { + const memberTypes = ['i32', 'u32', 'f32']; + const values = memberTypes.map((ty, i) => Type[ty].create(i)); + const expected = values[t.params.member_index]; + const input = new Uint8Array(64); + let offset = 4; // pre : i32 + for (let i = 0; i < 3; i++) { + offset = align(offset, values[i].type.alignment); + values[i].copyTo(input, offset); + offset += t.params.sizes[i]; + } + await run( + t, + ` +@group(0) @binding(0) var output : ${expected.type}; +@group(0) @binding(1) var input : MyStruct; + +struct MyStruct { + pre : i32, + @size(${t.params.sizes[0]}) member_0 : ${memberTypes[0]}, + @size(${t.params.sizes[1]}) member_1 : ${memberTypes[1]}, + @size(${t.params.sizes[2]}) member_2 : ${memberTypes[2]}, + post : i32, +}; + +@workgroup_size(1) @compute +fn main() { +output = input.member_${t.params.member_index}; +} +`, + /* expected */[expected], + /* input */input, + /* inputSource */'storage_r' + ); +}); + +g.test('buffer_pointer'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a value structure via a pointer to a storage or uniform buffer`). +params((u) => +u. +combine('member_types', kMemberTypesNoBool). +combine('inputSource', ['uniform', 'storage']). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; +@group(0) @binding(1) var<${t.params.inputSource}> input : MyStruct; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +@workgroup_size(1) @compute +fn main() { + let ptr = &input; + output = (*ptr).member_${t.params.member_index}; +} +`, + /* expected */[expected], + /* input */values, + /* inputSource */t.params.inputSource === 'uniform' ? 'uniform' : 'storage_r' + ); +}); + +g.test('let'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a let structure`). +params((u) => +u. +combine('member_types', kMemberTypes). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = + memberType === Type.bool ? + u32(values[t.params.member_index].value === true ? 1 : 0) : + values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +@workgroup_size(1) @compute +fn main() { + let s = MyStruct(${values.map((v) => v.wgsl()).join(', ')}); + let v = s.member_${t.params.member_index}; + output = ${memberType === Type.bool ? `select(0u, 1u, v)` : 'v'}; +} +`, + /* expected */[expected], + /* input */null, + /* inputSource */'const' + ); +}); + +g.test('param'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a parameter structure`). +params((u) => +u. +combine('member_types', kMemberTypes). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = + memberType === Type.bool ? + u32(values[t.params.member_index].value === true ? 1 : 0) : + values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +fn f(s : MyStruct) -> ${t.params.member_types[t.params.member_index]} { + return s.member_${t.params.member_index}; +} + +@workgroup_size(1) @compute +fn main() { + let v = f(MyStruct(${values.map((v) => v.wgsl()).join(', ')})); + output = ${memberType === Type.bool ? `select(0u, 1u, v)` : 'v'}; +} +`, + /* expected */[expected], + /* input */null, + /* inputSource */'const' + ); +}); + +g.test('const'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a const value structure`). +params((u) => +u. +combine('member_types', kMemberTypes). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = + memberType === Type.bool ? + u32(values[t.params.member_index].value === true ? 1 : 0) : + values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +const S = MyStruct(${values.map((v) => v.wgsl()).join(', ')}); + +@workgroup_size(1) @compute +fn main() { + let v = S.member_${t.params.member_index}; + output = ${memberType === Type.bool ? `select(0u, 1u, v)` : 'v'}; +} +`, + /* expected */[expected], + /* input */null, + /* inputSource */'const' + ); +}); + +g.test('const_nested'). +specURL('https://www.w3.org/TR/WGSL/#struct-access-expr'). +desc(`Test accessing of a const value structure nested in another structure`). +params((u) => +u. +combine('member_types', kMemberTypes). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + const expected = + memberType === Type.bool ? + u32(values[t.params.member_index].value === true ? 1 : 0) : + values[t.params.member_index]; + + await run( + t, + ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +@group(0) @binding(0) var output : ${expected.type}; + +struct MyStruct { + ${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; + +struct Outer { + pre : i32, + inner : MyStruct, + post : i32, +} + +const S = Outer(10, MyStruct(${values.map((v) => v.wgsl()).join(', ')}), 20); + +@workgroup_size(1) @compute +fn main() { + let v = S.inner.member_${t.params.member_index}; + output = ${memberType === Type.bool ? `select(0u, 1u, v)` : 'v'}; +} +`, + /* expected */[expected], + /* input */null, + /* inputSource */'const' + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/components.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/components.spec.js new file mode 100644 index 00000000000..9a62033a252 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/components.spec.js @@ -0,0 +1,118 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for vector component selection expressions +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { Type, VectorValue, f32 } from '../../../../../util/conversion.js'; +import { allInputSources, basicExpressionBuilder, run } from '../../expression.js'; + +export const g = makeTestGroup(GPUTest); + +/** @returns the full permutation of component indices used to component select a vector of width 'n' */ +function indices(n) { + const out = []; + for (let width = 1; width < n; width++) { + let generate = (swizzle) => { + out.push(swizzle); + }; + for (let i = 0; i < width; i++) { + const next = generate; + generate = (swizzle) => { + for (let j = 0; j < width; j++) { + next([...swizzle, j]); + } + }; + } + generate([]); + } + return out; +} + +g.test('concrete_scalar'). +specURL('https://www.w3.org/TR/WGSL/#vector-access-expr'). +desc(`Test vector component selection of concrete vectors`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('elementType', ['i32', 'u32', 'f32', 'f16', 'bool']). +combine('width', [2, 3, 4]). +combine('components', ['rgba', 'xyzw']). +beginSubcases(). +expand('indices', (u) => indices(u.width)) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const vectorType = Type.vec(t.params.width, elementType); + const elementValues = + t.params.elementType === 'bool' ? (i) => i & 1 : (i) => (i + 1) * 10; + const elements = []; + for (let i = 0; i < t.params.width; i++) { + elements.push(elementType.create(elementValues(i))); + } + const result = (() => { + if (t.params.indices.length === 1) { + return { type: elementType, value: elementType.create(elementValues(0)) }; + } else { + const vec = Type.vec(t.params.indices.length, elementType); + return { type: vec, value: vec.create(t.params.indices.map((i) => elementValues(i))) }; + } + })(); + + const components = t.params.indices.map((i) => t.params.components[i]).join(''); + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}.${components}`), + [vectorType], + result.type, + t.params, + [{ input: [new VectorValue(elements)], expected: result.value }] + ); +}); + +g.test('abstract_scalar'). +specURL('https://www.w3.org/TR/WGSL/#vector-access-expr'). +desc(`Test vector component selection of abstract numeric vectors`). +params((u) => +u. +combine('elementType', ['abstract-int', 'abstract-float']). +combine('width', [2, 3, 4]). +combine('components', ['rgba', 'xyzw']). +beginSubcases(). +expand('indices', (u) => indices(u.width)) +). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const vectorType = Type.vec(t.params.width, elementType); + const elementValues = (i) => (i + 1) * 0x100000000; + const elements = []; + for (let i = 0; i < t.params.width; i++) { + elements.push(elementType.create(elementValues(i))); + } + const result = (() => { + if (t.params.indices.length === 1) { + return { type: Type.f32, value: f32(elementValues(0) / 0x100000000) }; + } else { + const vec = Type.vec(t.params.indices.length, Type.f32); + return { + type: vec, + value: vec.create(t.params.indices.map((i) => elementValues(i) / 0x100000000)) + }; + } + })(); + + const components = t.params.indices.map((i) => t.params.components[i]).join(''); + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}.${components} / 0x100000000`), + [vectorType], + result.type, + { inputSource: 'const' }, + [{ input: [new VectorValue(elements)], expected: result.value }] + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/index.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/index.spec.js new file mode 100644 index 00000000000..d969f543b61 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/access/vector/index.spec.js @@ -0,0 +1,87 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for vector indexing expressions +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { Type, VectorValue, f32 } from '../../../../../util/conversion.js'; + +import { allInputSources, basicExpressionBuilder, run } from '../../expression.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('concrete_scalar'). +specURL('https://www.w3.org/TR/WGSL/#vector-access-expr'). +desc(`Test indexing of concrete vectors`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('elementType', ['i32', 'u32', 'f32', 'f16', 'bool']). +combine('indexType', ['i32', 'u32']). +combine('width', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.elementType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const vectorType = Type.vec(t.params.width, elementType); + const elements = []; + for (let i = 0; i < t.params.width; i++) { + if (t.params.elementType === 'bool') { + elements.push(elementType.create(i & 1)); + } else { + elements.push(elementType.create((i + 1) * 10)); + } + } + const vector = new VectorValue(elements); + const cases = []; + for (let i = 0; i < t.params.width; i++) { + cases.push({ input: [vector, indexType.create(i)], expected: elements[i] }); + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}]`), + [vectorType, indexType], + elementType, + t.params, + cases + ); +}); + +g.test('abstract_scalar'). +specURL('https://www.w3.org/TR/WGSL/#vector-access-expr'). +desc(`Test indexing of abstract numeric vectors`). +params((u) => +u. +combine('elementType', ['abstract-int', 'abstract-float']). +combine('indexType', ['i32', 'u32']). +combine('width', [2, 3, 4]) +). +fn(async (t) => { + const elementType = Type[t.params.elementType]; + const indexType = Type[t.params.indexType]; + const vectorType = Type.vec(t.params.width, elementType); + const elements = []; + for (let i = 0; i < t.params.width; i++) { + elements.push(elementType.create((i + 1) * 0x100000000)); + } + const vector = new VectorValue(elements); + const cases = []; + for (let i = 0; i < t.params.width; i++) { + cases.push({ input: [vector, indexType.create(i)], expected: f32(i + 1) }); + } + + await run( + t, + basicExpressionBuilder((ops) => `${ops[0]}[${ops[1]}] / 0x100000000`), + [vectorType, indexType], + Type.f32, + { inputSource: 'const' }, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.cache.js index 402fd1add81..89160507ac4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.cache.js @@ -1,31 +1,22 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; +**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; -const additionVectorScalarInterval = (v, s) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.additionInterval(e, s))); +import { getAdditionAFInterval, kSparseVectorAFValues } from './af_data.js'; + +const additionVectorScalarInterval = (vec, s) => { + return FP.abstract.toVector(vec.map((v) => getAdditionAFInterval(v, s))); }; -const additionScalarVectorInterval = (s, v) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.additionInterval(s, e))); -}; - -const scalar_cases = { - ['scalar']: () => { - return FP.abstract.generateScalarPairToIntervalCases( - sparseScalarF64Range(), - sparseScalarF64Range(), - 'finite', - FP.abstract.additionInterval - ); - } +const additionScalarVectorInterval = (s, vec) => { + return FP.abstract.toVector(vec.map((v) => getAdditionAFInterval(s, v))); }; const vector_scalar_cases = [2, 3, 4]. map((dim) => ({ [`vec${dim}_scalar`]: () => { return FP.abstract.generateVectorScalarToVectorCases( - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], sparseScalarF64Range(), 'finite', additionVectorScalarInterval @@ -39,7 +30,7 @@ map((dim) => ({ [`scalar_vec${dim}`]: () => { return FP.abstract.generateScalarVectorToVectorCases( sparseScalarF64Range(), - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], 'finite', additionScalarVectorInterval ); @@ -48,7 +39,14 @@ map((dim) => ({ reduce((a, b) => ({ ...a, ...b }), {}); export const d = makeCaseCache('binary/af_addition', { - ...scalar_cases, + ['scalar']: () => { + return FP.abstract.generateScalarPairToIntervalCases( + sparseScalarF64Range(), + sparseScalarF64Range(), + 'finite', + getAdditionAFInterval + ); + }, ...vector_scalar_cases, ...scalar_vector_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.spec.js index 44259f01729..75fc6688c20 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_addition.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for non-matrix AbstractFloat addition expression +Execution Tests for non-matrix abstract-float addition expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_addition.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,9 @@ fn(async (t) => { const cases = await d.get('scalar'); await run( t, - abstractBinary('+'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('+'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -48,9 +48,9 @@ fn(async (t) => { const cases = await d.get('scalar'); // Using vectorize to generate vector cases based on scalar cases await run( t, - abstractBinary('+'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('+'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -70,9 +70,9 @@ fn(async (t) => { const cases = await d.get(`vec${dim}_scalar`); await run( t, - abstractBinary('+'), - [TypeVec(dim, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('+'), + [Type.vec(dim, Type.abstractFloat), Type.abstractFloat], + Type.vec(dim, Type.abstractFloat), t.params, cases ); @@ -92,9 +92,9 @@ fn(async (t) => { const cases = await d.get(`scalar_vec${dim}`); await run( t, - abstractBinary('+'), - [TypeAbstractFloat, TypeVec(dim, TypeAbstractFloat)], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('+'), + [Type.abstractFloat, Type.vec(dim, Type.abstractFloat)], + Type.vec(dim, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_comparison.spec.js index e5205ccf1d6..3b1033a26e2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_comparison.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_comparison.spec.js @@ -1,10 +1,10 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for the AbstractFloat comparison operations +Execution Tests for the abstract-float comparison operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeBool } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { d } from './af_comparison.cache.js'; @@ -27,7 +27,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('equals'); - await run(t, binary('=='), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run( + t, + binary('=='), + [Type.abstractFloat, Type.abstractFloat], + Type.bool, + t.params, + cases + ); }); g.test('not_equals'). @@ -45,7 +52,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('not_equals'); - await run(t, binary('!='), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run( + t, + binary('!='), + [Type.abstractFloat, Type.abstractFloat], + Type.bool, + t.params, + cases + ); }); g.test('less_than'). @@ -63,7 +77,7 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('less_than'); - await run(t, binary('<'), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run(t, binary('<'), [Type.abstractFloat, Type.abstractFloat], Type.bool, t.params, cases); }); g.test('less_equals'). @@ -81,7 +95,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('less_equals'); - await run(t, binary('<='), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run( + t, + binary('<='), + [Type.abstractFloat, Type.abstractFloat], + Type.bool, + t.params, + cases + ); }); g.test('greater_than'). @@ -99,7 +120,7 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('greater_than'); - await run(t, binary('>'), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run(t, binary('>'), [Type.abstractFloat, Type.abstractFloat], Type.bool, t.params, cases); }); g.test('greater_equals'). @@ -117,5 +138,12 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('greater_equals'); - await run(t, binary('>='), [TypeAbstractFloat, TypeAbstractFloat], TypeBool, t.params, cases); + await run( + t, + binary('>='), + [Type.abstractFloat, Type.abstractFloat], + Type.bool, + t.params, + cases + ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_data.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_data.js new file mode 100644 index 00000000000..190583f2755 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_data.js @@ -0,0 +1,823 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { assert } from '../../../../../common/util/util.js';import { kValue } from '../../../../util/constants.js';import { FP } from '../../../../util/floating_point.js'; +import { sparseScalarF64Range } from '../../../../util/math.js'; +import { reinterpretU64AsF64 } from '../../../../util/reinterpret.js'; + +/** Simplified version of kSparseVectorF64Range that only uses values from sparseScalarF64Range() */ +export const kSparseVectorAFValues = { + 2: sparseScalarF64Range().map((f) => Array(2).fill(f)), + 3: sparseScalarF64Range().map((f) => Array(3).fill(f)), + 4: sparseScalarF64Range().map((f) => Array(4).fill(f)) +}; + +/** Simplified version of kSparseMatrixF64Range that only uses values from sparseScalarF64Range() */ +export const kSparseMatrixAFValues = { + 2: { + 2: sparseScalarF64Range().map((f) => Array(2).fill(Array(2).fill(f))), + 3: sparseScalarF64Range().map((f) => Array(2).fill(Array(3).fill(f))), + 4: sparseScalarF64Range().map((f) => Array(2).fill(Array(4).fill(f))) + }, + 3: { + 2: sparseScalarF64Range().map((f) => Array(3).fill(Array(2).fill(f))), + 3: sparseScalarF64Range().map((f) => Array(3).fill(Array(3).fill(f))), + 4: sparseScalarF64Range().map((f) => Array(3).fill(Array(4).fill(f))) + }, + 4: { + 2: sparseScalarF64Range().map((f) => Array(4).fill(Array(2).fill(f))), + 3: sparseScalarF64Range().map((f) => Array(4).fill(Array(3).fill(f))), + 4: sparseScalarF64Range().map((f) => Array(4).fill(Array(4).fill(f))) + } +}; + +/** Line format of af_data_gen/main.cpp outputs for unary operations */ + + + + + +/** Line format of af_data_gen/main.cpp outputs for binary operations */ + + + + + + +/** + * Externally generated values for binary operations, addition (+) and subtraction (-). + * These values are generated using af_data_gen/main.cpp and manually copied in + * here. This is done to get around the limitations of AbstractFloats in WGSL + * and TS numbers both being f64 internally. + * + * This contains entries covering performing the operations over the cartesian product of + * kInterestingF64Values with itself. Thus, can be used to create a lookup table + * to replace using the FPTraits framework for calculating intervals where + * sparseScalarF64Range, etc are being used to generate inputs. + */ + +const kAdditionRawValues = [{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: -10.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: -1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: -0.125, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 0.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 0.125, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 10.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.max, expected: [0.0] }, +{ lhs: -10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: -10.0, rhs: -10.0, expected: [-20] }, +{ lhs: -10.0, rhs: -1.0, expected: [-11] }, +{ lhs: -10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0xc024400000000000n) /* -10.125 */] }, +{ lhs: -10.0, rhs: kValue.f64.negative.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: 0.0, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0xc023c00000000000n) /* -9.875 */] }, +{ lhs: -10.0, rhs: 1.0, expected: [-9] }, +{ lhs: -10.0, rhs: 10.0, expected: [0.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: -1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: -1.0, rhs: -10.0, expected: [-11] }, +{ lhs: -1.0, rhs: -1.0, expected: [-2] }, +{ lhs: -1.0, rhs: -0.125, expected: [reinterpretU64AsF64(0xbff2000000000000n) /* -1.125 */] }, +{ lhs: -1.0, rhs: kValue.f64.negative.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: 0.0, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: 0.125, expected: [reinterpretU64AsF64(0xbfec000000000000n) /* -0.875 */] }, +{ lhs: -1.0, rhs: 1.0, expected: [0.0] }, +{ lhs: -1.0, rhs: 10.0, expected: [9] }, +{ lhs: -1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: -0.125, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: -0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0xc024400000000000n) /* -10.125 */] }, +{ lhs: -0.125, rhs: -1.0, expected: [reinterpretU64AsF64(0xbff2000000000000n) /* -1.125 */] }, +{ lhs: -0.125, rhs: -0.125, expected: [reinterpretU64AsF64(0xbfd0000000000000n) /* -0.25 */] }, +{ lhs: -0.125, rhs: kValue.f64.negative.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: 0.0, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: 0.125, expected: [0.0] }, +{ lhs: -0.125, rhs: 1.0, expected: [reinterpretU64AsF64(0x3fec000000000000n) /* 0.875 */] }, +{ lhs: -0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0x4023c00000000000n) /* 9.875 */] }, +{ lhs: -0.125, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.max, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.max, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.max, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x8020000000000000n) /* -4.45015e-308 */] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.min, expected: [reinterpretU64AsF64(0x801fffffffffffffn) /* -4.45015e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.max, expected: [reinterpretU64AsF64(0x8010000000000001n) /* -2.22507e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: 0.0, expected: [kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.min, expected: [0.0] }, +{ lhs: kValue.f64.negative.max, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.max, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.max, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x801fffffffffffffn) /* -4.45015e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [reinterpretU64AsF64(0x801ffffffffffffen) /* -4.45015e-308 */, kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.0, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.min, reinterpretU64AsF64(0x800ffffffffffffen) /* -2.22507e-308 */, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.min, 0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.subnormal.min, kValue.f64.positive.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x8010000000000001n) /* -2.22507e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [reinterpretU64AsF64(0x8000000000000002n) /* -9.88131e-324 */, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.0, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0, reinterpretU64AsF64(0x000ffffffffffffen) /* 2.22507e-308 */, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: 0.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: 0.0, rhs: -10.0, expected: [-10.0] }, +{ lhs: 0.0, rhs: -1.0, expected: [-1.0] }, +{ lhs: 0.0, rhs: -0.125, expected: [-0.125] }, +{ lhs: 0.0, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.max] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: 0.0, rhs: 0.0, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: 0.0, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.min] }, +{ lhs: 0.0, rhs: 0.125, expected: [0.125] }, +{ lhs: 0.0, rhs: 1.0, expected: [1.0] }, +{ lhs: 0.0, rhs: 10.0, expected: [10.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.min, reinterpretU64AsF64(0x800ffffffffffffen) /* -2.22507e-308 */, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.0, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min, reinterpretU64AsF64(0x0000000000000002n) /* 9.88131e-324 */] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min, kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x0010000000000001n) /* 2.22507e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.min, 0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0, reinterpretU64AsF64(0x000ffffffffffffen) /* 2.22507e-308 */, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.0, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min, kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.max, reinterpretU64AsF64(0x001ffffffffffffen) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x001fffffffffffffn) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.min, rhs: -10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.min, rhs: -1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.min, rhs: -0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.max, expected: [0.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.positive.subnormal.min, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: 0.0, expected: [kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x0010000000000001n) /* 2.22507e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x001fffffffffffffn) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x0020000000000000n) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: 0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.min, rhs: 1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.min, rhs: 10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: 0.125, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: 0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0xc023c00000000000n) /* -9.875 */] }, +{ lhs: 0.125, rhs: -1.0, expected: [reinterpretU64AsF64(0xbfec000000000000n) /* -0.875 */] }, +{ lhs: 0.125, rhs: -0.125, expected: [0.0] }, +{ lhs: 0.125, rhs: kValue.f64.negative.max, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.min, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.max, expected: [0.125] }, +{ lhs: 0.125, rhs: 0.0, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.min, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.max, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.min, expected: [0.125] }, +{ lhs: 0.125, rhs: 0.125, expected: [reinterpretU64AsF64(0x3fd0000000000000n) /* 0.25 */] }, +{ lhs: 0.125, rhs: 1.0, expected: [reinterpretU64AsF64(0x3ff2000000000000n) /* 1.125 */] }, +{ lhs: 0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0x4024400000000000n) /* 10.125 */] }, +{ lhs: 0.125, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: 1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: 1.0, rhs: -10.0, expected: [-9] }, +{ lhs: 1.0, rhs: -1.0, expected: [0.0] }, +{ lhs: 1.0, rhs: -0.125, expected: [reinterpretU64AsF64(0x3fec000000000000n) /* 0.875 */] }, +{ lhs: 1.0, rhs: kValue.f64.negative.max, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.min, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.max, expected: [1.0] }, +{ lhs: 1.0, rhs: 0.0, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.min, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.max, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.min, expected: [1.0] }, +{ lhs: 1.0, rhs: 0.125, expected: [reinterpretU64AsF64(0x3ff2000000000000n) /* 1.125 */] }, +{ lhs: 1.0, rhs: 1.0, expected: [2] }, +{ lhs: 1.0, rhs: 10.0, expected: [11] }, +{ lhs: 1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: 10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: 10.0, rhs: -10.0, expected: [0.0] }, +{ lhs: 10.0, rhs: -1.0, expected: [9] }, +{ lhs: 10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0x4023c00000000000n) /* 9.875 */] }, +{ lhs: 10.0, rhs: kValue.f64.negative.max, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.min, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.max, expected: [10.0] }, +{ lhs: 10.0, rhs: 0.0, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.min, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.max, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.min, expected: [10.0] }, +{ lhs: 10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0x4024400000000000n) /* 10.125 */] }, +{ lhs: 10.0, rhs: 1.0, expected: [11] }, +{ lhs: 10.0, rhs: 10.0, expected: [20] }, +{ lhs: 10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.min, expected: [0.0] }, +{ lhs: kValue.f64.positive.max, rhs: -10.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: -1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: -0.125, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 0.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 0.125, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 10.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }]; + + + +const kMultiplicationRawValues = [ +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: kValue.f64.negative.min, rhs: -10.0, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: kValue.f64.negative.min, rhs: -1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.min, rhs: -0.125, expected: [reinterpretU64AsF64(0x7fbfffffffffffffn) /* 2.24712e+307 */] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x400fffffffffffffn) /* 4 */] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, reinterpretU64AsF64(0x400ffffffffffffdn) /* 4 */] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, reinterpretU64AsF64(0x3ccfffffffffffffn) /* 8.88178e-16 */] }, +{ lhs: kValue.f64.negative.min, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.min, expected: [reinterpretU64AsF64(0xbccfffffffffffffn) /* -8.88178e-16 */, 0.0] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.max, expected: [reinterpretU64AsF64(0xc00ffffffffffffdn) /* -4 */, 0.0] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0xc00fffffffffffffn) /* -4 */] }, +{ lhs: kValue.f64.negative.min, rhs: 0.125, expected: [reinterpretU64AsF64(0xffbfffffffffffffn) /* -2.24712e+307 */] }, +{ lhs: kValue.f64.negative.min, rhs: 1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 10.0, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: -10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: -10.0, rhs: -10.0, expected: [100] }, +{ lhs: -10.0, rhs: -1.0, expected: [10.0] }, +{ lhs: -10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0x3ff4000000000000n) /* 1.25 */] }, +{ lhs: -10.0, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x0044000000000000n) /* 2.22507e-307 */] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, reinterpretU64AsF64(0x0043fffffffffffen) /* 2.22507e-307 */, reinterpretU64AsF64(0x0043ffffffffffffn) /* 2.22507e-307 */] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, reinterpretU64AsF64(0x000000000000000an) /* 4.94066e-323 */] }, +{ lhs: -10.0, rhs: 0.0, expected: [0.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.min, expected: [reinterpretU64AsF64(0x800000000000000an) /* -4.94066e-323 */, 0.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.max, expected: [reinterpretU64AsF64(0x8043ffffffffffffn) /* -2.22507e-307 */, reinterpretU64AsF64(0x8043fffffffffffen) /* -2.22507e-307 */, 0.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x8044000000000000n) /* -2.22507e-307 */] }, +{ lhs: -10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0xbff4000000000000n) /* -1.25 */] }, +{ lhs: -10.0, rhs: 1.0, expected: [-10.0] }, +{ lhs: -10.0, rhs: 10.0, expected: [-100] }, +{ lhs: -10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: -1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: -1.0, rhs: -10.0, expected: [10.0] }, +{ lhs: -1.0, rhs: -1.0, expected: [1.0] }, +{ lhs: -1.0, rhs: -0.125, expected: [0.125] }, +{ lhs: -1.0, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.min] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: -1.0, rhs: 0.0, expected: [0.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.max] }, +{ lhs: -1.0, rhs: 0.125, expected: [-0.125] }, +{ lhs: -1.0, rhs: 1.0, expected: [-1.0] }, +{ lhs: -1.0, rhs: 10.0, expected: [-10.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: -0.125, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0x7fbfffffffffffffn) /* 2.24712e+307 */] }, +{ lhs: -0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0x3ff4000000000000n) /* 1.25 */] }, +{ lhs: -0.125, rhs: -1.0, expected: [0.125] }, +{ lhs: -0.125, rhs: -0.125, expected: [reinterpretU64AsF64(0x3f90000000000000n) /* 0.015625 */] }, +{ lhs: -0.125, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, reinterpretU64AsF64(0x0001ffffffffffffn) /* 2.78134e-309 */, reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: -0.125, rhs: 0.0, expected: [0.0] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.max, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */, reinterpretU64AsF64(0x8001ffffffffffffn) /* -2.78134e-309 */, 0.0] }, +{ lhs: -0.125, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */] }, +{ lhs: -0.125, rhs: 0.125, expected: [reinterpretU64AsF64(0xbf90000000000000n) /* -0.015625 */] }, +{ lhs: -0.125, rhs: 1.0, expected: [-0.125] }, +{ lhs: -0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0xbff4000000000000n) /* -1.25 */] }, +{ lhs: -0.125, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0xffbfffffffffffffn) /* -2.24712e+307 */] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0x400fffffffffffffn) /* 4 */] }, +{ lhs: kValue.f64.negative.max, rhs: -10.0, expected: [reinterpretU64AsF64(0x0044000000000000n) /* 2.22507e-307 */] }, +{ lhs: kValue.f64.negative.max, rhs: -1.0, expected: [kValue.f64.positive.min] }, +{ lhs: kValue.f64.negative.max, rhs: -0.125, expected: [reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.max, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.max, rhs: 0.125, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */] }, +{ lhs: kValue.f64.negative.max, rhs: 1.0, expected: [kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: 10.0, expected: [reinterpretU64AsF64(0x8044000000000000n) /* -2.22507e-307 */] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0xc00fffffffffffffn) /* -4 */] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.min, expected: [0.0, reinterpretU64AsF64(0x400ffffffffffffdn) /* 4 */] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -10.0, expected: [0.0, reinterpretU64AsF64(0x0043fffffffffffen) /* 2.22507e-307 */, reinterpretU64AsF64(0x0043ffffffffffffn) /* 2.22507e-307 */] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -1.0, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -0.125, expected: [0.0, reinterpretU64AsF64(0x0001ffffffffffffn) /* 2.78134e-309 */, reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.125, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */, reinterpretU64AsF64(0x8001ffffffffffffn) /* -2.78134e-309 */, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 1.0, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 10.0, expected: [reinterpretU64AsF64(0x8043ffffffffffffn) /* -2.22507e-307 */, reinterpretU64AsF64(0x8043fffffffffffen) /* -2.22507e-307 */, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0xc00ffffffffffffdn) /* -4 */, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.min, expected: [0.0, reinterpretU64AsF64(0x3ccfffffffffffffn) /* 8.88178e-16 */] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -10.0, expected: [0.0, reinterpretU64AsF64(0x000000000000000an) /* 4.94066e-323 */] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -1.0, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -0.125, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.125, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 1.0, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 10.0, expected: [reinterpretU64AsF64(0x800000000000000an) /* -4.94066e-323 */, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0xbccfffffffffffffn) /* -8.88178e-16 */, 0.0] }, +{ lhs: 0.0, rhs: kValue.f64.negative.min, expected: [0.0] }, +{ lhs: 0.0, rhs: -10.0, expected: [0.0] }, +{ lhs: 0.0, rhs: -1.0, expected: [0.0] }, +{ lhs: 0.0, rhs: -0.125, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.negative.max, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.min, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.max, expected: [0.0] }, +{ lhs: 0.0, rhs: 0.0, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.min, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.max, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.min, expected: [0.0] }, +{ lhs: 0.0, rhs: 0.125, expected: [0.0] }, +{ lhs: 0.0, rhs: 1.0, expected: [0.0] }, +{ lhs: 0.0, rhs: 10.0, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.max, expected: [0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0xbccfffffffffffffn) /* -8.88178e-16 */, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -10.0, expected: [reinterpretU64AsF64(0x800000000000000an) /* -4.94066e-323 */, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -1.0, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -0.125, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.125, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 1.0, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 10.0, expected: [0.0, reinterpretU64AsF64(0x000000000000000an) /* 4.94066e-323 */] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.max, expected: [0.0, reinterpretU64AsF64(0x3ccfffffffffffffn) /* 8.88178e-16 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0xc00ffffffffffffdn) /* -4 */, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -10.0, expected: [reinterpretU64AsF64(0x8043ffffffffffffn) /* -2.22507e-307 */, reinterpretU64AsF64(0x8043fffffffffffen) /* -2.22507e-307 */, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -1.0, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -0.125, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */, reinterpretU64AsF64(0x8001ffffffffffffn) /* -2.78134e-309 */, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.125, expected: [0.0, reinterpretU64AsF64(0x0001ffffffffffffn) /* 2.78134e-309 */, reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 1.0, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 10.0, expected: [0.0, reinterpretU64AsF64(0x0043fffffffffffen) /* 2.22507e-307 */, reinterpretU64AsF64(0x0043ffffffffffffn) /* 2.22507e-307 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.max, expected: [0.0, reinterpretU64AsF64(0x400ffffffffffffdn) /* 4 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0xc00fffffffffffffn) /* -4 */] }, +{ lhs: kValue.f64.positive.min, rhs: -10.0, expected: [reinterpretU64AsF64(0x8044000000000000n) /* -2.22507e-307 */] }, +{ lhs: kValue.f64.positive.min, rhs: -1.0, expected: [kValue.f64.negative.max] }, +{ lhs: kValue.f64.positive.min, rhs: -0.125, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.positive.min, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.min, rhs: 0.125, expected: [reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: kValue.f64.positive.min, rhs: 1.0, expected: [kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: 10.0, expected: [reinterpretU64AsF64(0x0044000000000000n) /* 2.22507e-307 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0x400fffffffffffffn) /* 4 */] }, +{ lhs: 0.125, rhs: kValue.f64.negative.min, expected: [reinterpretU64AsF64(0xffbfffffffffffffn) /* -2.24712e+307 */] }, +{ lhs: 0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0xbff4000000000000n) /* -1.25 */] }, +{ lhs: 0.125, rhs: -1.0, expected: [-0.125] }, +{ lhs: 0.125, rhs: -0.125, expected: [reinterpretU64AsF64(0xbf90000000000000n) /* -0.015625 */] }, +{ lhs: 0.125, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.min, expected: [reinterpretU64AsF64(0x8002000000000000n) /* -2.78134e-309 */, reinterpretU64AsF64(0x8001ffffffffffffn) /* -2.78134e-309 */, 0.0] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: 0.125, rhs: 0.0, expected: [0.0] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, reinterpretU64AsF64(0x0001ffffffffffffn) /* 2.78134e-309 */, reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: 0.125, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x0002000000000000n) /* 2.78134e-309 */] }, +{ lhs: 0.125, rhs: 0.125, expected: [reinterpretU64AsF64(0x3f90000000000000n) /* 0.015625 */] }, +{ lhs: 0.125, rhs: 1.0, expected: [0.125] }, +{ lhs: 0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0x3ff4000000000000n) /* 1.25 */] }, +{ lhs: 0.125, rhs: kValue.f64.positive.max, expected: [reinterpretU64AsF64(0x7fbfffffffffffffn) /* 2.24712e+307 */] }, +{ lhs: 1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.min] }, +{ lhs: 1.0, rhs: -10.0, expected: [-10.0] }, +{ lhs: 1.0, rhs: -1.0, expected: [-1.0] }, +{ lhs: 1.0, rhs: -0.125, expected: [-0.125] }, +{ lhs: 1.0, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.max] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: 1.0, rhs: 0.0, expected: [0.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: 1.0, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.min] }, +{ lhs: 1.0, rhs: 0.125, expected: [0.125] }, +{ lhs: 1.0, rhs: 1.0, expected: [1.0] }, +{ lhs: 1.0, rhs: 10.0, expected: [10.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max] }, +{ lhs: 10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: 10.0, rhs: -10.0, expected: [-100] }, +{ lhs: 10.0, rhs: -1.0, expected: [-10.0] }, +{ lhs: 10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0xbff4000000000000n) /* -1.25 */] }, +{ lhs: 10.0, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x8044000000000000n) /* -2.22507e-307 */] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.min, expected: [reinterpretU64AsF64(0x8043ffffffffffffn) /* -2.22507e-307 */, reinterpretU64AsF64(0x8043fffffffffffen) /* -2.22507e-307 */, 0.0] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.max, expected: [reinterpretU64AsF64(0x800000000000000an) /* -4.94066e-323 */, 0.0] }, +{ lhs: 10.0, rhs: 0.0, expected: [0.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, reinterpretU64AsF64(0x000000000000000an) /* 4.94066e-323 */] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, reinterpretU64AsF64(0x0043fffffffffffen) /* 2.22507e-307 */, reinterpretU64AsF64(0x0043ffffffffffffn) /* 2.22507e-307 */] }, +{ lhs: 10.0, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x0044000000000000n) /* 2.22507e-307 */] }, +{ lhs: 10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0x3ff4000000000000n) /* 1.25 */] }, +{ lhs: 10.0, rhs: 1.0, expected: [10.0] }, +{ lhs: 10.0, rhs: 10.0, expected: [100] }, +{ lhs: 10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.max, rhs: -10.0, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.max, rhs: -1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.max, rhs: -0.125, expected: [reinterpretU64AsF64(0xffbfffffffffffffn) /* -2.24712e+307 */] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0xc00fffffffffffffn) /* -4 */] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.min, expected: [reinterpretU64AsF64(0xc00ffffffffffffdn) /* -4 */, 0.0] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.max, expected: [reinterpretU64AsF64(0xbccfffffffffffffn) /* -8.88178e-16 */, 0.0] }, +{ lhs: kValue.f64.positive.max, rhs: 0.0, expected: [0.0] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.min, expected: [0.0, reinterpretU64AsF64(0x3ccfffffffffffffn) /* 8.88178e-16 */] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.max, expected: [0.0, reinterpretU64AsF64(0x400ffffffffffffdn) /* 4 */] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x400fffffffffffffn) /* 4 */] }, +{ lhs: kValue.f64.positive.max, rhs: 0.125, expected: [reinterpretU64AsF64(0x7fbfffffffffffffn) /* 2.24712e+307 */] }, +{ lhs: kValue.f64.positive.max, rhs: 1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 10.0, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }]; + + + +const kSubtractionRawValues = [ +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.min, expected: [0.0] }, +{ lhs: kValue.f64.negative.min, rhs: -10.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: -1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: -0.125, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 0.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 0.125, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 1.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: 10.0, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.infinity, kValue.f64.negative.min] }, +{ lhs: -10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: -10.0, rhs: -10.0, expected: [0.0] }, +{ lhs: -10.0, rhs: -1.0, expected: [-9] }, +{ lhs: -10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0xc023c00000000000n) /* -9.875 */] }, +{ lhs: -10.0, rhs: kValue.f64.negative.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.negative.subnormal.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: 0.0, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.subnormal.max, expected: [-10.0] }, +{ lhs: -10.0, rhs: kValue.f64.positive.min, expected: [-10.0] }, +{ lhs: -10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0xc024400000000000n) /* -10.125 */] }, +{ lhs: -10.0, rhs: 1.0, expected: [-11] }, +{ lhs: -10.0, rhs: 10.0, expected: [-20] }, +{ lhs: -10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: -1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: -1.0, rhs: -10.0, expected: [9] }, +{ lhs: -1.0, rhs: -1.0, expected: [0.0] }, +{ lhs: -1.0, rhs: -0.125, expected: [reinterpretU64AsF64(0xbfec000000000000n) /* -0.875 */] }, +{ lhs: -1.0, rhs: kValue.f64.negative.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.negative.subnormal.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: 0.0, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.subnormal.max, expected: [-1.0] }, +{ lhs: -1.0, rhs: kValue.f64.positive.min, expected: [-1.0] }, +{ lhs: -1.0, rhs: 0.125, expected: [reinterpretU64AsF64(0xbff2000000000000n) /* -1.125 */] }, +{ lhs: -1.0, rhs: 1.0, expected: [-2] }, +{ lhs: -1.0, rhs: 10.0, expected: [-11] }, +{ lhs: -1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: -0.125, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: -0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0x4023c00000000000n) /* 9.875 */] }, +{ lhs: -0.125, rhs: -1.0, expected: [reinterpretU64AsF64(0x3fec000000000000n) /* 0.875 */] }, +{ lhs: -0.125, rhs: -0.125, expected: [0.0] }, +{ lhs: -0.125, rhs: kValue.f64.negative.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.negative.subnormal.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: 0.0, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.subnormal.max, expected: [-0.125] }, +{ lhs: -0.125, rhs: kValue.f64.positive.min, expected: [-0.125] }, +{ lhs: -0.125, rhs: 0.125, expected: [reinterpretU64AsF64(0xbfd0000000000000n) /* -0.25 */] }, +{ lhs: -0.125, rhs: 1.0, expected: [reinterpretU64AsF64(0xbff2000000000000n) /* -1.125 */] }, +{ lhs: -0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0xc024400000000000n) /* -10.125 */] }, +{ lhs: -0.125, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.max, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.max, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.max, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.max, expected: [0.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min] }, +{ lhs: kValue.f64.negative.max, rhs: 0.0, expected: [kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.min, expected: [reinterpretU64AsF64(0x8010000000000001n) /* -2.22507e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.subnormal.max, expected: [reinterpretU64AsF64(0x801fffffffffffffn) /* -4.45015e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x8020000000000000n) /* -4.45015e-308 */] }, +{ lhs: kValue.f64.negative.max, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.max, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.max, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.subnormal.min, kValue.f64.positive.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.min, 0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.min, reinterpretU64AsF64(0x800ffffffffffffen) /* -2.22507e-308 */, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.0, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [reinterpretU64AsF64(0x801ffffffffffffen) /* -4.45015e-308 */, kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x801fffffffffffffn) /* -4.45015e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.subnormal.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0, reinterpretU64AsF64(0x000ffffffffffffen) /* 2.22507e-308 */, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.negative.subnormal.max, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.0, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [reinterpretU64AsF64(0x8000000000000002n) /* -9.88131e-324 */, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min, kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.min, expected: [reinterpretU64AsF64(0x8010000000000001n) /* -2.22507e-308 */, kValue.f64.negative.max] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.negative.subnormal.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: 0.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: 0.0, rhs: -10.0, expected: [10.0] }, +{ lhs: 0.0, rhs: -1.0, expected: [1.0] }, +{ lhs: 0.0, rhs: -0.125, expected: [0.125] }, +{ lhs: 0.0, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.min] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: 0.0, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: 0.0, rhs: 0.0, expected: [0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.min, 0.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.max] }, +{ lhs: 0.0, rhs: 0.125, expected: [-0.125] }, +{ lhs: 0.0, rhs: 1.0, expected: [-1.0] }, +{ lhs: 0.0, rhs: 10.0, expected: [-10.0] }, +{ lhs: 0.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x0010000000000001n) /* 2.22507e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min, kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min, reinterpretU64AsF64(0x0000000000000002n) /* 9.88131e-324 */] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.0, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.min, reinterpretU64AsF64(0x800ffffffffffffen) /* -2.22507e-308 */, 0.0, kValue.f64.positive.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.min] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.subnormal.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x001fffffffffffffn) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.max, reinterpretU64AsF64(0x001ffffffffffffen) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.negative.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.min, kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.0, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.negative.subnormal.max, 0.0, reinterpretU64AsF64(0x000ffffffffffffen) /* 2.22507e-308 */, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.negative.subnormal.min, 0.0, kValue.f64.positive.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.negative.max, kValue.f64.negative.subnormal.max] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.subnormal.max, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.min, rhs: -10.0, expected: [10.0] }, +{ lhs: kValue.f64.positive.min, rhs: -1.0, expected: [1.0] }, +{ lhs: kValue.f64.positive.min, rhs: -0.125, expected: [0.125] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.max, expected: [reinterpretU64AsF64(0x0020000000000000n) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x001fffffffffffffn) /* 4.45015e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.positive.min, reinterpretU64AsF64(0x0010000000000001n) /* 2.22507e-308 */] }, +{ lhs: kValue.f64.positive.min, rhs: 0.0, expected: [kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.positive.subnormal.max, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.positive.subnormal.min, kValue.f64.positive.min] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.min, expected: [0.0] }, +{ lhs: kValue.f64.positive.min, rhs: 0.125, expected: [-0.125] }, +{ lhs: kValue.f64.positive.min, rhs: 1.0, expected: [-1.0] }, +{ lhs: kValue.f64.positive.min, rhs: 10.0, expected: [-10.0] }, +{ lhs: kValue.f64.positive.min, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: 0.125, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: 0.125, rhs: -10.0, expected: [reinterpretU64AsF64(0x4024400000000000n) /* 10.125 */] }, +{ lhs: 0.125, rhs: -1.0, expected: [reinterpretU64AsF64(0x3ff2000000000000n) /* 1.125 */] }, +{ lhs: 0.125, rhs: -0.125, expected: [reinterpretU64AsF64(0x3fd0000000000000n) /* 0.25 */] }, +{ lhs: 0.125, rhs: kValue.f64.negative.max, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.min, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.negative.subnormal.max, expected: [0.125] }, +{ lhs: 0.125, rhs: 0.0, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.min, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.subnormal.max, expected: [0.125] }, +{ lhs: 0.125, rhs: kValue.f64.positive.min, expected: [0.125] }, +{ lhs: 0.125, rhs: 0.125, expected: [0.0] }, +{ lhs: 0.125, rhs: 1.0, expected: [reinterpretU64AsF64(0xbfec000000000000n) /* -0.875 */] }, +{ lhs: 0.125, rhs: 10.0, expected: [reinterpretU64AsF64(0xc023c00000000000n) /* -9.875 */] }, +{ lhs: 0.125, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: 1.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: 1.0, rhs: -10.0, expected: [11] }, +{ lhs: 1.0, rhs: -1.0, expected: [2] }, +{ lhs: 1.0, rhs: -0.125, expected: [reinterpretU64AsF64(0x3ff2000000000000n) /* 1.125 */] }, +{ lhs: 1.0, rhs: kValue.f64.negative.max, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.min, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.negative.subnormal.max, expected: [1.0] }, +{ lhs: 1.0, rhs: 0.0, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.min, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.subnormal.max, expected: [1.0] }, +{ lhs: 1.0, rhs: kValue.f64.positive.min, expected: [1.0] }, +{ lhs: 1.0, rhs: 0.125, expected: [reinterpretU64AsF64(0x3fec000000000000n) /* 0.875 */] }, +{ lhs: 1.0, rhs: 1.0, expected: [0.0] }, +{ lhs: 1.0, rhs: 10.0, expected: [-9] }, +{ lhs: 1.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: 10.0, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max] }, +{ lhs: 10.0, rhs: -10.0, expected: [20] }, +{ lhs: 10.0, rhs: -1.0, expected: [11] }, +{ lhs: 10.0, rhs: -0.125, expected: [reinterpretU64AsF64(0x4024400000000000n) /* 10.125 */] }, +{ lhs: 10.0, rhs: kValue.f64.negative.max, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.min, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.negative.subnormal.max, expected: [10.0] }, +{ lhs: 10.0, rhs: 0.0, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.min, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.subnormal.max, expected: [10.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.min, expected: [10.0] }, +{ lhs: 10.0, rhs: 0.125, expected: [reinterpretU64AsF64(0x4023c00000000000n) /* 9.875 */] }, +{ lhs: 10.0, rhs: 1.0, expected: [9] }, +{ lhs: 10.0, rhs: 10.0, expected: [0.0] }, +{ lhs: 10.0, rhs: kValue.f64.positive.max, expected: [kValue.f64.negative.min] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.min, expected: [kValue.f64.positive.max, kValue.f64.positive.infinity] }, +{ lhs: kValue.f64.positive.max, rhs: -10.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: -1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: -0.125, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.negative.subnormal.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 0.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.subnormal.max, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.min, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 0.125, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 1.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: 10.0, expected: [kValue.f64.positive.max] }, +{ lhs: kValue.f64.positive.max, rhs: kValue.f64.positive.max, expected: [0.0] }]; + + + +const kFractRawValues = [ +{ input: kValue.f64.negative.min, expected: [0.0] }, +{ input: -10.0, expected: [0.0] }, +{ input: -1.0, expected: [0.0] }, +{ input: -0.125, expected: [reinterpretU64AsF64(0x3fec000000000000n) /* 0.875 */] }, +{ input: kValue.f64.negative.max, expected: [1.0] }, +{ input: kValue.f64.negative.subnormal.min, expected: [1.0] }, +{ input: kValue.f64.negative.subnormal.max, expected: [1.0] }, +{ input: 0.0, expected: [0.0] }, +{ input: kValue.f64.positive.subnormal.min, expected: [0.0, kValue.f64.positive.subnormal.min] }, +{ input: kValue.f64.positive.subnormal.max, expected: [0.0, kValue.f64.positive.subnormal.max] }, +{ input: kValue.f64.positive.min, expected: [kValue.f64.positive.min] }, +{ input: 0.125, expected: [0.125] }, +{ input: 1.0, expected: [0.0] }, +{ input: 10.0, expected: [0.0] }, +{ input: kValue.f64.positive.max, expected: [0.0] }, +{ input: -10.0000999999999997669, expected: [reinterpretU64AsF64(0x3fefff2e48e8a720n) /* ~0.9999 */] }, +{ input: -2, expected: [0.0] }, +{ input: -1, expected: [0.0] }, +{ input: -0.5, expected: [reinterpretU64AsF64(0x3fe0000000000000n) /* 0.5 */] }, +{ input: 0.5, expected: [reinterpretU64AsF64(0x3fe0000000000000n) /* 0.5 */] }, +{ input: 1, expected: [0.0] }, +{ input: 2, expected: [0.0] }, +{ input: 10.0000999999999997669, expected: [reinterpretU64AsF64(0x3f1a36e2eb1c0000n) /* ~0.0001 */] }, +{ input: 3937509.87755102012306, expected: [reinterpretU64AsF64(0x3fec14e5e0800000n) /* ~0.877551 */] }]; + + +/** Table mapping addition binary inputs to expectation intervals */ +const kAdditionTable = new Map( + kAdditionRawValues.map((value) => [ + `${value.lhs} ${value.rhs}`, + FP.abstract.spanIntervals(...value.expected.map((e) => FP.abstract.correctlyRoundedInterval(e)))] + ) +); + +/** External interface for fetching addition expectation intervals. */ +export function getAdditionAFInterval(lhs, rhs) { + assert(kAdditionTable.has(`${lhs} ${rhs}`), `${lhs} + ${rhs} not defined in lookup table`); + return kAdditionTable.get(`${lhs} ${rhs}`); +} + +/** Table mapping multiplication binary inputs to expectation intervals */ +const kMultiplicationTable = new Map( + kMultiplicationRawValues.map((value) => [ + `${value.lhs} ${value.rhs}`, + FP.abstract.spanIntervals(...value.expected.map((e) => FP.abstract.correctlyRoundedInterval(e)))] + ) +); + +/** External interface for fetching multiplication expectation intervals. */ +export function getMultiplicationAFInterval(lhs, rhs) { + assert(kMultiplicationTable.has(`${lhs} ${rhs}`), `${lhs} * ${rhs} not defined in lookup table`); + return kMultiplicationTable.get(`${lhs} ${rhs}`); +} + +/** Table mapping subtraction binary inputs to expectation intervals */ +const kSubtractionTable = new Map( + kSubtractionRawValues.map((value) => [ + `${value.lhs} ${value.rhs}`, + FP.abstract.spanIntervals(...value.expected.map((e) => FP.abstract.correctlyRoundedInterval(e)))] + ) +); + +/** External interface for fetching subtraction expectation intervals. */ +export function getSubtractionAFInterval(lhs, rhs) { + assert(kSubtractionTable.has(`${lhs} ${rhs}`), `${lhs} * ${rhs} not defined in lookup table`); + return kSubtractionTable.get(`${lhs} ${rhs}`); +} + +/** + * Table mapping fract unary inputs to expectation intervals. Directly exposed, since the keys are + * numbers, so do not need the caller to know how to pack multiple values into a key correctly. + */ +export const kFractTable = new Map( + kFractRawValues.map((value) => [ + value.input, + FP.abstract.spanIntervals(...value.expected.map((e) => FP.abstract.correctlyRoundedInterval(e)))] + ) +); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.cache.js index 867a448b26a..0eca9ce46c8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.cache.js @@ -3,11 +3,13 @@ **/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; const divisionVectorScalarInterval = (v, s) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.divisionInterval(e, s))); + // division has an ulp accuracy, so abstract is only expected to be as accurate as f32 + return FP.abstract.toVector(v.map((e) => FP.f32.divisionInterval(e, s))); }; const divisionScalarVectorInterval = (s, v) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.divisionInterval(s, e))); + // division has an ulp accuracy, so abstract is only expected to be as accurate as f32 + return FP.abstract.toVector(v.map((e) => FP.f32.divisionInterval(s, e))); }; const scalar_cases = { @@ -16,7 +18,8 @@ const scalar_cases = { sparseScalarF64Range(), sparseScalarF64Range(), 'finite', - FP.abstract.divisionInterval + // division has an ulp accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.divisionInterval ); } }; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.spec.js index eea10865180..495706ef5d6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_division.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for non-matrix AbstractFloat division expression +Execution Tests for non-matrix abstract-float division expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_division.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,9 @@ fn(async (t) => { const cases = await d.get('scalar'); await run( t, - abstractBinary('/'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('/'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -48,9 +48,9 @@ fn(async (t) => { const cases = await d.get('scalar'); // Using vectorize to generate vector cases based on scalar cases await run( t, - abstractBinary('/'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('/'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -70,9 +70,9 @@ fn(async (t) => { const cases = await d.get(`vec${dim}_scalar`); await run( t, - abstractBinary('/'), - [TypeVec(dim, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('/'), + [Type.vec(dim, Type.abstractFloat), Type.abstractFloat], + Type.vec(dim, Type.abstractFloat), t.params, cases ); @@ -92,9 +92,9 @@ fn(async (t) => { const cases = await d.get(`scalar_vec${dim}`); await run( t, - abstractBinary('/'), - [TypeAbstractFloat, TypeVec(dim, TypeAbstractFloat)], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('/'), + [Type.abstractFloat, Type.vec(dim, Type.abstractFloat)], + Type.vec(dim, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.cache.js index 3af576a5089..eeb5d14433b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.cache.js @@ -1,17 +1,43 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../util/floating_point.js';import { sparseMatrixF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; +**/import { assert } from '../../../../../common/util/util.js';import { FP } from '../../../../util/floating_point.js'; +import { selectNCases } from '../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +import { getAdditionAFInterval, kSparseMatrixAFValues } from './af_data.js'; + +const additionMatrixMatrixInterval = ( +lhs, +rhs) => +{ + assert(lhs.length === rhs.length, 'lhs and rhs have different number of columns'); + assert(rhs[0].length === rhs[0].length, 'lhs and rhs have different number of rows'); + const cols = lhs.length; + const rows = rhs[0].length; + + const result = [...Array(cols)].map((_) => [...Array(rows)]); + for (let i = 0; i < cols; i++) { + for (let j = 0; j < rows; j++) { + result[i][j] = getAdditionAFInterval(lhs[i][j], rhs[i][j]); + } + } + return FP.abstract.toMatrix(result); +}; // Cases: matCxR const mat_cases = [2, 3, 4]. flatMap((cols) => [2, 3, 4].map((rows) => ({ [`mat${cols}x${rows}`]: () => { - return FP.abstract.generateMatrixPairToMatrixCases( - sparseMatrixF64Range(cols, rows), - sparseMatrixF64Range(cols, rows), - 'finite', - FP.abstract.additionMatrixMatrixInterval + return selectNCases( + 'binary/af_matrix_addition', + 50, + FP.abstract.generateMatrixPairToMatrixCases( + kSparseMatrixAFValues[cols][rows], + kSparseMatrixAFValues[cols][rows], + 'finite', + additionMatrixMatrixInterval + ) ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.spec.js index 6007298df0b..132fe4244e6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_addition.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for matrix AbstractFloat addition expressions +Execution Tests for matrix abstract-float addition expressions `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_matrix_addition.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -32,9 +32,9 @@ fn(async (t) => { const cases = await d.get(`mat${cols}x${rows}`); await run( t, - abstractBinary('+'), - [TypeMat(cols, rows, TypeAbstractFloat), TypeMat(cols, rows, TypeAbstractFloat)], - TypeMat(cols, rows, TypeAbstractFloat), + abstractFloatBinary('+'), + [Type.mat(cols, rows, Type.abstractFloat), Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(cols, rows, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.cache.js new file mode 100644 index 00000000000..a313cea9925 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.cache.js @@ -0,0 +1,29 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { FP } from '../../../../util/floating_point.js';import { sparseMatrixF64Range } from '../../../../util/math.js';import { selectNCases } from '../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +// Cases: matKxR_matCxK +const mat_mat_cases = [2, 3, 4]. +flatMap((k) => +[2, 3, 4].flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`mat${k}x${rows}_mat${cols}x${k}`]: () => { + return selectNCases( + 'binary/af_matrix_matrix_multiplication', + 10, + FP.abstract.generateMatrixPairToMatrixCases( + sparseMatrixF64Range(k, rows), + sparseMatrixF64Range(cols, k), + 'finite', + // Matrix-matrix multiplication has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.multiplicationMatrixMatrixInterval + ) + ); + } +})) +) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +export const d = makeCaseCache('binary/af_matrix_matrix_multiplication', mat_mat_cases); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.js new file mode 100644 index 00000000000..27889a2a4f3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.js @@ -0,0 +1,45 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for matrix-matrix AbstractFloat multiplication expression +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { d } from './af_matrix_matrix_multiplication.cache.js'; +import { abstractFloatBinary } from './binary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('matrix_matrix'). +specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). +desc( + ` +Expression: x * y, where x is a matrix and y is a matrix +Accuracy: Correctly rounded +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('common_dim', [2, 3, 4]). +combine('x_rows', [2, 3, 4]). +combine('y_cols', [2, 3, 4]) +). +fn(async (t) => { + const x_cols = t.params.common_dim; + const x_rows = t.params.x_rows; + const y_cols = t.params.y_cols; + const y_rows = t.params.common_dim; + + const cases = await d.get(`mat${x_cols}x${x_rows}_mat${y_cols}x${y_rows}`); + await run( + t, + abstractFloatBinary('*'), + [Type.mat(x_cols, x_rows, Type.abstractFloat), Type.mat(y_cols, y_rows, Type.abstractFloat)], + Type.mat(y_cols, x_rows, Type.abstractFloat), + t.params, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.cache.js new file mode 100644 index 00000000000..1e39459d7a3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.cache.js @@ -0,0 +1,76 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { FP } from '../../../../util/floating_point.js';import { flatten2DArray, sparseScalarF64Range, unflatten2DArray } from '../../../../util/math.js'; +import { selectNCases } from '../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +import { getMultiplicationAFInterval, kSparseMatrixAFValues } from './af_data.js'; + +const multiplicationMatrixScalarInterval = (mat, s) => { + const cols = mat.length; + const rows = mat[0].length; + return FP.abstract.toMatrix( + unflatten2DArray( + flatten2DArray(mat).map((e) => getMultiplicationAFInterval(e, s)), + cols, + rows + ) + ); +}; + +const multiplicationScalarMatrixInterval = (s, mat) => { + const cols = mat.length; + const rows = mat[0].length; + return FP.abstract.toMatrix( + unflatten2DArray( + flatten2DArray(mat).map((e) => getMultiplicationAFInterval(s, e)), + cols, + rows + ) + ); +}; + +// Cases: matCxR_scalar +const mat_scalar_cases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`mat${cols}x${rows}_scalar`]: () => { + return selectNCases( + 'binary/af_matrix_scalar_multiplication_mat_scalar', + 50, + FP.abstract.generateMatrixScalarToMatrixCases( + kSparseMatrixAFValues[cols][rows], + sparseScalarF64Range(), + 'finite', + multiplicationMatrixScalarInterval + ) + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +// Cases: scalar_matCxR +const scalar_mat_cases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`scalar_mat${cols}x${rows}`]: () => { + return selectNCases( + 'binary/af_matrix_scalar_multiplication_scalar_mat', + 50, + FP.abstract.generateScalarMatrixToMatrixCases( + sparseScalarF64Range(), + kSparseMatrixAFValues[cols][rows], + 'finite', + multiplicationScalarMatrixInterval + ) + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +export const d = makeCaseCache('binary/af_matrix_scalar_multiplication', { + ...mat_scalar_cases, + ...scalar_mat_cases +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.js new file mode 100644 index 00000000000..78b2b4bcf8d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.js @@ -0,0 +1,69 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for matrix-scalar and scalar-matrix AbstractFloat multiplication expression +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { d } from './af_matrix_scalar_multiplication.cache.js'; +import { abstractFloatBinary } from './binary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('matrix_scalar'). +specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). +desc( + ` +Expression: x * y, where x is a matrix and y is a scalar +Accuracy: Correctly rounded +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`mat${cols}x${rows}_scalar`); + await run( + t, + abstractFloatBinary('*'), + [Type.mat(cols, rows, Type.abstractFloat), Type.abstractFloat], + Type.mat(cols, rows, Type.abstractFloat), + t.params, + cases + ); +}); + +g.test('scalar_matrix'). +specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). +desc( + ` +Expression: x * y, where x is a scalar and y is a matrix +Accuracy: Correctly rounded +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`scalar_mat${cols}x${rows}`); + await run( + t, + abstractFloatBinary('*'), + [Type.abstractFloat, Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(cols, rows, Type.abstractFloat), + t.params, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.cache.js index ffbe51b3f3c..865afbabd85 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.cache.js @@ -1,17 +1,43 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../util/floating_point.js';import { sparseMatrixF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; +**/import { assert } from '../../../../../common/util/util.js';import { FP } from '../../../../util/floating_point.js'; +import { selectNCases } from '../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +import { getSubtractionAFInterval, kSparseMatrixAFValues } from './af_data.js'; + +const subtractionMatrixMatrixInterval = ( +lhs, +rhs) => +{ + assert(lhs.length === rhs.length, 'lhs and rhs have different number of columns'); + assert(rhs[0].length === rhs[0].length, 'lhs and rhs have different number of rows'); + const cols = lhs.length; + const rows = rhs[0].length; + + const result = [...Array(cols)].map((_) => [...Array(rows)]); + for (let i = 0; i < cols; i++) { + for (let j = 0; j < rows; j++) { + result[i][j] = getSubtractionAFInterval(lhs[i][j], rhs[i][j]); + } + } + return FP.abstract.toMatrix(result); +}; // Cases: matCxR const mat_cases = [2, 3, 4]. flatMap((cols) => [2, 3, 4].map((rows) => ({ [`mat${cols}x${rows}`]: () => { - return FP.abstract.generateMatrixPairToMatrixCases( - sparseMatrixF64Range(cols, rows), - sparseMatrixF64Range(cols, rows), - 'finite', - FP.abstract.subtractionMatrixMatrixInterval + return selectNCases( + 'binary/af_matrix_subtraction', + 50, + FP.abstract.generateMatrixPairToMatrixCases( + kSparseMatrixAFValues[cols][rows], + kSparseMatrixAFValues[cols][rows], + 'finite', + subtractionMatrixMatrixInterval + ) ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.spec.js index 8ea6bcbdfb3..5a0f0ff8ffe 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_subtraction.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for matrix AbstractFloat subtraction expression +Execution Tests for matrix abstract-float subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_matrix_subtraction.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -32,9 +32,9 @@ fn(async (t) => { const cases = await d.get(`mat${cols}x${rows}`); await run( t, - abstractBinary('-'), - [TypeMat(cols, rows, TypeAbstractFloat), TypeMat(cols, rows, TypeAbstractFloat)], - TypeMat(cols, rows, TypeAbstractFloat), + abstractFloatBinary('-'), + [Type.mat(cols, rows, Type.abstractFloat), Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(cols, rows, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.cache.js new file mode 100644 index 00000000000..9f2124652cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.cache.js @@ -0,0 +1,51 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { FP } from '../../../../util/floating_point.js';import { sparseMatrixF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { selectNCases } from '../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +// Cases: matCxR_vecC +const mat_vec_cases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`mat${cols}x${rows}_vec${cols}`]: () => { + return selectNCases( + 'binary/af_matrix_vector_multiplication_mat_vec', + 50, + FP.abstract.generateMatrixVectorToVectorCases( + sparseMatrixF64Range(cols, rows), + sparseVectorF64Range(cols), + 'finite', + // Matrix-vector multiplication has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.multiplicationMatrixVectorInterval + ) + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +// Cases: vecR_matCxR +const vec_mat_cases = [2, 3, 4]. +flatMap((rows) => +[2, 3, 4].map((cols) => ({ + [`vec${rows}_mat${cols}x${rows}`]: () => { + return selectNCases( + 'binary/af_matrix_vector_multiplication_vec_mat', + 50, + FP.abstract.generateVectorMatrixToVectorCases( + sparseVectorF64Range(rows), + sparseMatrixF64Range(cols, rows), + 'finite', + // Vector-matrix multiplication has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.multiplicationVectorMatrixInterval + ) + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +export const d = makeCaseCache('binary/af_matrix_vector_multiplication', { + ...mat_vec_cases, + ...vec_mat_cases +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.spec.js new file mode 100644 index 00000000000..9ae17ce0cc0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.spec.js @@ -0,0 +1,69 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for matrix-vector and vector-matrix AbstractFloat multiplication expression +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { d } from './af_matrix_vector_multiplication.cache.js'; +import { abstractFloatBinary } from './binary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('matrix_vector'). +specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). +desc( + ` +Expression: x * y, where x is a matrix and y is a vector +Accuracy: Correctly rounded +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`mat${cols}x${rows}_vec${cols}`); + await run( + t, + abstractFloatBinary('*'), + [Type.mat(cols, rows, Type.abstractFloat), Type.vec(cols, Type.abstractFloat)], + Type.vec(rows, Type.abstractFloat), + t.params, + cases + ); +}); + +g.test('vector_matrix'). +specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). +desc( + ` +Expression: x * y, where x is a vector and y is is a matrix +Accuracy: Correctly rounded +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`vec${rows}_mat${cols}x${rows}`); + await run( + t, + abstractFloatBinary('*'), + [Type.vec(rows, Type.abstractFloat), Type.mat(cols, rows, Type.abstractFloat)], + Type.vec(cols, Type.abstractFloat), + t.params, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.cache.js index 210aab7752b..f95670fffc4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.cache.js @@ -1,13 +1,15 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; +**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; + +import { getMultiplicationAFInterval, kSparseVectorAFValues } from './af_data.js'; const multiplicationVectorScalarInterval = (v, s) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.multiplicationInterval(e, s))); + return FP.abstract.toVector(v.map((e) => getMultiplicationAFInterval(e, s))); }; const multiplicationScalarVectorInterval = (s, v) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.multiplicationInterval(s, e))); + return FP.abstract.toVector(v.map((e) => getMultiplicationAFInterval(s, e))); }; const scalar_cases = { @@ -16,7 +18,7 @@ const scalar_cases = { sparseScalarF64Range(), sparseScalarF64Range(), 'finite', - FP.abstract.multiplicationInterval + getMultiplicationAFInterval ); } }; @@ -25,7 +27,7 @@ const vector_scalar_cases = [2, 3, 4]. map((dim) => ({ [`vec${dim}_scalar`]: () => { return FP.abstract.generateVectorScalarToVectorCases( - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], sparseScalarF64Range(), 'finite', multiplicationVectorScalarInterval @@ -39,7 +41,7 @@ map((dim) => ({ [`scalar_vec${dim}`]: () => { return FP.abstract.generateScalarVectorToVectorCases( sparseScalarF64Range(), - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], 'finite', multiplicationScalarVectorInterval ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.spec.js index c9e6926635a..9a5f7bdb0d2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_multiplication.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for non-matrix AbstractFloat multiplication expression +Execution Tests for non-matrix abstract-float multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_multiplication.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,9 @@ fn(async (t) => { const cases = await d.get('scalar'); await run( t, - abstractBinary('*'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('*'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -48,9 +48,9 @@ fn(async (t) => { const cases = await d.get('scalar'); // Using vectorize to generate vector cases based on scalar cases await run( t, - abstractBinary('*'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('*'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -70,9 +70,9 @@ fn(async (t) => { const cases = await d.get(`vec${dim}_scalar`); await run( t, - abstractBinary('*'), - [TypeVec(dim, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('*'), + [Type.vec(dim, Type.abstractFloat), Type.abstractFloat], + Type.vec(dim, Type.abstractFloat), t.params, cases ); @@ -92,9 +92,9 @@ fn(async (t) => { const cases = await d.get(`scalar_vec${dim}`); await run( t, - abstractBinary('*'), - [TypeAbstractFloat, TypeVec(dim, TypeAbstractFloat)], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('*'), + [Type.abstractFloat, Type.vec(dim, Type.abstractFloat)], + Type.vec(dim, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.cache.js index d75ddd8c72f..e0e34535532 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.cache.js @@ -3,11 +3,13 @@ **/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; const remainderVectorScalarInterval = (v, s) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.remainderInterval(e, s))); + // remainder has an inherited accuracy, so abstract is only expected to be as accurate as f32 + return FP.abstract.toVector(v.map((e) => FP.f32.remainderInterval(e, s))); }; const remainderScalarVectorInterval = (s, v) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.remainderInterval(s, e))); + // remainder has an inherited accuracy, so abstract is only expected to be as accurate as f32 + return FP.abstract.toVector(v.map((e) => FP.f32.remainderInterval(s, e))); }; const scalar_cases = { @@ -16,7 +18,8 @@ const scalar_cases = { sparseScalarF64Range(), sparseScalarF64Range(), 'finite', - FP.abstract.remainderInterval + // remainder has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.remainderInterval ); } }; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.spec.js index 4abf5d88d50..7cbeda971cf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_remainder.spec.js @@ -4,11 +4,11 @@ Execution Tests for non-matrix abstract float remainder expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_remainder.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,9 @@ fn(async (t) => { const cases = await d.get('scalar'); await run( t, - abstractBinary('%'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('%'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -48,9 +48,9 @@ fn(async (t) => { const cases = await d.get('scalar'); // Using vectorize to generate vector cases based on scalar cases await run( t, - abstractBinary('%'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('%'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -70,9 +70,9 @@ fn(async (t) => { const cases = await d.get(`vec${dim}_scalar`); await run( t, - abstractBinary('%'), - [TypeVec(dim, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('%'), + [Type.vec(dim, Type.abstractFloat), Type.abstractFloat], + Type.vec(dim, Type.abstractFloat), t.params, cases ); @@ -92,9 +92,9 @@ fn(async (t) => { const cases = await d.get(`scalar_vec${dim}`); await run( t, - abstractBinary('%'), - [TypeAbstractFloat, TypeVec(dim, TypeAbstractFloat)], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('%'), + [Type.abstractFloat, Type.vec(dim, Type.abstractFloat)], + Type.vec(dim, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.cache.js index ea2adc302f7..74839462cec 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.cache.js @@ -1,31 +1,22 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range, sparseVectorF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; +**/import { FP } from '../../../../util/floating_point.js';import { sparseScalarF64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; -const subtractionVectorScalarInterval = (v, s) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.subtractionInterval(e, s))); +import { getSubtractionAFInterval, kSparseVectorAFValues } from './af_data.js'; + +const subtractionVectorScalarInterval = (vec, s) => { + return FP.abstract.toVector(vec.map((v) => getSubtractionAFInterval(v, s))); }; -const subtractionScalarVectorInterval = (s, v) => { - return FP.abstract.toVector(v.map((e) => FP.abstract.subtractionInterval(s, e))); -}; - -const scalar_cases = { - ['scalar']: () => { - return FP.abstract.generateScalarPairToIntervalCases( - sparseScalarF64Range(), - sparseScalarF64Range(), - 'finite', - FP.abstract.subtractionInterval - ); - } +const subtractionScalarVectorInterval = (s, vec) => { + return FP.abstract.toVector(vec.map((v) => getSubtractionAFInterval(s, v))); }; const vector_scalar_cases = [2, 3, 4]. map((dim) => ({ [`vec${dim}_scalar`]: () => { return FP.abstract.generateVectorScalarToVectorCases( - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], sparseScalarF64Range(), 'finite', subtractionVectorScalarInterval @@ -39,7 +30,7 @@ map((dim) => ({ [`scalar_vec${dim}`]: () => { return FP.abstract.generateScalarVectorToVectorCases( sparseScalarF64Range(), - sparseVectorF64Range(dim), + kSparseVectorAFValues[dim], 'finite', subtractionScalarVectorInterval ); @@ -48,7 +39,14 @@ map((dim) => ({ reduce((a, b) => ({ ...a, ...b }), {}); export const d = makeCaseCache('binary/af_subtraction', { - ...scalar_cases, + ['scalar']: () => { + return FP.abstract.generateScalarPairToIntervalCases( + sparseScalarF64Range(), + sparseScalarF64Range(), + 'finite', + getSubtractionAFInterval + ); + }, ...vector_scalar_cases, ...scalar_vector_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.spec.js index f1d510c4e60..a3cdd89f216 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/af_subtraction.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for non-matrix AbstractFloat subtraction expression +Execution Tests for non-matrix abstract-float subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_subtraction.cache.js'; -import { abstractBinary } from './binary.js'; +import { abstractFloatBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,9 @@ fn(async (t) => { const cases = await d.get('scalar'); await run( t, - abstractBinary('-'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('-'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -48,9 +48,9 @@ fn(async (t) => { const cases = await d.get('scalar'); // Using vectorize to generate vector cases based on scalar cases await run( t, - abstractBinary('-'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBinary('-'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -70,9 +70,9 @@ fn(async (t) => { const cases = await d.get(`vec${dim}_scalar`); await run( t, - abstractBinary('-'), - [TypeVec(dim, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('-'), + [Type.vec(dim, Type.abstractFloat), Type.abstractFloat], + Type.vec(dim, Type.abstractFloat), t.params, cases ); @@ -92,9 +92,9 @@ fn(async (t) => { const cases = await d.get(`scalar_vec${dim}`); await run( t, - abstractBinary('-'), - [TypeAbstractFloat, TypeVec(dim, TypeAbstractFloat)], - TypeVec(dim, TypeAbstractFloat), + abstractFloatBinary('-'), + [Type.abstractFloat, Type.vec(dim, Type.abstractFloat)], + Type.vec(dim, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.cache.js new file mode 100644 index 00000000000..af9ec7ac629 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.cache.js @@ -0,0 +1,145 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { kValue } from '../../../../util/constants.js';import { sparseI64Range, vectorI64Range } from '../../../../util/math.js';import { + generateBinaryToI64Cases, + generateI64VectorBinaryToVectorCases, + generateVectorI64BinaryToVectorCases } from +'../case.js'; +import { makeCaseCache } from '../case_cache.js'; + +function ai_add(x, y) { + const result = x + y; + return !kValue.i64.isOOB(result) ? result : undefined; +} + +function ai_div(x, y) { + if (y === 0n) return undefined; + if (x === kValue.i64.negative.min && y === -1n) return undefined; + const result = x / y; + return !kValue.i64.isOOB(result) ? result : undefined; +} + +function ai_mul(x, y) { + const result = x * y; + return !kValue.i64.isOOB(result) ? result : undefined; +} + +function ai_rem(x, y) { + if (y === 0n) return undefined; + if (x === kValue.i64.negative.min && y === -1n) return undefined; + const result = x % y; + return !kValue.i64.isOOB(result) ? result : undefined; +} + +function ai_sub(x, y) { + const result = x - y; + return !kValue.i64.isOOB(result) ? result : undefined; +} + +export const d = makeCaseCache('binary/ai_arithmetic', { + addition: () => { + return generateBinaryToI64Cases(sparseI64Range(), sparseI64Range(), ai_add); + }, + addition_scalar_vector2: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(2), ai_add); + }, + addition_scalar_vector3: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(3), ai_add); + }, + addition_scalar_vector4: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(4), ai_add); + }, + addition_vector2_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(2), sparseI64Range(), ai_add); + }, + addition_vector3_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(3), sparseI64Range(), ai_add); + }, + addition_vector4_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(4), sparseI64Range(), ai_add); + }, + division: () => { + return generateBinaryToI64Cases(sparseI64Range(), sparseI64Range(), ai_div); + }, + division_scalar_vector2: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(2), ai_div); + }, + division_scalar_vector3: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(3), ai_div); + }, + division_scalar_vector4: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(4), ai_div); + }, + division_vector2_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(2), sparseI64Range(), ai_div); + }, + division_vector3_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(3), sparseI64Range(), ai_div); + }, + division_vector4_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(4), sparseI64Range(), ai_div); + }, + multiplication: () => { + return generateBinaryToI64Cases(sparseI64Range(), sparseI64Range(), ai_mul); + }, + multiplication_scalar_vector2: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(2), ai_mul); + }, + multiplication_scalar_vector3: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(3), ai_mul); + }, + multiplication_scalar_vector4: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(4), ai_mul); + }, + multiplication_vector2_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(2), sparseI64Range(), ai_mul); + }, + multiplication_vector3_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(3), sparseI64Range(), ai_mul); + }, + multiplication_vector4_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(4), sparseI64Range(), ai_mul); + }, + remainder: () => { + return generateBinaryToI64Cases(sparseI64Range(), sparseI64Range(), ai_rem); + }, + remainder_scalar_vector2: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(2), ai_rem); + }, + remainder_scalar_vector3: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(3), ai_rem); + }, + remainder_scalar_vector4: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(4), ai_rem); + }, + remainder_vector2_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(2), sparseI64Range(), ai_rem); + }, + remainder_vector3_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(3), sparseI64Range(), ai_rem); + }, + remainder_vector4_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(4), sparseI64Range(), ai_rem); + }, + subtraction: () => { + return generateBinaryToI64Cases(sparseI64Range(), sparseI64Range(), ai_sub); + }, + subtraction_scalar_vector2: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(2), ai_sub); + }, + subtraction_scalar_vector3: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(3), ai_sub); + }, + subtraction_scalar_vector4: () => { + return generateI64VectorBinaryToVectorCases(sparseI64Range(), vectorI64Range(4), ai_sub); + }, + subtraction_vector2_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(2), sparseI64Range(), ai_sub); + }, + subtraction_vector3_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(3), sparseI64Range(), ai_sub); + }, + subtraction_vector4_scalar: () => { + return generateVectorI64BinaryToVectorCases(vectorI64Range(4), sparseI64Range(), ai_sub); + } +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.spec.js new file mode 100644 index 00000000000..ae85bd2d6f3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_arithmetic.spec.js @@ -0,0 +1,303 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for the abstract int arithmetic binary expression operations +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { d } from './ai_arithmetic.cache.js'; +import { abstractIntBinary } from './binary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('addition'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x + y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('addition'); + await run( + t, + abstractIntBinary('+'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); + +g.test('addition_scalar_vector'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x + y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_rhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_rhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`addition_scalar_vector${vec_size}`); + await run(t, abstractIntBinary('+'), [Type.abstractInt, vec_type], vec_type, t.params, cases); +}); + +g.test('addition_vector_scalar'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x + y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_lhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_lhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`addition_vector${vec_size}_scalar`); + await run(t, abstractIntBinary('+'), [vec_type, Type.abstractInt], vec_type, t.params, cases); +}); + +g.test('division'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x / y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('division'); + await run( + t, + abstractIntBinary('/'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); + +g.test('division_scalar_vector'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x / y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_rhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_rhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`division_scalar_vector${vec_size}`); + await run(t, abstractIntBinary('/'), [Type.abstractInt, vec_type], vec_type, t.params, cases); +}); + +g.test('division_vector_scalar'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x / y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_lhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_lhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`division_vector${vec_size}_scalar`); + await run(t, abstractIntBinary('/'), [vec_type, Type.abstractInt], vec_type, t.params, cases); +}); + +g.test('multiplication'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x * y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('multiplication'); + await run( + t, + abstractIntBinary('*'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); + +g.test('multiplication_scalar_vector'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x * y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_rhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_rhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`multiplication_scalar_vector${vec_size}`); + await run(t, abstractIntBinary('*'), [Type.abstractInt, vec_type], vec_type, t.params, cases); +}); + +g.test('multiplication_vector_scalar'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x * y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_lhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_lhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`multiplication_vector${vec_size}_scalar`); + await run(t, abstractIntBinary('*'), [vec_type, Type.abstractInt], vec_type, t.params, cases); +}); + +g.test('remainder'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x % y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('remainder'); + await run( + t, + abstractIntBinary('%'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); + +g.test('remainder_scalar_vector'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x % y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_rhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_rhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`remainder_scalar_vector${vec_size}`); + await run(t, abstractIntBinary('%'), [Type.abstractInt, vec_type], vec_type, t.params, cases); +}); + +g.test('remainder_vector_scalar'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x % y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_lhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_lhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`remainder_vector${vec_size}_scalar`); + await run(t, abstractIntBinary('%'), [vec_type, Type.abstractInt], vec_type, t.params, cases); +}); + +g.test('subtraction'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x - y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('subtraction'); + await run( + t, + abstractIntBinary('-'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); + +g.test('subtraction_scalar_vector'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x - y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_rhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_rhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`subtraction_scalar_vector${vec_size}`); + await run(t, abstractIntBinary('-'), [Type.abstractInt, vec_type], vec_type, t.params, cases); +}); + +g.test('subtraction_vector_scalar'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: x - y +` +). +params((u) => +u.combine('inputSource', onlyConstInputSource).combine('vectorize_lhs', [2, 3, 4]) +). +fn(async (t) => { + const vec_size = t.params.vectorize_lhs; + const vec_type = Type.vec(vec_size, Type.abstractInt); + const cases = await d.get(`subtraction_vector${vec_size}_scalar`); + await run(t, abstractIntBinary('-'), [vec_type, Type.abstractInt], vec_type, t.params, cases); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_comparison.spec.js new file mode 100644 index 00000000000..902e1c00009 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/ai_comparison.spec.js @@ -0,0 +1,124 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for the abstract-int comparison expressions +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { bool, abstractInt, Type } from '../../../../util/conversion.js'; +import { vectorI64Range } from '../../../../util/math.js'; + +import { onlyConstInputSource, run } from '../expression.js'; + +import { binary } from './binary.js'; + +export const g = makeTestGroup(GPUTest); + +/** + * @returns a test case for the provided left hand & right hand values and + * expected boolean result. + */ +function makeCase(lhs, rhs, expected_answer) { + return { input: [abstractInt(lhs), abstractInt(rhs)], expected: bool(expected_answer) }; +} + +g.test('equals'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x == y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] === v[1])); + await run(t, binary('=='), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); + +g.test('not_equals'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x != y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] !== v[1])); + await run(t, binary('!='), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); + +g.test('less_than'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x < y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] < v[1])); + await run(t, binary('<'), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); + +g.test('less_equals'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x <= y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] <= v[1])); + await run(t, binary('<='), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); + +g.test('greater_than'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x > y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] > v[1])); + await run(t, binary('>'), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); + +g.test('greater_equals'). +specURL('https://www.w3.org/TR/WGSL/#comparison-expr'). +desc( + ` +Expression: x >= y +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = vectorI64Range(2).map((v) => makeCase(v[0], v[1], v[0] >= v[1])); + await run(t, binary('>='), [Type.abstractInt, Type.abstractInt], Type.bool, t.params, cases); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/binary.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/binary.js index f3f84db87c9..1f0329e40bb 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/binary.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/binary.js @@ -2,7 +2,8 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { basicExpressionBuilder, compoundAssignmentBuilder, -abstractFloatShaderBuilder } from +abstractFloatShaderBuilder, +abstractIntShaderBuilder } from '../expression.js'; /* @returns a ShaderBuilder that evaluates a binary operation */ @@ -16,6 +17,11 @@ export function compoundBinary(op) { } /* @returns a ShaderBuilder that evaluates a binary operation that returns AbstractFloats */ -export function abstractBinary(op) { +export function abstractFloatBinary(op) { return abstractFloatShaderBuilder((values) => `(${values.map((v) => `(${v})`).join(op)})`); +} + +/* @returns a ShaderBuilder that evaluates a binary operation that returns AbstractFloats */ +export function abstractIntBinary(op) { + return abstractIntShaderBuilder((values) => `(${values.map((v) => `(${v})`).join(op)})`); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise.spec.js index c442f5cfa45..06ff03bb126 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise.spec.js @@ -3,59 +3,171 @@ **/export const description = ` Execution Tests for the bitwise binary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { assert } from '../../../../../common/util/util.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { i32, scalarType, u32 } from '../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { + abstractIntBits, + i32Bits, -import { binary, compoundBinary } from './binary.js'; + scalarType, + u32Bits } from +'../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../expression.js'; + +import { abstractIntBinary, binary, compoundBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); -function makeBitwiseOrCases(inputType) { - const V = inputType === 'i32' ? i32 : u32; - const cases = [ - // Static patterns - { - input: [V(0b00000000000000000000000000000000), V(0b00000000000000000000000000000000)], - expected: V(0b00000000000000000000000000000000) - }, - { - input: [V(0b11111111111111111111111111111111), V(0b00000000000000000000000000000000)], - expected: V(0b11111111111111111111111111111111) - }, - { - input: [V(0b00000000000000000000000000000000), V(0b11111111111111111111111111111111)], - expected: V(0b11111111111111111111111111111111) - }, - { - input: [V(0b11111111111111111111111111111111), V(0b11111111111111111111111111111111)], - expected: V(0b11111111111111111111111111111111) - }, - { - input: [V(0b10100100010010100100010010100100), V(0b00000000000000000000000000000000)], - expected: V(0b10100100010010100100010010100100) - }, - { - input: [V(0b00000000000000000000000000000000), V(0b10100100010010100100010010100100)], - expected: V(0b10100100010010100100010010100100) - }, - { - input: [V(0b01010010001001010010001001010010), V(0b10100100010010100100010010100100)], - expected: V(0b11110110011011110110011011110110) - }]; +/** + * Collection of functions and values required to implement bitwise tests for a + * specific scalar type + */ - // Permute all combinations of a single bit being set for the LHS and RHS - for (let i = 0; i < 32; i++) { - const lhs = 1 << i; - for (let j = 0; j < 32; j++) { - const rhs = 1 << j; - cases.push({ - input: [V(lhs), V(rhs)], - expected: V(lhs | rhs) - }); - } + + + + + + +const kScalarImpls = { + i32: { + builder: (bits) => { + assert(typeof bits === 'number'); + return i32Bits(bits); + }, + size: 32 + }, + u32: { + builder: (bits) => { + assert(typeof bits === 'number'); + return u32Bits(bits); + }, + size: 32 + }, + 'abstract-int': { + builder: (bits) => { + assert(typeof bits === 'bigint'); + return abstractIntBits(bits); + }, + size: 64 } - return cases; +}; + +/** Wrapper for converting from input type strings to the appropriate implementation */ +function scalarImplForInputType(inputType) { + assert(inputType === 'i32' || inputType === 'u32' || inputType === 'abstract-int'); + return kScalarImpls[inputType]; +} + +/** Manually calculated bitwise-or cases used a check that the CTS test is correct */ +const kBitwiseOrStaticPatterns = { + 32: [ + { + input: [0b00000000000000000000000000000000, 0b00000000000000000000000000000000], + expected: 0b00000000000000000000000000000000 + }, + { + input: [0b11111111111111111111111111111111, 0b00000000000000000000000000000000], + expected: 0b11111111111111111111111111111111 + }, + { + input: [0b00000000000000000000000000000000, 0b11111111111111111111111111111111], + expected: 0b11111111111111111111111111111111 + }, + { + input: [0b11111111111111111111111111111111, 0b11111111111111111111111111111111], + expected: 0b11111111111111111111111111111111 + }, + { + input: [0b10100100010010100100010010100100, 0b00000000000000000000000000000000], + expected: 0b10100100010010100100010010100100 + }, + { + input: [0b00000000000000000000000000000000, 0b10100100010010100100010010100100], + expected: 0b10100100010010100100010010100100 + }, + { + input: [0b01010010001001010010001001010010, 0b10100100010010100100010010100100], + expected: 0b11110110011011110110011011110110 + }], + + 64: [ + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b1010010001001010010001001010010010100100010010100100010010100100n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b0101001000100101001000100101001010100100010010100100010010100100n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b1111011001101111011001101111011010100100010010100100010010100100n + }] + +}; + +/** @returns a set of bitwise-or cases for the specific input type */ +function makeBitwiseOrCases(inputType) { + const impl = scalarImplForInputType(inputType); + const indices = + impl.size === 64 ? [...Array(impl.size).keys()].map(BigInt) : [...Array(impl.size).keys()]; + + return [ + ...kBitwiseOrStaticPatterns[impl.size].map((c) => { + return { + input: c.input.map(impl.builder), + expected: impl.builder(c.expected) + }; + }), + // Permute all combinations of a single bit being set for the LHS and RHS + ...indices.flatMap((i) => { + const lhs = typeof i === 'bigint' ? 1n << i : 1 << i; + return indices.map((j) => { + const rhs = typeof j === 'bigint' ? 1n << j : 1 << j; + assert(typeof lhs === typeof rhs); + const result = typeof lhs === 'bigint' ? lhs | rhs : lhs | rhs; + return { input: [impl.builder(lhs), impl.builder(rhs)], expected: impl.builder(result) }; + }); + })]; + } g.test('bitwise_or'). @@ -63,22 +175,25 @@ specURL('https://www.w3.org/TR/WGSL/#bit-expr'). desc( ` e1 | e2: T -T is i32, u32, vecN, or vecN +T is i32, u32, abstractInt, vecN, vecN, or vecN Bitwise-or. Component-wise when T is a vector. ` ). params((u) => u. -combine('type', ['i32', 'u32']). +combine('type', ['i32', 'u32', 'abstract-int']). combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { + t.skipIf( + t.params.type === 'abstract-int' && !onlyConstInputSource.includes(t.params.inputSource) + ); const type = scalarType(t.params.type); const cases = makeBitwiseOrCases(t.params.type); - - await run(t, binary('|'), [type, type], type, t.params, cases); + const builder = t.params.type === 'abstract-int' ? abstractIntBinary('|') : binary('|'); + await run(t, builder, [type, type], type, t.params, cases); }); g.test('bitwise_or_compound'). @@ -104,59 +219,137 @@ fn(async (t) => { await run(t, compoundBinary('|='), [type, type], type, t.params, cases); }); -function makeBitwiseAndCases(inputType) { - const V = inputType === 'i32' ? i32 : u32; - const cases = [ - // Static patterns +/** Manually calculated bitwise-and cases used a check that the CTS test is correct */ +const kBitwiseAndStaticPatterns = { + 32: [ { - input: [V(0b00000000000000000000000000000000), V(0b00000000000000000000000000000000)], - expected: V(0b00000000000000000000000000000000) + input: [0b00000000000000000000000000000000, 0b00000000000000000000000000000000], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b11111111111111111111111111111111), V(0b00000000000000000000000000000000)], - expected: V(0b00000000000000000000000000000000) + input: [0b11111111111111111111111111111111, 0b00000000000000000000000000000000], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b00000000000000000000000000000000), V(0b11111111111111111111111111111111)], - expected: V(0b00000000000000000000000000000000) + input: [0b00000000000000000000000000000000, 0b11111111111111111111111111111111], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b11111111111111111111111111111111), V(0b11111111111111111111111111111111)], - expected: V(0b11111111111111111111111111111111) + input: [0b11111111111111111111111111111111, 0b11111111111111111111111111111111], + expected: 0b11111111111111111111111111111111 }, { - input: [V(0b10100100010010100100010010100100), V(0b00000000000000000000000000000000)], - expected: V(0b00000000000000000000000000000000) + input: [0b10100100010010100100010010100100, 0b00000000000000000000000000000000], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b10100100010010100100010010100100), V(0b11111111111111111111111111111111)], - expected: V(0b10100100010010100100010010100100) + input: [0b10100100010010100100010010100100, 0b11111111111111111111111111111111], + expected: 0b10100100010010100100010010100100 }, { - input: [V(0b00000000000000000000000000000000), V(0b10100100010010100100010010100100)], - expected: V(0b00000000000000000000000000000000) + input: [0b00000000000000000000000000000000, 0b10100100010010100100010010100100], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b11111111111111111111111111111111), V(0b10100100010010100100010010100100)], - expected: V(0b10100100010010100100010010100100) + input: [0b11111111111111111111111111111111, 0b10100100010010100100010010100100], + expected: 0b10100100010010100100010010100100 }, { - input: [V(0b01010010001001010010001001010010), V(0b01011011101101011011101101011011)], - expected: V(0b01010010001001010010001001010010) - }]; + input: [0b01010010001001010010001001010010, 0b01011011101101011011101101011011], + expected: 0b01010010001001010010001001010010 + }], + 64: [ + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b1010010001001010010001001010010010100100010010100100010010100100n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1010010001001010010001001010010010100100010010100100010010100100n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b0101001000100101001000100101001001010010001001010010001001010010n, + 0b0101101110110101101110110101101101011011101101011011101101011011n], + + expected: 0b0101001000100101001000100101001001010010001001010010001001010010n + }] + +}; + +/** @returns a set of bitwise-or cases for the specific input type */ +function makeBitwiseAndCases(inputType) { + const impl = scalarImplForInputType(inputType); + const indices = + impl.size === 64 ? [...Array(impl.size).keys()].map(BigInt) : [...Array(impl.size).keys()]; + + return [ + ...kBitwiseAndStaticPatterns[impl.size].map((c) => { + return { + input: c.input.map(impl.builder), + expected: impl.builder(c.expected) + }; + }), // Permute all combinations of a single bit being set for the LHS and all but one bit set for the RHS - for (let i = 0; i < 32; i++) { - const lhs = 1 << i; - for (let j = 0; j < 32; j++) { - const rhs = 0xffffffff ^ 1 << j; - cases.push({ - input: [V(lhs), V(rhs)], - expected: V(lhs & rhs) - }); - } - } - return cases; + ...indices.flatMap((i) => { + const lhs = typeof i === 'bigint' ? 1n << i : 1 << i; + return indices.map((j) => { + const rhs = typeof j === 'bigint' ? 0xffffffffffffffffn ^ 1n << j : 0xffffffff ^ 1 << j; + assert(typeof lhs === typeof rhs); + const result = typeof lhs === 'bigint' ? lhs & rhs : lhs & rhs; + return { input: [impl.builder(lhs), impl.builder(rhs)], expected: impl.builder(result) }; + }); + })]; + } g.test('bitwise_and'). @@ -164,21 +357,25 @@ specURL('https://www.w3.org/TR/WGSL/#bit-expr'). desc( ` e1 & e2: T -T is i32, u32, vecN, or vecN +T is i32, u32, AbstractInt, vecN, vecN, or vecN Bitwise-and. Component-wise when T is a vector. ` ). params((u) => u. -combine('type', ['i32', 'u32']). +combine('type', ['i32', 'u32', 'abstract-int']). combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { + t.skipIf( + t.params.type === 'abstract-int' && !onlyConstInputSource.includes(t.params.inputSource) + ); const type = scalarType(t.params.type); const cases = makeBitwiseAndCases(t.params.type); - await run(t, binary('&'), [type, type], type, t.params, cases); + const builder = t.params.type === 'abstract-int' ? abstractIntBinary('&') : binary('&'); + await run(t, builder, [type, type], type, t.params, cases); }); g.test('bitwise_and_compound'). @@ -203,59 +400,137 @@ fn(async (t) => { await run(t, compoundBinary('&='), [type, type], type, t.params, cases); }); -function makeBitwiseExcluseOrCases(inputType) { - const V = inputType === 'i32' ? i32 : u32; - const cases = [ - // Static patterns +/** Manually calculated bitwise-or cases used a check that the CTS test is correct */ +const kBitwiseExclusiveOrStaticPatterns = { + 32: [ { - input: [V(0b00000000000000000000000000000000), V(0b00000000000000000000000000000000)], - expected: V(0b00000000000000000000000000000000) + input: [0b00000000000000000000000000000000, 0b00000000000000000000000000000000], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b11111111111111111111111111111111), V(0b00000000000000000000000000000000)], - expected: V(0b11111111111111111111111111111111) + input: [0b11111111111111111111111111111111, 0b00000000000000000000000000000000], + expected: 0b11111111111111111111111111111111 }, { - input: [V(0b00000000000000000000000000000000), V(0b11111111111111111111111111111111)], - expected: V(0b11111111111111111111111111111111) + input: [0b00000000000000000000000000000000, 0b11111111111111111111111111111111], + expected: 0b11111111111111111111111111111111 }, { - input: [V(0b11111111111111111111111111111111), V(0b11111111111111111111111111111111)], - expected: V(0b00000000000000000000000000000000) + input: [0b11111111111111111111111111111111, 0b11111111111111111111111111111111], + expected: 0b00000000000000000000000000000000 }, { - input: [V(0b10100100010010100100010010100100), V(0b00000000000000000000000000000000)], - expected: V(0b10100100010010100100010010100100) + input: [0b10100100010010100100010010100100, 0b00000000000000000000000000000000], + expected: 0b10100100010010100100010010100100 }, { - input: [V(0b10100100010010100100010010100100), V(0b11111111111111111111111111111111)], - expected: V(0b01011011101101011011101101011011) + input: [0b10100100010010100100010010100100, 0b11111111111111111111111111111111], + expected: 0b01011011101101011011101101011011 }, { - input: [V(0b00000000000000000000000000000000), V(0b10100100010010100100010010100100)], - expected: V(0b10100100010010100100010010100100) + input: [0b00000000000000000000000000000000, 0b10100100010010100100010010100100], + expected: 0b10100100010010100100010010100100 }, { - input: [V(0b11111111111111111111111111111111), V(0b10100100010010100100010010100100)], - expected: V(0b01011011101101011011101101011011) + input: [0b11111111111111111111111111111111, 0b10100100010010100100010010100100], + expected: 0b01011011101101011011101101011011 }, { - input: [V(0b01010010001001010010001001010010), V(0b01011011101101011011101101011011)], - expected: V(0b00001001100100001001100100001001) - }]; + input: [0b01010010001001010010001001010010, 0b01011011101101011011101101011011], + expected: 0b00001001100100001001100100001001 + }], + 64: [ + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b1111111111111111111111111111111111111111111111111111111111111111n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b0000000000000000000000000000000000000000000000000000000000000000n + }, + { + input: [ + 0b1010010001001010010001001010010010100100010010100100010010100100n, + 0b0000000000000000000000000000000000000000000000000000000000000000n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b1010010001001010010001001010010010100100010010100100010010100100n, + 0b1111111111111111111111111111111111111111111111111111111111111111n], + + expected: 0b0101101110110101101110110101101101011011101101011011101101011011n + }, + { + input: [ + 0b0000000000000000000000000000000000000000000000000000000000000000n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b1010010001001010010001001010010010100100010010100100010010100100n + }, + { + input: [ + 0b1111111111111111111111111111111111111111111111111111111111111111n, + 0b1010010001001010010001001010010010100100010010100100010010100100n], + + expected: 0b0101101110110101101110110101101101011011101101011011101101011011n + }, + { + input: [ + 0b0101001000100101001000100101001001010010001001010010001001010010n, + 0b0101101110110101101110110101101101011011101101011011101101011011n], + + expected: 0b0000100110010000100110010000100100001001100100001001100100001001n + }] + +}; + +/** @returns a set of bitwise-xor cases for the specific input type */ +function makeBitwiseExclusiveOrCases(inputType) { + const impl = scalarImplForInputType(inputType); + const indices = + impl.size === 64 ? [...Array(impl.size).keys()].map(BigInt) : [...Array(impl.size).keys()]; + + return [ + ...kBitwiseExclusiveOrStaticPatterns[impl.size].map((c) => { + return { + input: c.input.map(impl.builder), + expected: impl.builder(c.expected) + }; + }), // Permute all combinations of a single bit being set for the LHS and all but one bit set for the RHS - for (let i = 0; i < 32; i++) { - const lhs = 1 << i; - for (let j = 0; j < 32; j++) { - const rhs = 0xffffffff ^ 1 << j; - cases.push({ - input: [V(lhs), V(rhs)], - expected: V(lhs ^ rhs) - }); - } - } - return cases; + ...indices.flatMap((i) => { + const lhs = typeof i === 'bigint' ? 1n << i : 1 << i; + return indices.map((j) => { + const rhs = typeof j === 'bigint' ? 0xffffffffffffffffn ^ 1n << j : 0xffffffff ^ 1 << j; + assert(typeof lhs === typeof rhs); + const result = typeof lhs === 'bigint' ? lhs ^ rhs : lhs ^ rhs; + return { input: [impl.builder(lhs), impl.builder(rhs)], expected: impl.builder(result) }; + }); + })]; + } g.test('bitwise_exclusive_or'). @@ -263,21 +538,25 @@ specURL('https://www.w3.org/TR/WGSL/#bit-expr'). desc( ` e1 ^ e2: T -T is i32, u32, vecN, or vecN +T is i32, u32, abstractInt, vecN, vecN, or vecN Bitwise-exclusive-or. Component-wise when T is a vector. ` ). params((u) => u. -combine('type', ['i32', 'u32']). +combine('type', ['i32', 'u32', 'abstract-int']). combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { + t.skipIf( + t.params.type === 'abstract-int' && !onlyConstInputSource.includes(t.params.inputSource) + ); const type = scalarType(t.params.type); - const cases = makeBitwiseExcluseOrCases(t.params.type); - await run(t, binary('^'), [type, type], type, t.params, cases); + const cases = makeBitwiseExclusiveOrCases(t.params.type); + const builder = t.params.type === 'abstract-int' ? abstractIntBinary('^') : binary('^'); + await run(t, builder, [type, type], type, t.params, cases); }); g.test('bitwise_exclusive_or_compound'). @@ -298,6 +577,6 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const type = scalarType(t.params.type); - const cases = makeBitwiseExcluseOrCases(t.params.type); + const cases = makeBitwiseExclusiveOrCases(t.params.type); await run(t, compoundBinary('^='), [type, type], type, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise_shift.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise_shift.spec.js index ab766ba672a..8d9bc53669b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise_shift.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bitwise_shift.spec.js @@ -3,46 +3,46 @@ **/export const description = ` Execution Tests for the bitwise shift binary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { assert } from '../../../../../common/util/util.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { i32, scalarType, TypeU32, u32 } from '../../../../util/conversion.js'; +import { Type, abstractInt, u32 } from '../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { allInputSources, onlyConstInputSource, run } from '../expression.js'; -import { binary, compoundBinary } from './binary.js'; +import { abstractIntBinary, binary, compoundBinary } from './binary.js'; export const g = makeTestGroup(GPUTest); -function is_unsiged(type) { - return type === 'u32'; -} - -const bitwidth = 32; - // Returns true if e1 << e2 is valid for const evaluation -function is_valid_const_shift_left(e1, e1Type, e2) { +function isValidConstShiftLeft(e1, e2) { // Shift by 0 is always valid if (e2 === 0) { return true; } - // Cannot shift by bitwidth or greater + // Cannot shift by bitwidth or greater. + const bitwidth = e1.type.size * 8; if (e2 >= bitwidth) { return false; } - if (is_unsiged(e1Type)) { + if (!e1.type.signed) { + // AbstractInt should never enter this branch, so value should always be a number + assert(typeof e1.value === 'number'); // If T is an unsigned integer type, and any of the e2 most significant bits of e1 are 1, then invalid. const must_be_zero_msb = e2; const mask = ~0 << bitwidth - must_be_zero_msb; - if ((e1 & mask) !== 0) { + if ((e1.value & mask) !== 0) { return false; } } else { // If T is a signed integer type, and the e2+1 most significant bits of e1 do // not have the same bit value, then error. - const must_match_msb = e2 + 1; - const mask = ~0 << bitwidth - must_match_msb; - if ((e1 & mask) !== 0 && (e1 & mask) !== mask) { + // Working in bigint, because all i32 and AbstractInt values are representable in it. + const value = BigInt(e1.value); + const must_match_msb = BigInt(e2) + 1n; + const mask = ~0n << BigInt(bitwidth) - must_match_msb; + if ((value & mask) !== 0n && (value & mask) !== mask) { return false; } } @@ -50,77 +50,213 @@ function is_valid_const_shift_left(e1, e1Type, e2) { } // Returns true if e1 >> e2 is valid for const evaluation -function is_valid_const_shift_right(e1, e1Type, e2) { +function isValidConstShiftRight(e1, e2) { // Shift by 0 is always valid if (e2 === 0) { return true; } + const bitwidth = e1.type.size * 8; // Cannot shift by bitwidth or greater if (e2 >= bitwidth) { return false; } - return true; } -// Returns all cases of shifting e1 left by [0,63]. If `is_const` is true, cases that are +// Returns all cases of shifting e1 left by [0,63]. If `isConst` is true, cases that are // invalid for const eval are not returned. -function generate_shift_left_cases(e1, e1Type, is_const) { - const V = e1Type === 'i32' ? i32 : u32; +function generateShiftLeftConcreteCases(e1, isConst) { + assert(typeof e1.value === 'number'); + + const bitwidth = e1.type.size * 8; const cases = []; - for (let shift = 0; shift < 64; ++shift) { - const e2 = shift; - if (is_const && !is_valid_const_shift_left(e1, e1Type, e2)) { + for (let e2 = 0; e2 < 64; ++e2) { + if (isConst && !isValidConstShiftLeft(e1, e2)) { continue; } - const expected = e1 << e2 % bitwidth; - cases.push({ input: [V(e1), u32(e2)], expected: V(expected) }); + const expected = e1.value << e2 % bitwidth; + cases.push({ input: [e1, u32(e2)], expected: e1.type.create(expected) }); + } + return cases; +} + +// Returns all cases of shifting e1 left by [0,63] +function generateShiftLeftAbstractCases(e1) { + assert(typeof e1.value === 'bigint'); + + const cases = []; + for (let e2 = 0; e2 < 64; ++e2) { + if (!isValidConstShiftLeft(e1, e2)) { + continue; + } + const expected = e1.value << BigInt(e2); + cases.push({ input: [e1, u32(e2)], expected: abstractInt(expected) }); } return cases; } // Returns all cases of shifting e1 right by [0,63]. If `is_const` is true, cases that are // invalid for const eval are not returned. -function generate_shift_right_cases(e1, e1Type, is_const) { - const V = e1Type === 'i32' ? i32 : u32; +function generateShiftRightConcreteCases(e1, isConst) { + assert(typeof e1.value === 'number'); const cases = []; - for (let shift = 0; shift < 64; ++shift) { - const e2 = shift; - if (is_const && !is_valid_const_shift_right(e1, e1Type, e2)) { + for (let e2 = 0; e2 < 64; ++e2) { + if (isConst && !isValidConstShiftRight(e1, e2)) { continue; } let expected = 0; - if (is_unsiged(e1Type)) { + if (!e1.type.signed) { // zero-fill right shift - expected = e1 >>> e2; + expected = e1.value >>> e2; } else { // arithmetic right shift - expected = e1 >> e2; + expected = e1.value >> e2; } - cases.push({ input: [V(e1), u32(e2)], expected: V(expected) }); + cases.push({ input: [e1, u32(e2)], expected: e1.type.create(expected) }); } return cases; } -function makeShiftLeftConcreteCases(inputType, inputSource, type) { - const V = inputType === 'i32' ? i32 : u32; - const is_const = inputSource === 'const'; +// Returns all cases of shifting e1 right by [0,63], plus a selection of those from [65, 1025] +function generateShiftRightAbstractCases(e1) { + assert(typeof e1.value === 'bigint'); + const cases = []; + // Shifting within 64 bits + for (let e2 = 0; e2 < 64; ++e2) { + const expected = e1.value >> BigInt(e2); + cases.push({ input: [e1, u32(e2)], expected: abstractInt(expected) }); + } + // Always filled values + for (let e2 = 64; e2 < 1025; e2 *= 2) { + const expected = e1.value < 0n ? -1n : 0n; + cases.push({ input: [e1, u32(e2)], expected: abstractInt(expected) }); + } + return cases; +} +function makeShiftLeftAbstractCases() { const cases = [ { - input: /* */[V(0b00000000000000000000000000000001), u32(1)], - expected: /**/V(0b00000000000000000000000000000010) + input: /* */[ + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000001n), + u32(1)], + + expected: + /**/abstractInt(0b0000000000000000000000000000000000000000000000000000000000000010n) }, { - input: /* */[V(0b00000000000000000000000000000011), u32(1)], - expected: /**/V(0b00000000000000000000000000000110) + input: /* */[ + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000011n), + u32(1)], + + expected: + /**/abstractInt(0b0000000000000000000000000000000000000000000000000000000000000110n) + }, + // 0 should always return 0 + { input: [abstractInt(0n), u32(0)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(1)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(16)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(32)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(64)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(65)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(128)], expected: abstractInt(0n) }, + { input: [abstractInt(0n), u32(256)], expected: abstractInt(0n) }]; + + + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000001n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000010n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000011n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b1000000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0100000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b1100000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b0001000000100000100001000101010100010000001000001000010001010101n) + ) + ); + cases.push( + ...generateShiftLeftAbstractCases( + abstractInt(0b1110111111011111011110111010101011101111110111110111101110101010n) + ) + ); + return cases; +} + +g.test('shift_left_abstract'). +specURL('https://www.w3.org/TR/WGSL/#bit-expr'). +desc( + ` +e1 << e2 + +Shift left (shifted value is abstract) +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = makeShiftLeftAbstractCases(); + await run( + t, + abstractIntBinary('<<'), + [Type.abstractInt, Type.u32], + Type.abstractInt, + t.params, + cases + ); +}); + +function makeShiftLeftConcreteCases( +isConst, +isUnsigned, +B) +{ + const cases = [ + { + input: /* */[B(0b00000000000000000000000000000001), u32(1)], + expected: /**/B(0b00000000000000000000000000000010) + }, + { + input: /* */[B(0b00000000000000000000000000000011), u32(1)], + expected: /**/B(0b00000000000000000000000000000110) }]; - const add_unsigned_overflow_cases = !is_const || is_unsiged(inputType); - const add_signed_overflow_cases = !is_const || !is_unsiged(inputType); + const add_unsigned_overflow_cases = !isConst || isUnsigned; + const add_signed_overflow_cases = !isConst || !isUnsigned; if (add_unsigned_overflow_cases) { // Cases that are fine for unsigned values, but would overflow (sign change) signed @@ -128,16 +264,16 @@ function makeShiftLeftConcreteCases(inputType, inputSource, type) { cases.push( ...[ { - input: [/* */V(0b01000000000000000000000000000000), u32(1)], - expected: /**/V(0b10000000000000000000000000000000) + input: [/* */B(0b01000000000000000000000000000000), u32(1)], + expected: /**/B(0b10000000000000000000000000000000) }, { - input: [/* */V(0b01111111111111111111111111111111), u32(1)], - expected: /**/V(0b11111111111111111111111111111110) + input: [/* */B(0b01111111111111111111111111111111), u32(1)], + expected: /**/B(0b11111111111111111111111111111110) }, { - input: [/* */V(0b00000000000000000000000000000001), u32(31)], - expected: /**/V(0b10000000000000000000000000000000) + input: [/* */B(0b00000000000000000000000000000001), u32(31)], + expected: /**/B(0b10000000000000000000000000000000) }] ); @@ -148,31 +284,31 @@ function makeShiftLeftConcreteCases(inputType, inputSource, type) { cases.push( ...[ { - input: [/* */V(0b11000000000000000000000000000000), u32(1)], - expected: /**/V(0b10000000000000000000000000000000) + input: [/* */B(0b11000000000000000000000000000000), u32(1)], + expected: /**/B(0b10000000000000000000000000000000) }, { - input: [/* */V(0b11111111111111111111111111111111), u32(1)], - expected: /**/V(0b11111111111111111111111111111110) + input: [/* */B(0b11111111111111111111111111111111), u32(1)], + expected: /**/B(0b11111111111111111111111111111110) }, { - input: [/* */V(0b11111111111111111111111111111111), u32(31)], - expected: /**/V(0b10000000000000000000000000000000) + input: [/* */B(0b11111111111111111111111111111111), u32(31)], + expected: /**/B(0b10000000000000000000000000000000) }] ); } // Generate cases that shift input value by [0,63] (invalid const eval cases are not returned). - cases.push(...generate_shift_left_cases(0b00000000000000000000000000000000, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b00000000000000000000000000000001, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b00000000000000000000000000000010, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b00000000000000000000000000000011, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b10000000000000000000000000000000, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b01000000000000000000000000000000, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b11000000000000000000000000000000, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b00010000001000001000010001010101, inputType, is_const)); - cases.push(...generate_shift_left_cases(0b11101111110111110111101110101010, inputType, is_const)); + cases.push(...generateShiftLeftConcreteCases(B(0b00000000000000000000000000000000), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b00000000000000000000000000000001), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b00000000000000000000000000000010), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b00000000000000000000000000000011), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b10000000000000000000000000000000), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b01000000000000000000000000000000), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b11000000000000000000000000000000), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b00010000001000001000010001010101), isConst)); + cases.push(...generateShiftLeftConcreteCases(B(0b11101111110111110111101110101010), isConst)); return cases; } @@ -192,9 +328,15 @@ combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const type = scalarType(t.params.type); - const cases = makeShiftLeftConcreteCases(t.params.type, t.params.inputSource, type); - await run(t, binary('<<'), [type, TypeU32], type, t.params, cases); + const type = Type[t.params.type]; + const builder = type.create.bind(type); + + const cases = makeShiftLeftConcreteCases( + t.params.inputSource === 'const', + !type.signed, + builder + ); + await run(t, binary('<<'), [type, Type.u32], type, t.params, cases); }); g.test('shift_left_concrete_compound'). @@ -213,44 +355,178 @@ combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const type = scalarType(t.params.type); - const cases = makeShiftLeftConcreteCases(t.params.type, t.params.inputSource, type); - await run(t, compoundBinary('<<='), [type, TypeU32], type, t.params, cases); + const type = Type[t.params.type]; + const builder = type.create.bind(type); + + const cases = makeShiftLeftConcreteCases( + t.params.inputSource === 'const', + !type.signed, + builder + ); + await run(t, compoundBinary('<<='), [type, Type.u32], type, t.params, cases); }); -function makeShiftRightConcreteCases(inputType, inputSource, type) { - const V = inputType === 'i32' ? i32 : u32; - const is_const = inputSource === 'const'; - +function makeShiftRightAbstractCases() { const cases = [ { - input: /* */[V(0b00000000000000000000000000000001), u32(1)], - expected: /**/V(0b00000000000000000000000000000000) + input: /* */[ + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000001n), + u32(1)], + + expected: + /**/abstractInt(0b0000000000000000000000000000000000000000000000000000000000000000n) }, { - input: /* */[V(0b00000000000000000000000000000011), u32(1)], - expected: /**/V(0b00000000000000000000000000000001) + input: /* */[ + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000011n), + u32(1)], + + expected: + /**/abstractInt(0b0000000000000000000000000000000000000000000000000000000000000001n) }, { - input: /* */[V(0b01000000000000000000000000000000), u32(1)], - expected: /**/V(0b00100000000000000000000000000000) + input: /* */[ + abstractInt(0b0100000000000000000000000000000000000000000000000000000000000000n), + u32(1)], + + expected: + /**/abstractInt(0b0010000000000000000000000000000000000000000000000000000000000000n) }, { - input: /* */[V(0b01100000000000000000000000000000), u32(1)], - expected: /**/V(0b00110000000000000000000000000000) + input: /* */[ + abstractInt(0b0110000000000000000000000000000000000000000000000000000000000000n), + u32(1)], + + expected: + /**/abstractInt(0b0011000000000000000000000000000000000000000000000000000000000000n) + }, + // Sign extension if msb is 1 + { + input: /* */[ + abstractInt(0b1000000000000000000000000000000000000000000000000000000000000000n), + u32(1)], + + expected: + /**/abstractInt(0b1100000000000000000000000000000000000000000000000000000000000000n) + }, + { + input: /* */[ + abstractInt(0b1100000000000000000000000000000000000000000000000000000000000000n), + u32(1)], + + expected: + /**/abstractInt(0b1110000000000000000000000000000000000000000000000000000000000000n) }]; - if (is_unsiged(inputType)) { + + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000001n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000010n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0000000000000000000000000000000000000000000000000000000000000011n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b1000000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0100000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b1100000000000000000000000000000000000000000000000000000000000000n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b0001000000100000100001000101010100010000001000001000010001010101n) + ) + ); + cases.push( + ...generateShiftRightAbstractCases( + abstractInt(0b1110111111011111011110111010101011101111110111110111101110101010n) + ) + ); + return cases; +} + +g.test('shift_right_abstract'). +specURL('https://www.w3.org/TR/WGSL/#bit-expr'). +desc( + ` + e1 >> e2 + + Shift right (shifted value is abstract) + ` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = makeShiftRightAbstractCases(); + await run( + t, + abstractIntBinary('>>'), + [Type.abstractInt, Type.u32], + Type.abstractInt, + t.params, + cases + ); +}); + +function makeShiftRightConcreteCases( +isConst, +isUnsigned, +B) +{ + const cases = [ + { + input: /* */[B(0b00000000000000000000000000000001), u32(1)], + expected: /**/B(0b00000000000000000000000000000000) + }, + { + input: /* */[B(0b00000000000000000000000000000011), u32(1)], + expected: /**/B(0b00000000000000000000000000000001) + }, + { + input: /* */[B(0b01000000000000000000000000000000), u32(1)], + expected: /**/B(0b00100000000000000000000000000000) + }, + { + input: /* */[B(0b01100000000000000000000000000000), u32(1)], + expected: /**/B(0b00110000000000000000000000000000) + }]; + + if (isUnsigned) { // No sign extension cases.push( ...[ { - input: /* */[V(0b10000000000000000000000000000000), u32(1)], - expected: /**/V(0b01000000000000000000000000000000) + input: /* */[B(0b10000000000000000000000000000000), u32(1)], + expected: /**/B(0b01000000000000000000000000000000) }, { - input: /* */[V(0b11000000000000000000000000000000), u32(1)], - expected: /**/V(0b01100000000000000000000000000000) + input: /* */[B(0b11000000000000000000000000000000), u32(1)], + expected: /**/B(0b01100000000000000000000000000000) }] ); @@ -259,45 +535,27 @@ function makeShiftRightConcreteCases(inputType, inputSource, type) { // Sign extension if msb is 1 ...[ { - input: /* */[V(0b10000000000000000000000000000000), u32(1)], - expected: /**/V(0b11000000000000000000000000000000) + input: /* */[B(0b10000000000000000000000000000000), u32(1)], + expected: /**/B(0b11000000000000000000000000000000) }, { - input: /* */[V(0b11000000000000000000000000000000), u32(1)], - expected: /**/V(0b11100000000000000000000000000000) + input: /* */[B(0b11000000000000000000000000000000), u32(1)], + expected: /**/B(0b11100000000000000000000000000000) }] ); } // Generate cases that shift input value by [0,63] (invalid const eval cases are not returned). - cases.push( - ...generate_shift_right_cases(0b00000000000000000000000000000000, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b00000000000000000000000000000001, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b00000000000000000000000000000010, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b00000000000000000000000000000011, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b10000000000000000000000000000000, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b01000000000000000000000000000000, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b11000000000000000000000000000000, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b00010000001000001000010001010101, inputType, is_const) - ); - cases.push( - ...generate_shift_right_cases(0b11101111110111110111101110101010, inputType, is_const) - ); + cases.push(...generateShiftRightConcreteCases(B(0b00000000000000000000000000000000), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b00000000000000000000000000000001), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b00000000000000000000000000000010), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b00000000000000000000000000000011), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b10000000000000000000000000000000), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b01000000000000000000000000000000), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b11000000000000000000000000000000), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b00010000001000001000010001010101), isConst)); + cases.push(...generateShiftRightConcreteCases(B(0b11101111110111110111101110101010), isConst)); return cases; } @@ -317,9 +575,15 @@ combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const type = scalarType(t.params.type); - const cases = makeShiftRightConcreteCases(t.params.type, t.params.inputSource, type); - await run(t, binary('>>'), [type, TypeU32], type, t.params, cases); + const type = Type[t.params.type]; + const builder = type.create.bind(type); + + const cases = makeShiftRightConcreteCases( + t.params.inputSource === 'const', + !type.signed, + builder + ); + await run(t, binary('>>'), [type, Type.u32], type, t.params, cases); }); g.test('shift_right_concrete_compound'). @@ -338,7 +602,13 @@ combine('inputSource', allInputSources). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const type = scalarType(t.params.type); - const cases = makeShiftRightConcreteCases(t.params.type, t.params.inputSource, type); - await run(t, compoundBinary('>>='), [type, TypeU32], type, t.params, cases); + const type = Type[t.params.type]; + const builder = type.create.bind(type); + + const cases = makeShiftRightConcreteCases( + t.params.inputSource === 'const', + !type.signed, + builder + ); + await run(t, compoundBinary('>>='), [type, Type.u32], type, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bool_logical.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bool_logical.spec.js index 52cbe17222e..69a24f22a0f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bool_logical.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/bool_logical.spec.js @@ -4,7 +4,7 @@ Execution Tests for the boolean binary logical expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { bool, TypeBool } from '../../../../util/conversion.js'; +import { bool, Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -33,7 +33,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, binary('&'), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('&'), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('and_compound'). @@ -55,7 +55,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, compoundBinary('&='), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, compoundBinary('&='), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('and_short_circuit'). @@ -75,7 +75,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, binary('&&'), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('&&'), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('or'). @@ -97,7 +97,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, binary('|'), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('|'), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('or_compound'). @@ -119,7 +119,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, compoundBinary('|='), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, compoundBinary('|='), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('or_short_circuit'). @@ -139,7 +139,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, binary('||'), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('||'), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('equals'). @@ -161,7 +161,7 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(true) }]; - await run(t, binary('=='), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('=='), [Type.bool, Type.bool], Type.bool, t.params, cases); }); g.test('not_equals'). @@ -183,5 +183,5 @@ fn(async (t) => { { input: [bool(true), bool(true)], expected: bool(false) }]; - await run(t, binary('!='), [TypeBool, TypeBool], TypeBool, t.params, cases); + await run(t, binary('!='), [Type.bool, Type.bool], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_addition.spec.js index 5f06e372578..982aa1e43ac 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_addition.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f16 addition expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -28,7 +28,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('+'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('+'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector'). @@ -47,7 +47,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('+'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('+'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('scalar_compound'). @@ -68,7 +68,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('+='), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, compoundBinary('+='), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector_scalar'). @@ -91,8 +91,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -118,8 +118,8 @@ fn(async (t) => { await run( t, compoundBinary('+='), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -145,8 +145,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeF16, TypeVec(dim, TypeF16)], - TypeVec(dim, TypeF16), + [Type.f16, Type.vec(dim, Type.f16)], + Type.vec(dim, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_comparison.spec.js index b0ca6369316..defab2c209d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_comparison.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_comparison.spec.js @@ -4,7 +4,7 @@ Execution Tests for the f16 comparison operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeF16 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary } from './binary.js'; @@ -30,7 +30,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'equals_const' : 'equals_non_const' ); - await run(t, binary('=='), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('=='), [Type.f16, Type.f16], Type.bool, t.params, cases); }); g.test('not_equals'). @@ -51,7 +51,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'not_equals_const' : 'not_equals_non_const' ); - await run(t, binary('!='), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('!='), [Type.f16, Type.f16], Type.bool, t.params, cases); }); g.test('less_than'). @@ -72,7 +72,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'less_than_const' : 'less_than_non_const' ); - await run(t, binary('<'), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('<'), [Type.f16, Type.f16], Type.bool, t.params, cases); }); g.test('less_equals'). @@ -93,7 +93,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'less_equals_const' : 'less_equals_non_const' ); - await run(t, binary('<='), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('<='), [Type.f16, Type.f16], Type.bool, t.params, cases); }); g.test('greater_than'). @@ -114,7 +114,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'greater_than_const' : 'greater_than_non_const' ); - await run(t, binary('>'), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('>'), [Type.f16, Type.f16], Type.bool, t.params, cases); }); g.test('greater_equals'). @@ -135,5 +135,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'greater_equals_const' : 'greater_equals_non_const' ); - await run(t, binary('>='), [TypeF16, TypeF16], TypeBool, t.params, cases); + await run(t, binary('>='), [Type.f16, Type.f16], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_division.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_division.spec.js index 8284b4550f2..324d27c43a3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_division.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_division.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f16 division expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -28,7 +28,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('/'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('/'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector'). @@ -47,7 +47,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('/'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('/'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('scalar_compound'). @@ -68,7 +68,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('/='), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, compoundBinary('/='), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector_scalar'). @@ -91,8 +91,8 @@ fn(async (t) => { await run( t, binary('/'), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -118,8 +118,8 @@ fn(async (t) => { await run( t, compoundBinary('/='), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -145,8 +145,8 @@ fn(async (t) => { await run( t, binary('/'), - [TypeF16, TypeVec(dim, TypeF16)], - TypeVec(dim, TypeF16), + [Type.f16, Type.vec(dim, Type.f16)], + Type.vec(dim, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js index cf9cedd8d5e..a5478d9a492 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix f16 addition expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -38,8 +38,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeMat(cols, rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), t.params, cases ); @@ -71,8 +71,8 @@ fn(async (t) => { await run( t, compoundBinary('+='), - [TypeMat(cols, rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_matrix_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_matrix_multiplication.spec.js index a310e0eab68..9df16975832 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_matrix_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_matrix_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-matrix f16 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -44,8 +44,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(x_cols, x_rows, TypeF16), TypeMat(y_cols, y_rows, TypeF16)], - TypeMat(y_cols, x_rows, TypeF16), + [Type.mat(x_cols, x_rows, Type.f16), Type.mat(y_cols, y_rows, Type.f16)], + Type.mat(y_cols, x_rows, Type.f16), t.params, cases ); @@ -82,8 +82,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeMat(x_cols, x_rows, TypeF16), TypeMat(y_cols, y_rows, TypeF16)], - TypeMat(y_cols, x_rows, TypeF16), + [Type.mat(x_cols, x_rows, Type.f16), Type.mat(y_cols, y_rows, Type.f16)], + Type.mat(y_cols, x_rows, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_scalar_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_scalar_multiplication.spec.js index 2587945a761..040745320e9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_scalar_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_scalar_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-scalar and scalar-matrix f16 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -40,8 +40,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(cols, rows, TypeF16), TypeF16], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.f16], + Type.mat(cols, rows, Type.f16), t.params, cases ); @@ -75,8 +75,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeMat(cols, rows, TypeF16), TypeF16], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.f16], + Type.mat(cols, rows, Type.f16), t.params, cases ); @@ -110,8 +110,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeF16, TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.f16, Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_subtraction.spec.js index 9a458db528b..f47021eee64 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_subtraction.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix f16 subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -38,8 +38,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeMat(cols, rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), t.params, cases ); @@ -71,8 +71,8 @@ fn(async (t) => { await run( t, compoundBinary('-='), - [TypeMat(cols, rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_vector_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_vector_multiplication.spec.js index f7be6036f3a..d0262e04841 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_vector_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_vector_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-vector and vector-matrix f16 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeMat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -40,8 +40,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(cols, rows, TypeF16), TypeVec(cols, TypeF16)], - TypeVec(rows, TypeF16), + [Type.mat(cols, rows, Type.f16), Type.vec(cols, Type.f16)], + Type.vec(rows, Type.f16), t.params, cases ); @@ -75,8 +75,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeVec(rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeVec(cols, TypeF16), + [Type.vec(rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.vec(cols, Type.f16), t.params, cases ); @@ -105,8 +105,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeVec(rows, TypeF16), TypeMat(cols, rows, TypeF16)], - TypeVec(cols, TypeF16), + [Type.vec(rows, Type.f16), Type.mat(cols, rows, Type.f16)], + Type.vec(cols, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_multiplication.spec.js index acb36d472e8..c9d264f9492 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f16 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -28,7 +28,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('*'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('*'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector'). @@ -47,7 +47,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('*'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('*'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('scalar_compound'). @@ -68,7 +68,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('*='), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, compoundBinary('*='), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector_scalar'). @@ -91,8 +91,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -118,8 +118,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -145,8 +145,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeF16, TypeVec(dim, TypeF16)], - TypeVec(dim, TypeF16), + [Type.f16, Type.vec(dim, Type.f16)], + Type.vec(dim, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_remainder.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_remainder.spec.js index 8d9437d1033..52aa9945028 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_remainder.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_remainder.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f16 remainder expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -28,7 +28,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('%'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('%'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector'). @@ -47,7 +47,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('%'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('%'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('scalar_compound'). @@ -68,7 +68,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('%='), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, compoundBinary('%='), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector_scalar'). @@ -91,8 +91,8 @@ fn(async (t) => { await run( t, binary('%'), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -118,8 +118,8 @@ fn(async (t) => { await run( t, compoundBinary('%='), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -145,8 +145,8 @@ fn(async (t) => { await run( t, binary('%'), - [TypeF16, TypeVec(dim, TypeF16)], - TypeVec(dim, TypeF16), + [Type.f16, Type.vec(dim, Type.f16)], + Type.vec(dim, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_subtraction.spec.js index 90fe379dc29..f5910cd9863 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f16_subtraction.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f16 subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -28,7 +28,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('-'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('-'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector'). @@ -47,7 +47,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('-'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, binary('-'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('scalar_compound'). @@ -68,7 +68,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('-='), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, compoundBinary('-='), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('vector_scalar'). @@ -91,8 +91,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -118,8 +118,8 @@ fn(async (t) => { await run( t, compoundBinary('-='), - [TypeVec(dim, TypeF16), TypeF16], - TypeVec(dim, TypeF16), + [Type.vec(dim, Type.f16), Type.f16], + Type.vec(dim, Type.f16), t.params, cases ); @@ -145,8 +145,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeF16, TypeVec(dim, TypeF16)], - TypeVec(dim, TypeF16), + [Type.f16, Type.vec(dim, Type.f16)], + Type.vec(dim, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_addition.spec.js index d1372b80273..6c9adbb126c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_addition.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f32 addition expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -25,7 +25,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('+'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('+'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector'). @@ -41,7 +41,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('+'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('+'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('scalar_compound'). @@ -59,7 +59,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('+='), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, compoundBinary('+='), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector_scalar'). @@ -79,8 +79,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -103,8 +103,8 @@ fn(async (t) => { await run( t, compoundBinary('+='), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -127,8 +127,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeF32, TypeVec(dim, TypeF32)], - TypeVec(dim, TypeF32), + [Type.f32, Type.vec(dim, Type.f32)], + Type.vec(dim, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_comparison.spec.js index 95990ebc167..2c362db2ed7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_comparison.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_comparison.spec.js @@ -4,7 +4,7 @@ Execution Tests for the f32 comparison operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeF32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary } from './binary.js'; @@ -27,7 +27,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'equals_const' : 'equals_non_const' ); - await run(t, binary('=='), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('=='), [Type.f32, Type.f32], Type.bool, t.params, cases); }); g.test('not_equals'). @@ -45,7 +45,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'not_equals_const' : 'not_equals_non_const' ); - await run(t, binary('!='), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('!='), [Type.f32, Type.f32], Type.bool, t.params, cases); }); g.test('less_than'). @@ -63,7 +63,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'less_than_const' : 'less_than_non_const' ); - await run(t, binary('<'), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('<'), [Type.f32, Type.f32], Type.bool, t.params, cases); }); g.test('less_equals'). @@ -81,7 +81,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'less_equals_const' : 'less_equals_non_const' ); - await run(t, binary('<='), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('<='), [Type.f32, Type.f32], Type.bool, t.params, cases); }); g.test('greater_than'). @@ -99,7 +99,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'greater_than_const' : 'greater_than_non_const' ); - await run(t, binary('>'), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('>'), [Type.f32, Type.f32], Type.bool, t.params, cases); }); g.test('greater_equals'). @@ -117,5 +117,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'greater_equals_const' : 'greater_equals_non_const' ); - await run(t, binary('>='), [TypeF32, TypeF32], TypeBool, t.params, cases); + await run(t, binary('>='), [Type.f32, Type.f32], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_division.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_division.spec.js index a9180e950c7..fc752b9e3a3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_division.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_division.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f32 division expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -25,7 +25,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('/'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('/'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector'). @@ -41,7 +41,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('/'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('/'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('scalar_compound'). @@ -59,7 +59,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('/='), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, compoundBinary('/='), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector_scalar'). @@ -79,8 +79,8 @@ fn(async (t) => { await run( t, binary('/'), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -103,8 +103,8 @@ fn(async (t) => { await run( t, compoundBinary('/='), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -127,8 +127,8 @@ fn(async (t) => { await run( t, binary('/'), - [TypeF32, TypeVec(dim, TypeF32)], - TypeVec(dim, TypeF32), + [Type.f32, Type.vec(dim, Type.f32)], + Type.vec(dim, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js index 14cba2293ef..7da49853cc0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix f32 addition expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -35,8 +35,8 @@ fn(async (t) => { await run( t, binary('+'), - [TypeMat(cols, rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); @@ -65,8 +65,8 @@ fn(async (t) => { await run( t, compoundBinary('+='), - [TypeMat(cols, rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_matrix_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_matrix_multiplication.spec.js index ada32250a76..bee27aea4ce 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_matrix_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_matrix_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-matrix f32 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -41,8 +41,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(x_cols, x_rows, TypeF32), TypeMat(y_cols, y_rows, TypeF32)], - TypeMat(y_cols, x_rows, TypeF32), + [Type.mat(x_cols, x_rows, Type.f32), Type.mat(y_cols, y_rows, Type.f32)], + Type.mat(y_cols, x_rows, Type.f32), t.params, cases ); @@ -76,8 +76,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeMat(x_cols, x_rows, TypeF32), TypeMat(y_cols, y_rows, TypeF32)], - TypeMat(y_cols, x_rows, TypeF32), + [Type.mat(x_cols, x_rows, Type.f32), Type.mat(y_cols, y_rows, Type.f32)], + Type.mat(y_cols, x_rows, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_scalar_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_scalar_multiplication.spec.js index d7c0c2b04f7..918cbc49d61 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_scalar_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_scalar_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-scalar and scalar-matrix f32 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -37,8 +37,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(cols, rows, TypeF32), TypeF32], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.f32], + Type.mat(cols, rows, Type.f32), t.params, cases ); @@ -69,8 +69,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeMat(cols, rows, TypeF32), TypeF32], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.f32], + Type.mat(cols, rows, Type.f32), t.params, cases ); @@ -101,8 +101,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeF32, TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.f32, Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_subtraction.spec.js index beb7d0dac26..9c6930a63c1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_subtraction.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix f32 subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeMat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -35,8 +35,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeMat(cols, rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); @@ -65,8 +65,8 @@ fn(async (t) => { await run( t, compoundBinary('-='), - [TypeMat(cols, rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_vector_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_vector_multiplication.spec.js index ed1f21028d7..dc2d9a26044 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_vector_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_vector_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for matrix-vector and vector-matrix f32 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeMat, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -37,8 +37,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeMat(cols, rows, TypeF32), TypeVec(cols, TypeF32)], - TypeVec(rows, TypeF32), + [Type.mat(cols, rows, Type.f32), Type.vec(cols, Type.f32)], + Type.vec(rows, Type.f32), t.params, cases ); @@ -69,8 +69,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeVec(rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeVec(cols, TypeF32), + [Type.vec(rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.vec(cols, Type.f32), t.params, cases ); @@ -96,8 +96,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeVec(rows, TypeF32), TypeMat(cols, rows, TypeF32)], - TypeVec(cols, TypeF32), + [Type.vec(rows, Type.f32), Type.mat(cols, rows, Type.f32)], + Type.vec(cols, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_multiplication.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_multiplication.spec.js index 0420096d7a0..c7a737a8763 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_multiplication.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_multiplication.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f32 multiplication expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -25,7 +25,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('*'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('*'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector'). @@ -41,7 +41,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('*'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('*'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('scalar_compound'). @@ -59,7 +59,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('*='), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, compoundBinary('*='), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector_scalar'). @@ -79,8 +79,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -103,8 +103,8 @@ fn(async (t) => { await run( t, compoundBinary('*='), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -127,8 +127,8 @@ fn(async (t) => { await run( t, binary('*'), - [TypeF32, TypeVec(dim, TypeF32)], - TypeVec(dim, TypeF32), + [Type.f32, Type.vec(dim, Type.f32)], + Type.vec(dim, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_remainder.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_remainder.spec.js index 6e7d4cffc55..aab16e65e9d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_remainder.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_remainder.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f32 remainder expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -25,7 +25,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('%'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('%'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector'). @@ -41,7 +41,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('%'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('%'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('scalar_compound'). @@ -59,7 +59,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('%='), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, compoundBinary('%='), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector_scalar'). @@ -79,8 +79,8 @@ fn(async (t) => { await run( t, binary('%'), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -103,8 +103,8 @@ fn(async (t) => { await run( t, compoundBinary('%='), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -127,8 +127,8 @@ fn(async (t) => { await run( t, binary('%'), - [TypeF32, TypeVec(dim, TypeF32)], - TypeVec(dim, TypeF32), + [Type.f32, Type.vec(dim, Type.f32)], + Type.vec(dim, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_subtraction.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_subtraction.spec.js index dd4dab1c8f0..92325e65503 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_subtraction.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/f32_subtraction.spec.js @@ -4,7 +4,7 @@ Execution Tests for non-matrix f32 subtraction expression `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -25,7 +25,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, binary('-'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('-'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector'). @@ -41,7 +41,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' // Using vectorize to generate vector cases based on scalar cases ); - await run(t, binary('-'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, binary('-'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('scalar_compound'). @@ -59,7 +59,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'scalar_const' : 'scalar_non_const' ); - await run(t, compoundBinary('-='), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, compoundBinary('-='), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('vector_scalar'). @@ -79,8 +79,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -103,8 +103,8 @@ fn(async (t) => { await run( t, compoundBinary('-='), - [TypeVec(dim, TypeF32), TypeF32], - TypeVec(dim, TypeF32), + [Type.vec(dim, Type.f32), Type.f32], + Type.vec(dim, Type.f32), t.params, cases ); @@ -127,8 +127,8 @@ fn(async (t) => { await run( t, binary('-'), - [TypeF32, TypeVec(dim, TypeF32)], - TypeVec(dim, TypeF32), + [Type.f32, Type.vec(dim, Type.f32)], + Type.vec(dim, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_arithmetic.spec.js index c2abea5b26a..8f84d041b05 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_arithmetic.spec.js @@ -4,7 +4,7 @@ Execution Tests for the i32 arithmetic binary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeI32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -24,7 +24,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('addition'); - await run(t, binary('+'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, binary('+'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('addition_compound'). @@ -39,7 +39,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('addition'); - await run(t, compoundBinary('+='), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, compoundBinary('+='), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('subtraction'). @@ -54,7 +54,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('subtraction'); - await run(t, binary('-'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, binary('-'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('subtraction_compound'). @@ -69,7 +69,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('subtraction'); - await run(t, compoundBinary('-='), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, compoundBinary('-='), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('multiplication'). @@ -84,7 +84,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('multiplication'); - await run(t, binary('*'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, binary('*'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('multiplication_compound'). @@ -99,7 +99,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('multiplication'); - await run(t, compoundBinary('*='), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, compoundBinary('*='), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('division'). @@ -116,7 +116,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'division_const' : 'division_non_const' ); - await run(t, binary('/'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, binary('/'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('division_compound'). @@ -133,7 +133,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'division_const' : 'division_non_const' ); - await run(t, compoundBinary('/='), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, compoundBinary('/='), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('remainder'). @@ -150,7 +150,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'remainder_const' : 'remainder_non_const' ); - await run(t, binary('%'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, binary('%'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('remainder_compound'). @@ -167,7 +167,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'remainder_const' : 'remainder_non_const' ); - await run(t, compoundBinary('%='), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, compoundBinary('%='), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('addition_scalar_vector'). @@ -182,9 +182,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`addition_scalar_vector${vec_size}`); - await run(t, binary('+'), [TypeI32, vec_type], vec_type, t.params, cases); + await run(t, binary('+'), [Type.i32, vec_type], vec_type, t.params, cases); }); g.test('addition_vector_scalar'). @@ -199,9 +199,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`addition_vector${vec_size}_scalar`); - await run(t, binary('+'), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, binary('+'), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('addition_vector_scalar_compound'). @@ -216,9 +216,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`addition_vector${vec_size}_scalar`); - await run(t, compoundBinary('+='), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, compoundBinary('+='), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('subtraction_scalar_vector'). @@ -233,9 +233,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`subtraction_scalar_vector${vec_size}`); - await run(t, binary('-'), [TypeI32, vec_type], vec_type, t.params, cases); + await run(t, binary('-'), [Type.i32, vec_type], vec_type, t.params, cases); }); g.test('subtraction_vector_scalar'). @@ -250,9 +250,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`subtraction_vector${vec_size}_scalar`); - await run(t, binary('-'), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, binary('-'), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('subtraction_vector_scalar_compound'). @@ -267,9 +267,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`subtraction_vector${vec_size}_scalar`); - await run(t, compoundBinary('-='), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, compoundBinary('-='), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('multiplication_scalar_vector'). @@ -284,9 +284,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`multiplication_scalar_vector${vec_size}`); - await run(t, binary('*'), [TypeI32, vec_type], vec_type, t.params, cases); + await run(t, binary('*'), [Type.i32, vec_type], vec_type, t.params, cases); }); g.test('multiplication_vector_scalar'). @@ -301,9 +301,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`multiplication_vector${vec_size}_scalar`); - await run(t, binary('*'), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, binary('*'), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('multiplication_vector_scalar_compound'). @@ -318,9 +318,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const cases = await d.get(`multiplication_vector${vec_size}_scalar`); - await run(t, compoundBinary('*='), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, compoundBinary('*='), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('division_scalar_vector'). @@ -335,10 +335,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_scalar_vector${vec_size}_${source}`); - await run(t, binary('/'), [TypeI32, vec_type], vec_type, t.params, cases); + await run(t, binary('/'), [Type.i32, vec_type], vec_type, t.params, cases); }); g.test('division_vector_scalar'). @@ -353,10 +353,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_vector${vec_size}_scalar_${source}`); - await run(t, binary('/'), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, binary('/'), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('division_vector_scalar_compound'). @@ -371,10 +371,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_vector${vec_size}_scalar_${source}`); - await run(t, compoundBinary('/='), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, compoundBinary('/='), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('remainder_scalar_vector'). @@ -389,10 +389,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_scalar_vector${vec_size}_${source}`); - await run(t, binary('%'), [TypeI32, vec_type], vec_type, t.params, cases); + await run(t, binary('%'), [Type.i32, vec_type], vec_type, t.params, cases); }); g.test('remainder_vector_scalar'). @@ -407,10 +407,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_vector${vec_size}_scalar_${source}`); - await run(t, binary('%'), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, binary('%'), [vec_type, Type.i32], vec_type, t.params, cases); }); g.test('remainder_vector_scalar_compound'). @@ -425,8 +425,8 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeI32); + const vec_type = Type.vec(vec_size, Type.i32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_vector${vec_size}_scalar_${source}`); - await run(t, compoundBinary('%='), [vec_type, TypeI32], vec_type, t.params, cases); + await run(t, compoundBinary('%='), [vec_type, Type.i32], vec_type, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_comparison.spec.js index 4c9d7d66429..e0f78079bab 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_comparison.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/i32_comparison.spec.js @@ -4,7 +4,7 @@ Execution Tests for the i32 comparison expressions `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeI32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary } from './binary.js'; @@ -24,7 +24,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('equals'); - await run(t, binary('=='), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('=='), [Type.i32, Type.i32], Type.bool, t.params, cases); }); g.test('not_equals'). @@ -39,7 +39,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('not_equals'); - await run(t, binary('!='), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('!='), [Type.i32, Type.i32], Type.bool, t.params, cases); }); g.test('less_than'). @@ -54,7 +54,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('less_than'); - await run(t, binary('<'), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('<'), [Type.i32, Type.i32], Type.bool, t.params, cases); }); g.test('less_equals'). @@ -69,7 +69,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('less_equal'); - await run(t, binary('<='), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('<='), [Type.i32, Type.i32], Type.bool, t.params, cases); }); g.test('greater_than'). @@ -84,7 +84,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('greater_than'); - await run(t, binary('>'), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('>'), [Type.i32, Type.i32], Type.bool, t.params, cases); }); g.test('greater_equals'). @@ -99,5 +99,5 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('greater_equal'); - await run(t, binary('>='), [TypeI32, TypeI32], TypeBool, t.params, cases); + await run(t, binary('>='), [Type.i32, Type.i32], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_arithmetic.spec.js index ef1c480e5c4..0a86c46ffda 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_arithmetic.spec.js @@ -4,7 +4,7 @@ Execution Tests for the u32 arithmetic binary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeU32, TypeVec } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary, compoundBinary } from './binary.js'; @@ -24,7 +24,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('addition'); - await run(t, binary('+'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, binary('+'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('addition_compound'). @@ -39,7 +39,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('addition'); - await run(t, compoundBinary('+='), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, compoundBinary('+='), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('subtraction'). @@ -54,7 +54,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('subtraction'); - await run(t, binary('-'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, binary('-'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('subtraction_compound'). @@ -69,7 +69,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('subtraction'); - await run(t, compoundBinary('-='), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, compoundBinary('-='), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('multiplication'). @@ -84,7 +84,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('multiplication'); - await run(t, binary('*'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, binary('*'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('multiplication_compound'). @@ -99,7 +99,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('multiplication'); - await run(t, compoundBinary('*='), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, compoundBinary('*='), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('division'). @@ -116,7 +116,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'division_const' : 'division_non_const' ); - await run(t, binary('/'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, binary('/'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('division_compound'). @@ -133,7 +133,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'division_const' : 'division_non_const' ); - await run(t, compoundBinary('/='), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, compoundBinary('/='), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('remainder'). @@ -150,7 +150,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'remainder_const' : 'remainder_non_const' ); - await run(t, binary('%'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, binary('%'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('remainder_compound'). @@ -167,7 +167,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'remainder_const' : 'remainder_non_const' ); - await run(t, compoundBinary('%='), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, compoundBinary('%='), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('addition_scalar_vector'). @@ -182,9 +182,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`addition_scalar_vector${vec_size}`); - await run(t, binary('+'), [TypeU32, vec_type], vec_type, t.params, cases); + await run(t, binary('+'), [Type.u32, vec_type], vec_type, t.params, cases); }); g.test('addition_vector_scalar'). @@ -199,9 +199,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`addition_vector${vec_size}_scalar`); - await run(t, binary('+'), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, binary('+'), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('addition_vector_scalar_compound'). @@ -216,9 +216,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`addition_vector${vec_size}_scalar`); - await run(t, compoundBinary('+='), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, compoundBinary('+='), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('subtraction_scalar_vector'). @@ -233,9 +233,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`subtraction_scalar_vector${vec_size}`); - await run(t, binary('-'), [TypeU32, vec_type], vec_type, t.params, cases); + await run(t, binary('-'), [Type.u32, vec_type], vec_type, t.params, cases); }); g.test('subtraction_vector_scalar'). @@ -250,9 +250,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`subtraction_vector${vec_size}_scalar`); - await run(t, binary('-'), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, binary('-'), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('subtraction_vector_scalar_compound'). @@ -267,9 +267,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`subtraction_vector${vec_size}_scalar`); - await run(t, compoundBinary('-='), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, compoundBinary('-='), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('multiplication_scalar_vector'). @@ -284,9 +284,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`multiplication_scalar_vector${vec_size}`); - await run(t, binary('*'), [TypeU32, vec_type], vec_type, t.params, cases); + await run(t, binary('*'), [Type.u32, vec_type], vec_type, t.params, cases); }); g.test('multiplication_vector_scalar'). @@ -301,9 +301,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`multiplication_vector${vec_size}_scalar`); - await run(t, binary('*'), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, binary('*'), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('multiplication_vector_scalar_compound'). @@ -318,9 +318,9 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const cases = await d.get(`multiplication_vector${vec_size}_scalar`); - await run(t, compoundBinary('*='), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, compoundBinary('*='), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('division_scalar_vector'). @@ -335,10 +335,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_scalar_vector${vec_size}_${source}`); - await run(t, binary('/'), [TypeU32, vec_type], vec_type, t.params, cases); + await run(t, binary('/'), [Type.u32, vec_type], vec_type, t.params, cases); }); g.test('division_vector_scalar'). @@ -353,10 +353,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_vector${vec_size}_scalar_${source}`); - await run(t, binary('/'), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, binary('/'), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('division_vector_scalar_compound'). @@ -371,10 +371,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`division_vector${vec_size}_scalar_${source}`); - await run(t, compoundBinary('/='), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, compoundBinary('/='), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('remainder_scalar_vector'). @@ -389,10 +389,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_rhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_rhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_scalar_vector${vec_size}_${source}`); - await run(t, binary('%'), [TypeU32, vec_type], vec_type, t.params, cases); + await run(t, binary('%'), [Type.u32, vec_type], vec_type, t.params, cases); }); g.test('remainder_vector_scalar'). @@ -407,10 +407,10 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_vector${vec_size}_scalar_${source}`); - await run(t, binary('%'), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, binary('%'), [vec_type, Type.u32], vec_type, t.params, cases); }); g.test('remainder_vector_scalar_compound'). @@ -425,8 +425,8 @@ u.combine('inputSource', allInputSources).combine('vectorize_lhs', [2, 3, 4]) ). fn(async (t) => { const vec_size = t.params.vectorize_lhs; - const vec_type = TypeVec(vec_size, TypeU32); + const vec_type = Type.vec(vec_size, Type.u32); const source = t.params.inputSource === 'const' ? 'const' : 'non_const'; const cases = await d.get(`remainder_vector${vec_size}_scalar_${source}`); - await run(t, compoundBinary('%='), [vec_type, TypeU32], vec_type, t.params, cases); + await run(t, compoundBinary('%='), [vec_type, Type.u32], vec_type, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_comparison.spec.js index 917371129e8..a9424f205c8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_comparison.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/binary/u32_comparison.spec.js @@ -4,7 +4,7 @@ Execution Tests for the u32 comparison expressions `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeU32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { binary } from './binary.js'; @@ -24,7 +24,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('equals'); - await run(t, binary('=='), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('=='), [Type.u32, Type.u32], Type.bool, t.params, cases); }); g.test('not_equals'). @@ -39,7 +39,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('not_equals'); - await run(t, binary('!='), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('!='), [Type.u32, Type.u32], Type.bool, t.params, cases); }); g.test('less_than'). @@ -54,7 +54,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('less_than'); - await run(t, binary('<'), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('<'), [Type.u32, Type.u32], Type.bool, t.params, cases); }); g.test('less_equals'). @@ -69,7 +69,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('less_equal'); - await run(t, binary('<='), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('<='), [Type.u32, Type.u32], Type.bool, t.params, cases); }); g.test('greater_than'). @@ -84,7 +84,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('greater_than'); - await run(t, binary('>'), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('>'), [Type.u32, Type.u32], Type.bool, t.params, cases); }); g.test('greater_equals'). @@ -99,5 +99,5 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('greater_equal'); - await run(t, binary('>='), [TypeU32, TypeU32], TypeBool, t.params, cases); + await run(t, binary('>='), [Type.u32, Type.u32], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.cache.js index 8e2e0ea58f5..18404671f52 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.cache.js @@ -1,17 +1,26 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16|abstract] -const cases = ['f32', 'f16', 'abstract']. -map((trait) => ({ - [`${trait}`]: () => { - return FP[trait].generateScalarToIntervalCases( - FP[trait].scalarRange(), - 'unfiltered', - FP[trait].absInterval - ); +**/import { abstractInt } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js';import { absBigInt, fullI64Range } from '../../../../../util/math.js'; +import { makeCaseCache } from '../../case_cache.js'; + +// Cases: [f32|f16|abstract_float|abstract_int] +const cases = { + ...['f32', 'f16', 'abstract']. + map((trait) => ({ + [`${trait === 'abstract' ? 'abstract_float' : trait}`]: () => { + return FP[trait].generateScalarToIntervalCases( + FP[trait].scalarRange(), + 'unfiltered', + FP[trait].absInterval + ); + } + })). + reduce((a, b) => ({ ...a, ...b }), {}), + abstract_int: () => { + return fullI64Range().map((e) => { + return { input: abstractInt(e), expected: abstractInt(absBigInt(e)) }; + }); } -})). -reduce((a, b) => ({ ...a, ...b }), {}); +}; export const d = makeCaseCache('abs', cases); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.spec.js index 6069839777f..e5f9196d5dd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/abs.spec.js @@ -3,14 +3,14 @@ **/export const description = ` Execution tests for the 'abs' builtin function -S is AbstractInt, i32, or u32 +S is abstract-int, i32, or u32 T is S or vecN @const fn abs(e: T ) -> T The absolute value of e. Component-wise when T is a vector. If e is a signed integral scalar type and evaluates to the largest negative value, then the result is e. If e is an unsigned integral type, then the result is e. -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn abs(e: T ) -> T Returns the absolute value of e (e.g. e with a positive sign bit). @@ -18,19 +18,11 @@ Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; import { kBit } from '../../../../../util/constants.js'; -import { - i32Bits, - TypeF32, - TypeF16, - TypeI32, - TypeU32, - u32Bits, - TypeAbstractFloat } from -'../../../../../util/conversion.js'; +import { Type, i32Bits, u32Bits } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './abs.cache.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -38,9 +30,14 @@ g.test('abstract_int'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). desc(`abstract int tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_int'); + await run(t, abstractIntBuiltin('abs'), [Type.abstractInt], Type.abstractInt, t.params, cases); +}); g.test('u32'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). @@ -49,7 +46,7 @@ params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - await run(t, builtin('abs'), [TypeU32], TypeU32, t.params, [ + await run(t, builtin('abs'), [Type.u32], Type.u32, t.params, [ // Min and Max u32 { input: u32Bits(kBit.u32.min), expected: u32Bits(kBit.u32.min) }, { input: u32Bits(kBit.u32.max), expected: u32Bits(kBit.u32.max) }, @@ -96,7 +93,7 @@ params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - await run(t, builtin('abs'), [TypeI32], TypeI32, t.params, [ + await run(t, builtin('abs'), [Type.i32], Type.i32, t.params, [ // Min and max i32 // If e evaluates to the largest negative value, then the result is e. { input: i32Bits(kBit.i32.negative.min), expected: i32Bits(kBit.i32.negative.min) }, @@ -148,8 +145,15 @@ combine('inputSource', onlyConstInputSource). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const cases = await d.get('abstract'); - await run(t, abstractBuiltin('abs'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + const cases = await d.get('abstract_float'); + await run( + t, + abstractFloatBuiltin('abs'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); }); g.test('f32'). @@ -160,7 +164,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('abs'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('abs'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -174,5 +178,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('abs'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('abs'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.cache.js index d71dcffc6dd..2252cdfadaf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.cache.js @@ -2,15 +2,19 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [...linearRange(-1, 1, 100), ...FP[trait].scalarRange()], // acos is defined on [-1, 1] nonConst ? 'unfiltered' : 'finite', - FP[trait].acosInterval + // acos has an ulp or inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].acosInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.spec.js index a36a7a88f78..587d894db4e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acos.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'acos' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn acos(e: T ) -> T Returns the arc cosine of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeF16 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './acos.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('acos'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('acos'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('acos'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('acos'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('acos'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.cache.js index acd8029a17e..7ec1882deae 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.cache.js @@ -2,15 +2,19 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { biasedRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [...biasedRange(1, 2, 100), ...FP[trait].scalarRange()], // x near 1 can be problematic to implement nonConst ? 'unfiltered' : 'finite', - ...FP[trait].acoshIntervals + // acosh has an inherited accuracy, so is only expected to be as accurate as f32 + ...FP[trait !== 'abstract' ? trait : 'f32'].acoshIntervals ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.spec.js index 5b607469263..621805031fd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/acosh.spec.js @@ -3,7 +3,7 @@ **/export const description = ` Execution tests for the 'acosh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn acosh(e: T ) -> T Returns the hyperbolic arc cosine of e. The result is 0 when e < 1. @@ -13,11 +13,11 @@ Note: The result is not mathematically meaningful when e < 1. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './acosh.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -25,9 +25,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('acosh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -37,7 +49,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('acosh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('acosh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -51,5 +63,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('acosh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('acosh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/all.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/all.spec.js index 09bbb7c02e0..8189413ce42 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/all.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/all.spec.js @@ -10,15 +10,7 @@ Returns e if e is scalar. Returns true if each component of e is true if e is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - False, - True, - TypeBool, - TypeVec, - vec2, - vec3, - vec4 } from -'../../../../../util/conversion.js'; +import { False, True, Type, vec2, vec3, vec4 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -36,14 +28,14 @@ combine('overload', ['scalar', 'vec2', 'vec3', 'vec4']) fn(async (t) => { const overloads = { scalar: { - type: TypeBool, + type: Type.bool, cases: [ { input: False, expected: False }, { input: True, expected: True }] }, vec2: { - type: TypeVec(2, TypeBool), + type: Type.vec(2, Type.bool), cases: [ { input: vec2(False, False), expected: False }, { input: vec2(True, False), expected: False }, @@ -52,7 +44,7 @@ fn(async (t) => { }, vec3: { - type: TypeVec(3, TypeBool), + type: Type.vec(3, Type.bool), cases: [ { input: vec3(False, False, False), expected: False }, { input: vec3(True, False, False), expected: False }, @@ -65,7 +57,7 @@ fn(async (t) => { }, vec4: { - type: TypeVec(4, TypeBool), + type: Type.vec(4, Type.bool), cases: [ { input: vec4(False, False, False, False), expected: False }, { input: vec4(False, True, False, False), expected: False }, @@ -88,5 +80,5 @@ fn(async (t) => { }; const overload = overloads[t.params.overload]; - await run(t, builtin('all'), [overload.type], TypeBool, t.params, overload.cases); + await run(t, builtin('all'), [overload.type], Type.bool, t.params, overload.cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/any.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/any.spec.js index 119efbb2be9..621e56be22a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/any.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/any.spec.js @@ -10,15 +10,7 @@ Returns e if e is scalar. Returns true if any component of e is true if e is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - False, - True, - TypeBool, - TypeVec, - vec2, - vec3, - vec4 } from -'../../../../../util/conversion.js'; +import { False, True, Type, vec2, vec3, vec4 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -36,14 +28,14 @@ combine('overload', ['scalar', 'vec2', 'vec3', 'vec4']) fn(async (t) => { const overloads = { scalar: { - type: TypeBool, + type: Type.bool, cases: [ { input: False, expected: False }, { input: True, expected: True }] }, vec2: { - type: TypeVec(2, TypeBool), + type: Type.vec(2, Type.bool), cases: [ { input: vec2(False, False), expected: False }, { input: vec2(True, False), expected: True }, @@ -52,7 +44,7 @@ fn(async (t) => { }, vec3: { - type: TypeVec(3, TypeBool), + type: Type.vec(3, Type.bool), cases: [ { input: vec3(False, False, False), expected: False }, { input: vec3(True, False, False), expected: True }, @@ -65,7 +57,7 @@ fn(async (t) => { }, vec4: { - type: TypeVec(4, TypeBool), + type: Type.vec(4, Type.bool), cases: [ { input: vec4(False, False, False, False), expected: False }, { input: vec4(False, True, False, False), expected: True }, @@ -88,5 +80,5 @@ fn(async (t) => { }; const overload = overloads[t.params.overload]; - await run(t, builtin('any'), [overload.type], TypeBool, t.params, overload.cases); + await run(t, builtin('any'), [overload.type], Type.bool, t.params, overload.cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/arrayLength.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/arrayLength.spec.js index 460332e6916..b4ffb72c2f5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/arrayLength.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/arrayLength.spec.js @@ -97,13 +97,13 @@ binding_offset) }); // Create the buffer that will contain the runtime-sized array. - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: buffer_size, usage: GPUBufferUsage.STORAGE }); // Create the buffer that will receive the array length. - const lengthBuffer = t.device.createBuffer({ + const lengthBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.cache.js index c7991c9bc85..99f0e6b798c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.cache.js @@ -2,15 +2,19 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [...linearRange(-1, 1, 100), ...FP[trait].scalarRange()], // asin is defined on [-1, 1] nonConst ? 'unfiltered' : 'finite', - FP[trait].asinInterval + // asin has an ulp or inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].asinInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.spec.js index 0519361a714..0f8d808079a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asin.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'asin' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn asin(e: T ) -> T Returns the arc sine of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './asin.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('asin'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('asin'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('asin'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('asin'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('asin'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.cache.js index b45ca00e39a..2c3d6f33eb8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.cache.js @@ -1,14 +1,15 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), 'unfiltered', - FP[trait].asinhInterval + // asinh has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].asinhInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.spec.js index 6e2bd6f9b5a..4cee7ca2d83 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/asinh.spec.js @@ -3,7 +3,7 @@ **/export const description = ` Execution tests for the 'sinh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn asinh(e: T ) -> T Returns the hyperbolic arc sine of e. @@ -12,11 +12,11 @@ Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './asinh.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -24,9 +24,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float test`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('asinh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -36,7 +48,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('asinh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('asinh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -50,5 +62,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('asinh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('asinh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.cache.js index 97ce4e70cc1..aff1d32cbac 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.cache.js @@ -3,15 +3,19 @@ **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; const known_values = [-Math.sqrt(3), -1, -1 / Math.sqrt(3), 0, 1, 1 / Math.sqrt(3), Math.sqrt(3)]; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [...known_values, ...FP[trait].scalarRange()], nonConst ? 'unfiltered' : 'finite', - FP[trait].atanInterval + // atan has an ulp accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].atanInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.spec.js index 2ede98c6237..fe58aca571e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan.spec.js @@ -3,18 +3,18 @@ **/export const description = ` Execution tests for the 'atan' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn atan(e: T ) -> T Returns the arc tangent of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './atan.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -22,9 +22,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('atan'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -40,7 +52,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('atan'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('atan'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -54,5 +66,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('atan'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('atan'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.cache.js index 5363a81fd7f..b4625d38eb4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.cache.js @@ -2,22 +2,30 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. -flatMap((kind) => +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. +flatMap((trait) => [true, false].map((nonConst) => ({ - [`${kind}_${nonConst ? 'non_const' : 'const'}`]: () => { + [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } // Using sparse range since there are N^2 cases being generated, and also including extra values // around 0, where there is a discontinuity that implementations may behave badly at. const numeric_range = [ - ...FP[kind].sparseScalarRange(), - ...linearRange(FP[kind].constants().negative.max, FP[kind].constants().positive.min, 10)]; + ...FP[trait].sparseScalarRange(), + ...linearRange( + FP[trait].constants().negative.max, + FP[trait].constants().positive.min, + 10 + )]; - return FP[kind].generateScalarPairToIntervalCases( + return FP[trait].generateScalarPairToIntervalCases( numeric_range, numeric_range, nonConst ? 'unfiltered' : 'finite', - FP[kind].atan2Interval + // atan2 has an ulp accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].atan2Interval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.spec.js index da3cd9fe287..88a223e52e5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atan2.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'atan2' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn atan2(e1: T ,e2: T ) -> T Returns the arc tangent of e1 over e2. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './atan2.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get(`abstract_const`); + await run( + t, + abstractFloatBuiltin('atan2'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -39,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(`f32_${t.params.inputSource === 'const' ? 'const' : 'non_const'}`); - await run(t, builtin('atan2'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('atan2'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +65,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(`f16_${t.params.inputSource === 'const' ? 'const' : 'non_const'}`); - await run(t, builtin('atan2'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('atan2'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.cache.js index d34cd70b75b..b10574328e2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.cache.js @@ -2,11 +2,14 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { biasedRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [ // discontinuity at x = -1 @@ -18,7 +21,8 @@ flatMap((trait) => ...FP[trait].scalarRange()], nonConst ? 'unfiltered' : 'finite', - FP[trait].atanhInterval + // atanh has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].atanhInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.spec.js index b3a150bd70d..b378b0a494e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atanh.spec.js @@ -3,7 +3,7 @@ **/export const description = ` Execution tests for the 'atanh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn atanh(e: T ) -> T Returns the hyperbolic arc tangent of e. The result is 0 when abs(e) ≥ 1. @@ -12,11 +12,11 @@ Component-wise when T is a vector. Note: The result is not mathematically meaningful when abs(e) >= 1. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; import { d } from './atanh.cache.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -24,9 +24,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('atanh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -36,7 +48,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('atanh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('atanh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -50,5 +62,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('atanh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('atanh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.spec.js index 1c33de38cac..4d52fff7c4e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.spec.js @@ -102,27 +102,24 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); // Create input buffer with values [0..n] - const inputBuffer = t.device.createBuffer({ + const inputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(inputBuffer); const data = new arrayType(inputBuffer.getMappedRange()); data.forEach((_, i) => data[i] = i); inputBuffer.unmap(); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); - const exchangedBuffer = t.device.createBuffer({ + const exchangedBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(exchangedBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -252,23 +249,20 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); - const wgCopyBuffer = t.device.createBuffer({ + const wgCopyBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); - const exchangedBuffer = t.device.createBuffer({ + const exchangedBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(exchangedBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -414,7 +408,7 @@ fn(async (t) => { const defaultValue = 99999999; // Create single-value data buffer initialized to the first ping-pong value - const dataBuffer = t.device.createBuffer({ + const dataBuffer = t.createBufferTracked({ size: 1 * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true @@ -424,26 +418,23 @@ fn(async (t) => { data[0] = pingPongValues[0]; dataBuffer.unmap(); } - t.trackForCleanup(dataBuffer); - const oldValuesBuffer = t.device.createBuffer({ + const oldValuesBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(oldValuesBuffer); { const data = new arrayType(oldValuesBuffer.getMappedRange()); data.fill(defaultValue); oldValuesBuffer.unmap(); } - const exchangedBuffer = t.device.createBuffer({ + const exchangedBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(exchangedBuffer); { const data = new arrayType(exchangedBuffer.getMappedRange()); data.fill(defaultValue); @@ -641,24 +632,22 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); const defaultValue = 99999999; - const oldValuesBuffer = t.device.createBuffer({ + const oldValuesBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(oldValuesBuffer); { const data = new arrayType(oldValuesBuffer.getMappedRange()); data.fill(defaultValue); oldValuesBuffer.unmap(); } - const exchangedBuffer = t.device.createBuffer({ + const exchangedBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(exchangedBuffer); { const data = new arrayType(exchangedBuffer.getMappedRange()); data.fill(defaultValue); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicExchange.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicExchange.spec.js index 92717005f7a..23a9b78ba90 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicExchange.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicExchange.spec.js @@ -64,21 +64,19 @@ fn((t) => { const arrayType = typedArrayCtor(scalarType); // Create input buffer with values [0..n] - const inputBuffer = t.device.createBuffer({ + const inputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(inputBuffer); const data = new arrayType(inputBuffer.getMappedRange()); data.forEach((_, i) => data[i] = i); inputBuffer.unmap(); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -176,17 +174,15 @@ fn((t) => { const arrayType = typedArrayCtor(scalarType); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); - const wgCopyBuffer = t.device.createBuffer({ + const wgCopyBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -276,17 +272,15 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); // Create input buffer of size 1 with initial value 0 - const inputBuffer = t.device.createBuffer({ + const inputBuffer = t.createBufferTracked({ size: 1 * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(inputBuffer); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -402,17 +396,15 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: numInvocations * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); - const wgCopyBuffer = t.device.createBuffer({ + const wgCopyBuffer = t.createBufferTracked({ size: dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicLoad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicLoad.spec.js index dca1a6b9d92..96efa3ac5c9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicLoad.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicLoad.spec.js @@ -61,21 +61,19 @@ fn((t) => { const arrayType = typedArrayCtor(scalarType); // Create input buffer with values [map_id(0)..map_id(n)] - const inputBuffer = t.device.createBuffer({ + const inputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); - t.trackForCleanup(inputBuffer); const data = new arrayType(inputBuffer.getMappedRange()); data.forEach((_, i) => data[i] = mapId.f(i, numInvocations)); inputBuffer.unmap(); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -162,11 +160,10 @@ fn((t) => { const arrayType = typedArrayCtor(scalarType); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicStore.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicStore.spec.js index 1b9b7f70bd9..7e154e64965 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicStore.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicStore.spec.js @@ -152,11 +152,10 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); // Output buffer has only 1 element - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: 1 * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -257,11 +256,10 @@ fn(async (t) => { const arrayType = typedArrayCtor(scalarType); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicSub.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicSub.spec.js index 47b1ff8ec5a..696a15b2ef6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicSub.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicSub.spec.js @@ -98,4 +98,27 @@ fn((t) => { op, expected }); +}); + +g.test('sub_i32_min'). +desc('Test atomicSub with i32 minimum value'). +fn((t) => { + // Allocate one extra element to ensure it doesn't get modified + const bufferNumElements = 2; + + const initValue = 0xffff; + const op = `atomicSub(&output[0], -2147483648)`; + const expected = new (typedArrayCtor('i32'))(bufferNumElements); + expected[0] = -0x7fff0001; + expected[1] = 0xffff; + + runStorageVariableTest({ + t, + workgroupSize: 1, + dispatchSize: 1, + bufferNumElements, + initValue, + op, + expected + }); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/harness.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/harness.js index c377728f10c..abba91dc64b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/harness.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/harness.js @@ -84,13 +84,12 @@ export function runStorageVariableTest({ } }); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC, mappedAtCreation: true }); // Fill with initial value - t.trackForCleanup(outputBuffer); const data = new arrayType(outputBuffer.getMappedRange()); data.fill(initValue); outputBuffer.unmap(); @@ -184,7 +183,7 @@ export function runWorkgroupVariableTest({ } }); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: wgNumElements * dispatchSize * arrayType.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.cache.js index d0e4463d564..6ecbee7dd63 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.cache.js @@ -3,13 +3,14 @@ **/import { assert } from '../../../../../../common/util/util.js';import { alwaysPass, anyOf } from '../../../../../util/compare.js';import { kBit, kValue } from '../../../../../util/constants.js'; import { - Vector, + VectorValue, f16, f32, i32, toVector, u32, - abstractFloat } from + abstractFloat, + abstractInt } from '../../../../../util/conversion.js'; import { FP, FPInterval } from '../../../../../util/floating_point.js'; import { @@ -63,7 +64,7 @@ const f32ZerosInterval = new FPInterval('f32', -0.0, 0.0); const f32FiniteRange = [...scalarF32Range(), kValue.f32.negative.zero]; const f32RangeWithInfAndNaN = [...f32FiniteRange, ...f32InfAndNaNInF32]; -// F16 values, finite, Inf/NaN, and zeros. Represented in float and u16. +// Type.f16 values, finite, Inf/NaN, and zeros. Represented in float and u16. const f16FiniteInF16 = [...scalarF16Range(), kValue.f16.negative.zero]; const f16FiniteInU16 = f16FiniteInF16.map((u) => reinterpretF16AsU16(u)); @@ -499,11 +500,11 @@ type) } const possibleU16Bits = f16x2InU16x2.map(possibleBitsInU16FromFiniteF16InU16); const possibleExpectations = cartesianProduct(...possibleU16Bits).flatMap( + (possibleBitsU16x2) => { assert(possibleBitsU16x2.length === 2); return expectationsForValue(reinterpretFromU32(u16x2ToU32(possibleBitsU16x2))); - } - ); + }); return { possibleExpectations, isUnbounded: false }; } @@ -566,7 +567,7 @@ function bitcastVec4F16ToVec2U32Comparator(vec4F16InU16x4) { } return anyOf( ...cartesianProduct(...expectationsPerElement.map((e) => e.possibleExpectations)).map( - (e) => new Vector(e) + (e) => new VectorValue(e) ) ); } @@ -588,7 +589,7 @@ function bitcastVec4F16ToVec2I32Comparator(vec4F16InU16x4) { } return anyOf( ...cartesianProduct(...expectationsPerElement.map((e) => e.possibleExpectations)).map( - (e) => new Vector(e) + (e) => new VectorValue(e) ) ); } @@ -629,13 +630,21 @@ export const d = makeCaseCache('bitcast', { f16_to_f16: () => f16FiniteInF16.map((e) => ({ input: f16(e), expected: bitcastF16ToF16Comparator(e) })), - // i32,u32,f32 to different i32,u32,f32 + // i32,u32,f32,Abstract to different i32,u32,f32 i32_to_u32: () => fullI32Range().map((e) => ({ input: i32(e), expected: u32(e) })), i32_to_f32: () => i32RangeForF32Finite.map((e) => ({ input: i32(e), expected: bitcastI32ToF32Comparator(e) })), + ai_to_i32: () => fullI32Range().map((e) => ({ input: abstractInt(BigInt(e)), expected: i32(e) })), + ai_to_u32: () => fullU32Range().map((e) => ({ input: abstractInt(BigInt(e)), expected: u32(e) })), + ai_to_f32: () => + // AbstractInt is converted to i32, because there is no explicit overload + i32RangeForF32Finite.map((e) => ({ + input: abstractInt(BigInt(e)), + expected: bitcastI32ToF32Comparator(e) + })), i32_to_f32_inf_nan: () => i32RangeForF32FiniteInfNaN.map((e) => ({ input: i32(e), @@ -668,7 +677,7 @@ export const d = makeCaseCache('bitcast', { f32_to_u32: () => f32FiniteRange.map((e) => ({ input: f32(e), expected: bitcastF32ToU32Comparator(e) })), - // i32,u32,f32 to vec2 + // i32,u32,f32,AbstractInt to vec2 u32_to_vec2_f16_inf_nan: () => u32RangeForF16Vec2FiniteInfNaN.map((e) => ({ input: u32(e), @@ -689,6 +698,12 @@ export const d = makeCaseCache('bitcast', { input: i32(e), expected: bitcastI32ToVec2F16Comparator(e) })), + ai_to_vec2_f16: () => + // AbstractInt is converted to i32, because there is no explicit overload + i32RangeForF16Vec2Finite.map((e) => ({ + input: abstractInt(BigInt(e)), + expected: bitcastI32ToVec2F16Comparator(e) + })), f32_inf_nan_to_vec2_f16_inf_nan: () => f32RangeWithInfAndNaNForF16Vec2FiniteInfNaN.map((e) => ({ input: f32(e), @@ -705,7 +720,7 @@ export const d = makeCaseCache('bitcast', { expected: bitcastF32ToVec2F16Comparator(e) })), - // vec2, vec2, vec2 to vec4 + // vec2, vec2, vec2, vec2 to vec4 vec2_i32_to_vec4_f16_inf_nan: () => slidingSlice(i32RangeForF16Vec2FiniteInfNaN, 2).map((e) => ({ input: toVector(e, i32), @@ -716,6 +731,12 @@ export const d = makeCaseCache('bitcast', { input: toVector(e, i32), expected: bitcastVec2I32ToVec4F16Comparator(e) })), + vec2_ai_to_vec4_f16: () => + // AbstractInt is converted to i32, because there is no explicit overload + slidingSlice(i32RangeForF16Vec2Finite, 2).map((e) => ({ + input: toVector(e, (n) => abstractInt(BigInt(n))), + expected: bitcastVec2I32ToVec4F16Comparator(e) + })), vec2_u32_to_vec4_f16_inf_nan: () => slidingSlice(u32RangeForF16Vec2FiniteInfNaN, 2).map((e) => ({ input: toVector(e, u32), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.spec.js index 9ee1abdd363..a2e9ab49e7d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/bitcast.spec.js @@ -13,8 +13,8 @@ S is i32, u32, f32 T is i32, u32, f32, and T is not S Reinterpretation of bits. Beware non-normal f32 values. -@const @must_use fn bitcast(e : AbstractInt) -> T -@const @must_use fn bitcast>(e : vecN) -> T +@const @must_use fn bitcast(e : Type.abstractInt) -> T +@const @must_use fn bitcast>(e : vecN) -> T @const @must_use fn bitcast(e: vec2 ) -> T @const @must_use fn bitcast>(e: vec4 ) -> vec2 @@ -26,18 +26,13 @@ import { makeTestGroup } from '../../../../../../common/framework/test_group.js' import { GPUTest } from '../../../../../gpu_test.js'; import { anyOf } from '../../../../../util/compare.js'; import { - TypeF16, - TypeF32, - TypeI32, - TypeU32, - TypeVec, - TypeAbstractFloat, f32, u32, i32, abstractFloat, uint32ToFloat32, - u32Bits } from + u32Bits, + Type } from '../../../../../util/conversion.js'; import { FP } from '../../../../../util/floating_point.js'; import { scalarF32Range } from '../../../../../util/math.js'; @@ -76,7 +71,7 @@ combine('alias', [false, true]) ). fn(async (t) => { const cases = await d.get('i32_to_i32'); - await run(t, bitcastBuilder('i32', t.params), [TypeI32], TypeI32, t.params, cases); + await run(t, bitcastBuilder('i32', t.params), [Type.i32], Type.i32, t.params, cases); }); g.test('u32_to_u32'). @@ -90,7 +85,7 @@ combine('alias', [false, true]) ). fn(async (t) => { const cases = await d.get('u32_to_u32'); - await run(t, bitcastBuilder('u32', t.params), [TypeU32], TypeU32, t.params, cases); + await run(t, bitcastBuilder('u32', t.params), [Type.u32], Type.u32, t.params, cases); }); g.test('f32_to_f32'). @@ -107,7 +102,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'f32_to_f32' : 'f32_inf_nan_to_f32' ); - await run(t, bitcastBuilder('f32', t.params), [TypeF32], TypeF32, t.params, cases); + await run(t, bitcastBuilder('f32', t.params), [Type.f32], Type.f32, t.params, cases); }); // To i32 from u32, f32 @@ -122,7 +117,7 @@ combine('alias', [false, true]) ). fn(async (t) => { const cases = await d.get('u32_to_i32'); - await run(t, bitcastBuilder('i32', t.params), [TypeU32], TypeI32, t.params, cases); + await run(t, bitcastBuilder('i32', t.params), [Type.u32], Type.i32, t.params, cases); }); g.test('f32_to_i32'). @@ -139,7 +134,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'f32_to_i32' : 'f32_inf_nan_to_i32' ); - await run(t, bitcastBuilder('i32', t.params), [TypeF32], TypeI32, t.params, cases); + await run(t, bitcastBuilder('i32', t.params), [Type.f32], Type.i32, t.params, cases); }); // To u32 from i32, f32 @@ -154,7 +149,7 @@ combine('alias', [false, true]) ). fn(async (t) => { const cases = await d.get('i32_to_u32'); - await run(t, bitcastBuilder('u32', t.params), [TypeI32], TypeU32, t.params, cases); + await run(t, bitcastBuilder('u32', t.params), [Type.i32], Type.u32, t.params, cases); }); g.test('f32_to_u32'). @@ -171,7 +166,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'f32_to_u32' : 'f32_inf_nan_to_u32' ); - await run(t, bitcastBuilder('u32', t.params), [TypeF32], TypeU32, t.params, cases); + await run(t, bitcastBuilder('u32', t.params), [Type.f32], Type.u32, t.params, cases); }); // To f32 from i32, u32 @@ -189,7 +184,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'i32_to_f32' : 'i32_to_f32_inf_nan' ); - await run(t, bitcastBuilder('f32', t.params), [TypeI32], TypeF32, t.params, cases); + await run(t, bitcastBuilder('f32', t.params), [Type.i32], Type.f32, t.params, cases); }); g.test('u32_to_f32'). @@ -206,7 +201,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'u32_to_f32' : 'u32_to_f32_inf_nan' ); - await run(t, bitcastBuilder('f32', t.params), [TypeU32], TypeF32, t.params, cases); + await run(t, bitcastBuilder('f32', t.params), [Type.u32], Type.f32, t.params, cases); }); // 16 bit types @@ -231,7 +226,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'f16_to_f16' : 'f16_inf_nan_to_f16' ); - await run(t, bitcastBuilder('f16', t.params), [TypeF16], TypeF16, t.params, cases); + await run(t, bitcastBuilder('f16', t.params), [Type.f16], Type.f16, t.params, cases); }); // f16: 32-bit scalar numeric to vec2 @@ -247,14 +242,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'i32_to_vec2_f16' : 'i32_to_vec2_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeI32], - TypeVec(2, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.i32], Type.vec2h, t.params, cases); }); g.test('u32_to_vec2h'). @@ -269,14 +257,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'u32_to_vec2_f16' : 'u32_to_vec2_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeU32], - TypeVec(2, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.u32], Type.vec2h, t.params, cases); }); g.test('f32_to_vec2h'). @@ -291,14 +272,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'f32_to_vec2_f16' : 'f32_inf_nan_to_vec2_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeF32], - TypeVec(2, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.f32], Type.vec2h, t.params, cases); }); // f16: vec2<32-bit scalar numeric> to vec4 @@ -314,14 +288,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec2_i32_to_vec4_f16' : 'vec2_i32_to_vec4_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec4', t.params), - [TypeVec(2, TypeI32)], - TypeVec(4, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec4', t.params), [Type.vec2i], Type.vec4h, t.params, cases); }); g.test('vec2u_to_vec4h'). @@ -336,14 +303,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec2_u32_to_vec4_f16' : 'vec2_u32_to_vec4_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec4', t.params), - [TypeVec(2, TypeU32)], - TypeVec(4, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec4', t.params), [Type.vec2u], Type.vec4h, t.params, cases); }); g.test('vec2f_to_vec4h'). @@ -360,14 +320,7 @@ fn(async (t) => { 'vec2_f32_to_vec4_f16' : 'vec2_f32_inf_nan_to_vec4_f16_inf_nan' ); - await run( - t, - bitcastBuilder('vec4', t.params), - [TypeVec(2, TypeF32)], - TypeVec(4, TypeF16), - t.params, - cases - ); + await run(t, bitcastBuilder('vec4', t.params), [Type.vec2f], Type.vec4h, t.params, cases); }); // f16: vec2 to 32-bit scalar numeric @@ -383,7 +336,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec2_f16_to_i32' : 'vec2_f16_inf_nan_to_i32' ); - await run(t, bitcastBuilder('i32', t.params), [TypeVec(2, TypeF16)], TypeI32, t.params, cases); + await run(t, bitcastBuilder('i32', t.params), [Type.vec2h], Type.i32, t.params, cases); }); g.test('vec2h_to_u32'). @@ -398,7 +351,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec2_f16_to_u32' : 'vec2_f16_inf_nan_to_u32' ); - await run(t, bitcastBuilder('u32', t.params), [TypeVec(2, TypeF16)], TypeU32, t.params, cases); + await run(t, bitcastBuilder('u32', t.params), [Type.vec2h], Type.u32, t.params, cases); }); g.test('vec2h_to_f32'). @@ -413,7 +366,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec2_f16_to_f32_finite' : 'vec2_f16_inf_nan_to_f32' ); - await run(t, bitcastBuilder('f32', t.params), [TypeVec(2, TypeF16)], TypeF32, t.params, cases); + await run(t, bitcastBuilder('f32', t.params), [Type.vec2h], Type.f32, t.params, cases); }); // f16: vec4 to vec2<32-bit scalar numeric> @@ -429,14 +382,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec4_f16_to_vec2_i32' : 'vec4_f16_inf_nan_to_vec2_i32' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeVec(4, TypeF16)], - TypeVec(2, TypeI32), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.vec4h], Type.vec2i, t.params, cases); }); g.test('vec4h_to_vec2u'). @@ -451,14 +397,7 @@ fn(async (t) => { // Infinities and NaNs are errors in const-eval. t.params.inputSource === 'const' ? 'vec4_f16_to_vec2_u32' : 'vec4_f16_inf_nan_to_vec2_u32' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeVec(4, TypeF16)], - TypeVec(2, TypeU32), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.vec4h], Type.vec2u, t.params, cases); }); g.test('vec4h_to_vec2f'). @@ -475,14 +414,7 @@ fn(async (t) => { 'vec4_f16_to_vec2_f32_finite' : 'vec4_f16_inf_nan_to_vec2_f32' ); - await run( - t, - bitcastBuilder('vec2', t.params), - [TypeVec(4, TypeF16)], - TypeVec(2, TypeF32), - t.params, - cases - ); + await run(t, bitcastBuilder('vec2', t.params), [Type.vec4h], Type.vec2f, t.params, cases); }); // Abstract Float @@ -496,7 +428,7 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = scalarF32Range().map((u) => { - const res = FP['f32'].correctlyRounded(u).map((f) => { + const res = FP['f32'].addFlushedIfNeeded([u]).map((f) => { return f32(f); }); return { @@ -505,7 +437,7 @@ fn(async (t) => { }; }); - await run(t, bitcastBuilder('f32', t.params), [TypeAbstractFloat], TypeF32, t.params, cases); + await run(t, bitcastBuilder('f32', t.params), [Type.abstractFloat], Type.f32, t.params, cases); }); g.test('af_to_i32'). @@ -549,7 +481,7 @@ fn(async (t) => { }; }); - await run(t, bitcastBuilder('i32', t.params), [TypeAbstractFloat], TypeI32, t.params, cases); + await run(t, bitcastBuilder('i32', t.params), [Type.abstractFloat], Type.i32, t.params, cases); }); g.test('af_to_u32'). @@ -593,7 +525,7 @@ fn(async (t) => { }; }); - await run(t, bitcastBuilder('u32', t.params), [TypeAbstractFloat], TypeU32, t.params, cases); + await run(t, bitcastBuilder('u32', t.params), [Type.abstractFloat], Type.u32, t.params, cases); }); g.test('af_to_vec2f16'). @@ -609,8 +541,8 @@ fn(async (t) => { await run( t, bitcastBuilder('vec2', t.params), - [TypeAbstractFloat], - TypeVec(2, TypeF16), + [Type.abstractFloat], + Type.vec2h, t.params, cases ); @@ -629,71 +561,83 @@ fn(async (t) => { await run( t, bitcastBuilder('vec4', t.params), - [TypeVec(2, TypeAbstractFloat)], - TypeVec(4, TypeF16), + [Type.vec(2, Type.abstractFloat)], + Type.vec4h, t.params, cases ); }); // Abstract Int - -// bitcast(12) -// - cases: scalarI32Range g.test('ai_to_i32'). specURL('https://www.w3.org/TR/WGSL/#bitcast-builtin'). desc(`bitcast abstract int to i32 tests`). params((u) => u. combine('inputSource', onlyConstInputSource). -combine('vectorize', [undefined, 2, 3, 4]) +combine('vectorize', [undefined, 2, 3, 4]). +combine('alias', [false, true]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('ai_to_i32'); + await run(t, bitcastBuilder('i32', t.params), [Type.abstractInt], Type.i32, t.params, cases); +}); -// bitcast(12) -// - cases: scalarU32Range g.test('ai_to_u32'). specURL('https://www.w3.org/TR/WGSL/#bitcast-builtin'). desc(`bitcast abstract int to u32 tests`). params((u) => u. combine('inputSource', onlyConstInputSource). -combine('vectorize', [undefined, 2, 3, 4]) +combine('vectorize', [undefined, 2, 3, 4]). +combine('alias', [false, true]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('ai_to_u32'); + await run(t, bitcastBuilder('u32', t.params), [Type.abstractInt], Type.u32, t.params, cases); +}); -// bitcast(12) -// - cases: scalarF32Range g.test('ai_to_f32'). specURL('https://www.w3.org/TR/WGSL/#bitcast-builtin'). -desc(`bitcast abstract flointat to f32 tests`). +desc(`bitcast abstract int to f32 tests`). params((u) => u. combine('inputSource', onlyConstInputSource). -combine('vectorize', [undefined, 2, 3, 4]) +combine('vectorize', [undefined, 2, 3, 4]). +combine('alias', [false, true]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('ai_to_f32'); + await run(t, bitcastBuilder('f32', t.params), [Type.abstractInt], Type.f32, t.params, cases); +}); -// bitcast>(12) -// - cases: scalarF16Range -g.test('ai_to_vec2f16'). +g.test('ai_to_vec2h'). specURL('https://www.w3.org/TR/WGSL/#bitcast-builtin'). -desc(`bitcast abstract int to vec2f16 tests`). -params((u) => -u. -combine('inputSource', onlyConstInputSource). -combine('vectorize', [undefined, 2, 3, 4]) -). -unimplemented(); +desc(`bitcast ai to vec2h tests`). +params((u) => u.combine('inputSource', onlyConstInputSource).combine('alias', [false, true])). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn(async (t) => { + const cases = await d.get('ai_to_vec2_f16'); + await run( + t, + bitcastBuilder('vec2', t.params), + [Type.abstractInt], + Type.vec2h, + t.params, + cases + ); +}); -// bitcast>(vec2(12, 12)) -// - cases: sparseVectorF16Range -g.test('vec2ai_to_vec4f16'). +g.test('vec2ai_to_vec4h'). specURL('https://www.w3.org/TR/WGSL/#bitcast-builtin'). -desc(`bitcast vec2ai to vec4f16 tests`). -params((u) => -u. -combine('inputSource', onlyConstInputSource). -combine('vectorize', [undefined, 2, 3, 4]) -). -unimplemented(); \ No newline at end of file +desc(`bitcast vec2ai to vec4h tests`). +params((u) => u.combine('inputSource', onlyConstInputSource).combine('alias', [false, true])). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn(async (t) => { + const cases = await d.get('vec2_ai_to_vec4_f16'); + await run(t, bitcastBuilder('vec4', t.params), [Type.vec2ai], Type.vec4h, t.params, cases); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/builtin.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/builtin.js index cd3e52298c0..1cc248421b1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/builtin.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/builtin.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { abstractFloatShaderBuilder, basicExpressionBuilder, +**/import { abstractFloatShaderBuilder, abstractIntShaderBuilder, + basicExpressionBuilder, basicExpressionWithPredeclarationBuilder } from '../../expression.js'; @@ -11,10 +12,15 @@ export function builtin(name) { } /* @returns a ShaderBuilder that calls the builtin with the given name that returns AbstractFloats */ -export function abstractBuiltin(name) { +export function abstractFloatBuiltin(name) { return abstractFloatShaderBuilder((values) => `${name}(${values.join(', ')})`); } +/* @returns a ShaderBuilder that calls the builtin with the given name that returns AbstractInts */ +export function abstractIntBuiltin(name) { + return abstractIntShaderBuilder((values) => `${name}(${values.join(', ')})`); +} + /* @returns a ShaderBuilder that calls the builtin with the given name and has given predeclaration */ export function builtinWithPredeclaration(name, predeclaration) { return basicExpressionWithPredeclarationBuilder( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.cache.js index 9faa6b89726..5c101715f1c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.cache.js @@ -6,11 +6,12 @@ const kSmallMagnitudeTestValues = [0.1, 0.9, 1.0, 1.1, 1.9, -0.1, -0.9, -1.0, -1 // See https://github.com/gpuweb/cts/issues/2766 for details const kIssue2766Value = { f32: 0x8000_0000, - f16: 0x8000 + f16: 0x8000, + abstract: 0x8000_0000_0000_0000 }; // Cases: [f32|f16] -const cases = ['f32', 'f16']. +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.spec.js index f634fcdcbec..fab2be8c014 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ceil.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'ceil' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn ceil(e: T ) -> T Returns the ceiling of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './ceil.cache.js'; export const g = makeTestGroup(GPUTest); @@ -22,9 +22,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('ceil'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -34,7 +46,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('ceil'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('ceil'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -48,5 +60,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('ceil'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('ceil'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.cache.js index 189518963df..eee76e0de0f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.cache.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { kValue } from '../../../../../util/constants.js';import { TypeI32, TypeU32 } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js'; +**/import { kValue } from '../../../../../util/constants.js';import { Type } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js'; +import { maxBigInt, minBigInt } from '../../../../../util/math.js'; import { makeCaseCache } from '../../case_cache.js'; @@ -19,8 +20,21 @@ kValue.i32.negative.min, kValue.i32.positive.max]; -/** @returns a set of clamp test cases from an ascending list of integer values */ -function generateIntegerTestCases( +const abstractFloatValues = [ +kValue.i64.negative.min, +-3n, +-2n, +-1n, +0n, +1n, +2n, +3n, +0x70000000n, +kValue.i64.positive.max]; + + +/** @returns a set of clamp test cases from an ascending list of concrete integer values */ +function generateConcreteIntegerTestCases( test_values, type, stage) @@ -37,6 +51,24 @@ stage) ); } +/** @returns a set of clamp test cases from an ascending list of abstract integer values */ +function generateAbstractIntegerTestCases(test_values) { + return test_values.flatMap((low) => + test_values.flatMap((high) => + low > high ? + [] : + test_values.map((e) => ({ + input: [ + Type.abstractInt.create(e), + Type.abstractInt.create(low), + Type.abstractInt.create(high)], + + expected: Type.abstractInt.create(minBigInt(maxBigInt(e, low), high)) + })) + ) + ); +} + function generateFloatTestCases( test_values, trait, @@ -81,16 +113,19 @@ reduce((a, b) => ({ ...a, ...b }), {}); export const d = makeCaseCache('clamp', { u32_non_const: () => { - return generateIntegerTestCases(u32Values, TypeU32, 'non_const'); + return generateConcreteIntegerTestCases(u32Values, Type.u32, 'non_const'); }, u32_const: () => { - return generateIntegerTestCases(u32Values, TypeU32, 'const'); + return generateConcreteIntegerTestCases(u32Values, Type.u32, 'const'); }, i32_non_const: () => { - return generateIntegerTestCases(i32Values, TypeI32, 'non_const'); + return generateConcreteIntegerTestCases(i32Values, Type.i32, 'non_const'); }, i32_const: () => { - return generateIntegerTestCases(i32Values, TypeI32, 'const'); + return generateConcreteIntegerTestCases(i32Values, Type.i32, 'const'); + }, + abstract_int: () => { + return generateAbstractIntegerTestCases(abstractFloatValues); }, ...fp_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.spec.js index 51ff607c6db..1cf7035691c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/clamp.spec.js @@ -3,28 +3,22 @@ **/export const description = ` Execution tests for the 'clamp' builtin function -S is AbstractInt, i32, or u32 +S is abstract-int, i32, or u32 T is S or vecN @const fn clamp(e: T , low: T, high: T) -> T Returns min(max(e,low),high). Component-wise when T is a vector. -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const clamp(e: T , low: T , high: T) -> T Returns either min(max(e,low),high), or the median of the three values e, low, high. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - TypeAbstractFloat, - TypeF16, - TypeF32, - TypeI32, - TypeU32 } from -'../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './clamp.cache.js'; export const g = makeTestGroup(GPUTest); @@ -33,9 +27,21 @@ g.test('abstract_int'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). desc(`abstract int tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_int'); + await run( + t, + abstractIntBuiltin('clamp'), + [Type.abstractInt, Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); g.test('u32'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). @@ -45,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('clamp'), [TypeU32, TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, builtin('clamp'), [Type.u32, Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('i32'). @@ -56,7 +62,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'i32_const' : 'i32_non_const'); - await run(t, builtin('clamp'), [TypeI32, TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, builtin('clamp'), [Type.i32, Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('abstract_float'). @@ -71,9 +77,9 @@ fn(async (t) => { const cases = await d.get('abstract_const'); await run( t, - abstractBuiltin('clamp'), - [TypeAbstractFloat, TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('clamp'), + [Type.abstractFloat, Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -87,7 +93,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('clamp'), [TypeF32, TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('clamp'), [Type.f32, Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -101,5 +107,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('clamp'), [TypeF16, TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('clamp'), [Type.f16, Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.cache.js index 3e24070aad3..453110b9f78 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.cache.js @@ -2,8 +2,8 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( @@ -12,8 +12,9 @@ map((trait) => ({ ...linearRange(-Math.PI, Math.PI, 100), ...FP[trait].scalarRange()], - 'unfiltered', - FP[trait].cosInterval + trait === 'abstract' ? 'finite' : 'unfiltered', + // cos has an absolute accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].cosInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.spec.js index 4e2edf6e2f8..ae31f076105 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cos.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'cos' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn cos(e: T ) -> T Returns the cosine of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './cos.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('cos'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -39,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('cos'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('cos'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +65,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('cos'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('cos'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.cache.js index fca56714d1d..264a58ca7f0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.cache.js @@ -1,15 +1,19 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].coshInterval + // cosh has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].coshInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.spec.js index 756f23dcbdc..f51fef5dacc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cosh.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'cosh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn cosh(e: T ) -> T Returns the hyperbolic cosine of e. Component-wise when T is a vector `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './cosh.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('cosh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('cosh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('cosh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('cosh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('cosh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countLeadingZeros.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countLeadingZeros.spec.js index 8622bef96e5..c394cc60a4b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countLeadingZeros.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countLeadingZeros.spec.js @@ -12,7 +12,7 @@ Component-wise when T is a vector. Also known as "clz" in some languages. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, u32Bits, u32, TypeI32, i32Bits, i32 } from '../../../../../util/conversion.js'; +import { Type, u32Bits, u32, i32Bits, i32 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -27,7 +27,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countLeadingZeros'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('countLeadingZeros'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32(32) }, @@ -142,7 +142,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countLeadingZeros'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('countLeadingZeros'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32(32) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countOneBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countOneBits.spec.js index 500b02ba615..7de73dc8113 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countOneBits.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countOneBits.spec.js @@ -11,7 +11,7 @@ Also known as "population count". Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, u32Bits, u32, TypeI32, i32Bits, i32 } from '../../../../../util/conversion.js'; +import { Type, u32Bits, u32, i32Bits, i32 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -26,7 +26,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countOneBits'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('countOneBits'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32(0) }, @@ -141,7 +141,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countOneBits'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('countOneBits'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32(0) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countTrailingZeros.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countTrailingZeros.spec.js index ca3f78ee051..f7b3b3a9dd0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countTrailingZeros.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/countTrailingZeros.spec.js @@ -12,7 +12,7 @@ Component-wise when T is a vector. Also known as "ctz" in some languages. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { i32, i32Bits, TypeI32, u32, TypeU32, u32Bits } from '../../../../../util/conversion.js'; +import { i32, i32Bits, Type, u32, u32Bits } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -27,7 +27,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countTrailingZeros'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('countTrailingZeros'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32(32) }, @@ -142,7 +142,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('countTrailingZeros'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('countTrailingZeros'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32(32) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.cache.js index 12cee9a67fa..e5a68365ae3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.cache.js @@ -14,7 +14,8 @@ flatMap((trait) => FP[trait].vectorRange(3), FP[trait].vectorRange(3), nonConst ? 'unfiltered' : 'finite', - FP[trait].crossInterval + // cross has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].crossInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.spec.js index f192ac89470..c5a54fbe3e9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/cross.spec.js @@ -3,15 +3,15 @@ **/export const description = ` Execution tests for the 'cross' builtin function -T is AbstractFloat, f32, or f16 +T is abstract-float, f32, or f16 @const fn cross(e1: vec3 ,e2: vec3) -> vec3 Returns the cross product of e1 and e2. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './cross.cache.js'; export const g = makeTestGroup(GPUTest); @@ -24,9 +24,9 @@ fn(async (t) => { const cases = await d.get('abstract_const'); await run( t, - abstractBuiltin('cross'), - [TypeVec(3, TypeAbstractFloat), TypeVec(3, TypeAbstractFloat)], - TypeVec(3, TypeAbstractFloat), + abstractFloatBuiltin('cross'), + [Type.vec(3, Type.abstractFloat), Type.vec(3, Type.abstractFloat)], + Type.vec(3, Type.abstractFloat), t.params, cases ); @@ -38,14 +38,7 @@ desc(`f32 tests`). params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run( - t, - builtin('cross'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeVec(3, TypeF32), - t.params, - cases - ); + await run(t, builtin('cross'), [Type.vec3f, Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f16'). @@ -57,12 +50,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run( - t, - builtin('cross'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeVec(3, TypeF16), - t.params, - cases - ); + await run(t, builtin('cross'), [Type.vec3h, Type.vec3h], Type.vec3h, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.cache.js index c9d3faca94a..e4e012f2026 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.cache.js @@ -13,7 +13,8 @@ flatMap((trait) => return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].degreesInterval + // degrees has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].degreesInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.spec.js index 4e3d42b6d6b..a79889a43b3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/degrees.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'degrees' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn degrees(e1: T ) -> T Converts radians to degrees, approximating e1 × 180 ÷ π. Component-wise when T is a vector `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './degrees.cache.js'; export const g = makeTestGroup(GPUTest); @@ -29,9 +29,9 @@ fn(async (t) => { const cases = await d.get('abstract_const'); await run( t, - abstractBuiltin('degrees'), - [TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('degrees'), + [Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -45,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('degrees'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('degrees'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -59,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('degrees'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('degrees'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.cache.js new file mode 100644 index 00000000000..98a271f54ae --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.cache.js @@ -0,0 +1,14 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { FP } from '../../../../../util/floating_point.js';import { sparseScalarF32Range } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; + +export const d = makeCaseCache('derivatives', { + scalar: () => { + return FP.f32.generateScalarPairToIntervalCases( + sparseScalarF32Range(), + sparseScalarF32Range(), + 'unfiltered', + FP.f32.subtractionInterval + ); + } +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.js new file mode 100644 index 00000000000..02ae6d22d1f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/derivatives.js @@ -0,0 +1,215 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { Type } from '../../../../../util/conversion.js'; +import { toComparator } from '../../expectation.js'; +import { packScalarsToVector } from '../../expression.js'; + +/** + * Run a test for a derivative builtin function. + * @param t the GPUTest + * @param cases list of test cases to run + * @param builtin the builtin function to test + * @param non_uniform_discard if true, one of each pair of invocations will discard + * @param vectorize if defined, the vector width to use (2, 3, or 4) + */ +export function runDerivativeTest( +t, +cases, +builtin, +non_uniform_discard, +vectorize) +{ + // If the 'vectorize' config option was provided, pack the cases into vectors. + let type = Type.f32; + if (vectorize !== undefined) { + const packed = packScalarsToVector([type, type], type, cases, vectorize); + cases = packed.cases; + type = packed.resultType; + } + + //////////////////////////////////////////////////////////////// + // The two input values for a given case are distributed to two different invocations in a quad. + // We will populate a storage buffer with these input values laid out sequentially: + // [ case_0_input_1, case_0_input_0, case_1_input_1, case_1_input_0, ...] + // + // The render pipeline will be launched several times over a viewport size of (2, 2). Each draw + // call will execute a single quad (four fragment invocation), which will exercise two test cases. + // Each of these draw calls will use a different instance index, which is forwarded to the + // fragment shader. Each invocation will determine its index into the storage buffer using its + // fragment position and the instance index for that draw call. + // + // Consider two draw calls that test 4 cases (c_0, c_1, c_2, c_3). + // + // For derivatives along the 'x' direction, the mapping from fragment position to case input is: + // Quad 0: | c_0_i_1 | c_0_i_0 | Quad 1: | c_2_i_1 | c_2_i_0 | + // | c_1_i_1 | c_1_i_0 | | c_3_i_1 | c_3_i_0 | + // + // For derivatives along the 'y' direction, the mapping from fragment position to case input is: + // Quad 0: | c_0_i_1 | c_1_i_1 | Quad 1: | c_2_i_1 | c_3_i_1 | + // | c_0_i_0 | c_1_i_0 | | c_2_i_0 | c_3_i_0 | + // + //////////////////////////////////////////////////////////////// + + // Determine the direction of the derivative ('x' or 'y') from the builtin name. + const dir = builtin[3]; + + // Determine the WGSL type to use in the shader, and the stride in bytes between values. + let valueStride = 4; + let wgslType = 'f32'; + if (vectorize) { + wgslType = `vec${vectorize}f`; + valueStride = vectorize * 4; + if (vectorize === 3) { + valueStride = 16; + } + } + + // Define a vertex shader that draws a triangle over the full viewport, and a fragment shader that + // calls the derivative builtin with a value loaded from that fragment's index into the storage + // buffer (determined using the quad index and fragment position, as described above). + const code = ` +struct CaseInfo { + @builtin(position) position: vec4f, + @location(0) @interpolate(flat, either) quad_idx: u32, +} + +@vertex +fn vert(@builtin(vertex_index) vertex_idx: u32, + @builtin(instance_index) instance_idx: u32) -> CaseInfo { + const kVertices = array( + vec2f(-2, -2), + vec2f( 2, -2), + vec2f( 0, 2), + ); + return CaseInfo(vec4(kVertices[vertex_idx], 0, 1), instance_idx); +} + +@group(0) @binding(0) var inputs : array<${wgslType}>; +@group(0) @binding(1) var outputs : array<${wgslType}>; + +@fragment +fn frag(info : CaseInfo) { + let case_idx = u32(info.position.${dir === 'x' ? 'y' : 'x'}); + let inv_idx = u32(info.position.${dir}); + let index = info.quad_idx*4 + case_idx*2 + inv_idx; + let input = inputs[index]; + ${non_uniform_discard ? 'if inv_idx == 0 { discard; }' : ''} + outputs[index] = ${builtin}(input); +} +`; + + // Create the render pipeline. + const module = t.device.createShaderModule({ code }); + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { module, targets: [{ format: 'rgba8unorm', writeMask: 0 }] } + }); + + // Create storage buffers to hold the inputs and outputs. + const bufferSize = cases.length * 2 * valueStride; + const inputBuffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.STORAGE, + mappedAtCreation: true + }); + const outputBuffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + // Populate the input storage buffer with case input values. + const valuesData = new Uint8Array(inputBuffer.getMappedRange()); + for (let i = 0; i < cases.length; i++) { + const inputs = cases[i].input; + inputs[0].copyTo(valuesData, (i * 2 + 1) * valueStride); + inputs[1].copyTo(valuesData, i * 2 * valueStride); + } + inputBuffer.unmap(); + + // Create a bind group for the storage buffers. + const group = t.device.createBindGroup({ + entries: [ + { binding: 0, resource: { buffer: inputBuffer } }, + { binding: 1, resource: { buffer: outputBuffer } }], + + layout: pipeline.getBindGroupLayout(0) + }); + + // Create a texture to use as a color attachment. + // We only need this for launching the desired number of fragment invocations. + const colorAttachment = t.createTextureTracked({ + size: { width: 2, height: 2 }, + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); + + // Submit the render pass to the device. + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: colorAttachment.createView(), + loadOp: 'clear', + storeOp: 'discard' + }] + + }); + pass.setPipeline(pipeline); + pass.setBindGroup(0, group); + for (let quad = 0; quad < cases.length / 2; quad++) { + pass.draw(3, 1, undefined, quad); + } + pass.end(); + t.queue.submit([encoder.finish()]); + + // Check the outputs match the expected results. + t.expectGPUBufferValuesPassCheck( + outputBuffer, + (outputData) => { + for (let i = 0; i < cases.length; i++) { + const c = cases[i]; + + // Both invocations involved in the derivative should get the same result. + for (let d = 0; d < 2; d++) { + if (non_uniform_discard && d === 0) { + continue; + } + + const index = (i * 2 + d) * valueStride; + const result = type.read(outputData, index); + const cmp = toComparator(c.expected).compare(result); + if (!cmp.matched) { + // If this is a coarse derivative, the implementation is also allowed to calculate only + // one of the two derivatives and return that result to all of the invocations. + if (!builtin.endsWith('Fine')) { + const c0 = cases[i % 2 === 0 ? i + 1 : i - 1]; + const cmp0 = toComparator(c0.expected).compare(result); + if (!cmp0.matched) { + return new Error(` + 1st pair: (${c.input.join(', ')}) + expected: ${cmp.expected} + + 2nd pair: (${c0.input.join(', ')}) + expected: ${cmp0.expected} + + returned: ${result}`); + } + } else { + return new Error(` + inputs: (${c.input.join(', ')}) + expected: ${cmp.expected} + + returned: ${result}`); + } + } + } + } + return undefined; + }, + { + type: Uint8Array, + typedLength: bufferSize + } + ); +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.cache.js index 729d86ad795..86e1bae80df 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.cache.js @@ -1,60 +1,133 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; +**/import { assert } from '../../../../../../common/util/util.js';import { FP } from '../../../../../util/floating_point.js';import { PRNG } from '../../../../../util/prng.js'; +import { makeCaseCache } from '../../case_cache.js'; + +// We want each case to avoid losing accuracy. We want to prevent bits from +// falling off the bottom of the significand during intermediate +// calculations. We want this to be true for reasonable implementations of +// the determinant. Let's compute a budget B for the number of significant +// bits allowed for each element in the matrix. +// +// Example computation method 1: Use lower-diagonal form: +// A matrix is in lower-diagonal form if all the entries above and to +// the right of the diagonal are zero. +// 1. Convert the matrix to lower-diagonal form using elementary row +// operations. +// 2. Then the determinant is the product of the elements on the diagonal. +// +// Analysis: +// - Let M be the number of significand bits for the floating point type. +// Remember to include the hidden/implicit 1, because we will assume +// all numbers are normal. +// - It takes N-1 elementary row operations to convert a general NxN +// matrix to lower diagonal form. Let's ignore the fact this uses +// division. Let's allocate a budget 1 bit of precision per row operation. +// - If the diagonal elements are integers bounded by D, then their product +// is bounded by D**N. So we split the remaining significand bit budget +// bits N ways. +// +// So we have B ~ (M - (N-1)) / N +// +// For f32, M = 24: +// N = 4 : B =~ ( 24 - 3 ) / 4 = 21 / 4 +// The bound on matrix elements should be 2**(21/4) or roughly 38. +// N = 3 : B =~ ( 24 - 2 ) / 3 = 22 / 3 +// The bound on matrix elements should be 2**(22/3) or roughly 161. +// N = 2 : B =~ ( 24 - 1 ) / 2 = 23 / 2 +// The bound on matrix elements should be 2**(23/2) or roughly 2896. +// +// For f16, M = 11: +// N = 4 : B =~ ( 11 - 3 ) / 4 = 8 / 4 = 2 +// The bound on matrix elements should be 2**2 = 4. +// N = 3 : B =~ ( 11 - 2 ) / 3 = 9 / 3 = 3 +// The bound on matrix elements should be 2**3 = 8. +// N = 2 : B =~ ( 11 - 1 ) / 2 = 10 / 2 = 5 +// The bound on matrix elements should be 2**5 = 32. +// +// Example computation method 2: Naive method: +// The naive calculation of a determinant of an NxN matrix is the alternating +// sum of N terms, where each term is an entry from the matrix multiplied +// by the determinant of an (N-1)x(N-1) submatrix. +// The recurrence is: T(N) = (N-1) + N + T(N-1), with T(1) = 0. +// The first N is for the adds and subtracts, the second N is for the multiplies, +// and the T(N-1) is the determinant of the submatrix. +// As N grows, this blows up quickly, even when accounting for reusing results. +// It's unlikely any GPU would actually calculate it this way. +// // Accuracy for determinant is only defined for e, where e is an integer and // |e| < quadroot(2**21) [~38], // due to computational complexity of calculating the general solution for 4x4, // so custom matrices are used. -// -// Note: For 2x2 and 3x3 the limits are squareroot and cuberoot instead of -// quadroot, but using the tighter 4x4 limits for all cases for simplicity. -const kDeterminantValues = [-38, -10, -5, -1, 0, 1, 5, 10, 38]; -const kDeterminantMatrixValues = { - 2: kDeterminantValues.map((f, idx) => [ - [idx % 4 === 0 ? f : idx, idx % 4 === 1 ? f : -idx], - [idx % 4 === 2 ? f : -idx, idx % 4 === 3 ? f : idx]] - ), - 3: kDeterminantValues.map((f, idx) => [ - [idx % 9 === 0 ? f : idx, idx % 9 === 1 ? f : -idx, idx % 9 === 2 ? f : idx], - [idx % 9 === 3 ? f : -idx, idx % 9 === 4 ? f : idx, idx % 9 === 5 ? f : -idx], - [idx % 9 === 6 ? f : idx, idx % 9 === 7 ? f : -idx, idx % 9 === 8 ? f : idx]] - ), - 4: kDeterminantValues.map((f, idx) => [ - [ - idx % 16 === 0 ? f : idx, - idx % 16 === 1 ? f : -idx, - idx % 16 === 2 ? f : idx, - idx % 16 === 3 ? f : -idx], - [ - idx % 16 === 4 ? f : -idx, - idx % 16 === 5 ? f : idx, - idx % 16 === 6 ? f : -idx, - idx % 16 === 7 ? f : idx], - [ - idx % 16 === 8 ? f : idx, - idx % 16 === 9 ? f : -idx, - idx % 16 === 10 ? f : idx, - idx % 16 === 11 ? f : -idx], - [ - idx % 16 === 12 ? f : -idx, - idx % 16 === 13 ? f : idx, - idx % 16 === 14 ? f : -idx, - idx % 16 === 15 ? f : idx]] +// Number of random matrices to test, per configuration. +const numSamples = 20; - ) -}; +// Returns a random element in a range suitable for a square matrix +// that can have an accurately computed determinant. +function randomMatrixEntry(p, dim, fpwidth) { + // See above for the justification. + const rangeTable = { + 16: { + 2: 32, + 3: 8, + 4: 4 + }, + 32: { + 2: 2896, + 3: 161, + 4: 38 + } + }; + const N = rangeTable[fpwidth][dim]; + // Centre the distribution roughly at zero. + const balanced = p.uniformInt(N) - Math.floor(N / 2); + return balanced; +} + +// Returns a random square matrix that should have an exactly computed +// determinant for the given floating point width. +// At least some of the matrices returned by this function should have +// a non-zero determinant. This will be checked later by the nonTrivialMatrices +// function. +function randomSquareMatrix(p, dim, fpwidth) { + const result = [...Array(dim)].map((_) => [...Array(dim)]); + // Scale each element by a simple power of two. This should only affect + // the exponent of the result. + const multiplier = [1, 2, 0.25][p.uniformInt(3)]; + for (let c = 0; c < dim; c++) { + for (let r = 0; r < dim; r++) { + result[c][r] = multiplier * randomMatrixEntry(p, dim, fpwidth); + } + } + return result; +} + + + +// Returns true if at least one of the matrices has a non-zero determinant. +function nonTrivialMatrices(matrices, detFn) { + const detInterval = (m) => detFn(m); + const sumBegin = matrices.reduce((accum, m) => accum + Math.abs(detInterval(m).begin), 0); + const sumEnd = matrices.reduce((accum, m) => accum + Math.abs(detInterval(m).end), 0); + return sumBegin > 0 && sumEnd >= sumBegin; +} // Cases: f32_matDxD_[non_]const const f32_cases = [2, 3, 4]. flatMap((dim) => [true, false].map((nonConst) => ({ [`f32_mat${dim}x${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + const p = new PRNG(dim + 32); + const matrices = [...Array(numSamples)].map((_) => + randomSquareMatrix(p, dim, 32) + ); + assert(nonTrivialMatrices(matrices, FP.f32.determinantInterval)); return FP.f32.generateMatrixToScalarCases( - kDeterminantMatrixValues[dim], + matrices, nonConst ? 'unfiltered' : 'finite', FP.f32.determinantInterval ); @@ -68,8 +141,13 @@ const f16_cases = [2, 3, 4]. flatMap((dim) => [true, false].map((nonConst) => ({ [`f16_mat${dim}x${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + const p = new PRNG(dim + 16); + const matrices = [...Array(numSamples)].map((_) => + randomSquareMatrix(p, dim, 16) + ); + assert(nonTrivialMatrices(matrices, FP.f16.determinantInterval)); return FP.f16.generateMatrixToScalarCases( - kDeterminantMatrixValues[dim], + matrices, nonConst ? 'unfiltered' : 'finite', FP.f16.determinantInterval ); @@ -78,7 +156,28 @@ flatMap((dim) => ). reduce((a, b) => ({ ...a, ...b }), {}); +// Cases: abstract_matDxD +const abstract_cases = [2, 3, 4]. +map((dim) => ({ + [`abstract_mat${dim}x${dim}`]: () => { + const p = new PRNG(dim + 64); + // Use f32 values range for abstract float. + const matrices = [...Array(numSamples)].map((_) => + randomSquareMatrix(p, dim, 32) + ); + assert(nonTrivialMatrices(matrices, FP.f32.determinantInterval)); + return FP.abstract.generateMatrixToScalarCases( + matrices, + 'finite', + // determinant has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP.f32.determinantInterval + ); + } +})). +reduce((a, b) => ({ ...a, ...b }), {}); + export const d = makeCaseCache('determinant', { ...f32_cases, - ...f16_cases + ...f16_cases, + ...abstract_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.spec.js index 1791ed754ee..92d092c70b9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/determinant.spec.js @@ -3,15 +3,15 @@ **/export const description = ` Execution tests for the 'determinant' builtin function -T is AbstractFloat, f32, or f16 +T is abstract-float, f32, or f16 @const determinant(e: matCxC ) -> T Returns the determinant of e. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeMat } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './determinant.cache.js'; export const g = makeTestGroup(GPUTest); @@ -19,8 +19,19 @@ export const g = makeTestGroup(GPUTest); g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#matrix-builtin-functions'). desc(`abstract float tests`). -params((u) => u.combine('inputSource', allInputSources).combine('dimension', [2, 3, 4])). -unimplemented(); +params((u) => u.combine('inputSource', onlyConstInputSource).combine('dim', [2, 3, 4])). +fn(async (t) => { + const dim = t.params.dim; + const cases = await d.get(`abstract_mat${dim}x${dim}`); + await run( + t, + abstractFloatBuiltin('determinant'), + [Type.mat(dim, dim, Type.abstractFloat)], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#matrix-builtin-functions'). @@ -33,7 +44,7 @@ fn(async (t) => { `f32_mat${dim}x${dim}_const` : `f32_mat${dim}x${dim}_non_const` ); - await run(t, builtin('determinant'), [TypeMat(dim, dim, TypeF32)], TypeF32, t.params, cases); + await run(t, builtin('determinant'), [Type.mat(dim, dim, Type.f32)], Type.f32, t.params, cases); }); g.test('f16'). @@ -50,5 +61,5 @@ fn(async (t) => { `f16_mat${dim}x${dim}_const` : `f16_mat${dim}x${dim}_non_const` ); - await run(t, builtin('determinant'), [TypeMat(dim, dim, TypeF16)], TypeF16, t.params, cases); + await run(t, builtin('determinant'), [Type.mat(dim, dim, Type.f16)], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.cache.js index faeab44a9b0..3e0199304d6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.cache.js @@ -1,33 +1,41 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const scalar_cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const scalar_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarPairToIntervalCases( FP[trait].scalarRange(), FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].distanceInterval + // distance has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].distanceInterval ); } })) ). reduce((a, b) => ({ ...a, ...b }), {}); -// Cases: [f32|f16]_vecN_[non_]const -const vec_cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const vec_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateVectorPairToIntervalCases( FP[trait].sparseVectorRange(dim), FP[trait].sparseVectorRange(dim), nonConst ? 'unfiltered' : 'finite', - FP[trait].distanceInterval + // distance has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].distanceInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.spec.js index 72f6b686c24..7a45853faa4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/distance.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'distance' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn distance(e1: T ,e2: T ) -> f32 Returns the distance between e1 and e2 (e.g. length(e1-e2)). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './distance.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,10 +21,66 @@ export const g = makeTestGroup(GPUTest); g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). -params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) -). -unimplemented(); +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('distance'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('distance'), + [Type.vec2af, Type.vec2af], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('distance'), + [Type.vec3af, Type.vec3af], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('distance'), + [Type.vec4af, Type.vec4af], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -32,7 +88,7 @@ desc(`f32 tests`). params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('distance'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('distance'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f32_vec2'). @@ -43,14 +99,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_const' : 'f32_vec2_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec2f, Type.vec2f], Type.f32, t.params, cases); }); g.test('f32_vec3'). @@ -61,14 +110,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_const' : 'f32_vec3_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec3f, Type.vec3f], Type.f32, t.params, cases); }); g.test('f32_vec4'). @@ -79,14 +121,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_const' : 'f32_vec4_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec4f, Type.vec4f], Type.f32, t.params, cases); }); g.test('f16'). @@ -98,7 +133,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('distance'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('distance'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('f16_vec2'). @@ -112,14 +147,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_const' : 'f16_vec2_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec2h, Type.vec2h], Type.f16, t.params, cases); }); g.test('f16_vec3'). @@ -133,14 +161,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_const' : 'f16_vec3_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec3h, Type.vec3h], Type.f16, t.params, cases); }); g.test('f16_vec4'). @@ -154,12 +175,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_const' : 'f16_vec4_non_const' ); - await run( - t, - builtin('distance'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('distance'), [Type.vec4h, Type.vec4h], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.cache.js index 56d12bef598..4bdf75bc316 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.cache.js @@ -1,19 +1,82 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_vecN_[non_]const -const cases = ['f32', 'f16']. +**/import { assert } from '../../../../../../common/util/util.js';import { kValue } from '../../../../../util/constants.js'; +import { FP } from '../../../../../util/floating_point.js'; +import { + calculatePermutations, + sparseVectorI32Range, + sparseVectorI64Range, + sparseVectorU32Range, + vectorI32Range, + vectorI64Range, + vectorU32Range } from +'../../../../../util/math.js'; +import { + generateVectorVectorToI32Cases, + generateVectorVectorToI64Cases, + generateVectorVectorToU32Cases } from +'../../case.js'; +import { makeCaseCache } from '../../case_cache.js'; + +function ai_dot(x, y) { + assert(x.length === y.length, 'Cannot calculate dot for vectors of different lengths'); + const multiplications = x.map((_, idx) => x[idx] * y[idx]); + if (multiplications.some(kValue.i64.isOOB)) return undefined; + + const result = multiplications.reduce((prev, curr) => prev + curr); + if (kValue.i64.isOOB(result)) return undefined; + + // The spec does not state the ordering of summation, so all the + // permutations are calculated and the intermediate results checked for + // going OOB. vec2 does not need permutations, since a + b === b + a. + // All the end results should be the same regardless of the order if the + // intermediate additions stay inbounds. + if (x.length !== 2) { + let wentOOB = false; + const permutations = calculatePermutations(multiplications); + permutations.forEach((p) => { + if (!wentOOB) { + p.reduce((prev, curr) => { + const next = prev + curr; + if (kValue.i64.isOOB(next)) { + wentOOB = true; + } + return next; + }); + } + }); + + if (wentOOB) return undefined; + } + + return !kValue.i64.isOOB(result) ? result : undefined; +} + +function ci_dot(x, y) { + assert(x.length === y.length, 'Cannot calculate dot for vectors of different lengths'); + return x.reduce((prev, _, idx) => prev + Math.imul(x[idx], y[idx]), 0); +} + +// Cases: [f32|f16|abstract]_vecN_[non_]const +const float_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((N) => [true, false].map((nonConst) => ({ - [`${trait}_vec${N}_${nonConst ? 'non_const' : 'const'}`]: () => { + [`${trait === 'abstract' ? 'abstract_float' : trait}_vec${N}_${ + nonConst ? 'non_const' : 'const' + }`]: () => { + // Emit an empty array for not const abstract float, since they will never be run + if (trait === 'abstract' && nonConst) { + return []; + } // vec3 and vec4 require calculating all possible permutations, so their runtime is much // longer per test, so only using sparse vectors for them. return FP[trait].generateVectorPairToIntervalCases( N === 2 ? FP[trait].vectorRange(2) : FP[trait].sparseVectorRange(N), N === 2 ? FP[trait].vectorRange(2) : FP[trait].sparseVectorRange(N), nonConst ? 'unfiltered' : 'finite', - FP[trait].dotInterval + // dot has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].dotInterval ); } })) @@ -21,4 +84,35 @@ flatMap((trait) => ). reduce((a, b) => ({ ...a, ...b }), {}); +const cases = { + ...float_cases, + abstract_int_vec2: () => { + return generateVectorVectorToI64Cases(vectorI64Range(2), vectorI64Range(2), ai_dot); + }, + abstract_int_vec3: () => { + return generateVectorVectorToI64Cases(sparseVectorI64Range(3), sparseVectorI64Range(3), ai_dot); + }, + abstract_int_vec4: () => { + return generateVectorVectorToI64Cases(sparseVectorI64Range(4), sparseVectorI64Range(4), ai_dot); + }, + i32_vec2: () => { + return generateVectorVectorToI32Cases(vectorI32Range(2), vectorI32Range(2), ci_dot); + }, + i32_vec3: () => { + return generateVectorVectorToI32Cases(sparseVectorI32Range(3), sparseVectorI32Range(3), ci_dot); + }, + i32_vec4: () => { + return generateVectorVectorToI32Cases(sparseVectorI32Range(4), sparseVectorI32Range(4), ci_dot); + }, + u32_vec2: () => { + return generateVectorVectorToU32Cases(vectorU32Range(2), vectorU32Range(2), ci_dot); + }, + u32_vec3: () => { + return generateVectorVectorToU32Cases(sparseVectorU32Range(3), sparseVectorU32Range(3), ci_dot); + }, + u32_vec4: () => { + return generateVectorVectorToU32Cases(sparseVectorU32Range(4), sparseVectorU32Range(4), ci_dot); + } +}; + export const d = makeCaseCache('dot', cases); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.spec.js index c23848f11f4..76cbb503938 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot.spec.js @@ -3,42 +3,168 @@ **/export const description = ` Execution tests for the 'dot' builtin function -T is AbstractInt, AbstractFloat, i32, u32, f32, or f16 +T is Type.abstractInt, Type.abstractFloat, i32, u32, f32, or f16 @const fn dot(e1: vecN,e2: vecN) -> T Returns the dot product of e1 and e2. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './dot.cache.js'; export const g = makeTestGroup(GPUTest); -g.test('abstract_int'). +g.test('abstract_int_vec2'). specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). -desc(`abstract int tests`). -params((u) => u.combine('inputSource', allInputSources)). -unimplemented(); +desc(`abstract integer tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_int_vec2'); + await run( + t, + abstractIntBuiltin('dot'), + [Type.vec(2, Type.abstractInt), Type.vec(2, Type.abstractInt)], + Type.abstractInt, + t.params, + cases + ); +}); -g.test('i32'). +g.test('abstract_int_vec3'). specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). -desc(`i32 tests`). -params((u) => u.combine('inputSource', allInputSources)). -unimplemented(); +desc(`abstract integer tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_int_vec3'); + await run( + t, + abstractIntBuiltin('dot'), + [Type.vec(3, Type.abstractInt), Type.vec(3, Type.abstractInt)], + Type.abstractInt, + t.params, + cases + ); +}); -g.test('u32'). +g.test('abstract_int_vec4'). specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). -desc(`u32 tests`). -params((u) => u.combine('inputSource', allInputSources)). -unimplemented(); +desc(`abstract integer tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_int_vec4'); + await run( + t, + abstractIntBuiltin('dot'), + [Type.vec(4, Type.abstractInt), Type.vec(4, Type.abstractInt)], + Type.abstractInt, + t.params, + cases + ); +}); -g.test('abstract_float'). +g.test('i32_vec2'). specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). -desc(`abstract float test`). +desc(`i32 tests using vec2s`). params((u) => u.combine('inputSource', allInputSources)). -unimplemented(); +fn(async (t) => { + const cases = await d.get('i32_vec2'); + await run(t, builtin('dot'), [Type.vec2i, Type.vec2i], Type.i32, t.params, cases); +}); + +g.test('i32_vec3'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`i32 tests using vec3s`). +params((u) => u.combine('inputSource', allInputSources)). +fn(async (t) => { + const cases = await d.get('i32_vec3'); + await run(t, builtin('dot'), [Type.vec3i, Type.vec3i], Type.i32, t.params, cases); +}); + +g.test('i32_vec4'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`i32 tests using vec4s`). +params((u) => u.combine('inputSource', allInputSources)). +fn(async (t) => { + const cases = await d.get('i32_vec4'); + await run(t, builtin('dot'), [Type.vec4i, Type.vec4i], Type.i32, t.params, cases); +}); + +g.test('u32_vec2'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`u32 tests using vec2s`). +params((u) => u.combine('inputSource', allInputSources)). +fn(async (t) => { + const cases = await d.get('u32_vec2'); + await run(t, builtin('dot'), [Type.vec2u, Type.vec2u], Type.u32, t.params, cases); +}); + +g.test('u32_vec3'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`u32 tests using vec3s`). +params((u) => u.combine('inputSource', allInputSources)). +fn(async (t) => { + const cases = await d.get('u32_vec3'); + await run(t, builtin('dot'), [Type.vec3u, Type.vec3u], Type.u32, t.params, cases); +}); + +g.test('u32_vec4'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`u32 tests using vec4s`). +params((u) => u.combine('inputSource', allInputSources)). +fn(async (t) => { + const cases = await d.get('u32_vec4'); + await run(t, builtin('dot'), [Type.vec4u, Type.vec4u], Type.u32, t.params, cases); +}); + +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_float_vec2_const'); + await run( + t, + abstractFloatBuiltin('dot'), + [Type.vec(2, Type.abstractFloat), Type.vec(2, Type.abstractFloat)], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_float_vec3_const'); + await run( + t, + abstractFloatBuiltin('dot'), + [Type.vec(3, Type.abstractFloat), Type.vec(3, Type.abstractFloat)], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_float_vec4_const'); + await run( + t, + abstractFloatBuiltin('dot'), + [Type.vec(4, Type.abstractFloat), Type.vec(4, Type.abstractFloat)], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32_vec2'). specURL('https://www.w3.org/TR/WGSL/#vector-builtin-functions'). @@ -48,14 +174,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_const' : 'f32_vec2_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec2f, Type.vec2f], Type.f32, t.params, cases); }); g.test('f32_vec3'). @@ -66,14 +185,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_const' : 'f32_vec3_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec3f, Type.vec3f], Type.f32, t.params, cases); }); g.test('f32_vec4'). @@ -84,14 +196,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_const' : 'f32_vec4_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32)], - TypeF32, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec4f, Type.vec4f], Type.f32, t.params, cases); }); g.test('f16_vec2'). @@ -105,14 +210,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_const' : 'f16_vec2_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec2h, Type.vec2h], Type.f16, t.params, cases); }); g.test('f16_vec3'). @@ -126,14 +224,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_const' : 'f16_vec3_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec3h, Type.vec3h], Type.f16, t.params, cases); }); g.test('f16_vec4'). @@ -147,12 +238,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_const' : 'f16_vec4_non_const' ); - await run( - t, - builtin('dot'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16)], - TypeF16, - t.params, - cases - ); + await run(t, builtin('dot'), [Type.vec4h, Type.vec4h], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4I8Packed.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4I8Packed.spec.js index 1207b043136..9a2e9eae8d5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4I8Packed.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4I8Packed.spec.js @@ -9,7 +9,7 @@ integer dot product of these two vectors. Each component is sign-extended to i32 the multiply, and then the add operations are done in WGSL i32 with wrapping behaviour. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeI32, TypeU32, i32, u32 } from '../../../../../util/conversion.js'; +import { Type, i32, u32 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -70,5 +70,5 @@ fn(async (t) => { return [makeCase(...v)]; }); - await run(t, builtin('dot4I8Packed'), [TypeU32, TypeU32], TypeI32, cfg, cases); + await run(t, builtin('dot4I8Packed'), [Type.u32, Type.u32], Type.i32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4U8Packed.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4U8Packed.spec.js index 027b297fb68..7fd3c08a5f8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4U8Packed.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dot4U8Packed.spec.js @@ -8,7 +8,7 @@ e1 and e2 are interpreted as vectors with four 8-bit unsigned integer components unsigned integer dot product of these two vectors. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, u32 } from '../../../../../util/conversion.js'; +import { Type, u32 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -55,5 +55,5 @@ fn(async (t) => { return [makeCase(...v)]; }); - await run(t, builtin('dot4U8Packed'), [TypeU32, TypeU32], TypeU32, cfg, cases); + await run(t, builtin('dot4U8Packed'), [Type.u32, Type.u32], Type.u32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdx.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdx.spec.js index 9d595f7d236..9ea801316de 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdx.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdx.spec.js @@ -10,14 +10,22 @@ The result is the same as either dpdxFine(e) or dpdxCoarse(e). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdx'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxCoarse.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxCoarse.spec.js index db31f42df16..9b1b78f3812 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxCoarse.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxCoarse.spec.js @@ -9,14 +9,22 @@ Returns the partial derivative of e with respect to window x coordinates using l This may result in fewer unique positions that dpdxFine(e). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdxCoarse'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxFine.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxFine.spec.js index 5eaf7924391..25a04360340 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxFine.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdxFine.spec.js @@ -8,14 +8,22 @@ fn dpdxFine(e:T) ->T Returns the partial derivative of e with respect to window x coordinates. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdxFine'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdy.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdy.spec.js index edba9b14c14..0f79064b922 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdy.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdy.spec.js @@ -9,14 +9,22 @@ Partial derivative of e with respect to window y coordinates. The result is the same as either dpdyFine(e) or dpdyCoarse(e). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdy'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyCoarse.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyCoarse.spec.js index f002a587b6b..c547896de90 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyCoarse.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyCoarse.spec.js @@ -9,14 +9,22 @@ Returns the partial derivative of e with respect to window y coordinates using l This may result in fewer unique positions that dpdyFine(e). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdyCoarse'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 test`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyFine.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyFine.spec.js index 405914acf19..85a829ca009 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyFine.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/dpdyFine.spec.js @@ -8,14 +8,22 @@ fn dpdyFine(e:T) ->T Returns the partial derivative of e with respect to window y coordinates. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './derivatives.cache.js'; +import { runDerivativeTest } from './derivatives.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'dpdyFine'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runDerivativeTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.cache.js index 6fff05ae768..00a4cd7d2d0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.cache.js @@ -36,5 +36,9 @@ export const d = makeCaseCache('exp', { }, f16_non_const: () => { return FP.f16.generateScalarToIntervalCases(f16_inputs, 'unfiltered', FP.f16.expInterval); + }, + abstract: () => { + // exp has an ulp accuracy, so is only expected to be as accurate as f32 + return FP.abstract.generateScalarToIntervalCases(f32_inputs, 'finite', FP.f32.expInterval); } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.spec.js index e06613beb26..69883e92c0a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'exp' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn exp(e1: T ) -> T Returns the natural exponentiation of e1 (e.g. e^e1). Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './exp.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('exp'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('exp'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('exp'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('exp'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('exp'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.cache.js index df2b9edd41a..c001595cc01 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.cache.js @@ -36,5 +36,9 @@ export const d = makeCaseCache('exp2', { }, f16_non_const: () => { return FP.f16.generateScalarToIntervalCases(f16_inputs, 'unfiltered', FP.f16.exp2Interval); + }, + abstract: () => { + // exp2 has an ulp accuracy, so is only expected to be as accurate as f32 + return FP.abstract.generateScalarToIntervalCases(f32_inputs, 'finite', FP.f32.exp2Interval); } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.spec.js index 04f381730c6..573512cb52d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/exp2.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'exp2' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn exp2(e: T ) -> T Returns 2 raised to the power e (e.g. 2^e). Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './exp2.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('exp2'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('exp2'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('exp2'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('exp2'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('exp2'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/extractBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/extractBits.spec.js index 3faccc58a7b..ea3197696d6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/extractBits.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/extractBits.spec.js @@ -33,17 +33,7 @@ Other bits of the result are the same as bit c-1 of the result. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - i32Bits, - TypeI32, - u32, - TypeU32, - u32Bits, - vec2, - vec3, - vec4, - TypeVec } from -'../../../../../util/conversion.js'; +import { i32Bits, Type, u32, u32Bits, vec2, vec3, vec4 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -57,7 +47,7 @@ params((u) => u.combine('inputSource', allInputSources).combine('width', [1, 2, fn(async (t) => { const cfg = t.params; - const T = t.params.width === 1 ? TypeU32 : TypeVec(t.params.width, TypeU32); + const T = t.params.width === 1 ? Type.u32 : Type.vec(t.params.width, Type.u32); const V = (x, y, z, w) => { y = y === undefined ? x : y; @@ -193,7 +183,7 @@ fn(async (t) => { ); } - await run(t, builtin('extractBits'), [T, TypeU32, TypeU32], T, cfg, cases); + await run(t, builtin('extractBits'), [T, Type.u32, Type.u32], T, cfg, cases); }); g.test('i32'). @@ -203,7 +193,7 @@ params((u) => u.combine('inputSource', allInputSources).combine('width', [1, 2, fn(async (t) => { const cfg = t.params; - const T = t.params.width === 1 ? TypeI32 : TypeVec(t.params.width, TypeI32); + const T = t.params.width === 1 ? Type.i32 : Type.vec(t.params.width, Type.i32); const V = (x, y, z, w) => { y = y === undefined ? x : y; @@ -333,5 +323,5 @@ fn(async (t) => { ); } - await run(t, builtin('extractBits'), [T, TypeU32, TypeU32], T, cfg, cases); + await run(t, builtin('extractBits'), [T, Type.u32, Type.u32], T, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.cache.js index cd3b559955b..f2b96e3a5f9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.cache.js @@ -3,7 +3,7 @@ **/import { anyOf } from '../../../../../util/compare.js';import { toVector } from '../../../../../util/conversion.js'; import { FP } from '../../../../../util/floating_point.js'; import { cartesianProduct } from '../../../../../util/math.js'; - +import { selectNCases } from '../../case.js'; import { makeCaseCache } from '../../case_cache.js'; @@ -12,30 +12,33 @@ import { makeCaseCache } from '../../case_cache.js'; // (vec, vec, vec) -> vec // // Additionally faceForward has significant complexities around it due to the -// fact that `dot` is calculated in it s operation, but the result of dot isn't +// fact that `dot` is calculated in its operation, but the result of dot isn't // used to calculate the builtin's result. /** * @returns a Case for `faceForward` - * @param kind what kind of floating point numbers being operated on + * @param argumentKind what kind of floating point numbers being operated on + * @param parameterKind what kind of floating point operation should be performed, + * should be the same as argumentKind, except for abstract * @param x the `x` param for the case * @param y the `y` param for the case * @param z the `z` param for the case * @param check what interval checking to apply * */ function makeCase( -kind, +argumentKind, +parameterKind, x, y, z, check) { - const fp = FP[kind]; + const fp = FP[argumentKind]; x = x.map(fp.quantize); y = y.map(fp.quantize); z = z.map(fp.quantize); - const results = FP[kind].faceForwardIntervals(x, y, z); + const results = FP[parameterKind].faceForwardIntervals(x, y, z); if (check === 'finite' && results.some((r) => r === undefined)) { return undefined; } @@ -57,14 +60,17 @@ check) /** * @returns an array of Cases for `faceForward` - * @param kind what kind of floating point numbers being operated on + * @param argumentKind what kind of floating point numbers being operated on + * @param parameterKind what kind of floating point operation should be performed, + * should be the same as argumentKind, except for abstract * @param xs array of inputs to try for the `x` param * @param ys array of inputs to try for the `y` param * @param zs array of inputs to try for the `z` param * @param check what interval checking to apply */ function generateCases( -kind, +argumentKind, +parameterKind, xs, ys, zs, @@ -72,23 +78,44 @@ check) { // Cannot use `cartesianProduct` here due to heterogeneous param types return cartesianProduct(xs, ys, zs). - map((e) => makeCase(kind, e[0], e[1], e[2], check)). + map((e) => makeCase(argumentKind, parameterKind, e[0], e[1], e[2], check)). filter((c) => c !== undefined); } -// Cases: [f32|f16]_vecN_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { - return generateCases( - trait, - FP[trait].sparseVectorRange(dim), - FP[trait].sparseVectorRange(dim), - FP[trait].sparseVectorRange(dim), - nonConst ? 'unfiltered' : 'finite' - ); + if (trait === 'abstract' && nonConst) { + return []; + } + if (trait !== 'abstract') { + return generateCases( + trait, + trait, + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + nonConst ? 'unfiltered' : 'finite' + ); + } else { + // Restricting the number of cases, because a vector of abstract floats needs to be returned, which is costly. + return selectNCases( + 'faceForward', + 20, + generateCases( + trait, + // faceForward has an inherited accuracy, so is only expected to be as accurate as f32 + 'f32', + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + nonConst ? 'unfiltered' : 'finite' + ) + ); + } } })) ) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.spec.js index ab96642124d..542bff23f37 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/faceForward.spec.js @@ -3,24 +3,66 @@ **/export const description = ` Execution tests for the 'faceForward' builtin function -T is vecN, vecN, or vecN +T is vecN, vecN, or vecN @const fn faceForward(e1: T ,e2: T ,e3: T ) -> T Returns e1 if dot(e2,e3) is negative, and -e1 otherwise. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './faceForward.cache.js'; export const g = makeTestGroup(GPUTest); -g.test('abstract_float'). -specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). -desc(`abstract float tests`). -params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [2, 3, 4])). -unimplemented(); +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec2af, Type.vec2af, Type.vec2af], + Type.vec2af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec3af, Type.vec3af, Type.vec3af], + Type.vec3af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec4af, Type.vec4af, Type.vec4af], + Type.vec4af, + t.params, + cases + ); +}); g.test('f32_vec2'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -33,8 +75,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32), TypeVec(2, TypeF32)], - TypeVec(2, TypeF32), + [Type.vec2f, Type.vec2f, Type.vec2f], + Type.vec2f, t.params, cases ); @@ -51,8 +93,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeVec(3, TypeF32), + [Type.vec3f, Type.vec3f, Type.vec3f], + Type.vec3f, t.params, cases ); @@ -69,8 +111,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32), TypeVec(4, TypeF32)], - TypeVec(4, TypeF32), + [Type.vec4f, Type.vec4f, Type.vec4f], + Type.vec4f, t.params, cases ); @@ -90,8 +132,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16), TypeVec(2, TypeF16)], - TypeVec(2, TypeF16), + [Type.vec2h, Type.vec2h, Type.vec2h], + Type.vec2h, t.params, cases ); @@ -111,8 +153,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeVec(3, TypeF16), + [Type.vec3h, Type.vec3h, Type.vec3h], + Type.vec3h, t.params, cases ); @@ -132,8 +174,8 @@ fn(async (t) => { await run( t, builtin('faceForward'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16), TypeVec(4, TypeF16)], - TypeVec(4, TypeF16), + [Type.vec4h, Type.vec4h, Type.vec4h], + Type.vec4h, t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstLeadingBit.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstLeadingBit.spec.js index fd6b6359f12..139e653961e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstLeadingBit.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstLeadingBit.spec.js @@ -16,7 +16,7 @@ Otherwise the position of the most significant bit in e that is different from e Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { i32, i32Bits, TypeI32, u32, TypeU32, u32Bits } from '../../../../../util/conversion.js'; +import { i32, i32Bits, Type, u32, u32Bits } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -31,7 +31,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('firstLeadingBit'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('firstLeadingBit'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32(-1) }, @@ -146,7 +146,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('firstLeadingBit'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('firstLeadingBit'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32(-1) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstTrailingBit.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstTrailingBit.spec.js index 73071c38085..51fa9fa4747 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstTrailingBit.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/firstTrailingBit.spec.js @@ -12,7 +12,7 @@ Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { i32, i32Bits, TypeI32, u32, TypeU32, u32Bits } from '../../../../../util/conversion.js'; +import { i32, i32Bits, Type, u32, u32Bits } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -27,7 +27,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('firstTrailingBit'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('firstTrailingBit'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32(-1) }, @@ -142,7 +142,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cfg = t.params; - await run(t, builtin('firstTrailingBit'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('firstTrailingBit'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32(-1) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/floor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/floor.spec.js index dbb2704de20..6274dd75d15 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/floor.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/floor.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'floor' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn floor(e: T ) -> T Returns the floor of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './floor.cache.js'; export const g = makeTestGroup(GPUTest); @@ -27,7 +27,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('abstract'); - await run(t, abstractBuiltin('floor'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + await run( + t, + abstractFloatBuiltin('floor'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); }); g.test('f32'). @@ -38,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('floor'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('floor'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -52,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('floor'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('floor'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.cache.js index c4da19cfa84..d8a7da7aabf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.cache.js @@ -15,7 +15,8 @@ flatMap((trait) => FP[trait].sparseScalarRange(), FP[trait].sparseScalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].fmaInterval + // fma has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].fmaInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.spec.js index b9f114ee404..ed0203f89f6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fma.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'fma' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn fma(e1: T ,e2: T ,e3: T ) -> T Returns e1 * e2 + e3. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './fma.cache.js'; export const g = makeTestGroup(GPUTest); @@ -29,9 +29,9 @@ fn(async (t) => { const cases = await d.get('abstract_const'); await run( t, - abstractBuiltin('fma'), - [TypeAbstractFloat, TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('fma'), + [Type.abstractFloat, Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -45,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('fma'), [TypeF32, TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('fma'), [Type.f32, Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -59,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('fma'), [TypeF16, TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('fma'), [Type.f16, Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.cache.js index fbb92874530..d27581590f3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.cache.js @@ -1,6 +1,8 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; +**/import { assert } from '../../../../../../common/util/util.js';import { FP } from '../../../../../util/floating_point.js';import { kFractTable } from '../../binary/af_data.js'; +import { makeCaseCache } from '../../case_cache.js'; + const kCommonValues = [ 0.5, // 0.5 -> 0.5 0.9, // ~0.9 -> ~0.9 @@ -29,8 +31,8 @@ const kTraitSpecificValues = { ] }; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const concrete_cases = ['f32', 'f16']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( @@ -42,4 +44,19 @@ map((trait) => ({ })). reduce((a, b) => ({ ...a, ...b }), {}); -export const d = makeCaseCache('fract', cases); \ No newline at end of file +// Cases: [abstract] +const abstract_cases = () => { + return FP.abstract.generateScalarToIntervalCases( + [...kFractTable.keys()], + 'finite', + (x) => { + assert(kFractTable.has(x)); + return kFractTable.get(x); + } + ); +}; + +export const d = makeCaseCache('fract', { + abstract: abstract_cases, + ...concrete_cases +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.spec.js index c5a649bd17a..b556fcf18fe 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fract.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'fract' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn fract(e: T ) -> T Returns the fractional part of e, computed as e - floor(e). Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './fract.cache.js'; export const g = makeTestGroup(GPUTest); @@ -22,9 +22,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('fract'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -34,7 +46,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('fract'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('fract'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -48,5 +60,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('fract'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('fract'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.cache.js index 2de29328383..11d49dd0404 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.cache.js @@ -1,6 +1,12 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { skipUndefined } from '../../../../../util/compare.js';import { i32, toVector } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js'; +**/import { skipUndefined } from '../../../../../util/compare.js';import { + + i32, + toVector, + abstractInt } from +'../../../../../util/conversion.js'; +import { FP } from '../../../../../util/floating_point.js'; import { frexp } from '../../../../../util/math.js'; import { makeCaseCache } from '../../case_cache.js'; @@ -27,7 +33,7 @@ function makeCaseFract(v, trait) { } const fs = v.map((e) => { - return frexp(e, trait).fract; + return frexp(e, trait !== 'abstract' ? trait : 'f64').fract; }); return { input: toInput(v), expected: toOutput(fs) }; @@ -41,12 +47,14 @@ function makeCaseExp(v, trait) { if (v instanceof Array) { // Input is vector toInput = (n) => toVector(n, fp.scalarBuilder); - toOutput = (n) => toVector(n, i32); + toOutput = (n) => + toVector(n, trait !== 'abstract' ? i32 : (n) => abstractInt(BigInt(n))); } else { // Input is scalar, also wrap it in an array. v = [v]; toInput = (n) => fp.scalarBuilder(n[0]); - toOutput = (n) => i32(n[0]); + toOutput = (n) => + trait !== 'abstract' ? i32(n[0]) : abstractInt(BigInt(n[0])); } v = v.map(fp.quantize); @@ -55,14 +63,14 @@ function makeCaseExp(v, trait) { } const fs = v.map((e) => { - return frexp(e, trait).exp; + return frexp(e, trait !== 'abstract' ? trait : 'f64').exp; }); return { input: toInput(v), expected: toOutput(fs) }; } // Cases: [f32|f16]_vecN_[exp|whole] -const vec_cases = ['f32', 'f16']. +const vec_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => ['exp', 'fract'].map((portion) => ({ @@ -77,7 +85,7 @@ flatMap((trait) => reduce((a, b) => ({ ...a, ...b }), {}); // Cases: [f32|f16]_[exp|whole] -const scalar_cases = ['f32', 'f16']. +const scalar_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => ['exp', 'fract'].map((portion) => ({ [`${trait}_${portion}`]: () => { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.spec.js index 10fa6e72d2f..b7877a45833 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/frexp.spec.js @@ -15,8 +15,16 @@ Returns the result_struct for the appropriate overload. The magnitude of the significand is in the range of [0.5, 1.0) or 0. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeI32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, basicExpressionBuilder, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { + + allInputSources, + basicExpressionBuilder, + run, + abstractFloatShaderBuilder, + abstractIntShaderBuilder, + onlyConstInputSource } from +'../../expression.js'; import { d } from './frexp.cache.js'; @@ -31,6 +39,161 @@ function fractBuilder() { function expBuilder() { return basicExpressionBuilder((value) => `frexp(${value}).exp`); } + +/* @returns an ShaderBuilder that evaluates frexp and returns .fract from the result structure, for abstract inputs */ +function abstractFractBuilder() { + return abstractFloatShaderBuilder((value) => `frexp(${value}).fract`); +} + +/* @returns an ShaderBuilder that evaluates frexp and returns .exp from the result structure, for abstract inputs */ +function abstractExpBuilder() { + return abstractIntShaderBuilder((value) => `frexp(${value}).exp`); +} + +g.test('abstract_float_fract'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is AbstractFloat + +struct __frexp_result_abstract { + fract : AbstractFloat, // fract part + exp : AbstractInt // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_fract'); + await run(t, abstractFractBuilder(), [Type.abstractFloat], Type.abstractFloat, t.params, cases); +}); + +g.test('abstract_float_exp'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is AbstractFloat + +struct __frexp_result_abstract { + fract : AbstractFloat, // fract part + exp : AbstractInt // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_exp'); + await run(t, abstractExpBuilder(), [Type.abstractFloat], Type.abstractInt, t.params, cases); +}); + +g.test('abstract_float_vec2_fract'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec2 + +struct __frexp_result_vec2_abstract { + fract : vec2, // fract part + exp : vec2 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_fract'); + await run(t, abstractFractBuilder(), [Type.vec2af], Type.vec2af, t.params, cases); +}); + +g.test('abstract_float_vec2_exp'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec2 + +struct __frexp_result_vec2_abstract { + fract : vec2, // fractional part + exp : vec2 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_exp'); + await run(t, abstractExpBuilder(), [Type.vec2af], Type.vec2ai, t.params, cases); +}); + +g.test('abstract_float_vec3_fract'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec3 + +struct __frexp_result_vec3_abstract { + fract : vec3, // fractional part + exp : vec3 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_fract'); + await run(t, abstractFractBuilder(), [Type.vec3af], Type.vec3af, t.params, cases); +}); + +g.test('abstract_float_vec3_exp'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec3 + +struct __frexp_result_vec3_abstract { + fract : vec3, // fractional part + exp : vec3 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_exp'); + await run(t, abstractExpBuilder(), [Type.vec3af], Type.vec3ai, t.params, cases); +}); + +g.test('abstract_float_vec4_fract'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec4 + +struct __frexp_result_vec4_abstract { + fract : vec4, // fractional part + exp : vec4 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_fract'); + await run(t, abstractFractBuilder(), [Type.vec4af], Type.vec4af, t.params, cases); +}); + +g.test('abstract_float_vec4_exp'). +specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). +desc( + ` +T is vec4 + +struct __frexp_result_vec4_abstract { + fract : vec4, // fractional part + exp : vec4 // exponent part +} +` +). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_exp'); + await run(t, abstractExpBuilder(), [Type.vec4af], Type.vec4ai, t.params, cases); +}); + g.test('f32_fract'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc( @@ -46,7 +209,7 @@ struct __frexp_result_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_fract'); - await run(t, fractBuilder(), [TypeF32], TypeF32, t.params, cases); + await run(t, fractBuilder(), [Type.f32], Type.f32, t.params, cases); }); g.test('f32_exp'). @@ -64,7 +227,7 @@ struct __frexp_result_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_exp'); - await run(t, expBuilder(), [TypeF32], TypeI32, t.params, cases); + await run(t, expBuilder(), [Type.f32], Type.i32, t.params, cases); }); g.test('f32_vec2_fract'). @@ -82,7 +245,7 @@ struct __frexp_result_vec2_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec2_fract'); - await run(t, fractBuilder(), [TypeVec(2, TypeF32)], TypeVec(2, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec2f], Type.vec2f, t.params, cases); }); g.test('f32_vec2_exp'). @@ -100,7 +263,7 @@ struct __frexp_result_vec2_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec2_exp'); - await run(t, expBuilder(), [TypeVec(2, TypeF32)], TypeVec(2, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec2f], Type.vec2i, t.params, cases); }); g.test('f32_vec3_fract'). @@ -118,7 +281,7 @@ struct __frexp_result_vec3_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec3_fract'); - await run(t, fractBuilder(), [TypeVec(3, TypeF32)], TypeVec(3, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f32_vec3_exp'). @@ -136,7 +299,7 @@ struct __frexp_result_vec3_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec3_exp'); - await run(t, expBuilder(), [TypeVec(3, TypeF32)], TypeVec(3, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec3f], Type.vec3i, t.params, cases); }); g.test('f32_vec4_fract'). @@ -154,7 +317,7 @@ struct __frexp_result_vec4_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec4_fract'); - await run(t, fractBuilder(), [TypeVec(4, TypeF32)], TypeVec(4, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec4f], Type.vec4f, t.params, cases); }); g.test('f32_vec4_exp'). @@ -172,7 +335,7 @@ struct __frexp_result_vec4_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec4_exp'); - await run(t, expBuilder(), [TypeVec(4, TypeF32)], TypeVec(4, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec4f], Type.vec4i, t.params, cases); }); g.test('f16_fract'). @@ -193,7 +356,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_fract'); - await run(t, fractBuilder(), [TypeF16], TypeF16, t.params, cases); + await run(t, fractBuilder(), [Type.f16], Type.f16, t.params, cases); }); g.test('f16_exp'). @@ -214,7 +377,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_exp'); - await run(t, expBuilder(), [TypeF16], TypeI32, t.params, cases); + await run(t, expBuilder(), [Type.f16], Type.i32, t.params, cases); }); g.test('f16_vec2_fract'). @@ -235,7 +398,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec2_fract'); - await run(t, fractBuilder(), [TypeVec(2, TypeF16)], TypeVec(2, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec2h], Type.vec2h, t.params, cases); }); g.test('f16_vec2_exp'). @@ -256,7 +419,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec2_exp'); - await run(t, expBuilder(), [TypeVec(2, TypeF16)], TypeVec(2, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec2h], Type.vec2i, t.params, cases); }); g.test('f16_vec3_fract'). @@ -277,7 +440,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec3_fract'); - await run(t, fractBuilder(), [TypeVec(3, TypeF16)], TypeVec(3, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec3h], Type.vec3h, t.params, cases); }); g.test('f16_vec3_exp'). @@ -298,7 +461,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec3_exp'); - await run(t, expBuilder(), [TypeVec(3, TypeF16)], TypeVec(3, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec3h], Type.vec3i, t.params, cases); }); g.test('f16_vec4_fract'). @@ -319,7 +482,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec4_fract'); - await run(t, fractBuilder(), [TypeVec(4, TypeF16)], TypeVec(4, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec4h], Type.vec4h, t.params, cases); }); g.test('f16_vec4_exp'). @@ -340,5 +503,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec4_exp'); - await run(t, expBuilder(), [TypeVec(4, TypeF16)], TypeVec(4, TypeI32), t.params, cases); + await run(t, expBuilder(), [Type.vec4h], Type.vec4i, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.cache.js new file mode 100644 index 00000000000..2df7eaa47f9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.cache.js @@ -0,0 +1,54 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { f32 } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js';import { cartesianProduct, sparseScalarF32Range } from '../../../../../util/math.js'; + +import { makeCaseCache } from '../../case_cache.js'; + +function makeCase(v0, v1, v2, v3) { + const expected = [ + (x, y, z, w) => + FP.f32.additionInterval( + FP.f32.absInterval(FP.f32.subtractionInterval(x, y)), + FP.f32.absInterval(FP.f32.subtractionInterval(x, z)) + ), + (x, y, z, w) => + FP.f32.additionInterval( + FP.f32.absInterval(FP.f32.subtractionInterval(x, y)), + FP.f32.absInterval(FP.f32.subtractionInterval(y, w)) + ), + (x, y, z, w) => + FP.f32.additionInterval( + FP.f32.absInterval(FP.f32.subtractionInterval(z, w)), + FP.f32.absInterval(FP.f32.subtractionInterval(x, z)) + ), + (x, y, z, w) => + FP.f32.additionInterval( + FP.f32.absInterval(FP.f32.subtractionInterval(z, w)), + FP.f32.absInterval(FP.f32.subtractionInterval(y, w)) + )]. + map((o) => o(v0, v1, v2, v3)); + + return { + input: [f32(v0), f32(v1), f32(v2), f32(v3)], + expected + }; +} + +const cases = { + scalar: () => { + return cartesianProduct( + sparseScalarF32Range(), + sparseScalarF32Range(), + sparseScalarF32Range(), + sparseScalarF32Range() + ).reduce((cases, e) => { + const c = makeCase(e[0], e[1], e[2], e[3]); + if (c !== undefined) { + cases.push(c); + } + return cases; + }, new Array()); + } +}; + +export const d = makeCaseCache('fwidth', cases); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.js new file mode 100644 index 00000000000..dd3587874d0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.js @@ -0,0 +1,209 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { anyOf } from '../../../../../util/compare.js';import { Type } from '../../../../../util/conversion.js'; + + +import { toComparator } from '../../expectation.js'; + +/** + * Run a test for a fwidth builtin function. + * @param t the GPUTest + * @param cases list of test cases to run + * @param builtin the builtin function to test + * @param non_uniform_discard if true, one of each pair of invocations will discard + * @param vectorize if defined, the vector width to use (2, 3, or 4) + */ +export function runFWidthTest( +t, +cases, +builtin, +non_uniform_discard, +vectorize) +{ + //////////////////////////////////////////////////////////////// + // The four input values for a given case are distributed to across the invocations in a quad. + // We will populate a storage buffer with these input values laid out sequentially: + // [ case0_input0, case0_input1, case0_input2, case0_input3, ...] + // + // The render pipeline will be launched several times over a viewport size of (2, 2). Each draw + // call will execute a single quad (four fragment invocation), which will exercise one test case. + // Each of these draw calls will use a different instance index, which is forwarded to the + // fragment shader. Each invocation will determine its index into the storage buffer using its + // fragment position and the instance index for that draw call. + // + // Consider two draw calls that test 2 cases (c0, c1). + // + // The mapping from fragment position to case input is: + // Quad 0: | c0_i0 | c0_i1 | Quad 1: | c1_i0 | c1_i1 | + // | c0_i2 | c0_i3 | | c1_i2 | c1_i3 | + // + //////////////////////////////////////////////////////////////// + + // If the 'vectorize' config option was provided, pack the cases into vectors. + let vectorWidth = 1; + if (vectorize !== undefined) { + vectorWidth = vectorize; + } + + // Determine the WGSL type to use in the shader, and the stride in bytes between values. + let valueStride = 4; + let wgslType = 'f32'; + if (vectorize) { + wgslType = `vec${vectorize}f`; + valueStride = vectorize * 4; + if (vectorize === 3) { + valueStride = 16; + } + } + + // Define a vertex shader that draws a triangle over the full viewport, and a fragment shader that + // calls the fwidth builtin with a value loaded from that fragment's index into the storage + // buffer (determined using the quad index and fragment position, as described above). + const code = ` +struct CaseInfo { + @builtin(position) position: vec4f, + @location(0) @interpolate(flat, either) quad_idx: u32, +} + +@vertex +fn vert(@builtin(vertex_index) vertex_idx: u32, + @builtin(instance_index) instance_idx: u32) -> CaseInfo { + const kVertices = array( + vec2f(-2, -2), + vec2f( 2, -2), + vec2f( 0, 2), + ); + return CaseInfo(vec4(kVertices[vertex_idx], 0, 1), instance_idx); +} + +@group(0) @binding(0) var inputs : array<${wgslType}>; +@group(0) @binding(1) var outputs : array<${wgslType}>; + +@fragment +fn frag(info : CaseInfo) { + let inv_idx = u32(info.position.x) + u32(info.position.y)*2; + let index = info.quad_idx*4 + inv_idx; + let input = inputs[index]; + ${non_uniform_discard ? 'if inv_idx == 0 { discard; }' : ''} + outputs[index] = ${builtin}(input); +} +`; + + // Create the render pipeline. + const module = t.device.createShaderModule({ code }); + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module }, + fragment: { module, targets: [{ format: 'rgba8unorm', writeMask: 0 }] } + }); + + // Create storage buffers to hold the inputs and outputs. + const bufferSize = cases.length * 4 * valueStride; + const inputBuffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.STORAGE, + mappedAtCreation: true + }); + const outputBuffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + // Populate the input storage buffer with case input values. + const valuesData = new Uint8Array(inputBuffer.getMappedRange()); + for (let i = 0; i < cases.length / vectorWidth; i++) { + for (let v = 0; v < vectorWidth; v++) { + const index = i * vectorWidth + v; + if (index >= cases.length) { + break; + } + const inputs = cases[index].input; + for (let x = 0; x < 4; x++) { + inputs[x].copyTo(valuesData, (i * 4 + x) * valueStride + v * 4); + } + } + } + inputBuffer.unmap(); + + // Create a bind group for the storage buffers. + const group = t.device.createBindGroup({ + entries: [ + { binding: 0, resource: { buffer: inputBuffer } }, + { binding: 1, resource: { buffer: outputBuffer } }], + + layout: pipeline.getBindGroupLayout(0) + }); + + // Create a texture to use as a color attachment. + // We only need this for launching the desired number of fragment invocations. + const colorAttachment = t.createTextureTracked({ + size: { width: 2, height: 2 }, + format: 'rgba8unorm', + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); + + // Submit the render pass to the device. + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: colorAttachment.createView(), + loadOp: 'clear', + storeOp: 'discard' + }] + + }); + pass.setPipeline(pipeline); + pass.setBindGroup(0, group); + for (let quad = 0; quad < cases.length / vectorWidth; quad++) { + pass.draw(3, 1, undefined, quad); + } + pass.end(); + t.queue.submit([encoder.finish()]); + + // Check the outputs match the expected results. + t.expectGPUBufferValuesPassCheck( + outputBuffer, + (outputData) => { + for (let i = 0; i < cases.length / vectorWidth; i++) { + for (let v = 0; v < vectorWidth; v++) { + const index = i * vectorWidth + v; + if (index >= cases.length) { + break; + } + const c = cases[index]; + + for (let x = 0; x < 4; x++) { + if (non_uniform_discard && x === 0) { + continue; + } + + const index = (i * 4 + x) * valueStride + v * 4; + const result = Type.f32.read(outputData, index); + + let expected = c.expected; + if (builtin.endsWith('Fine')) { + expected = toComparator(expected[x]); + } else { + expected = anyOf(...expected); + } + + const cmp = expected.compare(result); + if (!cmp.matched) { + return new Error(` + inputs: (${c.input.join(', ')}) + expected: ${cmp.expected} + + returned: ${result}`); + } + } + } + } + return undefined; + }, + { + type: Uint8Array, + typedLength: bufferSize + } + ); +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.spec.js index 2ec40557bbb..b885f3f61d3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidth.spec.js @@ -8,14 +8,22 @@ fn fwidth(e:T) ->T Returns abs(dpdx(e)) + abs(dpdy(e)). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './fwidth.cache.js'; +import { runFWidthTest } from './fwidth.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'fwidth'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runFWidthTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthCoarse.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthCoarse.spec.js index 21c4cce9239..eddd60eee8f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthCoarse.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthCoarse.spec.js @@ -8,14 +8,22 @@ fn fwidthCoarse(e:T) ->T Returns abs(dpdxCoarse(e)) + abs(dpdyCoarse(e)). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './fwidth.cache.js'; +import { runFWidthTest } from './fwidth.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'fwidthCoarse'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runFWidthTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthFine.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthFine.spec.js index 637967371e9..fd768ce7894 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthFine.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/fwidthFine.spec.js @@ -8,14 +8,22 @@ fn fwidthFine(e:T) ->T Returns abs(dpdxFine(e)) + abs(dpdyFine(e)). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { allInputSources } from '../../expression.js'; + +import { d } from './fwidth.cache.js'; +import { runFWidthTest } from './fwidth.js'; export const g = makeTestGroup(GPUTest); +const builtin = 'fwidthFine'; + g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). -desc(`f32 tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('vectorize', [undefined, 2, 3, 4]). +combine('non_uniform_discard', [false, true]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('scalar'); + runFWidthTest(t, cases, builtin, t.params.non_uniform_discard, t.params.vectorize); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/insertBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/insertBits.spec.js index 1af24a51899..5a0a8182d69 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/insertBits.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/insertBits.spec.js @@ -18,17 +18,7 @@ Other bits of the result are copied from e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - i32Bits, - TypeI32, - u32, - TypeU32, - u32Bits, - vec2, - vec3, - vec4, - TypeVec } from -'../../../../../util/conversion.js'; +import { i32Bits, Type, u32, u32Bits, vec2, vec3, vec4 } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -46,8 +36,8 @@ combine('width', [1, 2, 3, 4]) ). fn(async (t) => { const cfg = t.params; - const scalarType = t.params.signed ? TypeI32 : TypeU32; - const T = t.params.width === 1 ? scalarType : TypeVec(t.params.width, scalarType); + const scalarType = t.params.signed ? Type.i32 : Type.u32; + const T = t.params.width === 1 ? scalarType : Type.vec(t.params.width, scalarType); const V = (x, y, z, w) => { y = y === undefined ? x : y; @@ -382,5 +372,5 @@ fn(async (t) => { ); } - await run(t, builtin('insertBits'), [T, T, TypeU32, TypeU32], T, cfg, cases); + await run(t, builtin('insertBits'), [T, T, Type.u32, Type.u32], T, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.cache.js index 8d8a9254972..883dc14c08f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.cache.js @@ -27,5 +27,18 @@ export const d = makeCaseCache('inverseSqrt', { 'unfiltered', FP.f16.inverseSqrtInterval ); + }, + abstract: () => { + return FP.abstract.generateScalarToIntervalCases( + [ + // 0 < x <= 1 linearly spread + ...linearRange(kValue.f64.positive.min, 1, 100), + // 1 <= x < 2^64, biased towards 1, only using 100 steps, because af tests are more expensive per case + ...biasedRange(1, 2 ** 64, 100)], + + 'finite', + // inverseSqrt has an ulp accuracy, so is only expected to be as accurate as f32 + FP.f32.inverseSqrtInterval + ); } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.spec.js index d72b14e2e6e..d22daed907c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/inversesqrt.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'inverseSqrt' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn inverseSqrt(e: T ) -> T Returns the reciprocal of sqrt(e). Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './inversesqrt.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('inverseSqrt'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('inverseSqrt'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('inverseSqrt'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('inverseSqrt'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('inverseSqrt'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.cache.js index 1c04b45ec25..bacdae0349d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.cache.js @@ -1,16 +1,11 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { assert } from '../../../../../../common/util/util.js';import { anyOf } from '../../../../../util/compare.js';import { i32 } from '../../../../../util/conversion.js'; +**/import { assert } from '../../../../../../common/util/util.js';import { anyOf } from '../../../../../util/compare.js';import { abstractInt, i32 } from '../../../../../util/conversion.js'; import { FP } from '../../../../../util/floating_point.js'; import { biasedRange, quantizeToI32, sparseI32Range } from '../../../../../util/math.js'; import { makeCaseCache } from '../../case_cache.js'; -const bias = { - f32: 127, - f16: 15 -}; - // ldexpInterval's return interval doesn't cover the flush-to-zero cases when e2 + bias <= 0, thus // special examination is required. // See the comment block on ldexpInterval for more details @@ -18,38 +13,43 @@ const bias = { const makeCase = (trait, e1, e2) => { const FPTrait = FP[trait]; e1 = FPTrait.quantize(e1); - // e2 should be in i32 range for the convinience. + // e2 should be in i32 range for the convenience. assert(-2147483648 <= e2 && e2 <= 2147483647, 'e2 should be in i32 range'); e2 = quantizeToI32(e2); const expected = FPTrait.ldexpInterval(e1, e2); + const e2_scalar = trait === 'abstract' ? abstractInt(BigInt(e2)) : i32(e2); // Result may be zero if e2 + bias <= 0 - if (e2 + bias[trait] <= 0) { + if (e2 + FPTrait.constants().bias <= 0) { return { - input: [FPTrait.scalarBuilder(e1), i32(e2)], + input: [FPTrait.scalarBuilder(e1), e2_scalar], expected: anyOf(expected, FPTrait.constants().zeroInterval) }; } - return { input: [FPTrait.scalarBuilder(e1), i32(e2)], expected }; + return { input: [FPTrait.scalarBuilder(e1), e2_scalar], expected }; }; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { if (nonConst) { + if (trait === 'abstract') { + return []; + } return FP[trait]. sparseScalarRange(). flatMap((e1) => sparseI32Range().map((e2) => makeCase(trait, e1, e2))); } + const bias = FP[trait].constants().bias; // const return FP[trait]. sparseScalarRange(). flatMap((e1) => - biasedRange(-bias[trait] - 10, bias[trait] + 1, 10).flatMap((e2) => + biasedRange(-bias - 10, bias + 1, 10).flatMap((e2) => FP[trait].isFinite(e1 * 2 ** quantizeToI32(e2)) ? makeCase(trait, e1, e2) : [] ) ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.spec.js index 0935b09eecb..99bb09d1763 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/ldexp.spec.js @@ -3,10 +3,10 @@ **/export const description = ` Execution tests for the 'ldexp' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN -K is AbstractInt, i32 +K is Type.abstractInt, i32 I is K or vecN, where I is a scalar if T is a scalar, or a vector when T is a vector @@ -14,10 +14,10 @@ I is K or vecN, where Returns e1 * 2^e2. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeI32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './ldexp.cache.js'; export const g = makeTestGroup(GPUTest); @@ -29,9 +29,21 @@ desc( ` ). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('ldexp'), + [Type.abstractFloat, Type.abstractInt], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -41,7 +53,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('ldexp'), [TypeF32, TypeI32], TypeF32, t.params, cases); + await run(t, builtin('ldexp'), [Type.f32, Type.i32], Type.f32, t.params, cases); }); g.test('f16'). @@ -55,5 +67,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('ldexp'), [TypeF16, TypeI32], TypeF16, t.params, cases); + await run(t, builtin('ldexp'), [Type.f16, Type.i32], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.cache.js index f1bbfeb0951..18c15dec5dd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.cache.js @@ -1,29 +1,34 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const scalar_cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const scalar_cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), - 'unfiltered', - FP[trait].lengthInterval + trait !== 'abstract' ? 'unfiltered' : 'finite', + // length has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].lengthInterval ); } })). reduce((a, b) => ({ ...a, ...b }), {}); -// Cases: [f32|f16]_vecN_[non_]const -const vec_cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const vec_cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateVectorToIntervalCases( FP[trait].vectorRange(dim), nonConst ? 'unfiltered' : 'finite', - FP[trait].lengthInterval + // length has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].lengthInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.spec.js index ee4138312bc..9aa959e086d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/length.spec.js @@ -3,27 +3,83 @@ **/export const description = ` Execution tests for the 'length' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn length(e: T ) -> f32 Returns the length of e (e.g. abs(e) if T is a scalar, or sqrt(e[0]^2 + e[1]^2 + ...) if T is a vector). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './length.cache.js'; export const g = makeTestGroup(GPUTest); g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). -desc(`abstract float tests`). -params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) -). -unimplemented(); +desc(`abstract_float tests`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('length'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('length'), + [Type.vec2af], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract_float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('length'), + [Type.vec3af], + Type.abstractFloat, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract_float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('length'), + [Type.vec4af], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -31,7 +87,7 @@ desc(`f32 tests`). params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('length'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('length'), [Type.f32], Type.f32, t.params, cases); }); g.test('f32_vec2'). @@ -42,7 +98,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_const' : 'f32_vec2_non_const' ); - await run(t, builtin('length'), [TypeVec(2, TypeF32)], TypeF32, t.params, cases); + await run(t, builtin('length'), [Type.vec2f], Type.f32, t.params, cases); }); g.test('f32_vec3'). @@ -53,7 +109,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_const' : 'f32_vec3_non_const' ); - await run(t, builtin('length'), [TypeVec(3, TypeF32)], TypeF32, t.params, cases); + await run(t, builtin('length'), [Type.vec3f], Type.f32, t.params, cases); }); g.test('f32_vec4'). @@ -64,7 +120,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_const' : 'f32_vec4_non_const' ); - await run(t, builtin('length'), [TypeVec(4, TypeF32)], TypeF32, t.params, cases); + await run(t, builtin('length'), [Type.vec4f], Type.f32, t.params, cases); }); g.test('f16'). @@ -76,7 +132,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('length'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('length'), [Type.f16], Type.f16, t.params, cases); }); g.test('f16_vec2'). @@ -90,7 +146,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_const' : 'f16_vec2_non_const' ); - await run(t, builtin('length'), [TypeVec(2, TypeF16)], TypeF16, t.params, cases); + await run(t, builtin('length'), [Type.vec2h], Type.f16, t.params, cases); }); g.test('f16_vec3'). @@ -104,7 +160,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_const' : 'f16_vec3_non_const' ); - await run(t, builtin('length'), [TypeVec(3, TypeF16)], TypeF16, t.params, cases); + await run(t, builtin('length'), [Type.vec3h], Type.f16, t.params, cases); }); g.test('f16_vec4'). @@ -118,5 +174,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_const' : 'f16_vec4_non_const' ); - await run(t, builtin('length'), [TypeVec(4, TypeF16)], TypeF16, t.params, cases); + await run(t, builtin('length'), [Type.vec4h], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.cache.js index c71324eb1c3..b984c1f30a4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.cache.js @@ -3,11 +3,14 @@ **/import { FP } from '../../../../../util/floating_point.js';import { biasedRange, linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; // log's accuracy is defined in three regions { [0, 0.5), [0.5, 2.0], (2.0, +∞] } -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [ ...linearRange(FP[trait].constants().positive.min, 0.5, 20), @@ -16,7 +19,8 @@ flatMap((trait) => ...FP[trait].scalarRange()], nonConst ? 'unfiltered' : 'finite', - FP[trait].logInterval + // log has an absolute or ulp accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].logInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.spec.js index b49df93f568..e828fabdbe8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'log' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn log(e: T ) -> T Returns the natural logarithm of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './log.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('log'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -39,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('log'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('log'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +65,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('log'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('log'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.cache.js index f12e8308173..1ed1f82474f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.cache.js @@ -3,11 +3,14 @@ **/import { FP } from '../../../../../util/floating_point.js';import { biasedRange, linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; // log2's accuracy is defined in three regions { [0, 0.5), [0.5, 2.0], (2.0, +∞] } -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( [ ...linearRange(FP[trait].constants().positive.min, 0.5, 20), @@ -16,7 +19,8 @@ flatMap((trait) => ...FP[trait].scalarRange()], nonConst ? 'unfiltered' : 'finite', - FP[trait].log2Interval + // log2 has an absolute or ulp accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].log2Interval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.spec.js index 8fd0dfec1cf..df280e59654 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/log2.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'log2' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn log2(e: T ) -> T Returns the base-2 logarithm of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './log2.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('log2'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -39,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('log2'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('log2'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +65,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('log2'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('log2'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.cache.js index afb67586a38..8644a569acc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.cache.js @@ -6,8 +6,8 @@ const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarPairToIntervalCases( - FP[trait].scalarRange(), - FP[trait].scalarRange(), + FP[trait].sparseScalarRange(), + FP[trait].sparseScalarRange(), 'unfiltered', FP[trait].maxInterval ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.spec.js index d5674b63b13..a605553a4a7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/max.spec.js @@ -3,12 +3,12 @@ **/export const description = ` Execution tests for the 'max' builtin function -S is AbstractInt, i32, or u32 +S is abstract-int, i32, or u32 T is S or vecN @const fn max(e1: T ,e2: T) -> T Returns e2 if e1 is less than e2, and e1 otherwise. Component-wise when T is a vector. -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is vecN @const fn max(e1: T ,e2: T) -> T Returns e2 if e1 is less than e2, and e1 otherwise. @@ -18,33 +18,21 @@ Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - TypeAbstractFloat, - TypeF16, - TypeF32, - TypeI32, - TypeU32, - i32, - u32 } from -'../../../../../util/conversion.js'; +import { Type, i32, u32, abstractInt } from '../../../../../util/conversion.js'; +import { maxBigInt } from '../../../../../util/math.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './max.cache.js'; /** Generate set of max test cases from list of interesting values */ -function generateTestCases( -values, -makeCase) -{ - const cases = new Array(); - values.forEach((e) => { - values.forEach((f) => { - cases.push(makeCase(e, f)); +function generateTestCases(values, makeCase) { + return values.flatMap((e) => { + return values.map((f) => { + return makeCase(e, f); }); }); - return cases; } export const g = makeTestGroup(GPUTest); @@ -53,9 +41,27 @@ g.test('abstract_int'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). desc(`abstract int tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const makeCase = (x, y) => { + return { input: [abstractInt(x), abstractInt(y)], expected: abstractInt(maxBigInt(x, y)) }; + }; + + const test_values = [-0x70000000n, -2n, -1n, 0n, 1n, 2n, 0x70000000n]; + const cases = generateTestCases(test_values, makeCase); + + await run( + t, + abstractIntBuiltin('max'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); g.test('u32'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). @@ -71,7 +77,7 @@ fn(async (t) => { const test_values = [0, 1, 2, 0x70000000, 0x80000000, 0xffffffff]; const cases = generateTestCases(test_values, makeCase); - await run(t, builtin('max'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, builtin('max'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('i32'). @@ -88,7 +94,7 @@ fn(async (t) => { const test_values = [-0x70000000, -2, -1, 0, 1, 2, 0x70000000]; const cases = generateTestCases(test_values, makeCase); - await run(t, builtin('max'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, builtin('max'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('abstract_float'). @@ -103,9 +109,9 @@ fn(async (t) => { const cases = await d.get('abstract'); await run( t, - abstractBuiltin('max'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('max'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -119,7 +125,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('max'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('max'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -133,5 +139,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('max'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('max'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.cache.js index f77b544f3f6..482502e3901 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.cache.js @@ -6,8 +6,8 @@ const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarPairToIntervalCases( - FP[trait].scalarRange(), - FP[trait].scalarRange(), + FP[trait].sparseScalarRange(), + FP[trait].sparseScalarRange(), 'unfiltered', FP[trait].minInterval ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.spec.js index bf9116fa5ff..05bd9dd0e4e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/min.spec.js @@ -3,12 +3,12 @@ **/export const description = ` Execution tests for the 'min' builtin function -S is AbstractInt, i32, or u32 +S is abstract-int, i32, or u32 T is S or vecN @const fn min(e1: T ,e2: T) -> T Returns e1 if e1 is less than e2, and e2 otherwise. Component-wise when T is a vector. -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn min(e1: T ,e2: T) -> T Returns e2 if e2 is less than e1, and e1 otherwise. @@ -17,44 +17,50 @@ If both operands are NaNs, a NaN is returned. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { - TypeAbstractFloat, - TypeF16, - TypeF32, - TypeI32, - TypeU32, - i32, - u32 } from -'../../../../../util/conversion.js'; +import { Type, i32, u32, abstractInt } from '../../../../../util/conversion.js'; +import { minBigInt } from '../../../../../util/math.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './min.cache.js'; export const g = makeTestGroup(GPUTest); /** Generate set of min test cases from list of interesting values */ -function generateTestCases( -values, -makeCase) -{ - const cases = new Array(); - values.forEach((e) => { - values.forEach((f) => { - cases.push(makeCase(e, f)); +function generateTestCases(values, makeCase) { + return values.flatMap((e) => { + return values.map((f) => { + return makeCase(e, f); }); }); - return cases; } g.test('abstract_int'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). desc(`abstract int tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const makeCase = (x, y) => { + return { input: [abstractInt(x), abstractInt(y)], expected: abstractInt(minBigInt(x, y)) }; + }; + + const test_values = [-0x70000000n, -2n, -1n, 0n, 1n, 2n, 0x70000000n]; + const cases = generateTestCases(test_values, makeCase); + + await run( + t, + abstractIntBuiltin('min'), + [Type.abstractInt, Type.abstractInt], + Type.abstractInt, + t.params, + cases + ); +}); g.test('u32'). specURL('https://www.w3.org/TR/WGSL/#integer-builtin-functions'). @@ -70,7 +76,7 @@ fn(async (t) => { const test_values = [0, 1, 2, 0x70000000, 0x80000000, 0xffffffff]; const cases = generateTestCases(test_values, makeCase); - await run(t, builtin('min'), [TypeU32, TypeU32], TypeU32, t.params, cases); + await run(t, builtin('min'), [Type.u32, Type.u32], Type.u32, t.params, cases); }); g.test('i32'). @@ -87,7 +93,7 @@ fn(async (t) => { const test_values = [-0x70000000, -2, -1, 0, 1, 2, 0x70000000]; const cases = generateTestCases(test_values, makeCase); - await run(t, builtin('min'), [TypeI32, TypeI32], TypeI32, t.params, cases); + await run(t, builtin('min'), [Type.i32, Type.i32], Type.i32, t.params, cases); }); g.test('abstract_float'). @@ -102,9 +108,9 @@ fn(async (t) => { const cases = await d.get('abstract'); await run( t, - abstractBuiltin('min'), - [TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('min'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -118,7 +124,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('min'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('min'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -132,5 +138,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('min'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('min'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.cache.js index 88579af0ad5..ac1d4cf5732 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.cache.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; +**/import { FP } from '../../../../../util/floating_point.js';import { selectNCases } from '../../case.js';import { makeCaseCache } from '../../case_cache.js'; + // Cases: [f32|f16|abstract]_[non_]const // abstract_non_const is empty and unused const scalar_cases = ['f32', 'f16', 'abstract']. @@ -10,13 +11,15 @@ flatMap((trait) => if (trait === 'abstract' && nonConst) { return []; } - return FP[trait].generateScalarTripleToIntervalCases( + const cases = FP[trait].generateScalarTripleToIntervalCases( FP[trait].sparseScalarRange(), FP[trait].sparseScalarRange(), FP[trait].sparseScalarRange(), nonConst ? 'unfiltered' : 'finite', - ...FP[trait].mixIntervals + // mix has an inherited accuracy, so abstract is only expected to be as accurate as f32 + ...FP[trait !== 'abstract' ? trait : 'f32'].mixIntervals ); + return selectNCases('mix_scalar', trait === 'abstract' ? 50 : cases.length, cases); } })) ). @@ -32,13 +35,15 @@ flatMap((trait) => if (trait === 'abstract' && nonConst) { return []; } - return FP[trait].generateVectorPairScalarToVectorComponentWiseCase( + const cases = FP[trait].generateVectorPairScalarToVectorComponentWiseCase( FP[trait].sparseVectorRange(dim), FP[trait].sparseVectorRange(dim), FP[trait].sparseScalarRange(), nonConst ? 'unfiltered' : 'finite', - ...FP[trait].mixIntervals + // mix has an inherited accuracy, so abstract is only expected to be as accurate as f32 + ...FP[trait !== 'abstract' ? trait : 'f32'].mixIntervals ); + return selectNCases('mix_vector', trait === 'abstract' ? 50 : cases.length, cases); } })) ) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.spec.js index 7a6d93eaa6c..a118c24978b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/mix.spec.js @@ -3,12 +3,12 @@ **/export const description = ` Execution tests for the 'mix' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn mix(e1: T, e2: T, e3: T) -> T Returns the linear blend of e1 and e2 (e.g. e1*(1-e3)+e2*e3). Component-wise when T is a vector. -T is AbstractFloat, f32, or f16 +T is abstract-float, f32, or f16 T2 is vecN @const fn mix(e1: T2, e2: T2, e3: T) -> T2 Returns the component-wise linear blend of e1 and e2, using scalar blending factor e3 for each component. @@ -16,10 +16,10 @@ Same as mix(e1,e2,T2(e3)). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './mix.cache.js'; export const g = makeTestGroup(GPUTest); @@ -36,9 +36,9 @@ fn(async (t) => { const cases = await d.get('abstract_const'); await run( t, - abstractBuiltin('mix'), - [TypeAbstractFloat, TypeAbstractFloat, TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('mix'), + [Type.abstractFloat, Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -52,9 +52,9 @@ fn(async (t) => { const cases = await d.get('abstract_vec2_scalar_const'); await run( t, - abstractBuiltin('mix'), - [TypeVec(2, TypeAbstractFloat), TypeVec(2, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(2, TypeAbstractFloat), + abstractFloatBuiltin('mix'), + [Type.vec(2, Type.abstractFloat), Type.vec(2, Type.abstractFloat), Type.abstractFloat], + Type.vec(2, Type.abstractFloat), t.params, cases ); @@ -68,9 +68,9 @@ fn(async (t) => { const cases = await d.get('abstract_vec3_scalar_const'); await run( t, - abstractBuiltin('mix'), - [TypeVec(3, TypeAbstractFloat), TypeVec(3, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(3, TypeAbstractFloat), + abstractFloatBuiltin('mix'), + [Type.vec(3, Type.abstractFloat), Type.vec(3, Type.abstractFloat), Type.abstractFloat], + Type.vec(3, Type.abstractFloat), t.params, cases ); @@ -84,9 +84,9 @@ fn(async (t) => { const cases = await d.get('abstract_vec4_scalar_const'); await run( t, - abstractBuiltin('mix'), - [TypeVec(4, TypeAbstractFloat), TypeVec(4, TypeAbstractFloat), TypeAbstractFloat], - TypeVec(4, TypeAbstractFloat), + abstractFloatBuiltin('mix'), + [Type.vec(4, Type.abstractFloat), Type.vec(4, Type.abstractFloat), Type.abstractFloat], + Type.vec(4, Type.abstractFloat), t.params, cases ); @@ -100,7 +100,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('mix'), [TypeF32, TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('mix'), [Type.f32, Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f32_nonmatching_vec2'). @@ -111,14 +111,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_scalar_const' : 'f32_vec2_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32), TypeF32], - TypeVec(2, TypeF32), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec2f, Type.vec2f, Type.f32], Type.vec2f, t.params, cases); }); g.test('f32_nonmatching_vec3'). @@ -129,14 +122,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_scalar_const' : 'f32_vec3_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32), TypeF32], - TypeVec(3, TypeF32), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec3f, Type.vec3f, Type.f32], Type.vec3f, t.params, cases); }); g.test('f32_nonmatching_vec4'). @@ -147,14 +133,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_scalar_const' : 'f32_vec4_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32), TypeF32], - TypeVec(4, TypeF32), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec4f, Type.vec4f, Type.f32], Type.vec4f, t.params, cases); }); g.test('f16_matching'). @@ -168,7 +147,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('mix'), [TypeF16, TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('mix'), [Type.f16, Type.f16, Type.f16], Type.f16, t.params, cases); }); g.test('f16_nonmatching_vec2'). @@ -182,14 +161,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_scalar_const' : 'f16_vec2_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16), TypeF16], - TypeVec(2, TypeF16), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec2h, Type.vec2h, Type.f16], Type.vec2h, t.params, cases); }); g.test('f16_nonmatching_vec3'). @@ -203,14 +175,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_scalar_const' : 'f16_vec3_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16), TypeF16], - TypeVec(3, TypeF16), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec3h, Type.vec3h, Type.f16], Type.vec3h, t.params, cases); }); g.test('f16_nonmatching_vec4'). @@ -224,12 +189,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_scalar_const' : 'f16_vec4_scalar_non_const' ); - await run( - t, - builtin('mix'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16), TypeF16], - TypeVec(4, TypeF16), - t.params, - cases - ); + await run(t, builtin('mix'), [Type.vec4h, Type.vec4h, Type.f16], Type.vec4h, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/modf.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/modf.spec.js index 2c88c8bb9cb..39a3c7f10dc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/modf.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/modf.spec.js @@ -3,13 +3,13 @@ **/export const description = ` Execution tests for the 'modf' builtin function -T is f32 or f16 or AbstractFloat +T is f32 or f16 or Type.abstractFloat @const fn modf(e:T) -> result_struct Splits |e| into fractional and whole number parts. The whole part is (|e| % 1.0), and the fractional part is |e| minus the whole part. Returns the result_struct for the given type. -S is f32 or f16 or AbstractFloat +S is f32 or f16 or Type.abstractFloat T is vecN @const fn modf(e:T) -> result_struct Splits the components of |e| into fractional and whole number parts. @@ -18,7 +18,7 @@ Returns the result_struct for the given type. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { abstractFloatShaderBuilder, allInputSources, @@ -67,7 +67,7 @@ struct __modf_result_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_fract'); - await run(t, fractBuilder(), [TypeF32], TypeF32, t.params, cases); + await run(t, fractBuilder(), [Type.f32], Type.f32, t.params, cases); }); g.test('f32_whole'). @@ -85,7 +85,7 @@ struct __modf_result_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_whole'); - await run(t, wholeBuilder(), [TypeF32], TypeF32, t.params, cases); + await run(t, wholeBuilder(), [Type.f32], Type.f32, t.params, cases); }); g.test('f32_vec2_fract'). @@ -103,7 +103,7 @@ struct __modf_result_vec2_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec2_fract'); - await run(t, fractBuilder(), [TypeVec(2, TypeF32)], TypeVec(2, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec2f], Type.vec2f, t.params, cases); }); g.test('f32_vec2_whole'). @@ -121,7 +121,7 @@ struct __modf_result_vec2_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec2_whole'); - await run(t, wholeBuilder(), [TypeVec(2, TypeF32)], TypeVec(2, TypeF32), t.params, cases); + await run(t, wholeBuilder(), [Type.vec2f], Type.vec2f, t.params, cases); }); g.test('f32_vec3_fract'). @@ -139,7 +139,7 @@ struct __modf_result_vec3_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec3_fract'); - await run(t, fractBuilder(), [TypeVec(3, TypeF32)], TypeVec(3, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f32_vec3_whole'). @@ -157,7 +157,7 @@ struct __modf_result_vec3_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec3_whole'); - await run(t, wholeBuilder(), [TypeVec(3, TypeF32)], TypeVec(3, TypeF32), t.params, cases); + await run(t, wholeBuilder(), [Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f32_vec4_fract'). @@ -175,7 +175,7 @@ struct __modf_result_vec4_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec4_fract'); - await run(t, fractBuilder(), [TypeVec(4, TypeF32)], TypeVec(4, TypeF32), t.params, cases); + await run(t, fractBuilder(), [Type.vec4f], Type.vec4f, t.params, cases); }); g.test('f32_vec4_whole'). @@ -193,7 +193,7 @@ struct __modf_result_vec4_f32 { params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get('f32_vec4_whole'); - await run(t, wholeBuilder(), [TypeVec(4, TypeF32)], TypeVec(4, TypeF32), t.params, cases); + await run(t, wholeBuilder(), [Type.vec4f], Type.vec4f, t.params, cases); }); g.test('f16_fract'). @@ -214,7 +214,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_fract'); - await run(t, fractBuilder(), [TypeF16], TypeF16, t.params, cases); + await run(t, fractBuilder(), [Type.f16], Type.f16, t.params, cases); }); g.test('f16_whole'). @@ -235,7 +235,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_whole'); - await run(t, wholeBuilder(), [TypeF16], TypeF16, t.params, cases); + await run(t, wholeBuilder(), [Type.f16], Type.f16, t.params, cases); }); g.test('f16_vec2_fract'). @@ -256,7 +256,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec2_fract'); - await run(t, fractBuilder(), [TypeVec(2, TypeF16)], TypeVec(2, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec2h], Type.vec2h, t.params, cases); }); g.test('f16_vec2_whole'). @@ -277,7 +277,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec2_whole'); - await run(t, wholeBuilder(), [TypeVec(2, TypeF16)], TypeVec(2, TypeF16), t.params, cases); + await run(t, wholeBuilder(), [Type.vec2h], Type.vec2h, t.params, cases); }); g.test('f16_vec3_fract'). @@ -298,7 +298,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec3_fract'); - await run(t, fractBuilder(), [TypeVec(3, TypeF16)], TypeVec(3, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec3h], Type.vec3h, t.params, cases); }); g.test('f16_vec3_whole'). @@ -319,7 +319,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec3_whole'); - await run(t, wholeBuilder(), [TypeVec(3, TypeF16)], TypeVec(3, TypeF16), t.params, cases); + await run(t, wholeBuilder(), [Type.vec3h], Type.vec3h, t.params, cases); }); g.test('f16_vec4_fract'). @@ -340,7 +340,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec4_fract'); - await run(t, fractBuilder(), [TypeVec(4, TypeF16)], TypeVec(4, TypeF16), t.params, cases); + await run(t, fractBuilder(), [Type.vec4h], Type.vec4h, t.params, cases); }); g.test('f16_vec4_whole'). @@ -361,43 +361,43 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16_vec4_whole'); - await run(t, wholeBuilder(), [TypeVec(4, TypeF16)], TypeVec(4, TypeF16), t.params, cases); + await run(t, wholeBuilder(), [Type.vec4h], Type.vec4h, t.params, cases); }); g.test('abstract_fract'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc( ` -T is AbstractFloat +T is abstract-float struct __modf_result_abstract { - fract : AbstractFloat, // fractional part - whole : AbstractFloat // whole part + fract : Type.abstractFloat, // fractional part + whole : Type.abstractFloat // whole part } ` ). params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('abstract_fract'); - await run(t, abstractFractBuilder(), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + await run(t, abstractFractBuilder(), [Type.abstractFloat], Type.abstractFloat, t.params, cases); }); g.test('abstract_whole'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc( ` -T is AbstractFloat +T is abstract-float struct __modf_result_abstract { - fract : AbstractFloat, // fractional part - whole : AbstractFloat // whole part + fract : Type.abstractFloat, // fractional part + whole : Type.abstractFloat // whole part } ` ). params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('abstract_whole'); - await run(t, abstractWholeBuilder(), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + await run(t, abstractWholeBuilder(), [Type.abstractFloat], Type.abstractFloat, t.params, cases); }); g.test('abstract_vec2_fract'). @@ -418,8 +418,8 @@ fn(async (t) => { await run( t, abstractFractBuilder(), - [TypeVec(2, TypeAbstractFloat)], - TypeVec(2, TypeAbstractFloat), + [Type.vec(2, Type.abstractFloat)], + Type.vec(2, Type.abstractFloat), t.params, cases ); @@ -443,8 +443,8 @@ fn(async (t) => { await run( t, abstractWholeBuilder(), - [TypeVec(2, TypeAbstractFloat)], - TypeVec(2, TypeAbstractFloat), + [Type.vec(2, Type.abstractFloat)], + Type.vec(2, Type.abstractFloat), t.params, cases ); @@ -468,8 +468,8 @@ fn(async (t) => { await run( t, abstractFractBuilder(), - [TypeVec(3, TypeAbstractFloat)], - TypeVec(3, TypeAbstractFloat), + [Type.vec(3, Type.abstractFloat)], + Type.vec(3, Type.abstractFloat), t.params, cases ); @@ -493,8 +493,8 @@ fn(async (t) => { await run( t, abstractWholeBuilder(), - [TypeVec(3, TypeAbstractFloat)], - TypeVec(3, TypeAbstractFloat), + [Type.vec(3, Type.abstractFloat)], + Type.vec(3, Type.abstractFloat), t.params, cases ); @@ -518,8 +518,8 @@ fn(async (t) => { await run( t, abstractFractBuilder(), - [TypeVec(4, TypeAbstractFloat)], - TypeVec(4, TypeAbstractFloat), + [Type.vec(4, Type.abstractFloat)], + Type.vec(4, Type.abstractFloat), t.params, cases ); @@ -543,8 +543,8 @@ fn(async (t) => { await run( t, abstractWholeBuilder(), - [TypeVec(4, TypeAbstractFloat)], - TypeVec(4, TypeAbstractFloat), + [Type.vec(4, Type.abstractFloat)], + Type.vec(4, Type.abstractFloat), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.cache.js index decd583a70f..a1b8b07b9f7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.cache.js @@ -1,16 +1,20 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_vecN_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateVectorToVectorCases( FP[trait].vectorRange(dim), nonConst ? 'unfiltered' : 'finite', - FP[trait].normalizeInterval + // normalize has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].normalizeInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.spec.js index ce13fea99b8..8bc4ea7ca80 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/normalize.spec.js @@ -3,26 +3,45 @@ **/export const description = ` Execution tests for the 'normalize' builtin function -T is AbstractFloat, f32, or f16 +T is abstract-float, f32, or f16 @const fn normalize(e: vecN ) -> vecN Returns a unit vector in the same direction as e. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './normalize.cache.js'; export const g = makeTestGroup(GPUTest); -g.test('abstract_float'). -specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). -desc(`abstract float tests`). -params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) -). -unimplemented(); +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run(t, abstractFloatBuiltin('normalize'), [Type.vec2af], Type.vec2af, t.params, cases); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run(t, abstractFloatBuiltin('normalize'), [Type.vec3af], Type.vec3af, t.params, cases); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run(t, abstractFloatBuiltin('normalize'), [Type.vec4af], Type.vec4af, t.params, cases); +}); g.test('f32_vec2'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -32,7 +51,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_const' : 'f32_vec2_non_const' ); - await run(t, builtin('normalize'), [TypeVec(2, TypeF32)], TypeVec(2, TypeF32), t.params, cases); + await run(t, builtin('normalize'), [Type.vec2f], Type.vec2f, t.params, cases); }); g.test('f32_vec3'). @@ -43,7 +62,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_const' : 'f32_vec3_non_const' ); - await run(t, builtin('normalize'), [TypeVec(3, TypeF32)], TypeVec(3, TypeF32), t.params, cases); + await run(t, builtin('normalize'), [Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f32_vec4'). @@ -54,7 +73,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_const' : 'f32_vec4_non_const' ); - await run(t, builtin('normalize'), [TypeVec(4, TypeF32)], TypeVec(4, TypeF32), t.params, cases); + await run(t, builtin('normalize'), [Type.vec4f], Type.vec4f, t.params, cases); }); g.test('f16_vec2'). @@ -68,7 +87,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_const' : 'f16_vec2_non_const' ); - await run(t, builtin('normalize'), [TypeVec(2, TypeF16)], TypeVec(2, TypeF16), t.params, cases); + await run(t, builtin('normalize'), [Type.vec2h], Type.vec2h, t.params, cases); }); g.test('f16_vec3'). @@ -82,7 +101,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_const' : 'f16_vec3_non_const' ); - await run(t, builtin('normalize'), [TypeVec(3, TypeF16)], TypeVec(3, TypeF16), t.params, cases); + await run(t, builtin('normalize'), [Type.vec3h], Type.vec3h, t.params, cases); }); g.test('f16_vec4'). @@ -96,5 +115,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_const' : 'f16_vec4_non_const' ); - await run(t, builtin('normalize'), [TypeVec(4, TypeF16)], TypeVec(4, TypeF16), t.params, cases); + await run(t, builtin('normalize'), [Type.vec4h], Type.vec4h, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16float.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16float.spec.js index 317966986b8..e859b1898a2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16float.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16float.spec.js @@ -6,7 +6,7 @@ Component e[i] of the input is converted to a IEEE-754 binary16 value, which is then placed in bits 16 × i through 16 × i + 15 of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -24,5 +24,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('pack2x16float'), [TypeVec(2, TypeF32)], TypeU32, t.params, cases); + await run(t, builtin('pack2x16float'), [Type.vec2f], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16snorm.spec.js index eb73eb4cb38..e9f4b655829 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16snorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16snorm.spec.js @@ -8,15 +8,7 @@ bits 16 × i through 16 × i + 15 of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; import { kValue } from '../../../../../util/constants.js'; -import { - f32, - pack2x16snorm, - TypeF32, - TypeU32, - TypeVec, - u32, - vec2 } from -'../../../../../util/conversion.js'; +import { f32, pack2x16snorm, u32, vec2, Type } from '../../../../../util/conversion.js'; import { quantizeToF32, vectorF32Range } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -52,5 +44,5 @@ fn(async (t) => { }); - await run(t, builtin('pack2x16snorm'), [TypeVec(2, TypeF32)], TypeU32, t.params, cases); + await run(t, builtin('pack2x16snorm'), [Type.vec2f], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16unorm.spec.js index 2648353ada8..f98d606b8d3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16unorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack2x16unorm.spec.js @@ -8,15 +8,7 @@ bits 16 × i through 16 × i + 15 of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; import { kValue } from '../../../../../util/constants.js'; -import { - f32, - pack2x16unorm, - TypeF32, - TypeU32, - TypeVec, - u32, - vec2 } from -'../../../../../util/conversion.js'; +import { f32, pack2x16unorm, u32, vec2, Type } from '../../../../../util/conversion.js'; import { quantizeToF32, vectorF32Range } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -52,5 +44,5 @@ fn(async (t) => { }); - await run(t, builtin('pack2x16unorm'), [TypeVec(2, TypeF32)], TypeU32, t.params, cases); + await run(t, builtin('pack2x16unorm'), [Type.vec2f], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8snorm.spec.js index 6668427241c..42db991e538 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8snorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8snorm.spec.js @@ -8,16 +8,7 @@ bits 8 × i through 8 × i + 7 of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; import { kValue } from '../../../../../util/constants.js'; -import { - f32, - pack4x8snorm, - - TypeF32, - TypeU32, - TypeVec, - u32, - vec4 } from -'../../../../../util/conversion.js'; +import { f32, pack4x8snorm, u32, vec4, Type } from '../../../../../util/conversion.js'; import { quantizeToF32, vectorF32Range } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -37,6 +28,11 @@ params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const makeCase = (vals) => { const vals_f32 = new Array(4); + + + + + for (const idx in vals) { vals[idx] = quantizeToF32(vals[idx]); vals_f32[idx] = f32(vals[idx]); @@ -57,5 +53,5 @@ fn(async (t) => { }); - await run(t, builtin('pack4x8snorm'), [TypeVec(4, TypeF32)], TypeU32, t.params, cases); + await run(t, builtin('pack4x8snorm'), [Type.vec4f], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8unorm.spec.js index 8c23e47719b..d0299f973c5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8unorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4x8unorm.spec.js @@ -8,16 +8,7 @@ bits 8 × i through 8 × i + 7 of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; import { kValue } from '../../../../../util/constants.js'; -import { - f32, - pack4x8unorm, - - TypeF32, - TypeU32, - TypeVec, - u32, - vec4 } from -'../../../../../util/conversion.js'; +import { f32, pack4x8unorm, u32, vec4, Type } from '../../../../../util/conversion.js'; import { quantizeToF32, vectorF32Range } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -37,6 +28,11 @@ params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const makeCase = (vals) => { const vals_f32 = new Array(4); + + + + + for (const idx in vals) { vals[idx] = quantizeToF32(vals[idx]); vals_f32[idx] = f32(vals[idx]); @@ -57,5 +53,5 @@ fn(async (t) => { }); - await run(t, builtin('pack4x8unorm'), [TypeVec(4, TypeF32)], TypeU32, t.params, cases); + await run(t, builtin('pack4x8unorm'), [Type.vec4f], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8.spec.js index 92f3fb45b34..4ced1a04b42 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8.spec.js @@ -8,7 +8,7 @@ Pack the lower 8 bits of each component of e into a u32 value and drop all the u Component e[i] of the input is mapped to bits (8 * i) through (8 * (i + 7)) of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeI32, TypeU32, TypeVec, u32, toVector, i32 } from '../../../../../util/conversion.js'; +import { u32, toVector, i32, Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -65,5 +65,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('pack4xI8'), [TypeVec(4, TypeI32)], TypeU32, cfg, cases); + await run(t, builtin('pack4xI8'), [Type.vec4i], Type.u32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8Clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8Clamp.spec.js index cdf33a6d102..e7ee33839ef 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8Clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xI8Clamp.spec.js @@ -9,7 +9,7 @@ into a u32 value. Component e[i] of the input is mapped to bits (8 * i) through result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeI32, TypeU32, TypeVec, u32, toVector, i32 } from '../../../../../util/conversion.js'; +import { u32, toVector, i32, Type } from '../../../../../util/conversion.js'; import { clamp } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -69,5 +69,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('pack4xI8Clamp'), [TypeVec(4, TypeI32)], TypeU32, cfg, cases); + await run(t, builtin('pack4xI8Clamp'), [Type.vec4i], Type.u32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8.spec.js index 3a36be4ba9b..e5ace048f79 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8.spec.js @@ -8,7 +8,7 @@ Pack the lower 8 bits of each component of e into a u32 value and drop all the u Component e[i] of the input is mapped to bits (8 * i) through (8 * (i + 7)) of the result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, TypeVec, u32, toVector } from '../../../../../util/conversion.js'; +import { u32, toVector, Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -50,5 +50,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('pack4xU8'), [TypeVec(4, TypeU32)], TypeU32, cfg, cases); + await run(t, builtin('pack4xU8'), [Type.vec4u], Type.u32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8Clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8Clamp.spec.js index d16fba390ed..5a68795299f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8Clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pack4xU8Clamp.spec.js @@ -9,7 +9,7 @@ into a u32 value. Component e[i] of the input is mapped to bits (8 * i) through result. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, TypeVec, u32, toVector } from '../../../../../util/conversion.js'; +import { u32, toVector, Type } from '../../../../../util/conversion.js'; import { clamp } from '../../../../../util/math.js'; import { allInputSources, run } from '../../expression.js'; @@ -53,5 +53,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('pack4xU8Clamp'), [TypeVec(4, TypeU32)], TypeU32, cfg, cases); + await run(t, builtin('pack4xU8Clamp'), [Type.vec4u], Type.u32, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.cache.js index b166e35b630..944c406bd83 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.cache.js @@ -1,16 +1,20 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarPairToIntervalCases( FP[trait].scalarRange(), FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].powInterval + // pow has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].powInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.spec.js index 3b677b9cb13..562c75de99c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/pow.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'pow' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn pow(e1: T ,e2: T ) -> T Returns e1 raised to the power e2. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './pow.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('pow'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('pow'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('pow'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('pow'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('pow'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/quantizeToF16.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/quantizeToF16.spec.js index 40f5b2f132e..b872d0923f4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/quantizeToF16.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/quantizeToF16.spec.js @@ -10,7 +10,7 @@ binary16 value, and then converted back to a IEEE 754 binary32 value. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -26,5 +26,5 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('quantizeToF16'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('quantizeToF16'), [Type.f32], Type.f32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.cache.js index 582338e976a..d3770a173c7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.cache.js @@ -7,8 +7,9 @@ map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), - 'unfiltered', - FP[trait].radiansInterval + trait !== 'abstract' ? 'unfiltered' : 'finite', + // radians has an inherited accuracy, so abstract is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].radiansInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.spec.js index 480cd55d5c3..46e8dbb09b4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/radians.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'radians' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn radians(e1: T ) -> T Converts degrees to radians, approximating e1 * π / 180. Component-wise when T is a vector `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './radians.cache.js'; export const g = makeTestGroup(GPUTest); @@ -30,9 +30,9 @@ fn(async (t) => { const cases = await d.get('abstract'); await run( t, - abstractBuiltin('radians'), - [TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('radians'), + [Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -46,7 +46,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('radians'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('radians'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -60,5 +60,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('radians'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('radians'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.cache.js index dbde2133063..359e731bf25 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.cache.js @@ -1,17 +1,21 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_vecN_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateVectorPairToVectorCases( FP[trait].sparseVectorRange(dim), FP[trait].sparseVectorRange(dim), nonConst ? 'unfiltered' : 'finite', - FP[trait].reflectInterval + // reflect has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].reflectInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.spec.js index a6a59f07104..4d1b805e1f3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reflect.spec.js @@ -3,25 +3,67 @@ **/export const description = ` Execution tests for the 'reflect' builtin function -T is vecN, vecN, or vecN +T is vecN, vecN, or vecN @const fn reflect(e1: T, e2: T ) -> T For the incident vector e1 and surface orientation e2, returns the reflection direction e1-2*dot(e2,e1)*e2. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './reflect.cache.js'; export const g = makeTestGroup(GPUTest); -g.test('abstract_float'). -specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). -desc(`abstract float tests`). -params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [2, 3, 4])). -unimplemented(); +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('reflect'), + [Type.vec2af, Type.vec2af], + Type.vec2af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('reflect'), + [Type.vec3af, Type.vec3af], + Type.vec3af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('reflect'), + [Type.vec4af, Type.vec4af], + Type.vec4af, + t.params, + cases + ); +}); g.test('f32_vec2'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -31,14 +73,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec2_const' : 'f32_vec2_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32)], - TypeVec(2, TypeF32), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec2f, Type.vec2f], Type.vec2f, t.params, cases); }); g.test('f32_vec3'). @@ -49,14 +84,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec3_const' : 'f32_vec3_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeVec(3, TypeF32), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec3f, Type.vec3f], Type.vec3f, t.params, cases); }); g.test('f32_vec4'). @@ -67,14 +95,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f32_vec4_const' : 'f32_vec4_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32)], - TypeVec(4, TypeF32), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec4f, Type.vec4f], Type.vec4f, t.params, cases); }); g.test('f16_vec2'). @@ -88,14 +109,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec2_const' : 'f16_vec2_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16)], - TypeVec(2, TypeF16), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec2h, Type.vec2h], Type.vec2h, t.params, cases); }); g.test('f16_vec3'). @@ -109,14 +123,7 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec3_const' : 'f16_vec3_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeVec(3, TypeF16), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec3h, Type.vec3h], Type.vec3h, t.params, cases); }); g.test('f16_vec4'). @@ -130,12 +137,5 @@ fn(async (t) => { const cases = await d.get( t.params.inputSource === 'const' ? 'f16_vec4_const' : 'f16_vec4_non_const' ); - await run( - t, - builtin('reflect'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16)], - TypeVec(4, TypeF16), - t.params, - cases - ); + await run(t, builtin('reflect'), [Type.vec4h, Type.vec4h], Type.vec4h, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.cache.js index 6b2c4b182e9..4f2ce5e2b45 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.cache.js @@ -1,7 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { toVector } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js'; - +import { selectNCases } from '../../case.js'; import { makeCaseCache } from '../../case_cache.js'; @@ -11,45 +11,51 @@ import { makeCaseCache } from '../../case_cache.js'; /** * @returns a Case for `refract` - * @param kind what type of floating point numbers to operate on + * @param argumentKind what kind of floating point numbers being operated on + * @param parameterKind what kind of floating point operation should be performed, + * should be the same as argumentKind, except for abstract * @param i the `i` param for the case * @param s the `s` param for the case * @param r the `r` param for the case * @param check what interval checking to apply * */ function makeCase( -kind, +argumentKind, +parameterKind, i, s, r, check) { - const fp = FP[kind]; + const fp = FP[argumentKind]; i = i.map(fp.quantize); s = s.map(fp.quantize); r = fp.quantize(r); - const vectors = fp.refractInterval(i, s, r); + const vectors = FP[parameterKind].refractInterval(i, s, r); if (check === 'finite' && vectors.some((e) => !e.isFinite())) { return undefined; } return { input: [toVector(i, fp.scalarBuilder), toVector(s, fp.scalarBuilder), fp.scalarBuilder(r)], - expected: fp.refractInterval(i, s, r) + expected: vectors }; } /** * @returns an array of Cases for `refract` - * @param kind what type of floating point numbers to operate on + * @param argumentKind what kind of floating point numbers being operated on + * @param parameterKind what kind of floating point operation should be performed, + * should be the same as argumentKind, except for abstract * @param param_is array of inputs to try for the `i` param * @param param_ss array of inputs to try for the `s` param * @param param_rs array of inputs to try for the `r` param * @param check what interval checking to apply */ function generateCases( -kind, +argumentKind, +parameterKind, param_is, param_ss, param_rs, @@ -60,26 +66,47 @@ check) flatMap((i) => { return param_ss.flatMap((s) => { return param_rs.map((r) => { - return makeCase(kind, i, s, r, check); + return makeCase(argumentKind, parameterKind, i, s, r, check); }); }); }). filter((c) => c !== undefined); } -// Cases: [f32|f16]_vecN_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_vecN_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [2, 3, 4].flatMap((dim) => [true, false].map((nonConst) => ({ [`${trait}_vec${dim}_${nonConst ? 'non_const' : 'const'}`]: () => { - return generateCases( - trait, - FP[trait].sparseVectorRange(dim), - FP[trait].sparseVectorRange(dim), - FP[trait].sparseScalarRange(), - nonConst ? 'unfiltered' : 'finite' - ); + if (trait === 'abstract' && nonConst) { + return []; + } + if (trait !== 'abstract') { + return generateCases( + trait, + trait, + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + FP[trait].sparseScalarRange(), + nonConst ? 'unfiltered' : 'finite' + ); + } else { + // Restricting the number of cases, because a vector of abstract floats needs to be returned, which is costly. + return selectNCases( + 'faceForward', + 20, + generateCases( + trait, + // refract has an inherited accuracy, so is only expected to be as accurate as f32 + 'f32', + FP[trait].sparseVectorRange(dim), + FP[trait].sparseVectorRange(dim), + FP[trait].sparseScalarRange(), + nonConst ? 'unfiltered' : 'finite' + ) + ); + } } })) ) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.spec.js index 90e39fa2522..a2ffec4a1a0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/refract.spec.js @@ -4,7 +4,7 @@ Execution tests for the 'refract' builtin function T is vecN -I is AbstractFloat, f32, or f16 +I is abstract-float, f32, or f16 @const fn refract(e1: T ,e2: T ,e3: I ) -> T For the incident vector e1 and surface normal e2, and the ratio of indices of refraction e3, let k = 1.0 -e3*e3* (1.0 - dot(e2,e1) * dot(e2,e1)). @@ -12,19 +12,61 @@ If k < 0.0, returns the refraction vector 0.0, otherwise return the refraction vector e3*e1- (e3* dot(e2,e1) + sqrt(k)) *e2. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32, TypeVec } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './refract.cache.js'; export const g = makeTestGroup(GPUTest); -g.test('abstract_float'). -specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). -desc(`abstract float tests`). -params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [2, 3, 4])). -unimplemented(); +g.test('abstract_float_vec2'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec2s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('refract'), + [Type.vec2af, Type.vec2af, Type.abstractFloat], + Type.vec2af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec3'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec3s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('refract'), + [Type.vec3af, Type.vec3af, Type.abstractFloat], + Type.vec3af, + t.params, + cases + ); +}); + +g.test('abstract_float_vec4'). +specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). +desc(`abstract float tests using vec4s`). +params((u) => u.combine('inputSource', onlyConstInputSource)). +fn(async (t) => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('refract'), + [Type.vec4af, Type.vec4af, Type.abstractFloat], + Type.vec4af, + t.params, + cases + ); +}); g.test('f32_vec2'). specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions'). @@ -37,8 +79,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32), TypeF32], - TypeVec(2, TypeF32), + [Type.vec2f, Type.vec2f, Type.f32], + Type.vec2f, t.params, cases ); @@ -55,8 +97,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32), TypeF32], - TypeVec(3, TypeF32), + [Type.vec3f, Type.vec3f, Type.f32], + Type.vec3f, t.params, cases ); @@ -73,8 +115,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32), TypeF32], - TypeVec(4, TypeF32), + [Type.vec4f, Type.vec4f, Type.f32], + Type.vec4f, t.params, cases ); @@ -94,8 +136,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16), TypeF16], - TypeVec(2, TypeF16), + [Type.vec2h, Type.vec2h, Type.f16], + Type.vec2h, t.params, cases ); @@ -115,8 +157,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16), TypeF16], - TypeVec(3, TypeF16), + [Type.vec3h, Type.vec3h, Type.f16], + Type.vec3h, t.params, cases ); @@ -136,8 +178,8 @@ fn(async (t) => { await run( t, builtin('refract'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16), TypeF16], - TypeVec(4, TypeF16), + [Type.vec4h, Type.vec4h, Type.f16], + Type.vec4h, t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reverseBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reverseBits.spec.js index fc99867f108..9716dfd108b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reverseBits.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/reverseBits.spec.js @@ -10,7 +10,7 @@ Reverses the bits in e: The bit at position k of the result equals the bit at po Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, u32Bits, TypeI32, i32Bits } from '../../../../../util/conversion.js'; +import { u32Bits, i32Bits, Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -26,7 +26,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, fn(async (t) => { const cfg = t.params; - await run(t, builtin('reverseBits'), [TypeU32], TypeU32, cfg, [ + await run(t, builtin('reverseBits'), [Type.u32], Type.u32, cfg, [ // Zero { input: u32Bits(0b00000000000000000000000000000000), expected: u32Bits(0b00000000000000000000000000000000) }, @@ -142,7 +142,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, fn(async (t) => { const cfg = t.params; - await run(t, builtin('reverseBits'), [TypeI32], TypeI32, cfg, [ + await run(t, builtin('reverseBits'), [Type.i32], Type.i32, cfg, [ // Zero { input: i32Bits(0b00000000000000000000000000000000), expected: i32Bits(0b00000000000000000000000000000000) }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/round.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/round.spec.js index 570f60ed9e8..b60399773e4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/round.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/round.spec.js @@ -3,7 +3,7 @@ **/export const description = ` Execution tests for the 'round' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn round(e: T) -> T Result is the integer k nearest to e, as a floating point value. @@ -12,10 +12,10 @@ and k+1 when k is odd. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './round.cache.js'; export const g = makeTestGroup(GPUTest); @@ -30,7 +30,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('abstract'); - await run(t, abstractBuiltin('round'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + await run( + t, + abstractFloatBuiltin('round'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); }); g.test('f32'). @@ -41,7 +48,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('round'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('round'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -55,5 +62,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('round'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('round'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/saturate.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/saturate.spec.js index 2b63e330546..e18f41ae659 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/saturate.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/saturate.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'saturate' builtin function -S is AbstractFloat, f32, or f16 +S is abstract-float, f32, or f16 T is S or vecN @const fn saturate(e: T) -> T Returns clamp(e, 0.0, 1.0). Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './saturate.cache.js'; export const g = makeTestGroup(GPUTest); @@ -29,9 +29,9 @@ fn(async (t) => { const cases = await d.get('abstract'); await run( t, - abstractBuiltin('saturate'), - [TypeAbstractFloat], - TypeAbstractFloat, + abstractFloatBuiltin('saturate'), + [Type.abstractFloat], + Type.abstractFloat, t.params, cases ); @@ -44,7 +44,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('saturate'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('saturate'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -58,5 +58,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('saturate'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('saturate'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/select.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/select.spec.js index 4c681e49cdf..c08f4d5f1b4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/select.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/select.spec.js @@ -14,12 +14,6 @@ Component-wise selection. Result component i is evaluated as select(f[i],t[i],co import { GPUTest } from '../../../../../gpu_test.js'; import { - TypeVec, - TypeBool, - TypeF32, - TypeF16, - TypeI32, - TypeU32, f32, f16, i32, @@ -31,12 +25,14 @@ import { vec3, vec4, abstractFloat, - TypeAbstractFloat } from + abstractInt, + + Type } from '../../../../../util/conversion.js'; import { run, allInputSources } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; export const g = makeTestGroup(GPUTest); @@ -48,28 +44,43 @@ function makeBool(n) { const dataType = { b: { - type: TypeBool, - constructor: makeBool + type: Type.bool, + scalar_builder: makeBool, + shader_builder: builtin('select') }, af: { - type: TypeAbstractFloat, - constructor: abstractFloat + type: Type.abstractFloat, + scalar_builder: abstractFloat, + shader_builder: abstractFloatBuiltin('select') }, f: { - type: TypeF32, - constructor: f32 + type: Type.f32, + scalar_builder: f32, + shader_builder: builtin('select') }, h: { - type: TypeF16, - constructor: f16 + type: Type.f16, + scalar_builder: f16, + shader_builder: builtin('select') + }, + ai: { + type: Type.abstractInt, + // Only ints are used in the tests below, so the conversion to bigint will + // be safe. If a non-int is passed in this will Error. + scalar_builder: (v) => { + return abstractInt(BigInt(v)); + }, + shader_builder: abstractIntBuiltin('select') }, i: { - type: TypeI32, - constructor: i32 + type: Type.i32, + scalar_builder: i32, + shader_builder: builtin('select') }, u: { - type: TypeU32, - constructor: u32 + type: Type.u32, + scalar_builder: u32, + shader_builder: builtin('select') } }; @@ -79,7 +90,7 @@ desc(`scalar tests`). params((u) => u. combine('inputSource', allInputSources). -combine('component', ['b', 'af', 'f', 'h', 'i', 'u']). +combine('component', ['b', 'af', 'f', 'h', 'ai', 'i', 'u']). combine('overload', ['scalar', 'vec2', 'vec3', 'vec4']) ). beforeAllSubcases((t) => { @@ -87,10 +98,11 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); } t.skipIf(t.params.component === 'af' && t.params.inputSource !== 'const'); + t.skipIf(t.params.component === 'ai' && t.params.inputSource !== 'const'); }). fn(async (t) => { const componentType = dataType[t.params.component].type; - const cons = dataType[t.params.component].constructor; + const scalar_builder = dataType[t.params.component].scalar_builder; // Create the scalar values that will be selected from, either as scalars // or vectors. @@ -98,39 +110,40 @@ fn(async (t) => { // Each boolean will select between c[k] and c[k+4]. Those values must // always compare as different. The tricky case is boolean, where the parity // has to be different, i.e. c[k]-c[k+4] must be odd. - const c = [0, 1, 2, 3, 5, 6, 7, 8].map((i) => cons(i)); + const scalars = [0, 1, 2, 3, 5, 6, 7, 8].map((i) => scalar_builder(i)); + // Now form vectors that will have different components from each other. - const v2a = vec2(c[0], c[1]); - const v2b = vec2(c[4], c[5]); - const v3a = vec3(c[0], c[1], c[2]); - const v3b = vec3(c[4], c[5], c[6]); - const v4a = vec4(c[0], c[1], c[2], c[3]); - const v4b = vec4(c[4], c[5], c[6], c[7]); + const v2a = vec2(scalars[0], scalars[1]); + const v2b = vec2(scalars[4], scalars[5]); + const v3a = vec3(scalars[0], scalars[1], scalars[2]); + const v3b = vec3(scalars[4], scalars[5], scalars[6]); + const v4a = vec4(scalars[0], scalars[1], scalars[2], scalars[3]); + const v4b = vec4(scalars[4], scalars[5], scalars[6], scalars[7]); const overloads = { scalar: { type: componentType, cases: [ - { input: [c[0], c[1], False], expected: c[0] }, - { input: [c[0], c[1], True], expected: c[1] }] + { input: [scalars[0], scalars[1], False], expected: scalars[0] }, + { input: [scalars[0], scalars[1], True], expected: scalars[1] }] }, vec2: { - type: TypeVec(2, componentType), + type: Type.vec(2, componentType), cases: [ { input: [v2a, v2b, False], expected: v2a }, { input: [v2a, v2b, True], expected: v2b }] }, vec3: { - type: TypeVec(3, componentType), + type: Type.vec(3, componentType), cases: [ { input: [v3a, v3b, False], expected: v3a }, { input: [v3a, v3b, True], expected: v3b }] }, vec4: { - type: TypeVec(4, componentType), + type: Type.vec(4, componentType), cases: [ { input: [v4a, v4b, False], expected: v4a }, { input: [v4a, v4b, True], expected: v4b }] @@ -141,8 +154,8 @@ fn(async (t) => { await run( t, - t.params.component === 'af' ? abstractBuiltin('select') : builtin('select'), - [overload.type, overload.type, TypeBool], + dataType[t.params.component].shader_builder, + [overload.type, overload.type, Type.bool], overload.type, t.params, overload.cases @@ -155,7 +168,7 @@ desc(`vector tests`). params((u) => u. combine('inputSource', allInputSources). -combine('component', ['b', 'af', 'f', 'h', 'i', 'u']). +combine('component', ['b', 'af', 'f', 'h', 'ai', 'i', 'u']). combine('overload', ['vec2', 'vec3', 'vec4']) ). beforeAllSubcases((t) => { @@ -163,17 +176,18 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); } t.skipIf(t.params.component === 'af' && t.params.inputSource !== 'const'); + t.skipIf(t.params.component === 'ai' && t.params.inputSource !== 'const'); }). fn(async (t) => { const componentType = dataType[t.params.component].type; - const cons = dataType[t.params.component].constructor; + const scalar_builder = dataType[t.params.component].scalar_builder; // Create the scalar values that will be selected from. // // Each boolean will select between c[k] and c[k+4]. Those values must // always compare as different. The tricky case is boolean, where the parity // has to be different, i.e. c[k]-c[k+4] must be odd. - const c = [0, 1, 2, 3, 5, 6, 7, 8].map((i) => cons(i)); + const scalars = [0, 1, 2, 3, 5, 6, 7, 8].map((i) => scalar_builder(i)); const T = True; const F = False; @@ -181,11 +195,11 @@ fn(async (t) => { switch (t.params.overload) { case 'vec2':{ - const a = vec2(c[0], c[1]); - const b = vec2(c[4], c[5]); + const a = vec2(scalars[0], scalars[1]); + const b = vec2(scalars[4], scalars[5]); tests = { - dataType: TypeVec(2, componentType), - boolType: TypeVec(2, TypeBool), + dataType: Type.vec(2, componentType), + boolType: Type.vec(2, Type.bool), cases: [ { input: [a, b, vec2(F, F)], expected: vec2(a.x, a.y) }, { input: [a, b, vec2(F, T)], expected: vec2(a.x, b.y) }, @@ -196,11 +210,11 @@ fn(async (t) => { break; } case 'vec3':{ - const a = vec3(c[0], c[1], c[2]); - const b = vec3(c[4], c[5], c[6]); + const a = vec3(scalars[0], scalars[1], scalars[2]); + const b = vec3(scalars[4], scalars[5], scalars[6]); tests = { - dataType: TypeVec(3, componentType), - boolType: TypeVec(3, TypeBool), + dataType: Type.vec(3, componentType), + boolType: Type.vec(3, Type.bool), cases: [ { input: [a, b, vec3(F, F, F)], expected: vec3(a.x, a.y, a.z) }, { input: [a, b, vec3(F, F, T)], expected: vec3(a.x, a.y, b.z) }, @@ -215,11 +229,11 @@ fn(async (t) => { break; } case 'vec4':{ - const a = vec4(c[0], c[1], c[2], c[3]); - const b = vec4(c[4], c[5], c[6], c[7]); + const a = vec4(scalars[0], scalars[1], scalars[2], scalars[3]); + const b = vec4(scalars[4], scalars[5], scalars[6], scalars[7]); tests = { - dataType: TypeVec(4, componentType), - boolType: TypeVec(4, TypeBool), + dataType: Type.vec(4, componentType), + boolType: Type.vec(4, Type.bool), cases: [ { input: [a, b, vec4(F, F, F, F)], expected: vec4(a.x, a.y, a.z, a.w) }, { input: [a, b, vec4(F, F, F, T)], expected: vec4(a.x, a.y, a.z, b.w) }, @@ -245,7 +259,7 @@ fn(async (t) => { await run( t, - t.params.component === 'af' ? abstractBuiltin('select') : builtin('select'), + dataType[t.params.component].shader_builder, [tests.dataType, tests.dataType, tests.boolType], tests.dataType, t.params, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.cache.js index a090c5c83dc..839f97d59a0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.cache.js @@ -1,12 +1,12 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { i32 } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js';import { fullI32Range } from '../../../../../util/math.js'; +**/import { abstractInt, i32 } from '../../../../../util/conversion.js';import { FP } from '../../../../../util/floating_point.js';import { fullI32Range, fullI64Range } from '../../../../../util/math.js'; import { makeCaseCache } from '../../case_cache.js'; // Cases: [f32|f16|abstract] const fp_cases = ['f32', 'f16', 'abstract']. map((trait) => ({ - [`${trait}`]: () => { + [`${trait === 'abstract' ? 'abstract_float' : trait}`]: () => { return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), 'unfiltered', @@ -22,5 +22,10 @@ export const d = makeCaseCache('sign', { fullI32Range().map((i) => { const signFunc = (i) => i < 0 ? -1 : i > 0 ? 1 : 0; return { input: [i32(i)], expected: i32(signFunc(i)) }; + }), + abstract_int: () => + fullI64Range().map((i) => { + const signFunc = (i) => i < 0n ? -1n : i > 0n ? 1n : 0n; + return { input: [abstractInt(i)], expected: abstractInt(signFunc(i)) }; }) }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.spec.js index aeddf2b5581..7f9218e7ef8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sign.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'sign' builtin function -S is AbstractFloat, AbstractInt, i32, f32, f16 +S is abstract-float, Type.abstractInt, i32, f32, f16 T is S or vecN @const fn sign(e: T ) -> T Returns the sign of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32, TypeI32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, abstractIntBuiltin, builtin } from './builtin.js'; import { d } from './sign.cache.js'; export const g = makeTestGroup(GPUTest); @@ -26,17 +26,29 @@ combine('inputSource', onlyConstInputSource). combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const cases = await d.get('abstract'); - await run(t, abstractBuiltin('sign'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + const cases = await d.get('abstract_float'); + await run( + t, + abstractFloatBuiltin('sign'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); }); g.test('abstract_int'). specURL('https://www.w3.org/TR/WGSL/#sign-builtin'). desc(`abstract int tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_int'); + await run(t, abstractIntBuiltin('sign'), [Type.abstractInt], Type.abstractInt, t.params, cases); +}); g.test('i32'). specURL('https://www.w3.org/TR/WGSL/#sign-builtin'). @@ -46,7 +58,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('i32'); - await run(t, builtin('sign'), [TypeI32], TypeI32, t.params, cases); + await run(t, builtin('sign'), [Type.i32], Type.i32, t.params, cases); }); g.test('f32'). @@ -57,7 +69,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('sign'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('sign'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -71,5 +83,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('sign'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('sign'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.cache.js index 67825c91c6f..69457c8b270 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.cache.js @@ -2,8 +2,8 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( @@ -12,8 +12,9 @@ map((trait) => ({ ...linearRange(-Math.PI, Math.PI, 100), ...FP[trait].scalarRange()], - 'unfiltered', - FP[trait].sinInterval + trait === 'abstract' ? 'finite' : 'unfiltered', + // sin has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].sinInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.spec.js index 76224e1cace..85a7a665f71 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sin.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'sin' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn sin(e: T ) -> T Returns the sine of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './sin.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('sin'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -39,7 +51,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('sin'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('sin'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +65,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('sin'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('sin'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.cache.js index 4dadd1e1e3c..0a9b03fb0a8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.cache.js @@ -1,15 +1,19 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract]_[non_]const +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].sinhInterval + // sinh has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].sinhInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.spec.js index ffe701e6161..c19a84ebc24 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sinh.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'sinh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn sinh(e: T ) -> T Returns the hyperbolic sine of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './sinh.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('sinh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('sinh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('sinh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('sinh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('sinh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.cache.js index 5af2eea9f01..9a379eed1d9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.cache.js @@ -2,16 +2,20 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; // Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarTripleToIntervalCases( FP[trait].sparseScalarRange(), FP[trait].sparseScalarRange(), FP[trait].sparseScalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].smoothStepInterval + // smoothstep has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].smoothStepInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.spec.js index 52bda2bf77e..353f70a00c3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/smoothstep.spec.js @@ -3,7 +3,7 @@ **/export const description = ` Execution tests for the 'smoothstep' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn smoothstep(low: T , high: T , x: T ) -> T Returns the smooth Hermite interpolation between 0 and 1. @@ -11,10 +11,10 @@ Component-wise when T is a vector. For scalar T, the result is t * t * (3.0 - 2.0 * t), where t = clamp((x - low) / (high - low), 0.0, 1.0). `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './smoothstep.cache.js'; export const g = makeTestGroup(GPUTest); @@ -23,9 +23,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('smoothstep'), + [Type.abstractFloat, Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -35,7 +47,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('smoothstep'), [TypeF32, TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('smoothstep'), [Type.f32, Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -49,5 +61,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('smoothstep'), [TypeF16, TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('smoothstep'), [Type.f16, Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.cache.js index 514a734274b..af8f0ba376e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.cache.js @@ -2,14 +2,18 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; // Cases: [f32|f16]_[non_]const -const cases = ['f32', 'f16']. +const cases = ['f32', 'f16', 'abstract']. flatMap((trait) => [true, false].map((nonConst) => ({ [`${trait}_${nonConst ? 'non_const' : 'const'}`]: () => { + if (trait === 'abstract' && nonConst) { + return []; + } return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), nonConst ? 'unfiltered' : 'finite', - FP[trait].sqrtInterval + // sqrt has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].sqrtInterval ); } })) diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.spec.js index e01df292609..b2bc38b8ce5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/sqrt.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'sqrt' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn sqrt(e: T ) -> T Returns the square root of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './sqrt.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract_const'); + await run( + t, + abstractFloatBuiltin('sqrt'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, builtin('sqrt'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('sqrt'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f16_const' : 'f16_non_const'); - await run(t, builtin('sqrt'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('sqrt'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.cache.js index 96ac3a4f287..91f05db9d46 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.cache.js @@ -27,13 +27,13 @@ const makeCase = (trait, edge, x) => { }; }; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait]. - scalarRange(). - flatMap((edge) => FP[trait].scalarRange().map((x) => makeCase(trait, edge, x))); + sparseScalarRange(). + flatMap((edge) => FP[trait].sparseScalarRange().map((x) => makeCase(trait, edge, x))); } })). reduce((a, b) => ({ ...a, ...b }), {}); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.spec.js index 15ab23462f9..86c7b64ba7c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/step.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'step' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn step(edge: T ,x: T ) -> T Returns 1.0 if edge ≤ x, and 0.0 otherwise. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './step.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('step'), + [Type.abstractFloat, Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('step'), [TypeF32, TypeF32], TypeF32, t.params, cases); + await run(t, builtin('step'), [Type.f32, Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('step'), [TypeF16, TypeF16], TypeF16, t.params, cases); + await run(t, builtin('step'), [Type.f16, Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.cache.js index 205cb6d6cfe..d88c4a29075 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.cache.js @@ -2,8 +2,8 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { linearRange } from '../../../../../util/math.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( @@ -13,7 +13,8 @@ map((trait) => ({ ...FP[trait].scalarRange()], 'unfiltered', - FP[trait].tanInterval + // tan has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].tanInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.spec.js index 335e0e229e4..af936622e26 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tan.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'tan' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn tan(e: T ) -> T Returns the tangent of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './tan.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('tan'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('tan'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('tan'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('tan'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('tan'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.cache.js index d38767af979..a1ec6c9e7f6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.cache.js @@ -1,14 +1,15 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { FP } from '../../../../../util/floating_point.js';import { makeCaseCache } from '../../case_cache.js'; -// Cases: [f32|f16] -const cases = ['f32', 'f16']. +// Cases: [f32|f16|abstract] +const cases = ['f32', 'f16', 'abstract']. map((trait) => ({ [`${trait}`]: () => { return FP[trait].generateScalarToIntervalCases( FP[trait].scalarRange(), 'unfiltered', - FP[trait].tanhInterval + // tanh has an inherited accuracy, so is only expected to be as accurate as f32 + FP[trait !== 'abstract' ? trait : 'f32'].tanhInterval ); } })). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.spec.js index 8e0d6bbe3ea..9c7b348f103 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/tanh.spec.js @@ -3,16 +3,16 @@ **/export const description = ` Execution tests for the 'tanh' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn tanh(e: T ) -> T Returns the hyperbolic tangent of e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF16, TypeF32 } from '../../../../../util/conversion.js'; -import { allInputSources, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './tanh.cache.js'; export const g = makeTestGroup(GPUTest); @@ -21,9 +21,21 @@ g.test('abstract_float'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). desc(`abstract float tests`). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); +fn(async (t) => { + const cases = await d.get('abstract'); + await run( + t, + abstractFloatBuiltin('tanh'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); +}); g.test('f32'). specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions'). @@ -33,7 +45,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('tanh'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('tanh'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -47,5 +59,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('tanh'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('tanh'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimension.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimension.spec.js deleted file mode 100644 index 8ed1e289ee4..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimension.spec.js +++ /dev/null @@ -1,160 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = ` -Execution tests for the 'textureDimension' builtin function - -The dimensions of the texture in texels. -For textures based on cubes, the results are the dimensions of each face of the cube. -Cube faces are square, so the x and y components of the result are equal. -If level is outside the range [0, textureNumLevels(t)) then any valid value for the return type may be returned. -`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; - -export const g = makeTestGroup(GPUTest); - -g.test('sampled'). -specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). -desc( - ` -T: f32, i32, u32 - -fn textureDimensions(t: texture_1d) -> u32 -fn textureDimensions(t: texture_1d, level: u32) -> u32 -fn textureDimensions(t: texture_2d) -> vec2 -fn textureDimensions(t: texture_2d, level: u32) -> vec2 -fn textureDimensions(t: texture_2d_array) -> vec2 -fn textureDimensions(t: texture_2d_array, level: u32) -> vec2 -fn textureDimensions(t: texture_3d) -> vec3 -fn textureDimensions(t: texture_3d, level: u32) -> vec3 -fn textureDimensions(t: texture_cube) -> vec2 -fn textureDimensions(t: texture_cube, level: u32) -> vec2 -fn textureDimensions(t: texture_cube_array) -> vec2 -fn textureDimensions(t: texture_cube_array, level: u32) -> vec2 -fn textureDimensions(t: texture_multisampled_2d)-> vec2 - -Parameters: - * t: the sampled texture - * level: - - The mip level, with level 0 containing a full size version of the texture. - - If omitted, the dimensions of level 0 are returned. -` -). -params((u) => -u. -combine('texture_type', [ -'texture_1d', -'texture_2d', -'texture_2d_array', -'texture_3d', -'texture_cube', -'texture_cube_array', -'texture_multisampled_2d'] -). -beginSubcases(). -combine('sampled_type', ['f32-only', 'i32', 'u32']). -combine('level', [undefined, 0, 1, 'textureNumLevels', 'textureNumLevels+1']) -). -unimplemented(); - -g.test('depth'). -specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). -desc( - ` -fn textureDimensions(t: texture_depth_2d) -> vec2 -fn textureDimensions(t: texture_depth_2d, level: u32) -> vec2 -fn textureDimensions(t: texture_depth_2d_array) -> vec2 -fn textureDimensions(t: texture_depth_2d_array, level: u32) -> vec2 -fn textureDimensions(t: texture_depth_cube) -> vec2 -fn textureDimensions(t: texture_depth_cube, level: u32) -> vec2 -fn textureDimensions(t: texture_depth_cube_array) -> vec2 -fn textureDimensions(t: texture_depth_cube_array, level: u32) -> vec2 -fn textureDimensions(t: texture_depth_multisampled_2d)-> vec2 - -Parameters: - * t: the depth or multisampled texture - * level: - - The mip level, with level 0 containing a full size version of the texture. - - If omitted, the dimensions of level 0 are returned. -` -). -params((u) => -u. -combine('texture_type', [ -'texture_depth_2d', -'texture_depth_2d_array', -'texture_depth_cube', -'texture_depth_cube_array', -'texture_depth_multisampled_2d'] -). -beginSubcases(). -combine('level', [undefined, 0, 1, 'textureNumLevels', 'textureNumLevels+1']) -). -unimplemented(); - -g.test('storage'). -specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). -desc( - ` -F: rgba8unorm - rgba8snorm - rgba8uint - rgba8sint - rgba16uint - rgba16sint - rgba16float - r32uint - r32sint - r32float - rg32uint - rg32sint - rg32float - rgba32uint - rgba32sint - rgba32float -A: read, write, read_write - -fn textureDimensions(t: texture_storage_1d) -> u32 -fn textureDimensions(t: texture_storage_2d) -> vec2 -fn textureDimensions(t: texture_storage_2d_array) -> vec2 -fn textureDimensions(t: texture_storage_3d) -> vec3 - -Parameters: - * t: the storage texture -` -). -params((u) => -u. -combine('texel_format', [ -'rgba8unorm', -'rgba8snorm', -'rgba8uint', -'rgba8sint', -'rgba16uint', -'rgba16sint', -'rgba16float', -'r32uint', -'r32sint', -'r32float', -'rg32uint', -'rg32sint', -'rg32float', -'rgba32uint', -'rgba32sint', -'rgba32float'] -). -beginSubcases(). -combine('access_mode', ['read', 'write', 'read_write']) -). -unimplemented(); - -g.test('external'). -specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). -desc( - ` -fn textureDimensions(t: texture_external) -> vec2 - -Parameters: - * t: the external texture -` -). -unimplemented(); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimensions.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimensions.spec.js new file mode 100644 index 00000000000..5d1c9e5df03 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureDimensions.spec.js @@ -0,0 +1,518 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution tests for the 'textureDimensions' builtin function + +The dimensions of the texture in texels. +For textures based on cubes, the results are the dimensions of each face of the cube. +Cube faces are square, so the x and y components of the result are equal. +If level is outside the range [0, textureNumLevels(t)) then any valid value for the return type may be returned. +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { + kAllTextureFormats, + kColorTextureFormats, + kTextureFormatInfo, + sampleTypeForFormatAndAspect, + textureDimensionAndFormatCompatible } from +'../../../../../format_info.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { align } from '../../../../../util/math.js'; + +export const g = makeTestGroup(GPUTest); + +/// The maximum number of texture mipmap levels to test. +/// Keep this small to reduce memory and test permutations. +const kMaxMipsForTest = 3; + +/// The maximum number of texture samples to test. +const kMaxSamplesForTest = 4; + +/// All the possible GPUTextureViewDimensions. +const kAllViewDimensions = [ +'1d', +'2d', +'2d-array', +'3d', +'cube', +'cube-array']; + + +/** @returns the aspects to test for the given format */ +function aspectsForFormat(format) { + const formatInfo = kTextureFormatInfo[format]; + if (formatInfo.depth !== undefined && formatInfo.stencil !== undefined) { + return ['depth-only', 'stencil-only']; + } + return ['all']; +} + +/** @returns the sample counts to test for the given format */ +function samplesForFormat(format) { + const info = kTextureFormatInfo[format]; + return info.multisample ? [1, kMaxSamplesForTest] : [1]; +} + +/** + * @returns a list of number of texture mipmap levels to test, given the format, view dimensions and + * number of samples. + */ +function textureMipCount(params) + + + +{ + if (params.samples !== undefined && params.samples !== 1) { + // https://www.w3.org/TR/webgpu/#texture-creation + // If descriptor.sampleCount > 1: descriptor.mipLevelCount must be 1. + return [1]; + } + if (textureDimensionsForViewDimensions(params.dimensions) === '1d') { + // https://www.w3.org/TR/webgpu/#dom-gputexturedimension-2d + // Only "2d" textures may have mipmaps, be multisampled, use a compressed or depth/stencil + // format, and be used as a render attachment. + return [1]; + } + return [1, kMaxMipsForTest]; +} + +/** + * @returns a list of GPUTextureViewDescriptor.baseMipLevel to test, give the texture mipmap count. + */ +function baseMipLevel(params) { + const out = []; + for (let i = 0; i < params.textureMipCount; i++) { + out.push(i); + } + return out; +} + +/** + * @returns the argument values for the textureDimensions() `level` parameter to test. + * An `undefined` represents a call to textureDimensions() without the level argument. + */ +function textureDimensionsLevel(params) + + + +{ + if (params.samples !== undefined && params.samples > 1) { + return [undefined]; // textureDimensions() overload with `level` not available. + } + const out = [undefined]; + for (let i = 0; i < params.textureMipCount - params.baseMipLevel; i++) { + out.push(i); + } + return out; +} + +/** @returns the GPUTextureViewDimensions to test for the format and number of samples */ +function viewDimensions(params) + + +{ + if (params.samples !== undefined && params.samples > 1) { + // https://www.w3.org/TR/webgpu/#dom-gputexturedimension-2d + // Only 2d textures can be multisampled + return ['2d']; + } + + return kAllViewDimensions.filter((dim) => + textureDimensionAndFormatCompatible(textureDimensionsForViewDimensions(dim), params.format) + ); +} + +/** @returns the GPUTextureDimension for the GPUTextureViewDimension */ +function textureDimensionsForViewDimensions(dim) { + switch (dim) { + case '1d': + return '1d'; + case '2d': + case '2d-array': + case 'cube': + case 'cube-array': + return '2d'; + case '3d': + return '3d'; + } +} + +/** TestValues holds the texture size and expected return value of textureDimensions() */ + + + + + + + +/** @returns The TestValues to use for the given texture dimensions and format */ +function testValues(params) + + + + +{ + // The minimum dimension length, given the number of mipmap levels that are being tested. + const kMinLen = 1 << kMaxMipsForTest; + const kNumCubeFaces = 6; + + const formatInfo = kTextureFormatInfo[params.format]; + const bw = formatInfo.blockWidth; + const bh = formatInfo.blockHeight; + let mip = params.baseMipLevel; + if (params.textureDimensionsLevel !== undefined) { + mip += params.textureDimensionsLevel; + } + + // Magic constants to multiply the minimum texture dimensions with, to provide + // different dimension values in the test. These could be parameterized, but + // these are currently fixed to reduce the number of test parameterizations. + const kMultipleA = 2; + const kMultipleB = 3; + const kMultipleC = 4; + + switch (params.dimensions) { + case '1d':{ + const w = align(kMinLen, bw) * kMultipleA; + return { size: [w], expected: [w >>> mip] }; + } + case '2d':{ + const w = align(kMinLen, bw) * kMultipleA; + const h = align(kMinLen, bh) * kMultipleB; + return { size: [w, h], expected: [w >>> mip, h >>> mip] }; + } + case '2d-array':{ + const w = align(kMinLen, bw) * kMultipleC; + const h = align(kMinLen, bh) * kMultipleB; + return { size: [w, h, 4], expected: [w >>> mip, h >>> mip] }; + } + case '3d':{ + const w = align(kMinLen, bw) * kMultipleA; + const h = align(kMinLen, bh) * kMultipleB; + const d = kMinLen * kMultipleC; + return { + size: [w, h, d], + expected: [w >>> mip, h >>> mip, d >>> mip] + }; + } + case 'cube':{ + const l = align(kMinLen, bw) * align(kMinLen, bh) * kMultipleB; + return { + size: [l, l, kNumCubeFaces], + expected: [l >>> mip, l >>> mip] + }; + } + case 'cube-array':{ + const l = align(kMinLen, bw) * align(kMinLen, bh) * kMultipleC; + return { + size: [l, l, kNumCubeFaces * 3], + expected: [l >>> mip, l >>> mip] + }; + } + } +} + +/** + * Builds a shader module with the texture view bound to the WGSL texture with the given WGSL type, + * which calls textureDimensions(), assigning the result to an output buffer. + * This shader is executed with a compute shader, and the output buffer is compared to + * `values.expected`. + */ +function run( +t, +view, +textureType, +levelArg, +values) +{ + const outputType = values.expected.length > 1 ? `vec${values.expected.length}u` : 'u32'; + const wgsl = ` +@group(0) @binding(0) var texture : ${textureType}; +@group(0) @binding(1) var output : ${outputType}; + +@compute @workgroup_size(1) +fn main() { +output = ${ + levelArg !== undefined ? + `textureDimensions(texture, ${levelArg})` : + 'textureDimensions(texture)' + }; +} +`; + const module = t.device.createShaderModule({ + code: wgsl + }); + const pipeline = t.device.createComputePipeline({ + compute: { module }, + layout: 'auto' + }); + const outputBuffer = t.createBufferTracked({ + size: 32, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + }); + const bindgroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: view }, + { binding: 1, resource: { buffer: outputBuffer } }] + + }); + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindgroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.device.queue.submit([encoder.finish()]); + + t.expectGPUBufferValuesEqual(outputBuffer, new Uint32Array(values.expected)); +} + +/** @returns true if the GPUTextureViewDimension is valid for a storage texture */ +function dimensionsValidForStorage(dimensions) { + switch (dimensions) { + case '1d': + case '2d': + case '2d-array': + case '3d': + return true; + default: + return false; + } +} + +g.test('sampled_and_multisampled'). +specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). +desc( + ` +T: f32, i32, u32 + +fn textureDimensions(t: texture_1d) -> u32 +fn textureDimensions(t: texture_1d, level: u32) -> u32 +fn textureDimensions(t: texture_2d) -> vec2 +fn textureDimensions(t: texture_2d, level: u32) -> vec2 +fn textureDimensions(t: texture_2d_array) -> vec2 +fn textureDimensions(t: texture_2d_array, level: u32) -> vec2 +fn textureDimensions(t: texture_3d) -> vec3 +fn textureDimensions(t: texture_3d, level: u32) -> vec3 +fn textureDimensions(t: texture_cube) -> vec2 +fn textureDimensions(t: texture_cube, level: u32) -> vec2 +fn textureDimensions(t: texture_cube_array) -> vec2 +fn textureDimensions(t: texture_cube_array, level: u32) -> vec2 +fn textureDimensions(t: texture_multisampled_2d)-> vec2 + +Parameters: + * t: the sampled texture + * level: + - The mip level, with level 0 containing a full size version of the texture. + - If omitted, the dimensions of level 0 are returned. +` +). +params((u) => +u. +combine('format', kAllTextureFormats). +unless((p) => kTextureFormatInfo[p.format].color?.type === 'unfilterable-float'). +expand('aspect', (u) => aspectsForFormat(u.format)). +expand('samples', (u) => samplesForFormat(u.format)). +beginSubcases(). +expand('dimensions', viewDimensions). +expand('textureMipCount', textureMipCount). +expand('baseMipLevel', baseMipLevel). +expand('textureDimensionsLevel', textureDimensionsLevel) +). +beforeAllSubcases((t) => { + const info = kTextureFormatInfo[t.params.format]; + t.skipIfTextureFormatNotSupported(t.params.format); + t.selectDeviceOrSkipTestCase(info.feature); +}). +fn((t) => { + t.skipIfTextureViewDimensionNotSupported(t.params.dimensions); + const values = testValues(t.params); + const texture = t.createTextureTracked({ + size: values.size, + dimension: textureDimensionsForViewDimensions(t.params.dimensions), + ...(t.isCompatibility && { textureBindingViewDimension: t.params.dimensions }), + usage: + t.params.samples === 1 ? + GPUTextureUsage.TEXTURE_BINDING : + GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, + format: t.params.format, + sampleCount: t.params.samples, + mipLevelCount: t.params.textureMipCount + }); + const textureView = texture.createView({ + dimension: t.params.dimensions, + aspect: t.params.aspect, + baseMipLevel: t.params.baseMipLevel + }); + + function wgslSampledTextureType() { + const base = t.params.samples !== 1 ? 'texture_multisampled' : 'texture'; + const dimensions = t.params.dimensions.replace('-', '_'); + const sampleType = sampleTypeForFormatAndAspect(t.params.format, t.params.aspect); + switch (sampleType) { + case 'depth': + case 'float': + return `${base}_${dimensions}`; + case 'uint': + return `${base}_${dimensions}`; + case 'sint': + return `${base}_${dimensions}`; + case 'unfilterable-float': + throw new Error(`'${t.params.format}' does not support sampling`); + } + } + + run(t, textureView, wgslSampledTextureType(), t.params.textureDimensionsLevel, values); +}); + +g.test('depth'). +specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). +desc( + ` +fn textureDimensions(t: texture_depth_2d) -> vec2 +fn textureDimensions(t: texture_depth_2d, level: u32) -> vec2 +fn textureDimensions(t: texture_depth_2d_array) -> vec2 +fn textureDimensions(t: texture_depth_2d_array, level: u32) -> vec2 +fn textureDimensions(t: texture_depth_cube) -> vec2 +fn textureDimensions(t: texture_depth_cube, level: u32) -> vec2 +fn textureDimensions(t: texture_depth_cube_array) -> vec2 +fn textureDimensions(t: texture_depth_cube_array, level: u32) -> vec2 +fn textureDimensions(t: texture_depth_multisampled_2d)-> vec2 + +Parameters: + * t: the depth or multisampled texture + * level: + - The mip level, with level 0 containing a full size version of the texture. + - If omitted, the dimensions of level 0 are returned. +` +). +params((u) => +u. +combine('format', kAllTextureFormats). +filter((p) => !!kTextureFormatInfo[p.format].depth). +expand('aspect', (u) => aspectsForFormat(u.format)). +unless((u) => u.aspect === 'stencil-only'). +expand('samples', (u) => samplesForFormat(u.format)). +beginSubcases(). +expand('dimensions', viewDimensions). +expand('textureMipCount', textureMipCount). +expand('baseMipLevel', baseMipLevel). +expand('textureDimensionsLevel', textureDimensionsLevel) +). +beforeAllSubcases((t) => { + const info = kTextureFormatInfo[t.params.format]; + t.skipIfTextureFormatNotSupported(t.params.format); + t.selectDeviceOrSkipTestCase(info.feature); +}). +fn((t) => { + t.skipIfTextureViewDimensionNotSupported(t.params.dimensions); + const values = testValues(t.params); + const texture = t.createTextureTracked({ + size: values.size, + dimension: textureDimensionsForViewDimensions(t.params.dimensions), + ...(t.isCompatibility && { textureBindingViewDimension: t.params.dimensions }), + usage: + t.params.samples === 1 ? + GPUTextureUsage.TEXTURE_BINDING : + GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, + format: t.params.format, + sampleCount: t.params.samples, + mipLevelCount: t.params.textureMipCount + }); + const textureView = texture.createView({ + dimension: t.params.dimensions, + aspect: t.params.aspect, + baseMipLevel: t.params.baseMipLevel + }); + + function wgslDepthTextureType() { + const base = t.params.samples !== 1 ? 'texture_depth_multisampled' : 'texture_depth'; + const dimensions = t.params.dimensions.replace('-', '_'); + return `${base}_${dimensions}`; + } + + run(t, textureView, wgslDepthTextureType(), t.params.textureDimensionsLevel, values); +}); + +g.test('storage'). +specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). +desc( + ` +F: rgba8unorm + rgba8snorm + rgba8uint + rgba8sint + rgba16uint + rgba16sint + rgba16float + r32uint + r32sint + r32float + rg32uint + rg32sint + rg32float + rgba32uint + rgba32sint + rgba32float +A: read, write, read_write + +fn textureDimensions(t: texture_storage_1d) -> u32 +fn textureDimensions(t: texture_storage_2d) -> vec2 +fn textureDimensions(t: texture_storage_2d_array) -> vec2 +fn textureDimensions(t: texture_storage_3d) -> vec3 + +Parameters: + * t: the storage texture +` +). +params((u) => +u. +combine('format', kColorTextureFormats). +filter((p) => kTextureFormatInfo[p.format].color?.storage === true). +expand('aspect', (u) => aspectsForFormat(u.format)). +beginSubcases(). +expand('dimensions', (u) => viewDimensions(u).filter(dimensionsValidForStorage)). +expand('textureMipCount', textureMipCount). +expand('baseMipLevel', baseMipLevel) +). +beforeAllSubcases((t) => { + const info = kTextureFormatInfo[t.params.format]; + t.skipIfTextureFormatNotSupported(t.params.format); + t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format); + t.selectDeviceOrSkipTestCase(info.feature); +}). +fn((t) => { + const values = testValues(t.params); + const texture = t.createTextureTracked({ + size: values.size, + dimension: textureDimensionsForViewDimensions(t.params.dimensions), + usage: GPUTextureUsage.STORAGE_BINDING, + format: t.params.format, + mipLevelCount: t.params.textureMipCount + }); + const textureView = texture.createView({ + dimension: t.params.dimensions, + aspect: t.params.aspect, + mipLevelCount: 1, + baseMipLevel: t.params.baseMipLevel + }); + + function wgslStorageTextureType() { + const dimensions = t.params.dimensions.replace('-', '_'); + return `texture_storage_${dimensions}<${t.params.format}, write>`; + } + + run(t, textureView, wgslStorageTextureType(), undefined, values); +}); + +g.test('external'). +specURL('https://www.w3.org/TR/WGSL/#texturedimensions'). +desc( + ` +fn textureDimensions(t: texture_external) -> vec2 + +Parameters: + * t: the external texture +` +). +unimplemented(); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureLoad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureLoad.spec.js index 269f841850b..7dc13aa0377 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureLoad.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureLoad.spec.js @@ -16,10 +16,58 @@ If an out of bounds access occurs, the built-in function returns one of: * The data for some texel within bounds of the texture * A vector (0,0,0,0) or (0,0,0,1) of the appropriate type for non-depth textures * 0.0 for depth textures -`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; -import { generateCoordBoundaries } from './utils.js'; +TODO: Test textureLoad with depth textures as texture_2d, etc... +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { unreachable, iterRange } from '../../../../../../common/util/util.js'; +import { + isCompressedFloatTextureFormat, + isDepthTextureFormat, + kCompressedTextureFormats, + kEncodableTextureFormats } from +'../../../../../format_info.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { + kFloat32Format, + kFloat16Format, + numberToFloatBits, + pack4x8unorm, + pack4x8snorm } from +'../../../../../util/conversion.js'; +import { TexelFormats } from '../../../../types.js'; + +import { + + checkCallResults, + chooseTextureSize, + createTextureWithRandomDataAndGetTexels, + doTextureCalls, + appendComponentTypeForFormatToTextureType } from + +'./texture_utils.js'; +import { + + + generateCoordBoundaries, + getCoordinateForBoundaries, + getMipLevelFromLevelSpec, + isBoundaryNegative, + isLevelSpecNegative } from +'./utils.js'; + +const kTestableColorFormats = [...kEncodableTextureFormats, ...kCompressedTextureFormats]; + +function filterOutDepthAndCompressedFloatTextureFormats({ format }) { + return !isDepthTextureFormat(format) && !isCompressedFloatTextureFormat(format); +} + +function filterOutU32WithNegativeValues(t) + + + +{ + return t.C === 'i32' || !isLevelSpecNegative(t.level) && !isBoundaryNegative(t.coordsBoundary); +} export const g = makeTestGroup(GPUTest); @@ -50,8 +98,9 @@ specURL('https://www.w3.org/TR/WGSL/#textureload'). desc( ` C is i32 or u32 +L is i32 or u32 -fn textureLoad(t: texture_2d, coords: vec2, level: C) -> vec4 +fn textureLoad(t: texture_2d, coords: vec2, level: L) -> vec4 Parameters: * t: The sampled texture to read from @@ -61,11 +110,58 @@ Parameters: ). params((u) => u. +combine('format', kTestableColorFormats). +filter(filterOutDepthAndCompressedFloatTextureFormats). +beginSubcases(). combine('C', ['i32', 'u32']). -combine('coords', generateCoordBoundaries(2)). -combine('level', [-1, 0, `numlevels-1`, `numlevels`]) +combine('L', ['i32', 'u32']). +combine('coordsBoundary', generateCoordBoundaries(2)). +combine('level', [-1, 0, `numLevels-1`, `numLevels`]). +filter(filterOutU32WithNegativeValues) ). -unimplemented(); +beforeAllSubcases((t) => { + const { format } = t.params; + t.skipIfTextureFormatNotSupported(format); + t.selectDeviceForTextureFormatOrSkipTestCase(t.params.format); +}). +fn(async (t) => { + const { format, C, L, coordsBoundary, level } = t.params; + + // We want at least 4 blocks or something wide enough for 3 mip levels. + const [width, height] = chooseTextureSize({ minSize: 8, minBlocks: 4, format }); + + const descriptor = { + format, + size: { width, height }, + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING + }; + const { texels, texture } = await createTextureWithRandomDataAndGetTexels(t, descriptor); + const mipLevel = getMipLevelFromLevelSpec(texture.mipLevelCount, level); + const coords = getCoordinateForBoundaries(texture, mipLevel, coordsBoundary); + + const calls = [ + { + builtin: 'textureLoad', + coordType: C === 'i32' ? 'i' : 'u', + levelType: L === 'i32' ? 'i' : 'u', + mipLevel, + coords + }]; + + const textureType = appendComponentTypeForFormatToTextureType('texture_2d', texture.format); + const viewDescriptor = {}; + const sampler = undefined; + const results = await doTextureCalls(t, texture, viewDescriptor, textureType, sampler, calls); + const res = await checkCallResults( + t, + { texels, descriptor, viewDescriptor }, + textureType, + sampler, + calls, + results + ); + t.expectOK(res); +}); g.test('sampled_3d'). specURL('https://www.w3.org/TR/WGSL/#textureload'). @@ -85,7 +181,7 @@ params((u) => u. combine('C', ['i32', 'u32']). combine('coords', generateCoordBoundaries(3)). -combine('level', [-1, 0, `numlevels-1`, `numlevels`]) +combine('level', [-1, 0, `numLevels-1`, `numLevels`]) ). unimplemented(); @@ -135,7 +231,7 @@ paramsSubcasesOnly((u) => u. combine('C', ['i32', 'u32']). combine('coords', generateCoordBoundaries(2)). -combine('level', [-1, 0, `numlevels-1`, `numlevels`]) +combine('level', [-1, 0, `numLevels-1`, `numLevels`]) ). unimplemented(); @@ -180,6 +276,334 @@ beginSubcases(). combine('C', ['i32', 'u32']). combine('coords', generateCoordBoundaries(2)). combine('array_index', [-1, 0, `numlayers-1`, `numlayers`]). -combine('level', [-1, 0, `numlevels-1`, `numlevels`]) +combine('level', [-1, 0, `numLevels-1`, `numLevels`]) ). -unimplemented(); \ No newline at end of file +unimplemented(); + +// Returns texel values to use as inputs for textureLoad. +// Values are kept simple to avoid rounding issues. +function shaderValues(format, type) { + switch (type) { + case 'f32':{ + switch (format) { + case 'rbga8snorm': + + return [ + { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, + { r: 0.2, g: 0.4, b: 0.6, a: 0.8 }, + { r: -0.2, g: -0.4, b: -0.6, a: -0.8 }, + { r: 0.2, g: -0.4, b: 0.6, a: -0.8 }, + { r: -0.2, g: 0.4, b: -0.6, a: 0.8 }, + { r: 0.2, g: 0.2, b: 0.2, a: 0.2 }, + { r: -0.2, g: -0.2, b: -0.2, a: -0.2 }, + { r: 0.4, g: 0.4, b: 0.4, a: 0.4 }, + { r: -0.4, g: -0.4, b: -0.4, a: -0.4 }, + { r: 0.6, g: 0.6, b: 0.6, a: 0.6 }, + { r: -0.6, g: -0.6, b: -0.6, a: -0.6 }, + { r: 0.8, g: 0.8, b: 0.8, a: 0.8 }, + { r: -0.8, g: -0.8, b: -0.8, a: -0.8 }]; + + case 'rgba8unorm': + case 'bgra8unorm': + + return [ + { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, + { r: 0.2, g: 0.4, b: 0.6, a: 0.8 }, + { r: 0.9, g: 0.4, b: 0.6, a: 0.8 }, + { r: 0.2, g: 0.9, b: 0.6, a: 0.8 }, + { r: 0.2, g: 0.4, b: 0.9, a: 0.8 }, + { r: 0.2, g: 0.4, b: 0.6, a: 0.9 }, + { r: 0.2, g: 0.2, b: 0.2, a: 0.2 }, + { r: 0.4, g: 0.4, b: 0.4, a: 0.4 }, + { r: 0.6, g: 0.6, b: 0.6, a: 0.6 }, + { r: 0.8, g: 0.8, b: 0.8, a: 0.8 }]; + + default: + // Stick within 16-bit ranges. + + return [ + { r: 100, g: 128, b: 100, a: 128 }, + { r: 64, g: 32, b: 32, a: 64 }, + { r: 8, g: 0, b: 8, a: 0 }, + { r: 0, g: 0, b: 0, a: 0 }, + { r: -100, g: 128, b: 100, a: 128 }, + { r: -64, g: 32, b: 32, a: 64 }, + { r: -8, g: 0, b: 8, a: 0 }, + { r: 100, g: -128, b: 100, a: 128 }, + { r: 64, g: -32, b: 32, a: 64 }, + { r: 8, g: 0, b: 8, a: 0 }, + { r: 100, g: 128, b: -100, a: 128 }, + { r: 64, g: 32, b: -32, a: 64 }, + { r: 8, g: 0, b: -8, a: 0 }, + { r: 100, g: 128, b: 100, a: -128 }, + { r: 64, g: 32, b: 32, a: -64 }, + { r: 8, g: 0, b: 8, a: 0 }]; + + } + break; + } + case 'u32': + // Keep all ranges within u8. + + return [ + { r: 0, g: 0, b: 0, a: 0 }, + { r: 0, g: 8, b: 16, a: 128 }, + { r: 8, g: 16, b: 32, a: 64 }, + { r: 16, g: 32, b: 64, a: 128 }, + { r: 255, g: 254, b: 253, a: 252 }, + { r: 255, g: 255, b: 255, a: 255 }, + { r: 128, g: 64, b: 32, a: 16 }, + { r: 64, g: 32, b: 16, a: 8 }, + { r: 32, g: 16, b: 8, a: 0 }]; + + case 'i32': + // Keep all ranges i8 + + return [ + { r: 0, g: 0, b: 0, a: 0 }, + { r: 0, g: -8, b: 16, a: 127 }, + { r: 8, g: 16, b: -32, a: 64 }, + { r: -16, g: 32, b: 64, a: -128 }, + { r: 127, g: 126, b: 125, a: 124 }, + { r: -128, g: -127, b: -126, a: -125 }, + { r: 127, g: 127, b: 127, a: 127 }, + { r: -128, g: -128, b: -128, a: -128 }]; + + default: + unreachable(`unhandled shader type ${type}`); + break; + } + return []; +} + +g.test('storage_texel_formats'). +desc('Test loading of texel formats'). +params((u) => u.combineWithParams([...TexelFormats, { format: 'bgra8unorm', _shaderType: 'f32' }])). +beforeAllSubcases((t) => { + t.skipIf(!t.hasLanguageFeature('readonly_and_readwrite_storage_textures')); + if (t.params.format === 'bgra8unorm') { + t.selectDeviceOrSkipTestCase('bgra8unorm-storage'); + } else { + t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format); + } +}). +fn((t) => { + const { format, _shaderType } = t.params; + const values = shaderValues(format, _shaderType); + + // To avoid rounding issues, unorm and snorm values are repacked in the shader. + let useType = _shaderType; + let assignValue = `v`; + if (format === 'bgra8unorm' || format === 'rgba8unorm') { + useType = 'u32'; + assignValue = `vec4u(pack4x8unorm(v),0,0,0)`; + } else if (format === 'rgba8snorm') { + useType = 'u32'; + assignValue = `vec4u(pack4x8snorm(v),0,0,0)`; + } + const wgsl = ` +requires readonly_and_readwrite_storage_textures; + +@group(0) @binding(0) +var tex : texture_storage_1d<${format}, read>; + +@group(0) @binding(1) +var out : array>; + +@compute @workgroup_size(${values.length}) +fn main(@builtin(global_invocation_id) gid : vec3u) { + let v = textureLoad(tex, gid.x); + out[gid.x] = ${assignValue}; +}`; + + const bytesPerRow = 256; + let bytesPerTexel = 4; + switch (format) { + case 'rgba16uint': + case 'rgba16sint': + case 'rgba16float': + case 'rg32uint': + case 'rg32sint': + case 'rg32float': + bytesPerTexel = 8; + break; + case 'rgba32uint': + case 'rgba32sint': + case 'rgba32float': + bytesPerTexel = 16; + break; + default: + break; + } + + const textureSize = { + width: bytesPerRow / bytesPerTexel, + height: 1, + depthOrArrayLayers: 1 + }; + const texture = t.createTextureTracked({ + format: format, + dimension: '1d', + size: textureSize, + mipLevelCount: 1, + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_DST + }); + const outputBuffer = t.makeBufferWithContents( + new Uint32Array([...iterRange(values.length * 4, (x) => 0)]), + GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + ); + t.trackForCleanup(outputBuffer); + + const transformed = values.flatMap((x) => { + switch (format) { + case 'rgba8unorm': + return pack4x8unorm(x.r, x.g, x.b, x.a); + case 'bgra8unorm': + return pack4x8unorm(x.b, x.g, x.r, x.a); + case 'rgba8snorm': + return pack4x8snorm(x.r, x.g, x.b, x.a); + case 'r32uint': + case 'r32sint': + return x.r; + case 'rg32uint': + case 'rg32sint': + return [x.r, x.g]; + case 'rgba32uint': + case 'rgba32sint': + return [x.r, x.g, x.b, x.a]; + case 'rgba8uint': + case 'rgba8sint': + return x.r & 0xff | (x.g & 0xff) << 8 | (x.b & 0xff) << 16 | (x.a & 0xff) << 24; + case 'rgba16uint': + case 'rgba16sint': + return [x.r & 0xffff | (x.g & 0xffff) << 16, x.b & 0xffff | (x.a & 0xffff) << 16]; + case 'r32float': + return numberToFloatBits(x.r, kFloat32Format); + case 'rg32float': + return [numberToFloatBits(x.r, kFloat32Format), numberToFloatBits(x.g, kFloat32Format)]; + case 'rgba32float': + return [ + numberToFloatBits(x.r, kFloat32Format), + numberToFloatBits(x.g, kFloat32Format), + numberToFloatBits(x.b, kFloat32Format), + numberToFloatBits(x.a, kFloat32Format)]; + + case 'rgba16float': + return [ + numberToFloatBits(x.r, kFloat16Format) & 0xffff | + (numberToFloatBits(x.g, kFloat16Format) & 0xffff) << 16, + numberToFloatBits(x.b, kFloat16Format) & 0xffff | + (numberToFloatBits(x.a, kFloat16Format) & 0xffff) << 16]; + + default: + unreachable(`unhandled format ${format}`); + break; + } + return 0; + }); + + const texelBuffer = t.makeBufferWithContents( + new Uint32Array([ + ...iterRange(bytesPerRow, (x) => { + if (x < transformed.length) { + return transformed[x]; + } else { + return 0; + } + })] + ), + GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + ); + t.trackForCleanup(texelBuffer); + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: format, + dimension: '1d' + }) + }, + { + binding: 1, + resource: { + buffer: outputBuffer + } + }] + + }); + + const encoder = t.device.createCommandEncoder(); + encoder.copyBufferToTexture( + { + buffer: texelBuffer, + offset: 0, + bytesPerRow, + rowsPerImage: 1 + }, + { texture }, + textureSize + ); + + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.dispatchWorkgroups(1, 1, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + const expected = new Uint32Array( + values.flatMap((x) => { + switch (format) { + case 'r32uint': + case 'r32sint': + return [x.r, 0, 0, 1]; + case 'rg32uint': + case 'rg32sint': + return [x.r, x.g, 0, 1]; + case 'r32float': + return [ + numberToFloatBits(x.r, kFloat32Format), + 0, + 0, + numberToFloatBits(1, kFloat32Format)]; + + case 'rg32float': + return [ + numberToFloatBits(x.r, kFloat32Format), + numberToFloatBits(x.g, kFloat32Format), + 0, + numberToFloatBits(1, kFloat32Format)]; + + case 'rgba32float': + case 'rgba16float': + return [ + numberToFloatBits(x.r, kFloat32Format), + numberToFloatBits(x.g, kFloat32Format), + numberToFloatBits(x.b, kFloat32Format), + numberToFloatBits(x.a, kFloat32Format)]; + + case 'rgba8unorm': + case 'bgra8unorm': + return [pack4x8unorm(x.r, x.g, x.b, x.a), 0, 0, 0]; + case 'rgba8snorm': + return [pack4x8snorm(x.r, x.g, x.b, x.a), 0, 0, 0]; + default: + break; + } + return [x.r, x.g, x.b, x.a]; + }) + ); + t.expectGPUBufferValuesEqual(outputBuffer, expected); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLayers.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLayers.spec.js index 30eeed0e882..835095a2274 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLayers.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLayers.spec.js @@ -5,9 +5,35 @@ Execution tests for the 'textureNumLayers' builtin function Returns the number of layers (elements) of an array texture. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; +import { kTextureFormatInfo } from '../../../../../format_info.js'; +import { TexelFormats } from '../../../../types.js'; -export const g = makeTestGroup(GPUTest); +import { kSampleTypeInfo, WGSLTextureQueryTest } from './texture_utils.js'; + +const kNumLayers = 36; + +function getLayerSettingsAndExpected({ + view_type, + isCubeArray + + + +}) { + const divisor = isCubeArray ? 6 : 1; + return view_type === 'partial' ? + { + baseArrayLayer: 11, + arrayLayerCount: 6, + expected: [6 / divisor] + } : + { + baseArrayLayer: 0, + arrayLayerCount: kNumLayers, + expected: [kNumLayers / divisor] + }; +} + +export const g = makeTestGroup(WGSLTextureQueryTest); g.test('sampled'). specURL('https://www.w3.org/TR/WGSL/#texturenumlayers'). @@ -26,9 +52,49 @@ params((u) => u. combine('texture_type', ['texture_2d_array', 'texture_cube_array']). beginSubcases(). -combine('sampled_type', ['f32-only', 'i32', 'u32']) +combine('sampled_type', ['f32', 'i32', 'u32']). +combine('view_type', ['full', 'partial']) ). -unimplemented(); +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && t.params.view === 'partial', + 'compatibility mode does not support partial layer views' + ); + t.skipIf( + t.isCompatibility && t.params.texture_type === 'texture_cube_array', + 'compatibility mode does not support cube arrays' + ); +}). +fn((t) => { + const { texture_type, sampled_type, view_type } = t.params; + const { format } = kSampleTypeInfo[sampled_type]; + + const texture = t.createTextureTracked({ + format, + usage: GPUTextureUsage.TEXTURE_BINDING, + size: [1, 1, kNumLayers] + }); + + const code = ` +@group(0) @binding(0) var t: ${texture_type}<${sampled_type}>; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumLayers(t); +} + `; + + const { baseArrayLayer, arrayLayerCount, expected } = getLayerSettingsAndExpected({ + view_type, + isCubeArray: texture_type === 'texture_cube_array' + }); + const view = texture.createView({ + dimension: texture_type === 'texture_2d_array' ? '2d-array' : 'cube-array', + baseArrayLayer, + arrayLayerCount + }); + + t.executeAndExpectResult(code, view, expected); +}); g.test('arrayed'). specURL('https://www.w3.org/TR/WGSL/#texturenumlayers'). @@ -42,9 +108,50 @@ Parameters ` ). params((u) => -u.combine('texture_type', ['texture_depth_2d_array', 'texture_depth_cube_array']) +u. +combine('texture_type', ['texture_depth_2d_array', 'texture_depth_cube_array']). +beginSubcases(). +combine('view_type', ['full', 'partial']) ). -unimplemented(); +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && t.params.view === 'partial', + 'compatibility mode does not support partial layer views' + ); + t.skipIf( + t.isCompatibility && t.params.texture_type === 'texture_depth_cube_array', + 'compatibility mode does not support cube arrays' + ); +}). +fn((t) => { + const { texture_type, view_type } = t.params; + + const texture = t.createTextureTracked({ + format: 'depth32float', + usage: GPUTextureUsage.TEXTURE_BINDING, + size: [1, 1, kNumLayers] + }); + + const code = ` +@group(0) @binding(0) var t: ${texture_type}; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumLayers(t); +} + `; + + const { baseArrayLayer, arrayLayerCount, expected } = getLayerSettingsAndExpected({ + view_type, + isCubeArray: texture_type === 'texture_depth_cube_array' + }); + const view = texture.createView({ + dimension: texture_type === 'texture_depth_2d_array' ? '2d-array' : 'cube-array', + baseArrayLayer, + arrayLayerCount + }); + + t.executeAndExpectResult(code, view, expected); +}); g.test('storage'). specURL('https://www.w3.org/TR/WGSL/#texturenumlayers'). @@ -76,25 +183,40 @@ Parameters ). params((u) => u. +combineWithParams(TexelFormats). beginSubcases(). -combine('texel_format', [ -'rgba8unorm', -'rgba8snorm', -'rgba8uint', -'rgba8sint', -'rgba16uint', -'rgba16sint', -'rgba16float', -'r32uint', -'r32sint', -'r32float', -'rg32uint', -'rg32sint', -'rg32float', -'rgba32uint', -'rgba32sint', -'rgba32float'] +combine('access_mode', ['read', 'write', 'read_write']). +filter( + (t) => t.access_mode !== 'read_write' || kTextureFormatInfo[t.format].color?.readWriteStorage ). -combine('access_mode', ['read', 'write', 'read_write']) +combine('view_type', ['full', 'partial']) ). -unimplemented(); \ No newline at end of file +beforeAllSubcases((t) => t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format)). +fn((t) => { + const { format, access_mode, view_type } = t.params; + + const texture = t.createTextureTracked({ + format, + usage: GPUTextureUsage.STORAGE_BINDING, + size: [1, 1, kNumLayers] + }); + + const code = ` +@group(0) @binding(0) var t: texture_storage_2d_array<${format}, ${access_mode}>; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumLayers(t); +} + `; + + const { baseArrayLayer, arrayLayerCount, expected } = getLayerSettingsAndExpected({ + view_type + }); + const view = texture.createView({ + dimension: '2d-array', + baseArrayLayer, + arrayLayerCount + }); + + t.executeAndExpectResult(code, view, expected); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLevels.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLevels.spec.js index 69af41b79ec..9292252108b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLevels.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumLevels.spec.js @@ -5,9 +5,38 @@ Execution tests for the 'textureNumLevels' builtin function Returns the number of mip levels of a texture. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; +import { getTextureDimensionFromView } from '../../../../../util/texture/base.js'; -export const g = makeTestGroup(GPUTest); +import { kSampleTypeInfo, WGSLTextureQueryTest } from './texture_utils.js'; + +function getLevelSettingsAndExpected(viewType, mipLevelCount) { + return viewType === 'partial' ? + { + baseMipLevel: 1, + mipLevelCount: 2, + expected: [2] + } : + { + baseMipLevel: 0, + mipLevelCount, + expected: [mipLevelCount] + }; +} + +const kTextureTypeToViewDimension = { + texture_1d: '1d', + texture_2d: '2d', + texture_2d_array: '2d-array', + texture_3d: '3d', + texture_cube: 'cube', + texture_cube_array: 'cube-array', + texture_depth_2d: '2d', + texture_depth_2d_array: '2d-array', + texture_depth_cube: 'cube', + texture_depth_cube_array: 'cube-array' +}; + +export const g = makeTestGroup(WGSLTextureQueryTest); g.test('sampled'). specURL('https://www.w3.org/TR/WGSL/#texturenumlevels'). @@ -34,12 +63,60 @@ combine('texture_type', [ 'texture_2d_array', 'texture_3d', 'texture_cube', -'texture_cube_array`'] +'texture_cube_array'] ). beginSubcases(). -combine('sampled_type', ['f32-only', 'i32', 'u32']) +combine('sampled_type', ['f32', 'i32', 'u32']). +combine('view_type', ['full', 'partial']) +// 1d textures can't have mipLevelCount > 0 +.filter((t) => t.texture_type !== 'texture_1d' || t.view_type !== 'partial') ). -unimplemented(); +beforeAllSubcases((t) => { + t.skipIfTextureViewDimensionNotSupported(kTextureTypeToViewDimension[t.params.texture_type]); +}). +fn((t) => { + const { texture_type, sampled_type, view_type } = t.params; + const { format } = kSampleTypeInfo[sampled_type]; + + const viewDimension = kTextureTypeToViewDimension[texture_type]; + const dimension = getTextureDimensionFromView(viewDimension); + const isCube = texture_type.includes('cube'); + const width = 64; + const height = dimension === '1d' ? 1 : width; + const depthOrArrayLayers = isCube ? 6 : 1; + const mipCount = dimension === '1d' ? 1 : 4; + const texture = t.createTextureTracked({ + format, + dimension, + usage: GPUTextureUsage.TEXTURE_BINDING, + size: { + width, + height, + depthOrArrayLayers + }, + mipLevelCount: mipCount + }); + + const code = ` +@group(0) @binding(0) var t: ${texture_type}<${sampled_type}>; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumLevels(t); +} + `; + + const { baseMipLevel, mipLevelCount, expected } = getLevelSettingsAndExpected( + view_type, + mipCount + ); + const view = texture.createView({ + dimension: viewDimension, + baseMipLevel, + mipLevelCount + }); + + t.executeAndExpectResult(code, view, expected); +}); g.test('depth'). specURL('https://www.w3.org/TR/WGSL/#texturenumlevels'). @@ -55,11 +132,57 @@ Parameters ` ). params((u) => -u.combine('texture_type', [ +u. +combine('texture_type', [ 'texture_depth_2d', 'texture_depth_2d_array', 'texture_depth_cube', 'texture_depth_cube_array'] -) ). -unimplemented(); \ No newline at end of file +combine('view_type', ['full', 'partial']) +). +beforeAllSubcases((t) => { + t.skipIfTextureViewDimensionNotSupported(kTextureTypeToViewDimension[t.params.texture_type]); +}). +fn((t) => { + const { texture_type, view_type } = t.params; + + const viewDimension = kTextureTypeToViewDimension[texture_type]; + const dimension = getTextureDimensionFromView(viewDimension); + const isCube = texture_type.includes('cube'); + const width = 64; + const height = dimension === '1d' ? 1 : width; + const depthOrArrayLayers = isCube ? 6 : 1; + const mipCount = dimension === '1d' ? 1 : 4; + const texture = t.createTextureTracked({ + format: 'depth32float', + dimension, + usage: GPUTextureUsage.TEXTURE_BINDING, + size: { + width, + height, + depthOrArrayLayers + }, + mipLevelCount: mipCount + }); + + const code = ` +@group(0) @binding(0) var t: ${texture_type}; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumLevels(t); +} + `; + + const { baseMipLevel, mipLevelCount, expected } = getLevelSettingsAndExpected( + view_type, + mipCount + ); + const view = texture.createView({ + dimension: viewDimension, + baseMipLevel, + mipLevelCount + }); + + t.executeAndExpectResult(code, view, expected); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumSamples.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumSamples.spec.js index c192bffe04b..95faec1946a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumSamples.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureNumSamples.spec.js @@ -5,9 +5,10 @@ Execution tests for the 'textureNumSamples' builtin function Returns the number samples per texel in a multisampled texture. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; -export const g = makeTestGroup(GPUTest); +import { kSampleTypeInfo, WGSLTextureQueryTest } from './texture_utils.js'; + +export const g = makeTestGroup(WGSLTextureQueryTest); g.test('sampled'). specURL('https://www.w3.org/TR/WGSL/#texturenumsamples'). @@ -21,8 +22,32 @@ Parameters * t The multisampled texture. ` ). -params((u) => u.beginSubcases().combine('sampled_type', ['f32-only', 'i32', 'u32'])). -unimplemented(); +params((u) => u.beginSubcases().combine('sampled_type', ['f32', 'i32', 'u32'])). +fn((t) => { + const { sampled_type } = t.params; + const { format } = kSampleTypeInfo[sampled_type]; + + const sampleCount = 4; + const texture = t.createTextureTracked({ + format, + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, + size: [1, 1, 1], + sampleCount + }); + + const code = ` +@group(0) @binding(0) var t: texture_multisampled_2d<${sampled_type}>; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumSamples(t); +} + `; + + const expected = [sampleCount]; + const view = texture.createView({}); + + t.executeAndExpectResult(code, view, expected); +}); g.test('depth'). specURL('https://www.w3.org/TR/WGSL/#texturenumsamples'). @@ -34,4 +59,25 @@ Parameters * t The multisampled texture. ` ). -unimplemented(); \ No newline at end of file +fn((t) => { + const sampleCount = 4; + const texture = t.createTextureTracked({ + format: 'depth32float', + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT, + size: [1, 1, 1], + sampleCount + }); + + const code = ` +@group(0) @binding(0) var t: texture_depth_multisampled_2d; +@group(0) @binding(1) var result: u32; +@compute @workgroup_size(1) fn cs() { + result = textureNumSamples(t); +} + `; + + const expected = [sampleCount]; + const view = texture.createView({}); + + t.executeAndExpectResult(code, view, expected); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSample.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSample.spec.js index 7e4bbd77441..bc18d9ad32a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSample.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSample.spec.js @@ -3,34 +3,65 @@ **/export const description = ` Samples a texture. -Must only be used in a fragment shader stage. -Must only be invoked in uniform control flow. +note: uniformity validation is covered in src/webgpu/shader/validation/uniformity/uniformity.spec.ts `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; +import { unreachable } from '../../../../../../common/util/util.js'; +import { + isCompressedTextureFormat, + kCompressedTextureFormats, + kEncodableTextureFormats, + kTextureFormatInfo } from +'../../../../../format_info.js'; +import { GPUTest, TextureTestMixin } from '../../../../../gpu_test.js'; +import { hashU32 } from '../../../../../util/math.js'; +import { + + + + putDataInTextureThenDrawAndCheckResultsComparedToSoftwareRasterizer, + generateSamplePoints2D, + generateSamplePoints3D, + kSamplePointMethods, + doTextureCalls, + checkCallResults, + createTextureWithRandomDataAndGetTexels, + generateSamplePointsCube, + kCubeSamplePointMethods, + + chooseTextureSize } from +'./texture_utils.js'; import { generateCoordBoundaries, generateOffsets } from './utils.js'; -export const g = makeTestGroup(GPUTest); +const kTestableColorFormats = [...kEncodableTextureFormats, ...kCompressedTextureFormats]; -g.test('stage'). -specURL('https://www.w3.org/TR/WGSL/#texturesample'). -desc( - ` -Tests that 'textureSample' can only be called in 'fragment' shaders. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); +function getDepthOrArrayLayersForViewDimension(viewDimension) { + switch (viewDimension) { + case '2d': + return 1; + case '3d': + return 8; + case 'cube': + return 6; + default: + unreachable(); + } +} -g.test('control_flow'). -specURL('https://www.w3.org/TR/WGSL/#texturesample'). -desc( - ` -Tests that 'textureSample' can only be called in uniform control flow. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); +function getTextureTypeForTextureViewDimension(viewDimension) { + switch (viewDimension) { + case '2d': + return 'texture_2d'; + case '3d': + return 'texture_3d'; + case 'cube': + return 'texture_cube'; + default: + unreachable(); + } +} + +export const g = makeTestGroup(TextureTestMixin(GPUTest)); g.test('sampled_1d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturesample'). @@ -70,13 +101,164 @@ Parameters: Values outside of this range will result in a shader-creation error. ` ). -paramsSubcasesOnly((u) => +params((u) => u. -combine('S', ['clamp-to-edge', 'repeat', 'mirror-repeat']). -combine('coords', generateCoordBoundaries(2)). -combine('offset', generateOffsets(2)) +combine('format', kTestableColorFormats). +filter((t) => { + const type = kTextureFormatInfo[t.format].color?.type; + const canPotentialFilter = type === 'float' || type === 'unfilterable-float'; + // We can't easily put random bytes into compressed textures if they are float formats + // since we want the range to be +/- 1000 and not +/- infinity or NaN. + const isFillable = !isCompressedTextureFormat(t.format) || !t.format.endsWith('float'); + return canPotentialFilter && isFillable; +}). +combine('sample_points', kSamplePointMethods). +beginSubcases(). +combine('addressModeU', ['clamp-to-edge', 'repeat', 'mirror-repeat']). +combine('addressModeV', ['clamp-to-edge', 'repeat', 'mirror-repeat']). +combine('minFilter', ['nearest', 'linear']). +combine('offset', [false, true]) ). -unimplemented(); +beforeAllSubcases((t) => { + const { format } = t.params; + t.skipIfTextureFormatNotSupported(format); + const info = kTextureFormatInfo[format]; + if (info.color?.type === 'unfilterable-float') { + t.selectDeviceOrSkipTestCase('float32-filterable'); + } else { + t.selectDeviceForTextureFormatOrSkipTestCase(t.params.format); + } +}). +fn(async (t) => { + const { format, sample_points, addressModeU, addressModeV, minFilter, offset } = t.params; + + // We want at least 4 blocks or something wide enough for 3 mip levels. + const [width, height] = chooseTextureSize({ minSize: 8, minBlocks: 4, format }); + + const descriptor = { + format, + size: { width, height }, + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING + }; + const { texels, texture } = await createTextureWithRandomDataAndGetTexels(t, descriptor); + + const calls = generateSamplePoints2D(50, minFilter === 'nearest', { + method: sample_points, + textureWidth: texture.width, + textureHeight: texture.height + }).map((c, i) => { + const hash = hashU32(i); + return { + builtin: 'textureSample', + coordType: 'f', + coords: c, + offset: offset ? [(hash & 0xf) - 8, (hash >> 4 & 0xf) - 8] : undefined + }; + }); + const sampler = { + addressModeU, + addressModeV, + minFilter, + magFilter: minFilter + }; + const viewDescriptor = {}; + const results = await doTextureCalls( + t, + texture, + viewDescriptor, + 'texture_2d', + sampler, + calls + ); + const res = await checkCallResults( + t, + { texels, descriptor, viewDescriptor }, + 'texture_2d', + sampler, + calls, + results + ); + t.expectOK(res); +}); + +g.test('sampled_2d_coords,derivatives'). +specURL('https://www.w3.org/TR/WGSL/#texturesample'). +desc( + ` +fn textureSample(t: texture_2d, s: sampler, coords: vec2) -> vec4 +fn textureSample(t: texture_2d, s: sampler, coords: vec2, offset: vec2) -> vec4 + +test mip level selection based on derivatives + ` +). +params((u) => +u. +combine('format', kTestableColorFormats). +filter((t) => { + const type = kTextureFormatInfo[t.format].color?.type; + const canPotentialFilter = type === 'float' || type === 'unfilterable-float'; + // We can't easily put random bytes into compressed textures if they are float formats + // since we want the range to be +/- 1000 and not +/- infinity or NaN. + const isFillable = !isCompressedTextureFormat(t.format) || !t.format.endsWith('float'); + return canPotentialFilter && isFillable; +}). +combine('mipmapFilter', ['nearest', 'linear']). +beginSubcases() +// note: this is the derivative we want at sample time. It is not the value +// passed directly to the shader. This way if we change the texture size +// or render target size we can compute the correct values to achieve the +// same results. +.combineWithParams([ +{ ddx: 0.5, ddy: 0.5 }, // test mag filter +{ ddx: 1, ddy: 1 }, // test level 0 +{ ddx: 2, ddy: 1 }, // test level 1 via ddx +{ ddx: 1, ddy: 4 }, // test level 2 via ddy +{ ddx: 1.5, ddy: 1.5 }, // test mix between 1 and 2 +{ ddx: 6, ddy: 6 }, // test mix between 2 and 3 (there is no 3 so we should get just 2) +{ ddx: 1.5, ddy: 1.5, offset: [7, -8] }, // test mix between 1 and 2 with offset +{ ddx: 1.5, ddy: 1.5, offset: [3, -3] }, // test mix between 1 and 2 with offset +{ ddx: 1.5, ddy: 1.5, uvwStart: [-3.5, -4] } // test mix between 1 and 2 with negative coords +]) +). +beforeAllSubcases((t) => { + const { format } = t.params; + t.skipIfTextureFormatNotSupported(format); + const info = kTextureFormatInfo[format]; + if (info.color?.type === 'unfilterable-float') { + t.selectDeviceOrSkipTestCase('float32-filterable'); + } else { + t.selectDeviceForTextureFormatOrSkipTestCase(t.params.format); + } +}). +fn(async (t) => { + const { format, mipmapFilter, ddx, ddy, uvwStart, offset } = t.params; + + // We want at least 4 blocks or something wide enough for 3 mip levels. + const [width, height] = chooseTextureSize({ minSize: 8, minBlocks: 4, format }); + + const descriptor = { + format, + mipLevelCount: 3, + size: { width, height }, + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING + }; + + const sampler = { + addressModeU: 'repeat', + addressModeV: 'repeat', + minFilter: 'linear', + magFilter: 'linear', + mipmapFilter + }; + const viewDescriptor = {}; + await putDataInTextureThenDrawAndCheckResultsComparedToSoftwareRasterizer( + t, + descriptor, + viewDescriptor, + sampler, + { ddx, ddy, uvwStart, offset } + ); +}); g.test('sampled_3d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturesample'). @@ -96,17 +278,104 @@ Parameters: * The offset expression must be a creation-time expression (e.g. vec2(1, 2)). * Each offset component must be at least -8 and at most 7. Values outside of this range will result in a shader-creation error. + +* TODO: test 3d compressed textures formats. Just remove the filter below 'viewDimension' ` ). params((u) => u. -combine('texture_type', ['texture_3d', 'texture_cube']). +combine('format', kTestableColorFormats). +filter((t) => { + const type = kTextureFormatInfo[t.format].color?.type; + const canPotentialFilter = type === 'float' || type === 'unfilterable-float'; + // We can't easily put random bytes into compressed textures if they are float formats + // since we want the range to be +/- 1000 and not +/- infinity or NaN. + const isFillable = !isCompressedTextureFormat(t.format) || !t.format.endsWith('float'); + return canPotentialFilter && isFillable; +}). +combine('viewDimension', ['3d', 'cube']). +filter((t) => !isCompressedTextureFormat(t.format) || t.viewDimension === 'cube'). +combine('sample_points', kCubeSamplePointMethods). +filter((t) => t.sample_points !== 'cube-edges' || t.viewDimension !== '3d'). beginSubcases(). -combine('S', ['clamp-to-edge', 'repeat', 'mirror-repeat']). -combine('coords', generateCoordBoundaries(3)). -combine('offset', generateOffsets(3)) +combine('addressModeU', ['clamp-to-edge', 'repeat', 'mirror-repeat']). +combine('addressModeV', ['clamp-to-edge', 'repeat', 'mirror-repeat']). +combine('addressModeW', ['clamp-to-edge', 'repeat', 'mirror-repeat']). +combine('minFilter', ['nearest', 'linear']). +combine('offset', [false, true]). +filter((t) => t.viewDimension !== 'cube' || t.offset !== true) ). -unimplemented(); +beforeAllSubcases((t) => { + const { format } = t.params; + t.skipIfTextureFormatNotSupported(format); + const info = kTextureFormatInfo[format]; + if (info.color?.type === 'unfilterable-float') { + t.selectDeviceOrSkipTestCase('float32-filterable'); + } else { + t.selectDeviceForTextureFormatOrSkipTestCase(t.params.format); + } +}). +fn(async (t) => { + const { format, viewDimension, sample_points, addressModeU, addressModeV, minFilter, offset } = + t.params; + + const [width, height] = chooseTextureSize({ minSize: 8, minBlocks: 2, format, viewDimension }); + const depthOrArrayLayers = getDepthOrArrayLayersForViewDimension(viewDimension); + + const descriptor = { + format, + dimension: viewDimension === '3d' ? '3d' : '2d', + ...(t.isCompatibility && { textureBindingViewDimension: viewDimension }), + size: { width, height, depthOrArrayLayers }, + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING + }; + const { texels, texture } = await createTextureWithRandomDataAndGetTexels(t, descriptor); + + const calls = ( + viewDimension === '3d' ? + generateSamplePoints3D(50, minFilter === 'nearest', { + method: sample_points, + textureWidth: texture.width, + textureHeight: texture.height, + textureDepthOrArrayLayers: texture.depthOrArrayLayers + }) : + generateSamplePointsCube(50, minFilter === 'nearest', { + method: sample_points, + textureWidth: texture.width, + textureDepthOrArrayLayers: texture.depthOrArrayLayers + })). + map((c, i) => { + const hash = hashU32(i); + return { + builtin: 'textureSample', + coordType: 'f', + coords: c, + offset: offset ? + [(hash & 0xf) - 8, (hash >> 4 & 0xf) - 8, (hash >> 8 & 0xf) - 8] : + undefined + }; + }); + const sampler = { + addressModeU, + addressModeV, + minFilter, + magFilter: minFilter + }; + const viewDescriptor = { + dimension: viewDimension + }; + const textureType = getTextureTypeForTextureViewDimension(viewDimension); + const results = await doTextureCalls(t, texture, viewDescriptor, textureType, sampler, calls); + const res = await checkCallResults( + t, + { texels, descriptor, viewDescriptor }, + textureType, + sampler, + calls, + results + ); + t.expectOK(res); +}); g.test('depth_2d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturesample'). diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleBias.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleBias.spec.js index 7594f3ad5ab..a11274e067f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleBias.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleBias.spec.js @@ -4,8 +4,6 @@ Execution tests for the 'textureSampleBias' builtin function Samples a texture with a bias to the mip level. -Must only be used in a fragment shader stage. -Must only be invoked in uniform control flow. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; @@ -13,26 +11,6 @@ import { generateCoordBoundaries, generateOffsets } from './utils.js'; export const g = makeTestGroup(GPUTest); -g.test('stage'). -specURL('https://www.w3.org/TR/WGSL/#texturesamplebias'). -desc( - ` -Tests that 'textureSampleBias' can only be called in 'fragment' shaders. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); - -g.test('control_flow'). -specURL('https://www.w3.org/TR/WGSL/#texturesamplebias'). -desc( - ` -Tests that 'textureSampleBias' can only be called in uniform control flow. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); - g.test('sampled_2d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturesamplebias'). desc( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleCompare.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleCompare.spec.js index 9f90e69f633..cb34aa652cc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleCompare.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureSampleCompare.spec.js @@ -2,9 +2,6 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` Samples a depth texture and compares the sampled depth values against a reference value. - -Must only be used in a fragment shader stage. -Must only be invoked in uniform control flow. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; @@ -12,26 +9,6 @@ import { generateCoordBoundaries, generateOffsets } from './utils.js'; export const g = makeTestGroup(GPUTest); -g.test('stage'). -specURL('https://www.w3.org/TR/WGSL/#texturesamplecompare'). -desc( - ` -Tests that 'textureSampleCompare' can only be called in 'fragment' shaders. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); - -g.test('control_flow'). -specURL('https://www.w3.org/TR/WGSL/#texturesamplecompare'). -desc( - ` -Tests that 'textureSampleCompare' can only be called in uniform control flow. -` -). -params((u) => u.combine('stage', ['fragment', 'vertex', 'compute'])). -unimplemented(); - g.test('2d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturesamplecompare'). desc( diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureStore.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureStore.spec.js index 24ee130577f..49e777d4550 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureStore.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/textureStore.spec.js @@ -10,16 +10,23 @@ Note: An out-of-bounds access occurs if: * any element of coords is outside the range [0, textureDimensions(t)) for the corresponding element, or * array_index is outside the range of [0, textureNumLayers(t)) -If an out-of-bounds access occurs, the built-in function may do any of the following: - * not be executed - * store value to some in bounds texel +If an out-of-bounds access occurs, the built-in function should not be executed. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { GPUTest } from '../../../../../gpu_test.js'; +import { unreachable, iterRange } from '../../../../../../common/util/util.js'; +import { GPUTest, TextureTestMixin } from '../../../../../gpu_test.js'; +import { + kFloat32Format, + kFloat16Format, + numberToFloatBits, + pack4x8unorm, + pack4x8snorm } from +'../../../../../util/conversion.js'; +import { virtualMipSize } from '../../../../../util/texture/base.js'; import { TexelFormats } from '../../../../types.js'; import { generateCoordBoundaries } from './utils.js'; -export const g = makeTestGroup(GPUTest); +export const g = makeTestGroup(TextureTestMixin(GPUTest)); g.test('store_1d_coords'). specURL('https://www.w3.org/TR/WGSL/#texturestore'). @@ -119,4 +126,725 @@ beginSubcases(). combine('coords', generateCoordBoundaries(3)). combine('C', ['i32', 'u32']) ). -unimplemented(); \ No newline at end of file +unimplemented(); + +// Returns shader input values for texel format tests. +// Values are intentionally simple to avoid rounding issues. +function inputArray(format) { + switch (format) { + case 'rgba8snorm': + return [-1.1, 1.0, -0.6, -0.3, 0, 0.3, 0.6, 1.0, 1.1]; + case 'rgba8unorm': + case 'bgra8unorm': + return [-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.1]; + case 'rgba8uint': + case 'rgba16uint': + case 'rgba32uint': + case 'r32uint': + case 'rg32uint': + // Stick within 8-bit ranges for simplicity. + return [0, 8, 16, 24, 32, 64, 100, 128, 200, 255]; + case 'rgba8sint': + case 'rgba16sint': + case 'rgba32sint': + case 'r32sint': + case 'rg32sint': + // Stick within 8-bit ranges for simplicity. + return [-128, -100, -64, -32, -16, -8, 0, 8, 16, 32, 64, 100, 127]; + case 'rgba16float': + case 'rgba32float': + case 'r32float': + case 'rg32float': + // Stick with simple values. + return [-100, -50, -32, -16, -8, -1, 0, 1, 8, 16, 32, 50, 100]; + default: + unreachable(`unhandled format ${format}`); + break; + } + return []; +} + +g.test('texel_formats'). +desc(`Test storage of texel formats`). +params((u) => u.combineWithParams([...TexelFormats, { format: 'bgra8unorm', _shaderType: 'f32' }])). +beforeAllSubcases((t) => { + if (t.params.format === 'bgra8unorm') { + t.selectDeviceOrSkipTestCase('bgra8unorm-storage'); + } else { + t.skipIfTextureFormatNotUsableAsStorageTexture(t.params.format); + } +}). +fn((t) => { + const { format, _shaderType } = t.params; + const values = inputArray(format); + + let numChannels = 4; + switch (format) { + case 'r32uint': + case 'r32sint': + case 'r32float': + numChannels = 1; + break; + case 'rg32uint': + case 'rg32sint': + case 'rg32float': + numChannels = 2; + break; + default: + break; + } + + let zeroVal = ``; + if (numChannels > 1) { + zeroVal = `val[idx % ${numChannels}] = 0;`; + } + + let wgsl = ` +const range = array(`; + for (const v of values) { + wgsl += `${v},\n`; + } + + wgsl += ` +); + +@group(0) @binding(0) +var tex : texture_storage_1d<${format}, write>; + +@compute @workgroup_size(${values.length}) +fn main(@builtin(global_invocation_id) gid : vec3u) { + let idx = gid.x; + let scalarVal = range[idx]; + let vecVal = vec4(scalarVal); + var val = vec4<${_shaderType}>(vecVal); + ${zeroVal} + textureStore(tex, gid.x, val); +} +`; + + const numTexels = values.length; + const textureSize = { width: numTexels, height: 1, depthOrArrayLayers: 1 }; + const texture = t.createTextureTracked({ + format: format, + dimension: '1d', + size: textureSize, + mipLevelCount: 1, + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC + }); + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: format, + dimension: '1d' + }) + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.dispatchWorkgroups(1, 1, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + let bytesPerTexel = 4; + switch (format) { + case 'rgba16uint': + case 'rgba16sint': + case 'rgba16float': + case 'rg32uint': + case 'rg32sint': + case 'rg32float': + bytesPerTexel = 8; + break; + case 'rgba32uint': + case 'rgba32sint': + case 'rgba32float': + bytesPerTexel = 16; + break; + default: + break; + } + + let zeroChannel = 0; + const buffer = t.copyWholeTextureToNewBufferSimple(texture, 0); + const uintsPerTexel = bytesPerTexel / 4; + const expected = new Uint32Array([ + ...iterRange(numTexels * uintsPerTexel, (x) => { + const idx = Math.floor(x / uintsPerTexel); + const channel = idx % numChannels; + zeroChannel = zeroChannel % numChannels; + const shaderVal = values[idx]; + switch (format) { + case 'rgba8unorm':{ + const vals = [shaderVal, shaderVal, shaderVal, shaderVal]; + vals[zeroChannel++] = 0; + return pack4x8unorm(vals[0], vals[1], vals[2], vals[3]); + } + case 'bgra8unorm':{ + const vals = [shaderVal, shaderVal, shaderVal, shaderVal]; + vals[zeroChannel++] = 0; + return pack4x8unorm(vals[2], vals[1], vals[0], vals[3]); + } + case 'rgba8snorm':{ + const vals = [shaderVal, shaderVal, shaderVal, shaderVal]; + vals[zeroChannel++] = 0; + return pack4x8snorm(vals[0], vals[1], vals[2], vals[3]); + } + case 'r32uint': + case 'r32sint': + return shaderVal; + case 'rg32uint': + case 'rgba32uint': + case 'rg32sint': + case 'rgba32sint':{ + const maskedVal = channel === zeroChannel++ ? 0 : shaderVal; + return maskedVal; + } + case 'rgba8uint': + case 'rgba8sint':{ + const vals = [shaderVal, shaderVal, shaderVal, shaderVal]; + vals[zeroChannel++] = 0; + return ( + (vals[3] & 0xff) << 24 | + (vals[2] & 0xff) << 16 | + (vals[1] & 0xff) << 8 | + vals[0] & 0xff); + + } + case 'rgba16uint': + case 'rgba16sint':{ + // 4 channels split over 2 uint32s. + // Determine if this pair has the zero channel. + const vals = [shaderVal, shaderVal]; + const lowChannels = (x & 0x1) === 0; + if (lowChannels) { + if (zeroChannel < 2) { + vals[zeroChannel] = 0; + } + } else { + if (zeroChannel >= 2) { + vals[zeroChannel - 2] = 0; + } + zeroChannel++; + } + return (vals[1] & 0xffff) << 16 | vals[0] & 0xffff; + } + case 'r32float':{ + return numberToFloatBits(shaderVal, kFloat32Format); + } + case 'rg32float': + case 'rgba32float':{ + const maskedVal = channel === zeroChannel++ ? 0 : shaderVal; + return numberToFloatBits(maskedVal, kFloat32Format); + } + case 'rgba16float':{ + // 4 channels split over 2 uint32s. + // Determine if this pair has the zero channel. + const bits = numberToFloatBits(shaderVal, kFloat16Format); + const vals = [bits, bits]; + const lowChannels = (x & 0x1) === 0; + if (lowChannels) { + if (zeroChannel < 2) { + vals[zeroChannel] = 0; + } + } else { + if (zeroChannel >= 2) { + vals[zeroChannel - 2] = 0; + } + zeroChannel++; + } + return (vals[1] & 0xffff) << 16 | vals[0] & 0xffff; + } + default: + unreachable(`unhandled format ${format}`); + break; + } + return 0; + })] + ); + t.expectGPUBufferValuesEqual(buffer, expected); +}); + +g.test('bgra8unorm_swizzle'). +desc('Test bgra8unorm swizzling'). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('bgra8unorm-storage'); +}). +fn((t) => { + const values = [ + { r: -1.1, g: 0.6, b: 0.4, a: 1 }, + { r: 1.1, g: 0.6, b: 0.4, a: 1 }, + { r: 0.4, g: -1.1, b: 0.6, a: 1 }, + { r: 0.4, g: 1.1, b: 0.6, a: 1 }, + { r: 0.6, g: 0.4, b: -1.1, a: 1 }, + { r: 0.6, g: 0.4, b: 1.1, a: 1 }, + { r: 0.2, g: 0.4, b: 0.6, a: 1 }, + { r: -0.2, g: -0.4, b: -0.6, a: 1 }]; + + let wgsl = ` +@group(0) @binding(0) var tex : texture_storage_1d; + +const values = array(`; + for (const v of values) { + wgsl += `vec4(${v.r},${v.g},${v.b},${v.a}),\n`; + } + wgsl += `); + +@compute @workgroup_size(${values.length}) +fn main(@builtin(global_invocation_id) gid : vec3u) { + let value = values[gid.x]; + textureStore(tex, gid.x, value); +}`; + + const numTexels = values.length; + const textureSize = { width: numTexels, height: 1, depthOrArrayLayers: 1 }; + const texture = t.createTextureTracked({ + format: 'bgra8unorm', + dimension: '1d', + size: textureSize, + mipLevelCount: 1, + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC + }); + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: 'bgra8unorm', + dimension: '1d' + }) + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.dispatchWorkgroups(1, 1, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + const buffer = t.copyWholeTextureToNewBufferSimple(texture, 0); + const expected = new Uint32Array([ + ...iterRange(numTexels, (x) => { + const { r, g, b, a } = values[x]; + return pack4x8unorm(b, g, r, a); + })] + ); + t.expectGPUBufferValuesEqual(buffer, expected); +}); + +// Texture width for dimensions >1D. +// Sized such that mip level 2 will be at least 256 bytes/row. +const kWidth = 256; + +// Returns the texture geometry based on a given number of texels. +function getTextureSize(numTexels, dim, array) { + const size = { width: 1, height: 1, depthOrArrayLayers: 1 }; + switch (dim) { + case '1d': + size.width = numTexels; + break; + case '2d':{ + const texelsPerArray = numTexels / array; + size.width = kWidth; + size.height = texelsPerArray / kWidth; + size.depthOrArrayLayers = array; + break; + } + case '3d': + size.width = kWidth; + size.height = numTexels / (2 * kWidth); + size.depthOrArrayLayers = 2; + break; + } + return size; +} + +// WGSL declaration type for the texture. +function textureType(dim) { + return `texture_storage_${dim}`; +} + +// Defines a function to convert linear global id into a texture coordinate. +function indexToCoord(dim, type) { + switch (dim) { + case '1d': + return ` +fn indexToCoord(id : u32) -> ${type} { + return ${type}(id); +}`; + break; + case '2d': + return ` +fn indexToCoord(id : u32) -> vec2<${type}> { + return vec2<${type}>(${type}(id % width), ${type}(id / width)); +}`; + break; + case '3d': + return ` +fn indexToCoord(id : u32) -> vec3<${type}> { + const half = numTexels / depth; + let half_id = id % half; + return vec3<${type}>(${type}(half_id % width), ${type}(half_id / width), ${type}(id / half)); +}`; + break; + } + return ``; +} + +// Mutates 'coords' to produce an out-of-bounds value. +// 1D workgroups are launched so 'gid.x' is the linear id. +// +// This code is only executed for odd global ids (gid.x % 2 == 1). +// All the values are chosen such they will further divide the odd invocations. +function outOfBoundsValue(dim, type) { + switch (dim) { + case '1d':{ + if (type === 'i32') { + return `if gid.x % 3 == 0 { + coords = -coords; + } else { + coords = coords + numTexels; + }`; + } else { + return `coords = coords + numTexels;`; + } + break; + } + case '2d':{ + if (type === 'i32') { + return `if gid.x % 3 == 0 { + coords.x = -coords.x; + } else { + coords.y = coords.y + height; + }`; + } else { + return `if gid.x % 3 == 1 { + coords.x = coords.x + width; + } else { + coords.y = coords.y + height; + }`; + } + break; + } + case '3d':{ + if (type === 'i32') { + return `if gid.x % 3 == 0 { + coords.x = -coords.x; + } else if gid.x % 5 == 0 { + coords.y = coords.y + height; + } else { + coords.z = coords.z + depth; + }`; + } else { + return `if gid.x % 3 == 1 { + coords.x = coords.x + width; + } else if gid.x % 5 == 1 { + coords.y = coords.y + height; + } else { + coords.z = 2 * depth; + }`; + } + break; + } + } + return ``; +} + +// Returns the number of texels for a given mip level. +// +// 1D textures cannot have multiple mip levels so always return the input number of texels. +function getMipTexels(numTexels, dim, mip) { + let texels = numTexels; + if (mip === 0) { + return texels; + } + if (dim === '2d') { + texels /= 1 << mip; + texels /= 1 << mip; + } else if (dim === '3d') { + texels /= 1 << mip; + texels /= 1 << mip; + texels /= 1 << mip; + } + return texels; +} + +const kDims = ['1d', '2d', '3d']; + +g.test('out_of_bounds'). +desc('Test that textureStore on out-of-bounds coordinates have no effect'). +params((u) => +u. +combine('dim', kDims). +combine('coords', ['i32', 'u32']). +combine('mipCount', [1, 2, 3]). +combine('mip', [0, 1, 2]). +filter((t) => { + if (t.dim === '1d') { + return t.mipCount === 1 && t.mip === 0; + } + if (t.dim === '3d') { + return t.mipCount <= 2 && t.mip < t.mipCount; + } + return t.mip < t.mipCount; +}) +). +fn((t) => { + const texel_format = 'r32uint'; + // Chosen such that the even at higher mip counts, + // the texture is laid out without padding. + // This simplifies the checking code below. + // + // Mip level | 1d | 2d | 3d + // ----------------------------------------- + // 0 | 4096 | 256 x 16 | 256 x 8 x 2 + // 1 | - | 128 x 8 | 128 x 4 x 1 + // 2 | - | 64 x 4 | - + const num_texels = 4096; + const view_texels = getMipTexels(num_texels, t.params.dim, t.params.mip); + + const texture_size = getTextureSize(num_texels, t.params.dim, 1); + const mip_size = virtualMipSize(t.params.dim, texture_size, t.params.mip); + const texture = t.createTextureTracked({ + format: texel_format, + dimension: t.params.dim, + size: texture_size, + mipLevelCount: t.params.mipCount, + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC + }); + + const oob_value = outOfBoundsValue(t.params.dim, t.params.coords); + const wgx_size = 32; + const num_wgs_x = view_texels / wgx_size; + + const wgsl = ` +@group(0) @binding(0) var tex : ${textureType(t.params.dim)}; + +const numTexels = ${view_texels}; +const width = ${mip_size[0]}; +const height = ${mip_size[1]}; +const depth = ${mip_size[2]}; + +${indexToCoord(t.params.dim, t.params.coords)} + +@compute @workgroup_size(${wgx_size}) +fn main(@builtin(global_invocation_id) gid : vec3u) { + var coords = indexToCoord(gid.x); + if gid.x % 2 == 1 { + ${oob_value} + } + textureStore(tex, coords, vec4u(gid.x)); +}`; + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: texel_format, + dimension: t.params.dim, + baseArrayLayer: 0, + arrayLayerCount: 1, + baseMipLevel: t.params.mip, + mipLevelCount: 1 + }) + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.dispatchWorkgroups(num_wgs_x, 1, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + for (let m = 0; m < t.params.mipCount; m++) { + const buffer = t.copyWholeTextureToNewBufferSimple(texture, m); + if (m === t.params.mip) { + const expectedOutput = new Uint32Array([ + ...iterRange(view_texels, (x) => { + if (x >= view_texels) { + return 0; + } + if (x % 2 === 1) { + return 0; + } + return x; + })] + ); + t.expectGPUBufferValuesEqual(buffer, expectedOutput); + } else { + const expectedOutput = new Uint32Array([ + ...iterRange(getMipTexels(num_texels, t.params.dim, m), (x) => 0)] + ); + t.expectGPUBufferValuesEqual(buffer, expectedOutput); + } + } +}); + +const kArrayLevels = 4; + +g.test('out_of_bounds_array'). +desc('Test that out-of-bounds array coordinates to textureStore have no effect'). +params((u) => +u. +combine('baseLevel', [0, 1, 2, 3]). +combine('arrayLevels', [1, 2, 3, 4]). +combine('type', ['i32', 'u32']). +filter((t) => { + if (t.arrayLevels <= t.baseLevel) { + return false; + } + if (kArrayLevels < t.baseLevel + t.arrayLevels) { + return false; + } + return true; +}) +). +fn((t) => { + const dim = '2d'; + const view_dim = '2d-array'; + const texel_format = 'r32uint'; + const width = 64; + const height = 64; + const base_texels = width * height; + const num_texels = base_texels * kArrayLevels; + const view_texels = base_texels * t.params.arrayLevels; + const texture_size = { width, height, depthOrArrayLayers: kArrayLevels }; + const view_size = { width, height, depthOrArrayLayers: t.params.arrayLevels }; + + const texture = t.createTextureTracked({ + format: texel_format, + dimension: dim, + size: texture_size, + mipLevelCount: 1, + usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.COPY_SRC + }); + + const wgx_size = 32; + const num_wgs_x = num_texels / wgx_size; + + let oob_value = `layer = layer + layers;`; + if (t.params.type === 'i32') { + oob_value = `if gid.x % 3 == 0 { + layer = -(layer + layers); + } else { + layer = layer + layers; + }`; + } + + const wgsl = ` +@group(0) @binding(0) var tex : texture_storage_2d_array; + +const numTexels = ${view_texels}; +const width = ${view_size.width}; +const height = ${view_size.height ?? 1}; +const layers = ${view_size.depthOrArrayLayers ?? 1}; +const layerTexels = numTexels / layers; + +@compute @workgroup_size(${wgx_size}) +fn main(@builtin(global_invocation_id) gid : vec3u) { + let layer_id = gid.x % layerTexels; + var x = ${t.params.type}(layer_id % width); + var y = ${t.params.type}(layer_id / width); + var layer = ${t.params.type}(gid.x / layerTexels); + if gid.x % 2 == 1 { + ${oob_value} + } + textureStore(tex, vec2(x, y), layer, vec4u(gid.x)); +}`; + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: texel_format, + dimension: view_dim, + baseArrayLayer: t.params.baseLevel, + arrayLayerCount: t.params.arrayLevels, + baseMipLevel: 0, + mipLevelCount: 1 + }) + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.dispatchWorkgroups(num_wgs_x, 1, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + const buffer = t.copyWholeTextureToNewBufferSimple(texture, 0); + const expectedOutput = new Uint32Array([ + ...iterRange(num_texels, (x) => { + const baseOffset = base_texels * t.params.baseLevel; + if (x < baseOffset) { + return 0; + } + if (base_texels * (t.params.baseLevel + t.params.arrayLevels) <= x) { + return 0; + } + if (x % 2 === 1) { + return 0; + } + return x - baseOffset; + })] + ); + t.expectGPUBufferValuesEqual(buffer, expectedOutput); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/texture_utils.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/texture_utils.js new file mode 100644 index 00000000000..4de55d82e5e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/texture_utils.js @@ -0,0 +1,2453 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { keysOf } from '../../../../../../common/util/data_tables.js';import { assert, range, unreachable } from '../../../../../../common/util/util.js';import { + + isCompressedFloatTextureFormat, + isCompressedTextureFormat, + isDepthOrStencilTextureFormat, + kEncodableTextureFormats, + kTextureFormatInfo } from +'../../../../../format_info.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { float32ToUint32 } from '../../../../../util/conversion.js'; +import { + align, + clamp, + dotProduct, + hashU32, + lcm, + lerp, + quantizeToF32 } from +'../../../../../util/math.js'; +import { + effectiveViewDimensionForDimension, + physicalMipSizeFromTexture, + reifyTextureDescriptor, + virtualMipSize } from +'../../../../../util/texture/base.js'; +import { + kTexelRepresentationInfo, + + + + TexelComponent } from + +'../../../../../util/texture/texel_data.js'; +import { TexelView } from '../../../../../util/texture/texel_view.js'; +import { createTextureFromTexelViews } from '../../../../../util/texture.js'; +import { reifyExtent3D } from '../../../../../util/unions.js'; + + + +export const kSampleTypeInfo = { + f32: { + format: 'rgba8unorm' + }, + i32: { + format: 'rgba8sint' + }, + u32: { + format: 'rgba8uint' + } +}; + +/** + * Used for textureDimension, textureNumLevels, textureNumLayers + */ +export class WGSLTextureQueryTest extends GPUTest { + executeAndExpectResult(code, view, expected) { + const { device } = this; + const module = device.createShaderModule({ code }); + const pipeline = device.createComputePipeline({ + layout: 'auto', + compute: { + module + } + }); + + const resultBuffer = this.createBufferTracked({ + size: 16, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + const bindGroup = device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: view }, + { binding: 1, resource: { buffer: resultBuffer } }] + + }); + + const encoder = device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + device.queue.submit([encoder.finish()]); + + const e = new Uint32Array(4); + e.set(expected); + this.expectGPUBufferValuesEqual(resultBuffer, e); + } +} + +function getLimitValue(v) { + switch (v) { + case Number.POSITIVE_INFINITY: + return 1000; + case Number.NEGATIVE_INFINITY: + return -1000; + default: + return v; + } +} + +function getValueBetweenMinAndMaxTexelValueInclusive( +rep, +component, +normalized) +{ + assert(!!rep.numericRange); + const perComponentRanges = rep.numericRange; + const perComponentRange = perComponentRanges[component]; + const range = rep.numericRange; + const { min, max } = perComponentRange ? perComponentRange : range; + return lerp(getLimitValue(min), getLimitValue(max), normalized); +} + +/** + * We need the software rendering to do the same interpolation as the hardware + * rendered so for -srgb formats we set the TexelView to an -srgb format as + * TexelView handles this case. Note: It might be nice to add rgba32float-srgb + * or something similar to TexelView. + */ +export function getTexelViewFormatForTextureFormat(format) { + return format.endsWith('-srgb') ? 'rgba8unorm-srgb' : 'rgba32float'; +} + +const kTextureTypeInfo = { + depth: { + componentType: 'f32', + resultType: 'vec4f', + resultFormat: 'rgba32float' + }, + float: { + componentType: 'f32', + resultType: 'vec4f', + resultFormat: 'rgba32float' + }, + 'unfilterable-float': { + componentType: 'f32', + resultType: 'vec4f', + resultFormat: 'rgba32float' + }, + sint: { + componentType: 'i32', + resultType: 'vec4i', + resultFormat: 'rgba32sint' + }, + uint: { + componentType: 'u32', + resultType: 'vec4u', + resultFormat: 'rgba32uint' + } +}; + +function getTextureFormatTypeInfo(format) { + const info = kTextureFormatInfo[format]; + const type = info.color?.type ?? info.depth?.type ?? info.stencil?.type; + assert(!!type); + return kTextureTypeInfo[type]; +} + +/** + * given a texture type 'base', returns the base with the correct component for the given texture format. + * eg: `getTextureType('texture_2d', someUnsignedIntTextureFormat)` -> `texture_2d` + */ +export function appendComponentTypeForFormatToTextureType(base, format) { + return `${base}<${getTextureFormatTypeInfo(format).componentType}>`; +} + +/** + * Creates a TexelView filled with random values. + */ +export function createRandomTexelView(info) + + +{ + const rep = kTexelRepresentationInfo[info.format]; + const generator = (coords) => { + const texel = {}; + for (const component of rep.componentOrder) { + const rnd = hashU32(coords.x, coords.y, coords.z, component.charCodeAt(0)); + const normalized = clamp(rnd / 0xffffffff, { min: 0, max: 1 }); + texel[component] = getValueBetweenMinAndMaxTexelValueInclusive(rep, component, normalized); + } + return quantize(texel, rep); + }; + return TexelView.fromTexelsAsColors(info.format, generator); +} + +/** + * Creates a mip chain of TexelViews filled with random values + */ +export function createRandomTexelViewMipmap(info) + + + + +{ + const mipLevelCount = info.mipLevelCount ?? 1; + const dimension = info.dimension ?? '2d'; + return range(mipLevelCount, (i) => + createRandomTexelView({ + format: info.format, + size: virtualMipSize(dimension, info.size, i) + }) + ); +} + +// Because it's easy to deal with if these types are all array of number + + + + + + +const kTextureCallArgNames = [ +'coords', +'mipLevel', +'arrayIndex', +'ddx', +'ddy', +'offset']; + + + + + + + + + + + + + + + + + + +function toArray(coords) { + if (coords instanceof Array) { + return coords; + } + return [coords]; +} + +function quantize(texel, repl) { + return repl.bitsToNumber(repl.unpackBits(new Uint8Array(repl.pack(repl.encode(texel))))); +} + +function apply(a, b, op) { + assert(a.length === b.length, `apply(${a}, ${b}): arrays must have same length`); + return a.map((v, i) => op(v, b[i])); +} + +/** + * At the corner of a cubemap we need to sample just 3 texels, not 4. + * The texels are in + * + * 0: (u,v) + * 1: (u + 1, v) + * 2: (u, v + 1) + * 3: (u + 1, v + 1) + * + * We pass in the original 2d (converted from cubemap) texture coordinate. + * If it's within half a pixel of the edge in both directions then it's + * a corner so we return the index of the one texel that's not needed. + * Otherwise we return -1. + */ +function getUnusedCubeCornerSampleIndex(textureSize, coords) { + const u = coords[0] * textureSize; + const v = coords[1] * textureSize; + if (v < 0.5) { + if (u < 0.5) { + return 0; + } else if (u >= textureSize - 0.5) { + return 1; + } + } else if (v >= textureSize - 0.5) { + if (u < 0.5) { + return 2; + } else if (u >= textureSize - 0.5) { + return 3; + } + } + return -1; +} + +const add = (a, b) => apply(a, b, (x, y) => x + y); + + + + + + + +/** + * Converts the src texel representation to an RGBA representation. + */ +function convertPerTexelComponentToResultFormat( +src, +format) +{ + const rep = kTexelRepresentationInfo[format]; + const out = { R: 0, G: 0, B: 0, A: 1 }; + for (const component of rep.componentOrder) { + switch (component) { + case 'Stencil': + case 'Depth': + out.R = src[component]; + break; + default: + assert(out[component] !== undefined); // checks that component = R, G, B or A + out[component] = src[component]; + } + } + return out; +} + +/** + * Convert RGBA result format to texel view format of src texture. + * Effectively this converts something like { R: 0.1, G: 0, B: 0, A: 1 } + * to { Depth: 0.1 } + */ +function convertResultFormatToTexelViewFormat( +src, +format) +{ + const rep = kTexelRepresentationInfo[format]; + const out = {}; + for (const component of rep.componentOrder) { + out[component] = src[component] ?? src.R; + } + return out; +} + +/** + * Returns the expect value for a WGSL builtin texture function for a single + * mip level + */ +export function softwareTextureReadMipLevel( +call, +texture, +sampler, +mipLevel) +{ + const { format } = texture.texels[mipLevel]; + const rep = kTexelRepresentationInfo[format]; + const textureSize = virtualMipSize( + texture.descriptor.dimension || '2d', + texture.descriptor.size, + mipLevel + ); + const addressMode = [ + sampler?.addressModeU ?? 'clamp-to-edge', + sampler?.addressModeV ?? 'clamp-to-edge', + sampler?.addressModeW ?? 'clamp-to-edge']; + + + const load = (at) => + texture.texels[mipLevel].color({ + x: Math.floor(at[0]), + y: Math.floor(at[1] ?? 0), + z: Math.floor(at[2] ?? 0) + }); + + const isCube = texture.viewDescriptor.dimension === 'cube'; + + switch (call.builtin) { + case 'textureSample':{ + let coords = toArray(call.coords); + + if (isCube) { + coords = convertCubeCoordToNormalized3DTextureCoord(coords); + } + + // convert normalized to absolute texel coordinate + // ┌───┬───┬───┬───┐ + // │ a │ │ │ │ norm: a = 1/8, b = 7/8 + // ├───┼───┼───┼───┤ abs: a = 0, b = 3 + // │ │ │ │ │ + // ├───┼───┼───┼───┤ + // │ │ │ │ │ + // ├───┼───┼───┼───┤ + // │ │ │ │ b │ + // └───┴───┴───┴───┘ + let at = coords.map((v, i) => v * textureSize[i] - 0.5); + + // Apply offset in whole texel units + // This means the offset is added at each mip level in texels. There's no + // scaling for each level. + if (call.offset !== undefined) { + at = add(at, toArray(call.offset)); + } + + const samples = []; + + const filter = sampler?.minFilter ?? 'nearest'; + switch (filter) { + case 'linear':{ + // 'p0' is the lower texel for 'at' + const p0 = at.map((v) => Math.floor(v)); + // 'p1' is the higher texel for 'at' + // If it's cube then don't advance Z. + const p1 = p0.map((v, i) => v + (isCube ? i === 2 ? 0 : 1 : 1)); + + // interpolation weights for p0 and p1 + const p1W = at.map((v, i) => v - p0[i]); + const p0W = p1W.map((v) => 1 - v); + + switch (coords.length) { + case 1: + samples.push({ at: p0, weight: p0W[0] }); + samples.push({ at: p1, weight: p1W[0] }); + break; + case 2:{ + samples.push({ at: p0, weight: p0W[0] * p0W[1] }); + samples.push({ at: [p1[0], p0[1]], weight: p1W[0] * p0W[1] }); + samples.push({ at: [p0[0], p1[1]], weight: p0W[0] * p1W[1] }); + samples.push({ at: p1, weight: p1W[0] * p1W[1] }); + break; + } + case 3:{ + // cube sampling, here in the software renderer, is the same + // as 2d sampling. We'll sample at most 4 texels. The weights are + // the same as if it was just one plane. If the points fall outside + // the slice they'll be wrapped by wrapFaceCoordToCubeFaceAtEdgeBoundaries + // below. + if (isCube) { + samples.push({ at: p0, weight: p0W[0] * p0W[1] }); + samples.push({ at: [p1[0], p0[1], p0[2]], weight: p1W[0] * p0W[1] }); + samples.push({ at: [p0[0], p1[1], p0[2]], weight: p0W[0] * p1W[1] }); + samples.push({ at: p1, weight: p1W[0] * p1W[1] }); + const ndx = getUnusedCubeCornerSampleIndex(textureSize[0], coords); + if (ndx >= 0) { + // # Issues with corners of cubemaps + // + // note: I tried multiple things here + // + // 1. distribute 1/3 of the weight of the removed sample to each of the remaining samples + // 2. distribute 1/2 of the weight of the removed sample to the 2 samples that are not the "main" sample. + // 3. normalize the weights of the remaining 3 samples. + // + // none of them matched the M1 in all cases. Checking the dEQP I found this comment + // + // > If any of samples is out of both edges, implementations can do pretty much anything according to spec. + // https://github.com/KhronosGroup/VK-GL-CTS/blob/d2d6aa65607383bb29c8398fe6562c6b08b4de57/framework/common/tcuTexCompareVerifier.cpp#L882 + // + // If I understand this correctly it matches the OpenGL ES 3.1 spec it says + // it's implementation defined. + // + // > OpenGL ES 3.1 section 8.12.1 Seamless Cubemap Filtering + // > + // > - If a texture sample location would lie in the texture + // > border in both u and v (in one of the corners of the + // > cube), there is no unique neighboring face from which to + // > extract one texel. The recommended method to generate this + // > texel is to average the values of the three available + // > samples. However, implementations are free to construct + // > this fourth texel in another way, so long as, when the + // > three available samples have the same value, this texel + // > also has that value. + // + // I'm not sure what "average the values of the three available samples" + // means. To me that would be (a+b+c)/3 or in other words, set all the + // weights to 0.33333 but that's not what the M1 is doing. + unreachable('corners of cubemaps are not testable'); + } + } else { + const p = [p0, p1]; + const w = [p0W, p1W]; + for (let z = 0; z < 2; ++z) { + for (let y = 0; y < 2; ++y) { + for (let x = 0; x < 2; ++x) { + samples.push({ + at: [p[x][0], p[y][1], p[z][2]], + weight: w[x][0] * w[y][1] * w[z][2] + }); + } + } + } + } + break; + } + } + break; + } + case 'nearest':{ + const p = at.map((v) => Math.round(quantizeToF32(v))); + samples.push({ at: p, weight: 1 }); + break; + } + default: + unreachable(); + } + + const out = {}; + const ss = []; + for (const sample of samples) { + const c = isCube ? + wrapFaceCoordToCubeFaceAtEdgeBoundaries(textureSize[0], sample.at) : + applyAddressModesToCoords(addressMode, textureSize, sample.at); + const v = load(c); + ss.push(v); + for (const component of rep.componentOrder) { + out[component] = (out[component] ?? 0) + v[component] * sample.weight; + } + } + + return convertPerTexelComponentToResultFormat(out, format); + } + case 'textureLoad':{ + const c = applyAddressModesToCoords(addressMode, textureSize, call.coords); + return convertPerTexelComponentToResultFormat(load(c), format); + } + } +} + +/** + * The software version of a texture builtin (eg: textureSample) + * Note that this is not a complete implementation. Rather it's only + * what's needed to generate the correct expected value for the tests. + */ +export function softwareTextureRead( +call, +texture, +sampler) +{ + assert(call.ddx !== undefined); + assert(call.ddy !== undefined); + const rep = kTexelRepresentationInfo[texture.texels[0].format]; + const texSize = reifyExtent3D(texture.descriptor.size); + const textureSize = [texSize.width, texSize.height]; + + // ddx and ddy are the values that would be passed to textureSampleGrad + // If we're emulating textureSample then they're the computed derivatives + // such that if we passed them to textureSampleGrad they'd produce the + // same result. + const ddx = typeof call.ddx === 'number' ? [call.ddx] : call.ddx; + const ddy = typeof call.ddy === 'number' ? [call.ddy] : call.ddy; + + // Compute the mip level the same way textureSampleGrad does + const scaledDdx = ddx.map((v, i) => v * textureSize[i]); + const scaledDdy = ddy.map((v, i) => v * textureSize[i]); + const dotDDX = dotProduct(scaledDdx, scaledDdx); + const dotDDY = dotProduct(scaledDdy, scaledDdy); + const deltaMax = Math.max(dotDDX, dotDDY); + // MAINTENANCE_TODO: handle texture view baseMipLevel and mipLevelCount? + const mipLevel = 0.5 * Math.log2(deltaMax); + + const mipLevelCount = texture.texels.length; + const maxLevel = mipLevelCount - 1; + + switch (sampler.mipmapFilter) { + case 'linear':{ + const clampedMipLevel = clamp(mipLevel, { min: 0, max: maxLevel }); + const baseMipLevel = Math.floor(clampedMipLevel); + const nextMipLevel = Math.ceil(clampedMipLevel); + const t0 = softwareTextureReadMipLevel(call, texture, sampler, baseMipLevel); + const t1 = softwareTextureReadMipLevel(call, texture, sampler, nextMipLevel); + const mix = mipLevel % 1; + const values = [ + { v: t0, weight: 1 - mix }, + { v: t1, weight: mix }]; + + const out = {}; + for (const { v, weight } of values) { + for (const component of rep.componentOrder) { + out[component] = (out[component] ?? 0) + v[component] * weight; + } + } + return out; + } + default:{ + const baseMipLevel = Math.floor( + clamp(mipLevel + 0.5, { min: 0, max: texture.texels.length - 1 }) + ); + return softwareTextureReadMipLevel(call, texture, sampler, baseMipLevel); + } + } +} + + + + + + + + +/** + * out of bounds is defined as any of the following being true + * + * * coords is outside the range [0, textureDimensions(t, level)) + * * array_index is outside the range [0, textureNumLayers(t)) + * * level is outside the range [0, textureNumLevels(t)) + * * sample_index is outside the range [0, textureNumSamples(s)) + */ +function isOutOfBoundsCall(texture, call) { + assert(call.mipLevel !== undefined); + assert(call.coords !== undefined); + assert(call.offset === undefined); + + const desc = reifyTextureDescriptor(texture.descriptor); + + const { coords, mipLevel, arrayIndex, sampleIndex } = call; + + if (mipLevel < 0 || mipLevel >= desc.mipLevelCount) { + return true; + } + + const size = virtualMipSize( + texture.descriptor.dimension || '2d', + texture.descriptor.size, + mipLevel + ); + + for (let i = 0; i < coords.length; ++i) { + const v = coords[i]; + if (v < 0 || v >= size[i]) { + return true; + } + } + + if (arrayIndex !== undefined) { + const size = reifyExtent3D(desc.size); + if (arrayIndex < 0 || arrayIndex >= size.depthOrArrayLayers) { + return true; + } + } + + if (sampleIndex !== undefined) { + if (sampleIndex < 0 || sampleIndex >= desc.sampleCount) { + return true; + } + } + + return false; +} + +/** + * For a texture builtin with no sampler (eg textureLoad), + * any out of bounds access is allowed to return one of: + * + * * the value of any texel in the texture + * * 0,0,0,0 or 0,0,0,1 if not a depth texture + * * 0 if a depth texture + */ +function okBecauseOutOfBounds( +texture, +call, +gotRGBA, +maxFractionalDiff) +{ + if (!isOutOfBoundsCall(texture, call)) { + return false; + } + + if (texture.descriptor.format.includes('depth')) { + if (gotRGBA.R === 0) { + return true; + } + } else { + if ( + gotRGBA.R === 0 && + gotRGBA.B === 0 && + gotRGBA.G === 0 && ( + gotRGBA.A === 0 || gotRGBA.A === 1)) + { + return true; + } + } + + for (let mipLevel = 0; mipLevel < texture.texels.length; ++mipLevel) { + const mipTexels = texture.texels[mipLevel]; + const size = virtualMipSize( + texture.descriptor.dimension || '2d', + texture.descriptor.size, + mipLevel + ); + for (let z = 0; z < size[2]; ++z) { + for (let y = 0; y < size[1]; ++y) { + for (let x = 0; x < size[0]; ++x) { + const texel = mipTexels.color({ x, y, z }); + const rgba = convertPerTexelComponentToResultFormat(texel, mipTexels.format); + if (texelsApproximatelyEqual(gotRGBA, rgba, mipTexels.format, maxFractionalDiff)) { + return true; + } + } + } + } + } + + return false; +} + +const kRGBAComponents = [ +TexelComponent.R, +TexelComponent.G, +TexelComponent.B, +TexelComponent.A]; + + +const kRComponent = [TexelComponent.R]; + +function texelsApproximatelyEqual( +gotRGBA, +expectRGBA, +format, +maxFractionalDiff) +{ + const rep = kTexelRepresentationInfo[format]; + const got = convertResultFormatToTexelViewFormat(gotRGBA, format); + const expect = convertResultFormatToTexelViewFormat(expectRGBA, format); + const gULP = rep.bitsToULPFromZero(rep.numberToBits(got)); + const eULP = rep.bitsToULPFromZero(rep.numberToBits(expect)); + + const rgbaComponentsToCheck = isDepthOrStencilTextureFormat(format) ? + kRComponent : + kRGBAComponents; + + for (const component of rgbaComponentsToCheck) { + const g = gotRGBA[component]; + const e = expectRGBA[component]; + const absDiff = Math.abs(g - e); + const ulpDiff = Math.abs(gULP[component] - eULP[component]); + if (ulpDiff > 3 && absDiff > maxFractionalDiff) { + return false; + } + } + return true; +} + +/** + * Checks the result of each call matches the expected result. + */ +export async function checkCallResults( +t, +texture, +textureType, +sampler, +calls, +results) +{ + const errs = []; + const rep = kTexelRepresentationInfo[texture.texels[0].format]; + const maxFractionalDiff = + sampler?.minFilter === 'linear' || + sampler?.magFilter === 'linear' || + sampler?.mipmapFilter === 'linear' ? + getMaxFractionalDiffForTextureFormat(texture.descriptor.format) : + 0; + + for (let callIdx = 0; callIdx < calls.length; callIdx++) { + const call = calls[callIdx]; + const gotRGBA = results[callIdx]; + const expectRGBA = softwareTextureReadMipLevel(call, texture, sampler, 0); + + if ( + texelsApproximatelyEqual(gotRGBA, expectRGBA, texture.texels[0].format, maxFractionalDiff)) + { + continue; + } + + if (!sampler && okBecauseOutOfBounds(texture, call, gotRGBA, maxFractionalDiff)) { + continue; + } + + const got = convertResultFormatToTexelViewFormat(gotRGBA, texture.texels[0].format); + const expect = convertResultFormatToTexelViewFormat(expectRGBA, texture.texels[0].format); + const gULP = rep.bitsToULPFromZero(rep.numberToBits(got)); + const eULP = rep.bitsToULPFromZero(rep.numberToBits(expect)); + for (const component of rep.componentOrder) { + const g = got[component]; + const e = expect[component]; + const absDiff = Math.abs(g - e); + const ulpDiff = Math.abs(gULP[component] - eULP[component]); + const relDiff = absDiff / Math.max(Math.abs(g), Math.abs(e)); + if (ulpDiff > 3 && absDiff > maxFractionalDiff) { + const desc = describeTextureCall(call); + errs.push(`component was not as expected: + call: ${desc} // #${callIdx} + component: ${component} + got: ${g} + expected: ${e} + abs diff: ${absDiff.toFixed(4)} + rel diff: ${(relDiff * 100).toFixed(2)}% + ulp diff: ${ulpDiff} +`); + if (sampler) { + const expectedSamplePoints = [ + 'expected:', + ...(await identifySamplePoints(texture, (texels) => { + return Promise.resolve( + softwareTextureReadMipLevel( + call, + { + texels: [texels], + descriptor: texture.descriptor, + viewDescriptor: texture.viewDescriptor + }, + sampler, + 0 + ) + ); + }))]; + + const gotSamplePoints = [ + 'got:', + ...(await identifySamplePoints(texture, async (texels) => { + const gpuTexture = createTextureFromTexelViews(t, [texels], texture.descriptor); + const result = ( + await doTextureCalls(t, gpuTexture, texture.viewDescriptor, textureType, sampler, [ + call] + ))[ + 0]; + gpuTexture.destroy(); + return result; + }))]; + + errs.push(' sample points:'); + errs.push(layoutTwoColumns(expectedSamplePoints, gotSamplePoints).join('\n')); + errs.push('', ''); + } + } + } + } + + return errs.length > 0 ? new Error(errs.join('\n')) : undefined; +} + +/** + * "Renders a quad" to a TexelView with the given parameters, + * sampling from the given Texture. + */ +export function softwareRasterize( +texture, +sampler, +targetSize, +options) +{ + const [width, height] = targetSize; + const { ddx = 1, ddy = 1, uvwStart = [0, 0] } = options; + const format = 'rgba32float'; + + const textureSize = reifyExtent3D(texture.descriptor.size); + + // MAINTENANCE_TODO: Consider passing these in as a similar computation + // happens in putDataInTextureThenDrawAndCheckResultsComparedToSoftwareRasterizer. + // The issue is there, the calculation is "what do we need to multiply the unitQuad + // by to get the derivatives we want". The calculation here is "what coordinate + // will we get for a given frag coordinate". It turns out to be the same calculation + // but needs rephrasing them so they are more obviously the same would help + // consolidate them into one calculation. + const screenSpaceUMult = ddx * width / textureSize.width; + const screenSpaceVMult = ddy * height / textureSize.height; + + const rep = kTexelRepresentationInfo[format]; + + const expData = new Float32Array(width * height * 4); + for (let y = 0; y < height; ++y) { + const fragY = height - y - 1 + 0.5; + for (let x = 0; x < width; ++x) { + const fragX = x + 0.5; + // This code calculates the same value that will be passed to + // `textureSample` in the fragment shader for a given frag coord (see the + // WGSL code which uses the same formula, but using interpolation). That + // shader renders a clip space quad and includes a inter-stage "uv" + // coordinates that start with a unit quad (0,0) to (1,1) and is + // multiplied by ddx,ddy and as added in uStart and vStart + // + // uv = unitQuad * vec2(ddx, ddy) + vec2(vStart, uStart); + // + // softwareTextureRead simulates a single call to `textureSample` so + // here we're computing the `uv` value that will be passed for a + // particular fragment coordinate. fragX / width, fragY / height provides + // the unitQuad value. + // + // ddx and ddy in this case are the derivative values we want to test. We + // pass those into the softwareTextureRead as they would normally be + // derived from the change in coord. + const coords = [ + fragX / width * screenSpaceUMult + uvwStart[0], + fragY / height * screenSpaceVMult + uvwStart[1]]; + + const call = { + builtin: 'textureSample', + coordType: 'f', + coords, + ddx: [ddx / textureSize.width, 0], + ddy: [0, ddy / textureSize.height], + offset: options.offset + }; + const sample = softwareTextureRead(call, texture, sampler); + const rgba = { R: 0, G: 0, B: 0, A: 1, ...sample }; + const asRgba32Float = new Float32Array(rep.pack(rgba)); + expData.set(asRgba32Float, (y * width + x) * 4); + } + } + + return TexelView.fromTextureDataByReference(format, new Uint8Array(expData.buffer), { + bytesPerRow: width * 4 * 4, + rowsPerImage: height, + subrectOrigin: [0, 0, 0], + subrectSize: targetSize + }); +} + +/** + * Render textured quad to an rgba32float texture. + */ +export function drawTexture( +t, +texture, +samplerDesc, +options) +{ + const device = t.device; + const { ddx = 1, ddy = 1, uvwStart = [0, 0, 0], offset } = options; + + const format = 'rgba32float'; + const renderTarget = t.createTextureTracked({ + format, + size: [32, 32], + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); + + // Compute the amount we need to multiply the unitQuad by get the + // derivatives we want. + const uMult = ddx * renderTarget.width / texture.width; + const vMult = ddy * renderTarget.height / texture.height; + + const offsetWGSL = offset ? `, vec2i(${offset[0]},${offset[1]})` : ''; + + const code = ` +struct InOut { + @builtin(position) pos: vec4f, + @location(0) uv: vec2f, +}; + +@vertex fn vs(@builtin(vertex_index) vertex_index : u32) -> InOut { + let positions = array( + vec2f(-1, 1), vec2f( 1, 1), + vec2f(-1, -1), vec2f( 1, -1), + ); + let pos = positions[vertex_index]; + return InOut( + vec4f(pos, 0, 1), + (pos * 0.5 + 0.5) * vec2f(${uMult}, ${vMult}) + vec2f(${uvwStart[0]}, ${uvwStart[1]}), + ); +} + +@group(0) @binding(0) var T : texture_2d; +@group(0) @binding(1) var S : sampler; + +@fragment fn fs(v: InOut) -> @location(0) vec4f { + return textureSample(T, S, v.uv${offsetWGSL}); +} +`; + + const shaderModule = device.createShaderModule({ code }); + + const pipeline = device.createRenderPipeline({ + layout: 'auto', + vertex: { module: shaderModule }, + fragment: { + module: shaderModule, + targets: [{ format }] + }, + primitive: { topology: 'triangle-strip' } + }); + + const sampler = device.createSampler(samplerDesc); + + const bindGroup = device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: texture.createView() }, + { binding: 1, resource: sampler }] + + }); + + const encoder = device.createCommandEncoder(); + + const renderPass = encoder.beginRenderPass({ + colorAttachments: [{ view: renderTarget.createView(), loadOp: 'clear', storeOp: 'store' }] + }); + + renderPass.setPipeline(pipeline); + renderPass.setBindGroup(0, bindGroup); + renderPass.draw(4); + renderPass.end(); + device.queue.submit([encoder.finish()]); + + return renderTarget; +} + +function getMaxFractionalDiffForTextureFormat(format) { + // Note: I'm not sure what we should do here. My assumption is, given texels + // have random values, the difference between 2 texels can be very large. In + // the current version, for a float texture they can be +/- 1000 difference. + // Sampling is very GPU dependent. So if one pixel gets a random value of + // -1000 and the neighboring pixel gets +1000 then any slight variation in how + // sampling is applied will generate a large difference when interpolating + // between -1000 and +1000. + // + // We could make some entry for every format but for now I just put the + // tolerances here based on format texture suffix. + // + // It's possible the math in the software rasterizer is just bad but the + // results certainly seem close. + // + // These tolerances started from the OpenGL ES dEQP tests. + // Those tests always render to an rgba8unorm texture. The shaders do effectively + // + // result = textureSample(...) * scale + bias + // + // to get the results in a 0.0 to 1.0 range. After reading the values back they + // expand them to their original ranges with + // + // value = (result - bias) / scale; + // + // Tolerances from dEQP + // -------------------- + // 8unorm: 3.9 / 255 + // 8snorm: 7.9 / 128 + // 2unorm: 7.9 / 512 + // ufloat: 156.249 + // float: 31.2498 + // + // The numbers below have been set empirically to get the tests to pass on all + // devices. The devices with the most divergence from the calculated expected + // values are MacOS Intel and AMD. + // + // MAINTENANCE_TODO: Double check the software rendering math and lower these + // tolerances if possible. + + if (format.includes('8unorm')) { + return 7 / 255; + } else if (format.includes('2unorm')) { + return 9 / 512; + } else if (format.includes('unorm')) { + return 7 / 255; + } else if (format.includes('8snorm')) { + return 7.9 / 128; + } else if (format.includes('snorm')) { + return 7.9 / 128; + } else if (format.endsWith('ufloat')) { + return 156.249; + } else if (format.endsWith('float')) { + return 44; + } else { + // It's likely an integer format. In any case, zero tolerance is passable. + return 0; + } +} + +export function checkTextureMatchesExpectedTexelView( +t, +format, +actualTexture, +expectedTexelView) +{ + const maxFractionalDiff = getMaxFractionalDiffForTextureFormat(format); + t.expectTexelViewComparisonIsOkInTexture( + { texture: actualTexture }, + expectedTexelView, + [actualTexture.width, actualTexture.height], + { maxFractionalDiff } + ); +} + +/** + * Puts data in a texture. Renders a quad to a rgba32float. Then "software renders" + * to a TexelView the expected result and compares the rendered texture to the + * expected TexelView. + */ +export async function putDataInTextureThenDrawAndCheckResultsComparedToSoftwareRasterizer( + + +t, +descriptor, +viewDescriptor, +samplerDesc, +options) +{ + const { texture, texels } = await createTextureWithRandomDataAndGetTexels(t, descriptor); + + const actualTexture = drawTexture(t, texture, samplerDesc, options); + const expectedTexelView = softwareRasterize( + { descriptor, texels, viewDescriptor }, + samplerDesc, + [actualTexture.width, actualTexture.height], + options + ); + + checkTextureMatchesExpectedTexelView(t, texture.format, actualTexture, expectedTexelView); +} + +const sumOfCharCodesOfString = (s) => +String(s). +split(''). +reduce((sum, c) => sum + c.charCodeAt(0), 0); + +/** + * Makes a function that fills a block portion of a Uint8Array with random valid data + * for an astc block. + * + * The astc format is fairly complicated. For now we do the simplest thing. + * which is to set the block as a "void-extent" block (a solid color). + * This makes our test have far less precision. + * + * MAINTENANCE_TODO: generate other types of astc blocks. One option would + * be to randomly select from set of pre-made blocks. + * + * See Spec: + * https://registry.khronos.org/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt + */ +function makeAstcBlockFiller(format) { + const info = kTextureFormatInfo[format]; + const bytesPerBlock = info.color.bytes; + return (data, offset, hashBase) => { + // set the block to be a void-extent block + data.set( + [ + 0b1111_1100, // 0 + 0b1111_1101, // 1 + 0b1111_1111, // 2 + 0b1111_1111, // 3 + 0b1111_1111, // 4 + 0b1111_1111, // 5 + 0b1111_1111, // 6 + 0b1111_1111 // 7 + ], + offset + ); + // fill the rest of the block with random data + const end = offset + bytesPerBlock; + for (let i = offset + 8; i < end; ++i) { + data[i] = hashU32(hashBase, i); + } + }; +} + +/** + * Makes a function that fills a block portion of a Uint8Array with random bytes. + */ +function makeRandomBytesBlockFiller(format) { + const info = kTextureFormatInfo[format]; + const bytesPerBlock = info.color.bytes; + return (data, offset, hashBase) => { + const end = offset + bytesPerBlock; + for (let i = offset; i < end; ++i) { + data[i] = hashU32(hashBase, i); + } + }; +} + +function getBlockFiller(format) { + if (format.startsWith('astc')) { + return makeAstcBlockFiller(format); + } else { + return makeRandomBytesBlockFiller(format); + } +} + +/** + * Fills a texture with random data. + */ +export function fillTextureWithRandomData(device, texture) { + assert(!isCompressedFloatTextureFormat(texture.format)); + const info = kTextureFormatInfo[texture.format]; + const hashBase = + sumOfCharCodesOfString(texture.format) + + sumOfCharCodesOfString(texture.dimension) + + texture.width + + texture.height + + texture.depthOrArrayLayers + + texture.mipLevelCount; + const bytesPerBlock = info.color.bytes; + const fillBlock = getBlockFiller(texture.format); + for (let mipLevel = 0; mipLevel < texture.mipLevelCount; ++mipLevel) { + const size = physicalMipSizeFromTexture(texture, mipLevel); + const blocksAcross = Math.ceil(size[0] / info.blockWidth); + const blocksDown = Math.ceil(size[1] / info.blockHeight); + const bytesPerRow = blocksAcross * bytesPerBlock; + const bytesNeeded = bytesPerRow * blocksDown * size[2]; + const data = new Uint8Array(bytesNeeded); + for (let offset = 0; offset < bytesNeeded; offset += bytesPerBlock) { + fillBlock(data, offset, hashBase); + } + device.queue.writeTexture( + { texture, mipLevel }, + data, + { bytesPerRow, rowsPerImage: blocksDown }, + size + ); + } +} + +const s_readTextureToRGBA32DeviceToPipeline = new WeakMap( + + +); + +// MAINTENANCE_TODO: remove cast once textureBindingViewDimension is added to IDL +function getEffectiveViewDimension( +t, +descriptor) +{ + const { textureBindingViewDimension } = descriptor; + + + const size = reifyExtent3D(descriptor.size); + return effectiveViewDimensionForDimension( + textureBindingViewDimension, + descriptor.dimension, + size.depthOrArrayLayers + ); +} + +export async function readTextureToTexelViews( +t, +texture, +descriptor, +format) +{ + const device = t.device; + const viewDimensionToPipelineMap = + s_readTextureToRGBA32DeviceToPipeline.get(device) ?? + new Map(); + s_readTextureToRGBA32DeviceToPipeline.set(device, viewDimensionToPipelineMap); + + const viewDimension = getEffectiveViewDimension(t, descriptor); + let pipeline = viewDimensionToPipelineMap.get(viewDimension); + if (!pipeline) { + let textureWGSL; + let loadWGSL; + switch (viewDimension) { + case '2d': + textureWGSL = 'texture_2d'; + loadWGSL = 'textureLoad(tex, global_invocation_id.xy, mipLevel)'; + break; + case 'cube-array': // cube-array doesn't exist in compat so we can just use 2d_array for this + case '2d-array': + textureWGSL = 'texture_2d_array'; + loadWGSL = ` + textureLoad( + tex, + global_invocation_id.xy, + global_invocation_id.z, + mipLevel)`; + break; + case '3d': + textureWGSL = 'texture_3d'; + loadWGSL = 'textureLoad(tex, global_invocation_id.xyz, mipLevel)'; + break; + case 'cube': + textureWGSL = 'texture_cube'; + loadWGSL = ` + textureLoadCubeAs2DArray(tex, global_invocation_id.xy, global_invocation_id.z, mipLevel); + `; + break; + default: + unreachable(`unsupported view: ${viewDimension}`); + } + const module = device.createShaderModule({ + code: ` + const faceMat = array( + mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1), // pos-x + mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1), // neg-x + mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1), // pos-y + mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1), // neg-y + mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1), // pos-z + mat3x3f(-2, 0, 0, 0, -2, 0, 1, 1, -1)); // neg-z + + // needed for compat mode. + fn textureLoadCubeAs2DArray(tex: texture_cube, coord: vec2u, layer: u32, mipLevel: u32) -> vec4f { + // convert texel coord normalized coord + let size = textureDimensions(tex, mipLevel); + let uv = (vec2f(coord) + 0.5) / vec2f(size.xy); + + // convert uv + layer into cube coord + let cubeCoord = faceMat[layer] * vec3f(uv, 1.0); + + return textureSampleLevel(tex, smp, cubeCoord, f32(mipLevel)); + } + + @group(0) @binding(0) var mipLevel: u32; + @group(0) @binding(1) var tex: ${textureWGSL}; + @group(0) @binding(2) var smp: sampler; + @group(0) @binding(3) var data: array; + + @compute @workgroup_size(1) fn cs( + @builtin(global_invocation_id) global_invocation_id : vec3) { + _ = smp; + let size = textureDimensions(tex, mipLevel); + let ndx = global_invocation_id.z * size.x * size.y + + global_invocation_id.y * size.x + + global_invocation_id.x; + data[ndx] = ${loadWGSL}; + } + ` + }); + pipeline = device.createComputePipeline({ layout: 'auto', compute: { module } }); + viewDimensionToPipelineMap.set(viewDimension, pipeline); + } + + const encoder = device.createCommandEncoder(); + + const readBuffers = []; + for (let mipLevel = 0; mipLevel < texture.mipLevelCount; ++mipLevel) { + const size = virtualMipSize(texture.dimension, texture, mipLevel); + + const uniformValues = new Uint32Array([mipLevel, 0, 0, 0]); // min size is 16 bytes + const uniformBuffer = t.createBufferTracked({ + size: uniformValues.byteLength, + usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST + }); + device.queue.writeBuffer(uniformBuffer, 0, uniformValues); + + const storageBuffer = t.createBufferTracked({ + size: size[0] * size[1] * size[2] * 4 * 4, // rgba32float + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + const readBuffer = t.createBufferTracked({ + size: storageBuffer.size, + usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST + }); + readBuffers.push({ size, readBuffer }); + + const sampler = device.createSampler(); + + const bindGroup = device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: { buffer: uniformBuffer } }, + { binding: 1, resource: texture.createView({ dimension: viewDimension }) }, + { binding: 2, resource: sampler }, + { binding: 3, resource: { buffer: storageBuffer } }] + + }); + + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(...size); + pass.end(); + encoder.copyBufferToBuffer(storageBuffer, 0, readBuffer, 0, readBuffer.size); + } + + device.queue.submit([encoder.finish()]); + + const texelViews = []; + + for (const { readBuffer, size } of readBuffers) { + await readBuffer.mapAsync(GPUMapMode.READ); + + // need a copy of the data since unmapping will nullify the typedarray view. + const data = new Float32Array(readBuffer.getMappedRange()).slice(); + readBuffer.unmap(); + + texelViews.push( + TexelView.fromTexelsAsColors(format, (coord) => { + const offset = (coord.z * size[0] * size[1] + coord.y * size[0] + coord.x) * 4; + return { + R: data[offset + 0], + G: data[offset + 1], + B: data[offset + 2], + A: data[offset + 3] + }; + }) + ); + } + + return texelViews; +} + +/** + * Fills a texture with random data and returns that data as + * an array of TexelView. + * + * For compressed textures the texture is filled with random bytes + * and then read back from the GPU by sampling so the GPU decompressed + * the texture. + * + * For uncompressed textures the TexelViews are generated and then + * copied to the texture. + */ +export async function createTextureWithRandomDataAndGetTexels( +t, +descriptor) +{ + if (isCompressedTextureFormat(descriptor.format)) { + const texture = t.createTextureTracked(descriptor); + + fillTextureWithRandomData(t.device, texture); + const texels = await readTextureToTexelViews( + t, + texture, + descriptor, + getTexelViewFormatForTextureFormat(texture.format) + ); + return { texture, texels }; + } else { + const texels = createRandomTexelViewMipmap(descriptor); + const texture = createTextureFromTexelViews(t, texels, descriptor); + return { texture, texels }; + } +} + +const kFaceNames = ['+x', '-x', '+y', '-y', '+z', '-z']; + +/** + * Generates a text art grid showing which texels were sampled + * followed by a list of the samples and the weights used for each + * component. + * + * It works by making an index for every pixel in the texture. Then, + * for each index it generates texture data using TexelView.fromTexelsAsColor + * with a single [1, 1, 1, 1] texel at the texel for the current index. + * + * In then calls 'run' which renders a single `call`. `run` uses either + * the software renderer or WebGPU. The result ends up being the weights + * used when sampling that pixel. 0 = that texel was not sampled. > 0 = + * it was sampled. + * + * This lets you see if the weights from the software renderer match the + * weights from WebGPU. + * + * Example: + * + * 0 1 2 3 4 5 6 7 + * ┌───┬───┬───┬───┬───┬───┬───┬───┐ + * 0 │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 1 │ │ │ │ │ │ │ │ a │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 2 │ │ │ │ │ │ │ │ b │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 3 │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 4 │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 5 │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 6 │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┤ + * 7 │ │ │ │ │ │ │ │ │ + * └───┴───┴───┴───┴───┴───┴───┴───┘ + * a: at: [7, 1], weights: [R: 0.75000] + * b: at: [7, 2], weights: [R: 0.25000] + */ +async function identifySamplePoints( +texture, +run) +{ + const info = texture.descriptor; + const isCube = texture.viewDescriptor.dimension === 'cube'; + const textureSize = reifyExtent3D(info.size); + const numTexels = textureSize.width * textureSize.height * textureSize.height; + const texelsPerRow = textureSize.width; + const texelsPerSlice = textureSize.width * textureSize.height; + // This isn't perfect. We already know there was an error. We're just + // generating info so it seems okay it's not perfect. This format will + // be used to generate weights by drawing with a texture of this format + // with a specific pixel set to [1, 1, 1, 1]. As such, if the result + // is > 0 then that pixel was sampled and the results are the weights. + // + // Ideally, this texture with a single pixel set to [1, 1, 1, 1] would + // be the same format we were originally testing, the one we already + // detected an error for. This way, whatever subtle issues there are + // from that format will affect the weight values we're computing. But, + // if that format is not encodable, for example if it's a compressed + // texture format, then we have no way to build a texture so we use + // rgba8unorm instead. + const format = + kEncodableTextureFormats.includes(info.format) ? + info.format : + 'rgba8unorm'; + + const rep = kTexelRepresentationInfo[format]; + + // Identify all the texels that are sampled, and their weights. + const sampledTexelWeights = new Map(); + const unclassifiedStack = [new Set(range(numTexels, (v) => v))]; + while (unclassifiedStack.length > 0) { + // Pop the an unclassified texels stack + const unclassified = unclassifiedStack.pop(); + + // Split unclassified texels evenly into two new sets + const setA = new Set(); + const setB = new Set(); + [...unclassified.keys()].forEach((t, i) => ((i & 1) === 0 ? setA : setB).add(t)); + + // Push setB to the unclassified texels stack + if (setB.size > 0) { + unclassifiedStack.push(setB); + } + + // See if any of the texels in setA were sampled. + const results = await run( + TexelView.fromTexelsAsColors( + format, + (coords) => { + const isCandidate = setA.has( + coords.x + coords.y * texelsPerRow + coords.z * texelsPerSlice + ); + const texel = {}; + for (const component of rep.componentOrder) { + texel[component] = isCandidate ? 1 : 0; + } + return texel; + } + ) + ); + if (rep.componentOrder.some((c) => results[c] !== 0)) { + // One or more texels of setA were sampled. + if (setA.size === 1) { + // We identified a specific texel was sampled. + // As there was only one texel in the set, results holds the sampling weights. + setA.forEach((texel) => sampledTexelWeights.set(texel, results)); + } else { + // More than one texel in the set. Needs splitting. + unclassifiedStack.push(setA); + } + } + } + + // ┌───┬───┬───┬───┐ + // │ a │ │ │ │ + // ├───┼───┼───┼───┤ + // │ │ │ │ │ + // ├───┼───┼───┼───┤ + // │ │ │ │ │ + // ├───┼───┼───┼───┤ + // │ │ │ │ b │ + // └───┴───┴───┴───┘ + const letter = (idx) => String.fromCharCode(97 + idx); // 97: 'a' + const orderedTexelIndices = []; + const lines = []; + for (let z = 0; z < textureSize.depthOrArrayLayers; ++z) { + lines.push(`slice: ${z}${isCube ? ` (${kFaceNames[z]})` : ''}`); + { + let line = ' '; + for (let x = 0; x < textureSize.width; x++) { + line += ` ${x.toString().padEnd(2)}`; + } + lines.push(line); + } + { + let line = ' ┌'; + for (let x = 0; x < textureSize.width; x++) { + line += x === textureSize.width - 1 ? '───┐' : '───┬'; + } + lines.push(line); + } + for (let y = 0; y < textureSize.height; y++) { + { + let line = `${y.toString().padEnd(2)}│`; + for (let x = 0; x < textureSize.width; x++) { + const texelIdx = x + y * texelsPerRow + z * texelsPerSlice; + const weight = sampledTexelWeights.get(texelIdx); + if (weight !== undefined) { + line += ` ${letter(orderedTexelIndices.length)} │`; + orderedTexelIndices.push(texelIdx); + } else { + line += ' │'; + } + } + lines.push(line); + } + if (y < textureSize.height - 1) { + let line = ' ├'; + for (let x = 0; x < textureSize.width; x++) { + line += x === textureSize.width - 1 ? '───┤' : '───┼'; + } + lines.push(line); + } + } + { + let line = ' └'; + for (let x = 0; x < textureSize.width; x++) { + line += x === textureSize.width - 1 ? '───┘' : '───┴'; + } + lines.push(line); + } + } + + const pad2 = (n) => n.toString().padStart(2); + orderedTexelIndices.forEach((texelIdx, i) => { + const weights = sampledTexelWeights.get(texelIdx); + const z = Math.floor(texelIdx / texelsPerSlice); + const y = Math.floor(texelIdx % texelsPerSlice / texelsPerRow); + const x = texelIdx % texelsPerRow; + const w = rep.componentOrder.map((c) => `${c}: ${weights[c]?.toFixed(5)}`).join(', '); + lines.push(`${letter(i)}: at: [${pad2(x)}, ${pad2(y)}, ${pad2(z)}], weights: [${w}]`); + }); + return lines; +} + +function layoutTwoColumns(columnA, columnB) { + const widthA = Math.max(...columnA.map((l) => l.length)); + const lines = Math.max(columnA.length, columnB.length); + const out = new Array(lines); + for (let line = 0; line < lines; line++) { + const a = columnA[line] ?? ''; + const b = columnB[line] ?? ''; + out[line] = `${a}${' '.repeat(widthA - a.length)} | ${b}`; + } + return out; +} + +function getDepthOrArrayLayersForViewDimension(viewDimension) { + switch (viewDimension) { + case undefined: + case '2d': + return 1; + case '3d': + return 8; + case 'cube': + return 6; + default: + unreachable(); + } +} + +/** + * Choose a texture size based on the given parameters. + * The size will be in a multiple of blocks. If it's a cube + * map the size will so be square. + */ +export function chooseTextureSize({ + minSize, + minBlocks, + format, + viewDimension + + + + + +}) { + const { blockWidth, blockHeight } = kTextureFormatInfo[format]; + const width = align(Math.max(minSize, blockWidth * minBlocks), blockWidth); + const height = align(Math.max(minSize, blockHeight * minBlocks), blockHeight); + if (viewDimension === 'cube') { + const size = lcm(width, height); + return [size, size, 6]; + } + const depthOrArrayLayers = getDepthOrArrayLayersForViewDimension(viewDimension); + return [width, height, depthOrArrayLayers]; +} + +export const kSamplePointMethods = ['texel-centre', 'spiral']; + + +export const kCubeSamplePointMethods = ['cube-edges', 'texel-centre', 'spiral']; + + +/** + * Generates an array of coordinates at which to sample a texture. + */ +function generateSamplePointsImpl( +makeValue, +n, +nearest, +args) + + + + + + + + + + + + + + +{ + const { method, textureWidth, textureHeight, textureDepthOrArrayLayers = 1 } = args; + const out = []; + switch (method) { + case 'texel-centre':{ + for (let i = 0; i < n; i++) { + const r = hashU32(i); + const x = Math.floor(lerp(0, textureWidth - 1, (r & 0xff) / 0xff)) + 0.5; + const y = Math.floor(lerp(0, textureHeight - 1, (r >> 8 & 0xff) / 0xff)) + 0.5; + const z = + Math.floor(lerp(0, textureDepthOrArrayLayers - 1, (r >> 16 & 0xff) / 0xff)) + 0.5; + out.push(makeValue(x / textureWidth, y / textureHeight, z / textureDepthOrArrayLayers)); + } + break; + } + case 'spiral':{ + const { radius = 1.5, loops = 2 } = args; + for (let i = 0; i < n; i++) { + const f = i / (Math.max(n, 2) - 1); + const r = radius * f; + const a = loops * 2 * Math.PI * f; + out.push(makeValue(0.5 + r * Math.cos(a), 0.5 + r * Math.sin(a), 0)); + } + break; + } + } + + // Samplers across devices use different methods to interpolate. + // Quantizing the texture coordinates seems to hit coords that produce + // comparable results to our computed results. + // Note: This value works with 8x8 textures. Other sizes have not been tested. + // Values that worked for reference: + // Win 11, NVidia 2070 Super: 16 + // Linux, AMD Radeon Pro WX 3200: 256 + // MacOS, M1 Mac: 256 + const kSubdivisionsPerTexel = 4; + const q = [ + textureWidth * kSubdivisionsPerTexel, + textureHeight * kSubdivisionsPerTexel, + textureDepthOrArrayLayers * kSubdivisionsPerTexel]; + + return out.map( + (c) => + c.map((v, i) => { + // Quantize to kSubdivisionsPerPixel + const v1 = Math.floor(v * q[i]); + // If it's nearest and we're on the edge of a texel then move us off the edge + // since the edge could choose one texel or another in nearest mode + const v2 = nearest && v1 % kSubdivisionsPerTexel === 0 ? v1 + 1 : v1; + // Convert back to texture coords + return v2 / q[i]; + }) + ); +} + +// Removes the first element from an array of types + + + + +export function generateSamplePoints1D(...args) { + return generateSamplePointsImpl((x) => [x], ...args); +} + +export function generateSamplePoints2D(...args) { + return generateSamplePointsImpl((x, y) => [x, y], ...args); +} + +export function generateSamplePoints3D(...args) { + return generateSamplePointsImpl((x, y, z) => [x, y, z], ...args); +} + + + + + + + + +const kFaceUVMatrices = +[ +[0, 0, -2, 0, -2, 0, 1, 1, 1], // pos-x +[0, 0, 2, 0, -2, 0, -1, 1, -1], // neg-x +[2, 0, 0, 0, 0, 2, -1, 1, -1], // pos-y +[2, 0, 0, 0, 0, -2, -1, -1, 1], // neg-y +[2, 0, 0, 0, -2, 0, -1, 1, 1], // pos-z +[-2, 0, 0, 0, -2, 0, 1, 1, -1] // neg-z +]; + +/** multiply a vec3 by mat3 */ +function transformMat3(v, m) { + const x = v[0]; + const y = v[1]; + const z = v[2]; + + return [ + x * m[0] + y * m[3] + z * m[6], + x * m[1] + y * m[4] + z * m[7], + x * m[2] + y * m[5] + z * m[8]]; + +} + +/** normalize a vec3 */ +function normalize(v) { + const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + assert(length > 0); + return v.map((v) => v / length); +} + +/** + * Converts a cube map coordinate to a uv coordinate (0 to 1) and layer (0.5/6.0 to 5.5/6.0). + * Also returns the length of the original coordinate. + */ +function convertCubeCoordToNormalized3DTextureCoord(v) { + let uvw; + let layer; + // normalize the coord. + // MAINTENANCE_TODO: handle(0, 0, 0) + const r = normalize(v); + const absR = r.map((v) => Math.abs(v)); + if (absR[0] > absR[1] && absR[0] > absR[2]) { + // x major + const negX = r[0] < 0.0 ? 1 : 0; + uvw = [negX ? r[2] : -r[2], -r[1], absR[0]]; + layer = negX; + } else if (absR[1] > absR[2]) { + // y major + const negY = r[1] < 0.0 ? 1 : 0; + uvw = [r[0], negY ? -r[2] : r[2], absR[1]]; + layer = 2 + negY; + } else { + // z major + const negZ = r[2] < 0.0 ? 1 : 0; + uvw = [negZ ? -r[0] : r[0], -r[1], absR[2]]; + layer = 4 + negZ; + } + return [(uvw[0] / uvw[2] + 1) * 0.5, (uvw[1] / uvw[2] + 1) * 0.5, (layer + 0.5) / 6]; +} + +/** + * Convert a 3d texcoord into a cube map coordinate. + */ +function convertNormalized3DTexCoordToCubeCoord(uvLayer) { + const [u, v, faceLayer] = uvLayer; + return normalize(transformMat3([u, v, 1], kFaceUVMatrices[Math.min(5, faceLayer * 6) | 0])); +} + +/** + * We have a face texture in texels coord where U/V choose a texel and W chooses the face. + * If U/V are outside the size of the texture then, when normalized and converted + * to a cube map coordinate, they'll end up pointing to a different face. + * + * addressMode is effectively ignored for cube + * + * +-----------+ + * |0->u | + * |↓ | + * |v +y | + * | (2) | + * | | + * +-----------+-----------+-----------+-----------+ + * |0->u |0->u |0->u |0->u | + * |↓ |↓ |↓ |↓ | + * |v -x |v +z |v +x |v -z | + * | (1) | (4) | (0) | (5) | + * | | | | | + * +-----------+-----------+-----------+-----------+ + * |0->u | + * |↓ | + * |v -y | + * | (3) | + * | | + * +-----------+ + */ +const kFaceConversions = { + u: (textureSize, faceCoord) => faceCoord[0], + v: (textureSize, faceCoord) => faceCoord[1], + 'u+t': (textureSize, faceCoord) => faceCoord[0] + textureSize, + 'u-t': (textureSize, faceCoord) => faceCoord[0] - textureSize, + 'v+t': (textureSize, faceCoord) => faceCoord[1] + textureSize, + 'v-t': (textureSize, faceCoord) => faceCoord[1] - textureSize, + 't-v': (textureSize, faceCoord) => textureSize - faceCoord[1], + '1+u': (textureSize, faceCoord) => 1 + faceCoord[0], + '1+v': (textureSize, faceCoord) => 1 + faceCoord[1], + '-v-1': (textureSize, faceCoord) => -faceCoord[1] - 1, + 't-u-1': (textureSize, faceCoord) => textureSize - faceCoord[0] - 1, + 't-v-1': (textureSize, faceCoord) => textureSize - faceCoord[1] - 1, + '2t-u-1': (textureSize, faceCoord) => textureSize * 2 - faceCoord[0] - 1, + '2t-v-1': (textureSize, faceCoord) => textureSize * 2 - faceCoord[1] - 1 +}; +const kFaceConversionEnums = keysOf(kFaceConversions); + + +// For Each face +// face to go if u < 0 +// face to go if u >= textureSize +// face to go if v < 0 +// face to go if v >= textureSize +const kFaceToFaceRemap = [ +// 0 +[ +/* -u */{ to: 4, u: 'u+t', v: 'v' }, +/* +u */{ to: 5, u: 'u-t', v: 'v' }, +/* -v */{ to: 2, u: 'v+t', v: 't-u-1' }, +/* +v */{ to: 3, u: '2t-v-1', v: 'u' }], + +// 1 +[ +/* -u */{ to: 5, u: 'u+t', v: 'v' }, +/* +u */{ to: 4, u: 'u-t', v: 'v' }, +/* -v */{ to: 2, u: '-v-1', v: 'u' }, // -1->0, -2->1 -3->2 +/* +v */{ to: 3, u: 't-v', v: 't-u-1' }], + +// 2 +[ +/* -u */{ to: 1, u: 'v', v: '1+u' }, +/* +u */{ to: 0, u: 't-v-1', v: 'u-t' }, +/* -v */{ to: 5, u: 't-u-1', v: 't-v-1' }, +/* +v */{ to: 4, u: 'u', v: 'v-t' }], + +// 3 +[ +/* -u */{ to: 1, u: 't-v-1', v: 'u+t' }, +/* +u */{ to: 0, u: 'v', v: '2t-u-1' }, +/* -v */{ to: 4, u: 'u', v: 'v+t' }, +/* +v */{ to: 5, u: 't-u-1', v: '2t-v-1' }], + +// 4 +[ +/* -u */{ to: 1, u: 'u+t', v: 'v' }, +/* +u */{ to: 0, u: 'u-t', v: 'v' }, +/* -v */{ to: 2, u: 'u', v: 'v+t' }, +/* +v */{ to: 3, u: 'u', v: 'v-t' }], + +// 5 +[ +/* -u */{ to: 0, u: 'u+t', v: 'v' }, +/* +u */{ to: 1, u: 'u-t', v: 'v' }, +/* -v */{ to: 2, u: 't-u-1', v: '1+v' }, +/* +v */{ to: 3, u: 't-u-1', v: '2t-v-1' }]]; + + + +function getFaceWrapIndex(textureSize, faceCoord) { + if (faceCoord[0] < 0) { + return 0; + } + if (faceCoord[0] >= textureSize) { + return 1; + } + if (faceCoord[1] < 0) { + return 2; + } + if (faceCoord[1] >= textureSize) { + return 3; + } + return -1; +} + +function applyFaceWrap(textureSize, faceCoord) { + const ndx = getFaceWrapIndex(textureSize, faceCoord); + if (ndx < 0) { + return faceCoord; + } + const { to, u, v } = kFaceToFaceRemap[faceCoord[2]][ndx]; + return [ + kFaceConversions[u](textureSize, faceCoord), + kFaceConversions[v](textureSize, faceCoord), + to]; + +} + +function wrapFaceCoordToCubeFaceAtEdgeBoundaries(textureSize, faceCoord) { + // If we're off both edges we need to wrap twice, once for each edge. + faceCoord = applyFaceWrap(textureSize, faceCoord); + faceCoord = applyFaceWrap(textureSize, faceCoord); + return faceCoord; +} + +function applyAddressModesToCoords( +addressMode, +textureSize, +coord) +{ + return coord.map((v, i) => { + switch (addressMode[i]) { + case 'clamp-to-edge': + return clamp(v, { min: 0, max: textureSize[i] - 1 }); + case 'mirror-repeat':{ + const n = Math.floor(v / textureSize[i]); + v = v - n * textureSize[i]; + return (n & 1) !== 0 ? textureSize[i] - v - 1 : v; + } + case 'repeat': + return v - Math.floor(v / textureSize[i]) * textureSize[i]; + default: + unreachable(); + } + }); +} + +/** + * Generates an array of coordinates at which to sample a texture for a cubemap + */ +export function generateSamplePointsCube( +n, +nearest, +args) + + + + + + + + + + + + + + + + + +{ + const { method, textureWidth } = args; + const out = []; + switch (method) { + case 'texel-centre':{ + for (let i = 0; i < n; i++) { + const r = hashU32(i); + const u = (Math.floor(lerp(0, textureWidth - 1, (r & 0xff) / 0xff)) + 0.5) / textureWidth; + const v = + (Math.floor(lerp(0, textureWidth - 1, (r >> 8 & 0xff) / 0xff)) + 0.5) / textureWidth; + const face = Math.floor(lerp(0, 6, (r >> 16 & 0xff) / 0x100)); + out.push(convertNormalized3DTexCoordToCubeCoord([u, v, face])); + } + break; + } + case 'spiral':{ + const { radius = 1.5, loops = 2 } = args; + for (let i = 0; i < n; i++) { + const f = (i + 1) / (Math.max(n, 2) - 1); + const r = radius * f; + const theta = loops * 2 * Math.PI * f; + const phi = loops * 1.3 * Math.PI * f; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + const sinPhi = Math.sin(phi); + const cosPhi = Math.cos(phi); + const ux = cosTheta * sinPhi; + const uy = cosPhi; + const uz = sinTheta * sinPhi; + out.push([ux * r, uy * r, uz * r]); + } + break; + } + case 'cube-edges':{ + + out.push( + // between edges + [-1.01, -1.02, 0], + [1.01, -1.02, 0], + [-1.01, 1.02, 0], + [1.01, 1.02, 0], + + [-1.01, 0, -1.02], + [1.01, 0, -1.02], + [-1.01, 0, 1.02], + [1.01, 0, 1.02], + + [-1.01, -1.02, 0], + [1.01, -1.02, 0], + [-1.01, 1.02, 0], + [1.01, 1.02, 0] + + // corners (see comment "Issues with corners of cubemaps") + // for why these are commented out. + // [-1.01, -1.02, -1.03], + // [ 1.01, -1.02, -1.03], + // [-1.01, 1.02, -1.03], + // [ 1.01, 1.02, -1.03], + // [-1.01, -1.02, 1.03], + // [ 1.01, -1.02, 1.03], + // [-1.01, 1.02, 1.03], + // [ 1.01, 1.02, 1.03], + ); + break; + } + } + + // Samplers across devices use different methods to interpolate. + // Quantizing the texture coordinates seems to hit coords that produce + // comparable results to our computed results. + // Note: This value works with 8x8 textures. Other sizes have not been tested. + // Values that worked for reference: + // Win 11, NVidia 2070 Super: 16 + // Linux, AMD Radeon Pro WX 3200: 256 + // MacOS, M1 Mac: 256 + const kSubdivisionsPerTexel = 4; + const q = [ + textureWidth * kSubdivisionsPerTexel, + textureWidth * kSubdivisionsPerTexel, + 6 * kSubdivisionsPerTexel]; + + return out.map((c) => { + const uvw = convertCubeCoordToNormalized3DTextureCoord(c); + + // If this is a corner, move to in so it's not + // (see comment "Issues with corners of cubemaps") + const ndx = getUnusedCubeCornerSampleIndex(textureWidth, uvw); + if (ndx >= 0) { + const halfTexel = 0.5 / textureWidth; + uvw[0] = clamp(uvw[0], { min: halfTexel, max: 1 - halfTexel }); + } + + const quantizedUVW = uvw.map((v, i) => { + // Quantize to kSubdivisionsPerPixel + const v1 = Math.floor(v * q[i]); + // If it's nearest and we're on the edge of a texel then move us off the edge + // since the edge could choose one texel or another in nearest mode + const v2 = nearest && v1 % kSubdivisionsPerTexel === 0 ? v1 + 1 : v1; + // Convert back to texture coords + return v2 / q[i]; + }); + return convertNormalized3DTexCoordToCubeCoord(quantizedUVW); + }); +} + +function wgslTypeFor(data, type) { + if (Array.isArray(data)) { + switch (data.length) { + case 1: + return `${type}32`; + case 2: + return `vec2${type}`; + case 3: + return `vec3${type}`; + default: + unreachable(); + } + } + return `${type}32`; +} + +function wgslExpr(data) { + if (Array.isArray(data)) { + switch (data.length) { + case 1: + return data[0].toString(); + case 2: + return `vec2(${data.map((v) => v.toString()).join(', ')})`; + case 3: + return `vec3(${data.map((v) => v.toString()).join(', ')})`; + default: + unreachable(); + } + } + return data.toString(); +} + +function wgslExprFor(data, type) { + if (Array.isArray(data)) { + switch (data.length) { + case 1: + return `${type}(${data[0].toString()})`; + case 2: + return `vec2${type}(${data.map((v) => v.toString()).join(', ')})`; + case 3: + return `vec3${type}(${data.map((v) => v.toString()).join(', ')})`; + default: + unreachable(); + } + } + return `${type}32(${data.toString()})`; +} + +function binKey(call) { + const keys = []; + for (const name of kTextureCallArgNames) { + const value = call[name]; + if (value !== undefined) { + if (name === 'offset') { + // offset must be a constant expression + keys.push(`${name}: ${wgslExpr(value)}`); + } else { + keys.push(`${name}: ${wgslTypeFor(value, call.coordType)}`); + } + } + } + return `${call.builtin}(${keys.join(', ')})`; +} + +function buildBinnedCalls(calls) { + const args = ['T']; // All texture builtins take the texture as the first argument + const fields = []; + const data = []; + + const prototype = calls[0]; + if (prototype.builtin.startsWith('textureSample')) { + // textureSample*() builtins take a sampler as the second argument + args.push('S'); + } + + for (const name of kTextureCallArgNames) { + const value = prototype[name]; + if (value !== undefined) { + if (name === 'offset') { + args.push(`/* offset */ ${wgslExpr(value)}`); + } else { + const type = name === 'mipLevel' ? prototype.levelType : prototype.coordType; + args.push(`args.${name}`); + fields.push(`@align(16) ${name} : ${wgslTypeFor(value, type)}`); + } + } + } + + for (const call of calls) { + for (const name of kTextureCallArgNames) { + const value = call[name]; + assert( + prototype[name] === undefined === (value === undefined), + 'texture calls are not binned correctly' + ); + if (value !== undefined && name !== 'offset') { + const bitcastToU32 = (value) => { + if (calls[0].coordType === 'f') { + return float32ToUint32(value); + } + return value; + }; + if (value instanceof Array) { + for (const c of value) { + data.push(bitcastToU32(c)); + } + } else { + data.push(bitcastToU32(value)); + } + // All fields are aligned to 16 bytes. + while ((data.length & 3) !== 0) { + data.push(0); + } + } + } + } + + const expr = `${prototype.builtin}(${args.join(', ')})`; + + return { expr, fields, data }; +} + +function binCalls(calls) { + const map = new Map(); // key to bin index + const bins = []; + calls.forEach((call, callIdx) => { + const key = binKey(call); + const binIdx = map.get(key); + if (binIdx === undefined) { + map.set(key, bins.length); + bins.push([callIdx]); + } else { + bins[binIdx].push(callIdx); + } + }); + return bins; +} + +export function describeTextureCall(call) { + const args = ['texture: T']; + if (call.builtin.startsWith('textureSample')) { + args.push('sampler: S'); + } + for (const name of kTextureCallArgNames) { + const value = call[name]; + if (value !== undefined) { + if (name === 'coords') { + args.push(`${name}: ${wgslExprFor(value, call.coordType)}`); + } else if (name === 'mipLevel') { + args.push(`${name}: ${wgslExprFor(value, call.levelType)}`); + } else { + args.push(`${name}: ${wgslExpr(value)}`); + } + } + } + return `${call.builtin}(${args.join(', ')})`; +} + +const s_deviceToPipelines = new WeakMap(); + +/** + * Given a list of "calls", each one of which has a texture coordinate, + * generates a fragment shader that uses the fragment position as an index + * (position.y * 256 + position.x) That index is then used to look up a + * coordinate from a storage buffer which is used to call the WGSL texture + * function to read/sample the texture, and then write to an rgba32float + * texture. We then read the rgba32float texture for the per "call" results. + * + * Calls are "binned" by call parameters. Each bin has its own structure and + * field in the storage buffer. This allows the calls to be non-homogenous and + * each have their own data type for coordinates. + */ +export async function doTextureCalls( +t, +gpuTexture, +viewDescriptor, +textureType, +sampler, +calls) +{ + let structs = ''; + let body = ''; + let dataFields = ''; + const data = []; + let callCount = 0; + const binned = binCalls(calls); + binned.forEach((binCalls, binIdx) => { + const b = buildBinnedCalls(binCalls.map((callIdx) => calls[callIdx])); + structs += `struct Args${binIdx} { + ${b.fields.join(', \n')} +} +`; + dataFields += ` args${binIdx} : array, +`; + body += ` + { + let is_active = (frag_idx >= ${callCount}) & (frag_idx < ${callCount + binCalls.length}); + let args = data.args${binIdx}[frag_idx - ${callCount}]; + let call = ${b.expr}; + result = select(result, call, is_active); + } +`; + callCount += binCalls.length; + data.push(...b.data); + }); + + const dataBuffer = t.createBufferTracked({ + size: data.length * 4, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + }); + t.device.queue.writeBuffer(dataBuffer, 0, new Uint32Array(data)); + + const { resultType, resultFormat } = getTextureFormatTypeInfo(gpuTexture.format); + + const rtWidth = 256; + const renderTarget = t.createTextureTracked({ + format: resultFormat, + size: { width: rtWidth, height: Math.ceil(calls.length / rtWidth) }, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); + + const code = ` +${structs} + +struct Data { +${dataFields} +} + +@vertex +fn vs_main(@builtin(vertex_index) vertex_index : u32) -> @builtin(position) vec4f { + let positions = array( + vec4f(-1, 1, 0, 1), vec4f( 1, 1, 0, 1), + vec4f(-1, -1, 0, 1), vec4f( 1, -1, 0, 1), + ); + return positions[vertex_index]; +} + +@group(0) @binding(0) var T : ${textureType}; +${sampler ? '@group(0) @binding(1) var S : sampler' : ''}; +@group(0) @binding(2) var data : Data; + +@fragment +fn fs_main(@builtin(position) frag_pos : vec4f) -> @location(0) ${resultType} { + let frag_idx = u32(frag_pos.x) + u32(frag_pos.y) * ${renderTarget.width}; + var result : ${resultType}; +${body} + return result; +} +`; + + const pipelines = s_deviceToPipelines.get(t.device) ?? new Map(); + s_deviceToPipelines.set(t.device, pipelines); + + let pipeline = pipelines.get(code); + if (!pipeline) { + const shaderModule = t.device.createShaderModule({ code }); + + pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { module: shaderModule }, + fragment: { + module: shaderModule, + targets: [{ format: renderTarget.format }] + }, + primitive: { topology: 'triangle-strip' } + }); + + pipelines.set(code, pipeline); + } + + const gpuSampler = sampler ? t.device.createSampler(sampler) : undefined; + + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { binding: 0, resource: gpuTexture.createView(viewDescriptor) }, + ...(sampler ? [{ binding: 1, resource: gpuSampler }] : []), + { binding: 2, resource: { buffer: dataBuffer } }] + + }); + + const bytesPerRow = align(16 * renderTarget.width, 256); + const resultBuffer = t.createBufferTracked({ + size: renderTarget.height * bytesPerRow, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ + }); + const encoder = t.device.createCommandEncoder(); + + const renderPass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: renderTarget.createView(), + loadOp: 'clear', + storeOp: 'store' + }] + + }); + + renderPass.setPipeline(pipeline); + renderPass.setBindGroup(0, bindGroup); + renderPass.draw(4); + renderPass.end(); + encoder.copyTextureToBuffer( + { texture: renderTarget }, + { buffer: resultBuffer, bytesPerRow }, + { width: renderTarget.width, height: renderTarget.height } + ); + t.device.queue.submit([encoder.finish()]); + + await resultBuffer.mapAsync(GPUMapMode.READ); + + const view = TexelView.fromTextureDataByReference( + renderTarget.format, + new Uint8Array(resultBuffer.getMappedRange()), + { + bytesPerRow, + rowsPerImage: renderTarget.height, + subrectOrigin: [0, 0, 0], + subrectSize: [renderTarget.width, renderTarget.height] + } + ); + + let outIdx = 0; + const out = new Array(calls.length); + for (const bin of binned) { + for (const callIdx of bin) { + const x = outIdx % rtWidth; + const y = Math.floor(outIdx / rtWidth); + out[callIdx] = view.color({ x, y, z: 0 }); + outIdx++; + } + } + + renderTarget.destroy(); + resultBuffer.destroy(); + + return out; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/transpose.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/transpose.spec.js index 5a919d82ec4..8e1c70e37f1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/transpose.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/transpose.spec.js @@ -3,15 +3,15 @@ **/export const description = ` Execution tests for the 'transpose' builtin function -T is AbstractFloat, f32, or f16 +T is abstract-float, f32, or f16 @const transpose(e: matRxC ) -> matCxR Returns the transpose of e. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32, TypeMat } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './transpose.cache.js'; export const g = makeTestGroup(GPUTest); @@ -31,9 +31,9 @@ fn(async (t) => { const cases = await d.get(`abstract_mat${cols}x${rows}_const`); await run( t, - abstractBuiltin('transpose'), - [TypeMat(cols, rows, TypeAbstractFloat)], - TypeMat(rows, cols, TypeAbstractFloat), + abstractFloatBuiltin('transpose'), + [Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(rows, cols, Type.abstractFloat), t.params, cases ); @@ -59,8 +59,8 @@ fn(async (t) => { await run( t, builtin('transpose'), - [TypeMat(cols, rows, TypeF32)], - TypeMat(rows, cols, TypeF32), + [Type.mat(cols, rows, Type.f32)], + Type.mat(rows, cols, Type.f32), t.params, cases ); @@ -89,8 +89,8 @@ fn(async (t) => { await run( t, builtin('transpose'), - [TypeMat(cols, rows, TypeF16)], - TypeMat(rows, cols, TypeF16), + [Type.mat(cols, rows, Type.f16)], + Type.mat(rows, cols, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/trunc.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/trunc.spec.js index ddd7549a70f..b2af7b2e03c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/trunc.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/trunc.spec.js @@ -3,17 +3,17 @@ **/export const description = ` Execution tests for the 'trunc' builtin function -S is AbstractFloat, f32, f16 +S is abstract-float, f32, f16 T is S or vecN @const fn trunc(e: T ) -> T Returns the nearest whole number whose absolute value is less than or equal to e. Component-wise when T is a vector. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { abstractBuiltin, builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; import { d } from './trunc.cache.js'; export const g = makeTestGroup(GPUTest); @@ -28,7 +28,14 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('abstract'); - await run(t, abstractBuiltin('trunc'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases); + await run( + t, + abstractFloatBuiltin('trunc'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases + ); }); g.test('f32'). @@ -39,7 +46,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, builtin('trunc'), [TypeF32], TypeF32, t.params, cases); + await run(t, builtin('trunc'), [Type.f32], Type.f32, t.params, cases); }); g.test('f16'). @@ -53,5 +60,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, builtin('trunc'), [TypeF16], TypeF16, t.params, cases); + await run(t, builtin('trunc'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16float.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16float.spec.js index 47fdf10edd7..39e1ca28e5c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16float.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16float.spec.js @@ -7,7 +7,7 @@ Component i of the result is the f32 representation of v, where v is the interpretation of bits 16×i through 16×i+15 of e as an IEEE-754 binary16 value. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -25,5 +25,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('unpack2x16float'), [TypeU32], TypeVec(2, TypeF32), t.params, cases); + await run(t, builtin('unpack2x16float'), [Type.u32], Type.vec2f, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16snorm.spec.js index 7c832f3d6bd..f2b36e2ceb3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16snorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16snorm.spec.js @@ -7,7 +7,7 @@ Component i of the result is max(v ÷ 32767, -1), where v is the interpretation of bits 16×i through 16×i+15 of e as a twos-complement signed integer. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -25,5 +25,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('unpack2x16snorm'), [TypeU32], TypeVec(2, TypeF32), t.params, cases); + await run(t, builtin('unpack2x16snorm'), [Type.u32], Type.vec2f, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16unorm.spec.js index 0f50805c783..37547b1b3cb 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16unorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack2x16unorm.spec.js @@ -7,7 +7,7 @@ Component i of the result is v ÷ 65535, where v is the interpretation of bits 16×i through 16×i+15 of e as an unsigned integer. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -25,5 +25,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('unpack2x16unorm'), [TypeU32], TypeVec(2, TypeF32), t.params, cases); + await run(t, builtin('unpack2x16unorm'), [Type.u32], Type.vec2f, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8snorm.spec.js index f46549c33d7..59043efbfa3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8snorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8snorm.spec.js @@ -7,7 +7,7 @@ Component i of the result is max(v ÷ 127, -1), where v is the interpretation of bits 8×i through 8×i+7 of e as a twos-complement signed integer. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -25,5 +25,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('unpack4x8snorm'), [TypeU32], TypeVec(4, TypeF32), t.params, cases); + await run(t, builtin('unpack4x8snorm'), [Type.u32], Type.vec4f, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8unorm.spec.js index faffee42290..755c490c0c1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8unorm.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4x8unorm.spec.js @@ -7,7 +7,7 @@ Component i of the result is v ÷ 255, where v is the interpretation of bits 8× through 8×i+7 of e as an unsigned integer. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeF32, TypeU32, TypeVec } from '../../../../../util/conversion.js'; +import { Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; import { builtin } from './builtin.js'; @@ -25,5 +25,5 @@ desc( params((u) => u.combine('inputSource', allInputSources)). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, builtin('unpack4x8unorm'), [TypeU32], TypeVec(4, TypeF32), t.params, cases); + await run(t, builtin('unpack4x8unorm'), [Type.u32], Type.vec4f, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xI8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xI8.spec.js index 2688d78efea..30bd91d235e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xI8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xI8.spec.js @@ -8,7 +8,7 @@ e is interpreted as a vector with four 8-bit signed integer components. Unpack e with sign extension. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeI32, TypeU32, TypeVec, u32, toVector, i32 } from '../../../../../util/conversion.js'; +import { u32, toVector, i32, Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -52,5 +52,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('unpack4xI8'), [TypeU32], TypeVec(4, TypeI32), cfg, cases); + await run(t, builtin('unpack4xI8'), [Type.u32], Type.vec4i, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xU8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xU8.spec.js index 8d86de83609..9711650ec0c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xU8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/unpack4xU8.spec.js @@ -8,7 +8,7 @@ e is interpreted as a vector with four 8-bit unsigned integer components. Unpack with zero extension. `;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { TypeU32, TypeVec, u32, toVector } from '../../../../../util/conversion.js'; +import { u32, toVector, Type } from '../../../../../util/conversion.js'; import { allInputSources, run } from '../../expression.js'; @@ -44,5 +44,5 @@ fn(async (t) => { return [makeCase(v)]; }); - await run(t, builtin('unpack4xU8'), [TypeU32], TypeVec(4, TypeU32), cfg, cases); + await run(t, builtin('unpack4xU8'), [Type.u32], Type.vec4u, cfg, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/utils.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/utils.js index 448d369d7f1..a603a10a6f7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/utils.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/utils.js @@ -1,11 +1,34 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/ /** +**/import { assert, unreachable } from '../../../../../../common/util/util.js';import { virtualMipSize } from '../../../../../util/texture/base.js'; +/* Valid types of Boundaries */ + + + + + + + + + + + + + + + +export function isBoundaryNegative(boundary) { + return boundary.endsWith('min-wrap'); +} + +/** * Generates the boundary entries for the given number of dimensions * * @param numDimensions: The number of dimensions to generate for * @returns an array of generated coord boundaries - */export function generateCoordBoundaries(numDimensions) {const ret = ['in-bounds']; + */ +export function generateCoordBoundaries(numDimensions) { + const ret = ['in-bounds']; if (numDimensions < 1 || numDimensions > 3) { throw new Error(`invalid numDimensions: ${numDimensions}`); @@ -23,18 +46,91 @@ return ret; } + + +export function getMipLevelFromLevelSpec(mipLevelCount, levelSpec) { + switch (levelSpec) { + case -1: + return -1; + case 0: + return 0; + case 'numLevels': + return mipLevelCount; + case 'numLevels-1': + return mipLevelCount - 1; + default: + unreachable(); + } +} + +export function isLevelSpecNegative(levelSpec) { + return levelSpec === -1; +} + +function getCoordForSize(size, boundary) { + const coord = size.map((v) => Math.floor(v / 2)); + switch (boundary) { + case 'in-bounds': + break; + default:{ + const axis = boundary[0]; + const axisIndex = axis.charCodeAt(0) - 'x'.charCodeAt(0); + const axisSize = size[axisIndex]; + const location = boundary.substring(2); + let v = 0; + switch (location) { + case 'min-wrap': + v = -1; + break; + case 'min-boundary': + v = 0; + break; + case 'max-wrap': + v = axisSize; + break; + case 'max-boundary': + v = axisSize - 1; + break; + default: + unreachable(); + } + coord[axisIndex] = v; + } + } + return coord; +} + +function getNumDimensions(dimension) { + switch (dimension) { + case '1d': + return 1; + case '2d': + return 2; + case '3d': + return 3; + } +} + +export function getCoordinateForBoundaries( +texture, +mipLevel, +boundary) +{ + const size = virtualMipSize(texture.dimension, texture, mipLevel); + const coord = getCoordForSize(size, boundary); + return coord.slice(0, getNumDimensions(texture.dimension)); +} + /** - * Generates a set of offset values to attempt in the range [-9, 8]. + * Generates a set of offset values to attempt in the range [-8, 7]. * * @param numDimensions: The number of dimensions to generate for * @return an array of generated offset values */ export function generateOffsets(numDimensions) { - if (numDimensions < 2 || numDimensions > 3) { - throw new Error(`generateOffsets: invalid numDimensions: ${numDimensions}`); - } + assert(numDimensions >= 2 && numDimensions <= 3); const ret = [undefined]; - for (const val of [-9, -8, 0, 1, 7, 8]) { + for (const val of [-8, 0, 1, 7]) { const v = []; for (let i = 0; i < numDimensions; ++i) { v.push(val); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/workgroupUniformLoad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/workgroupUniformLoad.spec.js new file mode 100644 index 00000000000..0a08baba0d9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/builtin/workgroupUniformLoad.spec.js @@ -0,0 +1,182 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Executes a control barrier synchronization function that affects memory and atomic operations in the workgroup address space. +`; // NOTE: The control barrier executed by this builtin is tested in the memory_model tests. + +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { + + + iterRange } from +'../../../../../../common/util/util.js'; +import { GPUTest } from '../../../../../gpu_test.js'; +import { checkElementsEqualGenerated } from '../../../../../util/check_contents.js'; + +export const g = makeTestGroup(GPUTest); + + + + + + + + + + + + + + +// A list of types configurations used for the workgroup variable. +const kTypes = { + bool: { + store_val: `true`, + expected: new Uint32Array([1]), + host_type: 'u32', + to_host: (x) => `u32(${x})` + }, + u32: { + store_val: `42`, + expected: new Uint32Array([42]) + }, + vec4u: { + store_val: `vec4u(42, 1, 0xffffffff, 777)`, + expected: new Uint32Array([42, 1, 0xffffffff, 777]) + }, + mat3x2f: { + store_val: `mat3x2(42, 1, 65536, -42, -1, -65536)`, + expected: new Float32Array([42, 1, 65536, -42, -1, -65536]) + }, + 'array': { + store_val: `array(42, 1, 0xffffffff, 777)`, + expected: new Uint32Array([42, 1, 0xffffffff, 777]) + }, + SimpleStruct: { + decls: 'struct SimpleStruct { a: u32, b: u32, c: u32, d: u32, }', + store_val: `SimpleStruct(42, 1, 0xffffffff, 777)`, + expected: new Uint32Array([42, 1, 0xffffffff, 777]) + }, + ComplexStruct: { + decls: `struct Inner { v: vec4u, } + struct ComplexStruct { + a: array, + @size(28) b: vec4u, + c: u32 + } + const v = vec4(42, 1, 0xffffffff, 777); + const rhs = ComplexStruct( + array(Inner(v.xyzw), Inner(v.yzwx), Inner(v.zwxy), Inner(v.wxyz)), + v.xzxz, + 0x12345678, + );`, + store_val: `rhs`, + expected: new Uint32Array([ + // v.xyzw + 42, 1, 0xffffffff, 777, + // v.yzwx + 1, 0xffffffff, 777, 42, + // v.zwxy + 0xffffffff, 777, 42, 1, + // v.wxyz + 777, 42, 1, 0xffffffff, + // v.xzxz + 42, 0xffffffff, 42, 0xffffffff, + // 12 bytes of padding + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x12345678] + ) + } +}; + +g.test('types'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#workgroupUniformLoad-builtin'). +desc( + `Test that the result of a workgroupUniformLoad is the value previously stored to the workgroup variable, for a variety of types. + ` +). +params((u) => +u.combine('type', keysOf(kTypes)).combine('wgsize', [ +[1, 1], +[3, 7], +[1, 128], +[16, 16]] +) +). +fn((t) => { + const type = kTypes[t.params.type]; + const wgsize_x = t.params.wgsize[0]; + const wgsize_y = t.params.wgsize[1]; + const num_invocations = wgsize_x * wgsize_y; + const num_words_per_invocation = type.expected.length; + const total_host_words = num_invocations * num_words_per_invocation; + + t.skipIf( + num_invocations > t.device.limits.maxComputeInvocationsPerWorkgroup, + `num_invocations (${num_invocations}) > maxComputeInvocationsPerWorkgroup (${t.device.limits.maxComputeInvocationsPerWorkgroup})` + ); + + let load = `workgroupUniformLoad(&wgvar)`; + if (type.to_host) { + load = type.to_host(load); + } + + // Construct a shader that stores a value to workgroup variable and then loads it using + // workgroupUniformLoad() in every invocation, copying the results back to a storage buffer. + const code = ` + ${type.decls ? type.decls : ''} + + @group(0) @binding(0) var buffer : array<${ + type.host_type ? type.host_type : t.params.type + }, ${num_invocations}>; + + var wgvar : ${t.params.type}; + + @compute @workgroup_size(${wgsize_x}, ${wgsize_y}) + fn main(@builtin(local_invocation_index) lid: u32) { + if (lid == ${num_invocations - 1}) { + wgvar = ${type.store_val}; + } + buffer[lid] = ${load}; + } + `; + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ code }), + entryPoint: 'main' + } + }); + + // Allocate a buffer and fill it with 0xdeadbeef values. + const outputBuffer = t.makeBufferWithContents( + new Uint32Array([...iterRange(total_host_words, (_i) => 0xdeadbeef)]), + GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + ); + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [{ binding: 0, resource: { buffer: outputBuffer } }] + }); + + // Run the shader. + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.queue.submit([encoder.finish()]); + + // Check that the output matches the expected values for each invocation. + t.expectGPUBufferValuesPassCheck( + outputBuffer, + (data) => + checkElementsEqualGenerated(data, (i) => { + return Number(type.expected[i % num_words_per_invocation]); + }), + { + type: type.expected.constructor, + typedLength: total_host_words + } + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/user/ptr_params.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/user/ptr_params.spec.js index 1c3976ed4c6..fdc31662a61 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/user/ptr_params.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/call/user/ptr_params.spec.js @@ -61,7 +61,7 @@ expected) inputUsage === 'uniform' ? GPUBufferUsage.UNIFORM : GPUBufferUsage.STORAGE ); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: expected.buffer.byteLength, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -634,6 +634,150 @@ ${main} run(t, wgsl, 'storage', input, expected); }); +g.test('atomic_ptr_to_element'). +desc( + 'Test a pointer parameter to an atomic of an array can be read from and written to by a callee function' +). +params((u) => u.combine('address_space', ['workgroup', 'storage'])). +fn((t) => { + t.skipIfLanguageFeatureNotSupported('unrestricted_pointer_parameters'); + + const main = { + workgroup: ` +var W_input : T; +var W_output : T; +@compute @workgroup_size(1) +fn main() { + // Copy input -> W_input + for (var i = 0; i < 2; i++) { + for (var j = 0; j < 3; j++) { + for (var k = 0; k < 2; k++) { + atomicStore(&W_input[k][j][i], atomicLoad(&input[k][j][i])); + } + } + } + + f0(&W_input, &W_output); + + // Copy W_output -> output + for (var i = 0; i < 2; i++) { + for (var j = 0; j < 3; j++) { + for (var k = 0; k < 2; k++) { + atomicStore(&output[k][j][i], atomicLoad(&W_output[k][j][i])); + } + } + } +} +`, + storage: ` +@compute @workgroup_size(1) +fn main() { + f0(&input, &output); +} +` + }[t.params.address_space]; + + const ptr = (ty) => + t.params.address_space === 'storage' ? + `ptr` : + `ptr<${t.params.address_space}, ${ty}>`; + + const wgsl = ` +alias T3 = atomic; +alias T2 = array; +alias T1 = array; +alias T = array; + +@binding(0) @group(0) var input : T; +@binding(1) @group(0) var output : T; + +fn f2(in : ${ptr('T2')}, out : ${ptr('T2')}) { + let v = atomicLoad(&(*in)[0]); + atomicStore(&(*out)[1], v); +} + +fn f1(in : ${ptr('T1')}, out : ${ptr('T1')}) { + f2(&(*in)[0], &(*out)[1]); + f2(&(*in)[2], &(*out)[0]); +} + +fn f0(in : ${ptr('T')}, out : ${ptr('T')}) { + f1(&(*in)[1], &(*out)[0]); +} + +${main} +`; + + + const input = new Uint32Array([ + /* [0][0][0] */1, + /* [0][0][1] */2, + /* [0][1][0] */3, + /* [0][1][1] */4, + /* [0][2][0] */5, + /* [0][2][1] */6, + /* [1][0][0] */7, // -> [0][1][1] + /* [1][0][1] */8, + /* [1][1][0] */9, + /* [1][1][1] */10, + /* [1][2][0] */11, // -> [0][0][1] + /* [1][2][1] */12] + ); + + + const expected = new Uint32Array([ + /* [0][0][0] */0, + /* [0][0][1] */11, + /* [0][1][0] */0, + /* [0][1][1] */7, + /* [0][2][0] */0, + /* [0][2][1] */0, + /* [1][0][0] */0, + /* [1][0][1] */0, + /* [1][1][0] */0, + /* [1][1][1] */0, + /* [1][2][0] */0, + /* [1][2][1] */0] + ); + + run(t, wgsl, 'storage', input, expected); +}); + +g.test('array_length'). +desc( + 'Test a pointer parameter to a runtime sized array can be used by arrayLength() in a callee function' +). +fn((t) => { + t.skipIfLanguageFeatureNotSupported('unrestricted_pointer_parameters'); + + const wgsl = ` +@binding(0) @group(0) var arr : array; +@binding(1) @group(0) var output : u32; + +fn f2(p : ptr, read>) -> u32 { + return arrayLength(p); +} + +fn f1(p : ptr, read>) -> u32 { + return f2(p); +} + +fn f0(p : ptr, read>) -> u32 { + return f1(p); +} + +@compute @workgroup_size(1) +fn main() { + output = f0(&arr); +} +`; + + const input = new Uint32Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); + const expected = new Uint32Array([12]); + + run(t, wgsl, 'storage', input, expected); +}); + g.test('mixed_ptr_parameters'). desc('Test that functions can accept multiple, mixed pointer parameters'). fn((t) => { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case.js index e361bf370db..d2d3a019de6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case.js @@ -1,14 +1,28 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { Vector, i32, u32 } from '../../../util/conversion.js';import { +**/import { crc32 } from '../../../../common/util/crc32.js';import { assert } from '../../../../common/util/util.js'; +import { + abstractInt, + i32, + u32, + + VectorValue } from +'../../../util/conversion.js'; +import { cartesianProduct, + quantizeToI32, + quantizeToI64, quantizeToU32 } from '../../../util/math.js'; +function notUndefined(value) { + return value !== undefined; +} + /** Case is a single expression test case. */ @@ -17,12 +31,60 @@ -/** CaseList is a list of Cases */ +/** + * Filters a given set of Cases down to a target number of cases by + * randomly selecting which Cases to return. + * + * The selection algorithm is deterministic and stable for a case's + * inputs. + * + * This means that if a specific case is selected is not affected by the + * presence of other cases in the list, so in theory it is possible to create a + * pathological set of cases such that all or not of the cases are selected + * in spite of the target number. + * + * This is a trade-off from guaranteeing stability of the selected cases over + * small changes, so the target number of cases is more of a suggestion. It is + * still guaranteed that if you set n0 < n1, then the invocation with n0 will + * return at most the number of cases that n1 does, it just isn't guaranteed to + * be less. + * + * @param dis is a string provided for additional hashing information to avoid + * systemic bias in the selection process across different test + * suites. Specifically every Case with the same input values being + * included or skipped regardless of the operation that they are + * testing. This string should be something like the name of the case + * cache the values are for or the operation under test. + * @param n number of cases targeted be returned. Expected to be a positive + * integer. If equal or greater than the number of cases, then all the + * cases are returned. 0 is not allowed, since it is likely a + * programming error, because if the caller intentionally wants 0 + * items, they can just use []. + * @param cases list of Cases to be selected from. + */ +export function selectNCases(dis, n, cases) { + assert(n > 0 && Math.round(n) === n, `n ${n} is expected to be a positive integer`); + const count = cases.length; + if (n >= count) { + return cases; + } + const dis_crc32 = crc32(dis); + return cases.filter( + (c) => Math.trunc(n / count * 0xffff_ffff) > (crc32(c.input.toString()) ^ dis_crc32) >>> 0 + ); +} + +/** + * A function that performs a binary operation on x and y, and returns the + * expected result. + */ + + /** - * A function that performs a binary operation on x and y, and returns the expected - * result. + * A function that performs a vector-vector operation on x and y, and returns the + * expected result. */ @@ -50,8 +112,8 @@ scalarize) return undefined; } return { - input: [scalarize(scalar), new Vector(vector.map(scalarize))], - expected: new Vector(result.map(scalarize)) + input: [scalarize(scalar), new VectorValue(vector.map(scalarize))], + expected: new VectorValue(result.filter(notUndefined).map(scalarize)) }; } @@ -70,16 +132,13 @@ op, quantize, scalarize) { - const cases = new Array(); - scalars.forEach((s) => { - vectors.forEach((v) => { - const c = makeScalarVectorBinaryToVectorCase(s, v, op, quantize, scalarize); - if (c !== undefined) { - cases.push(c); - } - }); + return scalars.flatMap((s) => { + return vectors. + map((v) => { + return makeScalarVectorBinaryToVectorCase(s, v, op, quantize, scalarize); + }). + filter(notUndefined); }); - return cases; } /** @@ -104,8 +163,8 @@ scalarize) return undefined; } return { - input: [new Vector(vector.map(scalarize)), scalarize(scalar)], - expected: new Vector(result.map(scalarize)) + input: [new VectorValue(vector.map(scalarize)), scalarize(scalar)], + expected: new VectorValue(result.filter(notUndefined).map(scalarize)) }; } @@ -124,16 +183,13 @@ op, quantize, scalarize) { - const cases = new Array(); - scalars.forEach((s) => { - vectors.forEach((v) => { - const c = makeVectorScalarBinaryToVectorCase(v, s, op, quantize, scalarize); - if (c !== undefined) { - cases.push(c); - } - }); + return scalars.flatMap((s) => { + return vectors. + map((v) => { + return makeVectorScalarBinaryToVectorCase(v, s, op, quantize, scalarize); + }). + filter(notUndefined); }); - return cases; } /** @@ -192,6 +248,34 @@ op) return generateVectorScalarBinaryToVectorCases(vectors, scalars, op, quantizeToI32, i32); } +/** + * @returns array of Case for the input params with op applied + * @param scalars array of scalar params + * @param vectors array of vector params (2, 3, or 4 elements) + * @param op he op to apply to each pair of scalar and vector + */ +export function generateI64VectorBinaryToVectorCases( +scalars, +vectors, +op) +{ + return generateScalarVectorBinaryToVectorCases(scalars, vectors, op, quantizeToI64, abstractInt); +} + +/** + * @returns array of Case for the input params with op applied + * @param vectors array of vector params (2, 3, or 4 elements) + * @param scalars array of scalar params + * @param op he op to apply to each pair of vector and scalar + */ +export function generateVectorI64BinaryToVectorCases( +vectors, +scalars, +op) +{ + return generateVectorScalarBinaryToVectorCases(vectors, scalars, op, quantizeToI64, abstractInt); +} + /** * @returns array of Case for the input params with op applied * @param param0s array of inputs to try for the first param @@ -244,4 +328,113 @@ param1s, op) { return generateScalarBinaryToScalarCases(param0s, param1s, op, quantizeToU32, u32); +} + +/** + * @returns an array of Cases for operations over a range of inputs + * @param param0s array of inputs to try for the first param + * @param param1s array of inputs to try for the second param + * @param op callback called on each pair of inputs to produce each case + */ +export function generateBinaryToI64Cases( +param0s, +param1s, +op) +{ + return generateScalarBinaryToScalarCases(param0s, param1s, op, quantizeToI64, abstractInt); +} + +/** + * @returns a Case for the input params with op applied + * @param param0 vector param (2, 3, or 4 elements) for the first param + * @param param1 vector param (2, 3, or 4 elements) for the second param + * @param op the op to apply to each pair of vectors + * @param quantize function to quantize all values in vectors and scalars + * @param scalarize function to convert numbers to Scalars + */ +function makeVectorVectorToScalarCase( +param0, +param1, +op, +quantize, +scalarize) +{ + const param0_quantized = param0.map(quantize); + const param1_quantized = param1.map(quantize); + const result = op(param0_quantized, param1_quantized); + if (result === undefined) return undefined; + + return { + input: [ + new VectorValue(param0_quantized.map(scalarize)), + new VectorValue(param1_quantized.map(scalarize))], + + expected: scalarize(result) + }; +} + +/** + * @returns array of Case for the input params with op applied + * @param param0s array of vector params (2, 3, or 4 elements) for the first param + * @param param1s array of vector params (2, 3, or 4 elements) for the second param + * @param op the op to apply to each pair of vectors + * @param quantize function to quantize all values in vectors and scalars + * @param scalarize function to convert numbers to Scalars + */ +function generateVectorVectorToScalarCases( +param0s, +param1s, +op, +quantize, +scalarize) +{ + return param0s.flatMap((param0) => { + return param1s. + map((param1) => { + return makeVectorVectorToScalarCase(param0, param1, op, quantize, scalarize); + }). + filter(notUndefined); + }); +} + +/** + * @returns array of Case for the input params with op applied + * @param param0s array of vector params (2, 3, or 4 elements) for the first param + * @param param1s array of vector params (2, 3, or 4 elements) for the second param + * @param op the op to apply to each pair of vectors + */ +export function generateVectorVectorToI32Cases( +param0s, +param1s, +op) +{ + return generateVectorVectorToScalarCases(param0s, param1s, op, quantizeToI32, i32); +} + +/** + * @returns array of Case for the input params with op applied + * @param param0s array of vector params (2, 3, or 4 elements) for the first param + * @param param1s array of vector params (2, 3, or 4 elements) for the second param + * @param op the op to apply to each pair of vectors + */ +export function generateVectorVectorToU32Cases( +param0s, +param1s, +op) +{ + return generateVectorVectorToScalarCases(param0s, param1s, op, quantizeToU32, u32); +} + +/** + * @returns array of Case for the input params with op applied + * @param param0s array of vector params (2, 3, or 4 elements) for the first param + * @param param1s array of vector params (2, 3, or 4 elements) for the second param + * @param op the op to apply to each pair of vectors + */ +export function generateVectorVectorToI64Cases( +param0s, +param1s, +op) +{ + return generateVectorVectorToScalarCases(param0s, param1s, op, quantizeToI64, abstractInt); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case_cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case_cache.js index 261c55d762a..41857ad8fa6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case_cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/case_cache.js @@ -3,11 +3,11 @@ **/import { dataCache } from '../../../../common/framework/data_cache.js';import { unreachable } from '../../../../common/util/util.js';import BinaryStream from '../../../util/binary_stream.js'; import { deserializeComparator, serializeComparator } from '../../../util/compare.js'; import { - Matrix, - Scalar, + MatrixValue, - Vector, + VectorValue, deserializeValue, + isScalarValue, serializeValue } from '../../../util/conversion.js'; import { @@ -31,7 +31,7 @@ SerializedExpectationKind = /*#__PURE__*/function (SerializedExpectationKind) {S /** serializeExpectation() serializes an Expectation to a BinaryStream */ export function serializeExpectation(s, e) { - if (e instanceof Scalar || e instanceof Vector || e instanceof Matrix) { + if (isScalarValue(e) || e instanceof VectorValue || e instanceof MatrixValue) { s.writeU8(SerializedExpectationKind.Value); serializeValue(s, e); return; @@ -123,11 +123,11 @@ export function deserializeCase(s) { return { input, expected }; } -/** CaseListBuilder is a function that builds a CaseList */ +/** CaseListBuilder is a function that builds a list of cases, Case[] */ /** - * CaseCache is a cache of CaseList. + * CaseCache is a cache of Case[]. * CaseCache implements the Cacheable interface, so the cases can be pre-built * and stored in the data cache, reducing computation costs at CTS runtime. */ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/non_zero.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/non_zero.spec.js new file mode 100644 index 00000000000..e79f9a3a2b5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/non_zero.spec.js @@ -0,0 +1,802 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for value constructors from components +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { + ArrayValue, + + + Type, + + + + scalarTypeOf, + vec2, + vec3 } from +'../../../../util/conversion.js'; +import { FP } from '../../../../util/floating_point.js'; +import { + + allInputSources, + basicExpressionBuilder, + run } from +'../expression.js'; + +export const g = makeTestGroup(GPUTest); + +/** @returns true if 'v' is 'min' or 'max' */ +function isMinOrMax(v) { + return v === 'min' || v === 'max'; +} + +/** A list of concrete types to test for the given abstract-numeric type */ +const kConcreteTypesForAbstractType = { + 'abstract-float': ['f32', 'f16'], + 'abstract-int': ['f32', 'f16', 'i32', 'u32'], + 'vec3': ['vec3f', 'vec3h', 'vec3i', 'vec3u'], + 'vec4': ['vec4f', 'vec4h'], + 'mat2x3': ['mat2x3f', 'mat2x3h'] +}; + +/** + * @returns the lowest finite value for 'kind' if 'v' is 'min', + * the highest finite value for 'kind' if 'v' is 'max', + * otherwise returns 'v' + */ +function valueFor(v, kind) { + if (!isMinOrMax(v)) { + return v; + } + switch (kind) { + case 'bool': + return v === 'min' ? 0 : 1; + case 'i32': + return v === 'min' ? -0x80000000 : 0x7fffffff; + case 'u32': + return v === 'min' ? 0 : 0xffffffff; + case 'f32': + return v === 'min' ? FP['f32'].constants().negative.min : FP['f32'].constants().positive.max; + case 'f16': + return v === 'min' ? FP['f16'].constants().negative.min : FP['f16'].constants().positive.max; + } +} + +g.test('scalar_identity'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a scalar constructed from a value of the same type produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('value', ['min', 'max', 1, 2, 5, 100]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } + t.skipIf(t.params.type === 'bool' && !isMinOrMax(t.params.value)); +}). +fn(async (t) => { + const type = Type[t.params.type]; + const value = valueFor(t.params.value, t.params.type); + await run( + t, + basicExpressionBuilder((ops) => `${type}(${ops[0]})`), + [type], + type, + t.params, + [{ input: [type.create(value)], expected: type.create(value) }] + ); +}); + +g.test('vector_identity'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a vector constructed from a value of the same type produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('width', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const vectorType = Type.vec(t.params.width, elementType); + const elements = []; + const fn = t.params.infer_type ? `vec${t.params.width}` : `${vectorType}`; + for (let i = 0; i < t.params.width; i++) { + if (t.params.type === 'bool') { + elements.push(i & 1); + } else { + elements.push((i + 1) * 10); + } + } + + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops[0]})`), + [vectorType], + vectorType, + t.params, + [ + { + input: vectorType.create(elements), + expected: vectorType.create(elements) + }] + + ); +}); + +g.test('concrete_vector_splat'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a vector constructed from a single concrete scalar produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('value', ['min', 'max', 1, 2, 5, 100]). +combine('width', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } + t.skipIf(t.params.type === 'bool' && !isMinOrMax(t.params.value)); +}). +fn(async (t) => { + const value = valueFor(t.params.value, t.params.type); + const elementType = Type[t.params.type]; + const vectorType = Type.vec(t.params.width, elementType); + const fn = t.params.infer_type ? `vec${t.params.width}` : `${vectorType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops[0]})`), + [elementType], + vectorType, + t.params, + [{ input: [elementType.create(value)], expected: vectorType.create(value) }] + ); +}); + +g.test('abstract_vector_splat'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a vector constructed from a single abstract scalar produces the expected value`). +params((u) => +u. +combine('abstract_type', ['abstract-int', 'abstract-float']). +expand('concrete_type', (t) => kConcreteTypesForAbstractType[t.abstract_type]). +combine('value', [1, 2, 5, 100]). +combine('width', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const suffix = t.params.abstract_type === 'abstract-float' ? '.0' : ''; + const concreteElementType = Type[t.params.concrete_type]; + const concreteVectorType = Type.vec(t.params.width, concreteElementType); + const fn = `vec${t.params.width}`; + await run( + t, + basicExpressionBuilder((_) => `${fn}(${t.params.value * 0x100000000}${suffix}) / 0x100000000`), + [], + concreteVectorType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [{ input: [], expected: concreteVectorType.create(t.params.value) }] + ); +}); + +g.test('concrete_vector_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a vector constructed from concrete element values produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('width', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const vectorType = Type.vec(t.params.width, elementType); + const elements = []; + const fn = t.params.infer_type ? `vec${t.params.width}` : `${vectorType}`; + for (let i = 0; i < t.params.width; i++) { + if (t.params.type === 'bool') { + elements.push(i & 1); + } else { + elements.push((i + 1) * 10); + } + } + + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops.join(', ')})`), + elements.map((e) => elementType), + vectorType, + t.params, + [ + { + input: elements.map((v) => elementType.create(v)), + expected: vectorType.create(elements) + }] + + ); +}); + +g.test('abstract_vector_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a vector constructed from abstract element values produces the expected value`). +params((u) => +u. +combine('abstract_type', ['abstract-int', 'abstract-float']). +expand('concrete_type', (t) => kConcreteTypesForAbstractType[t.abstract_type]). +combine('width', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const suffix = t.params.abstract_type === 'abstract-float' ? '.0' : ''; + const concreteElementType = Type[t.params.concrete_type]; + const concreteVectorType = Type.vec(t.params.width, concreteElementType); + const fn = `vec${t.params.width}`; + const elements = []; + for (let i = 0; i < t.params.width; i++) { + elements.push((i + 1) * 10); + } + await run( + t, + basicExpressionBuilder( + (_) => `${fn}(${elements.map((v) => `${v * 0x100000000}${suffix}`).join(', ')}) / 0x100000000` + ), + [], + concreteVectorType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [{ input: [], expected: concreteVectorType.create(elements) }] + ); +}); + +const kMixSignatures = [ +'2s', // [vec2, scalar] +'s2', // [scalar, vec2] +'2ss', // [vec2, scalar, scalar] +'s2s', // [scalar, vec2, scalar] +'ss2', // [scalar, scalar, vec2 ] +'22', // [vec2, vec2] +'3s', // [vec3, scalar] +'s3' // [scalar, vec3] +]; + +g.test('concrete_vector_mix'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + `Test that a vector constructed from a mix of concrete element values and sub-vectors produces the expected value` +). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('signature', kMixSignatures). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + let width = 0; + const elementValue = (i) => t.params.type === 'bool' ? i & 1 : (i + 1) * 10; + const elements = []; + const nextValue = () => { + const value = elementValue(width++); + elements.push(value); + return elementType.create(value); + }; + const args = []; + for (const c of t.params.signature) { + switch (c) { + case '2': + args.push(vec2(nextValue(), nextValue())); + break; + case '3': + args.push(vec3(nextValue(), nextValue(), nextValue())); + break; + case 's': + args.push(nextValue()); + break; + } + } + const vectorType = Type.vec(width, elementType); + const fn = t.params.infer_type ? `vec${width}` : `${vectorType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops.join(', ')})`), + args.map((e) => e.type), + vectorType, + t.params, + [ + { + input: args, + expected: vectorType.create(elements) + }] + + ); +}); + +g.test('abstract_vector_mix'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + `Test that a vector constructed from a mix of abstract element values and sub-vectors produces the expected value` +). +params((u) => +u. +combine('abstract_type', ['abstract-int', 'abstract-float']). +expand('concrete_type', (t) => kConcreteTypesForAbstractType[t.abstract_type]). +combine('signature', kMixSignatures) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + let width = 0; + const suffix = t.params.abstract_type === 'abstract-float' ? '.0' : ''; + const concreteElementType = Type[t.params.concrete_type]; + const elementValue = (i) => (i + 1) * 10; + const elements = []; + const nextValue = () => { + const value = elementValue(width++); + elements.push(value); + return `${value * 0x100000000}${suffix}`; + }; + const args = []; + for (const c of t.params.signature) { + switch (c) { + case '2': + args.push(`vec2(${nextValue()}, ${nextValue()})`); + break; + case '3': + args.push(`vec3(${nextValue()}, ${nextValue()}, ${nextValue()})`); + break; + case 's': + args.push(`${nextValue()}`); + break; + } + } + const concreteVectorType = Type.vec(width, concreteElementType); + const fn = `vec${width}`; + await run( + t, + basicExpressionBuilder((_) => `${fn}(${args.join(', ')}) / 0x100000000`), + [], + concreteVectorType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [ + { + input: [], + expected: concreteVectorType.create(elements) + }] + + ); +}); + +g.test('matrix_identity'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a matrix constructed from a value of the same type produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const elements = []; + for (let column = 0; column < t.params.columns; column++) { + for (let row = 0; row < t.params.rows; row++) { + elements.push((column + 1) * 10 + (row + 1)); + } + } + const fn = t.params.infer_type ? `mat${t.params.columns}x${t.params.rows}` : `${matrixType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops[0]})`), + [matrixType], + matrixType, + t.params, + [ + { + input: matrixType.create(elements), + expected: matrixType.create(elements) + }] + + ); +}); + +g.test('concrete_matrix_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a matrix constructed from concrete element values produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const elements = []; + for (let column = 0; column < t.params.columns; column++) { + for (let row = 0; row < t.params.rows; row++) { + elements.push((column + 1) * 10 + (row + 1)); + } + } + const fn = t.params.infer_type ? `mat${t.params.columns}x${t.params.rows}` : `${matrixType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops.join(', ')})`), + elements.map((e) => elementType), + matrixType, + t.params, + [ + { + input: elements.map((e) => elementType.create(e)), + expected: matrixType.create(elements) + }] + + ); +}); + +g.test('abstract_matrix_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a matrix constructed from concrete element values produces the expected value`). +params((u) => +u. +combine('concrete_type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const concreteElementType = Type[t.params.concrete_type]; + const concreteMatrixType = Type.mat(t.params.columns, t.params.rows, concreteElementType); + const elements = []; + for (let column = 0; column < t.params.columns; column++) { + for (let row = 0; row < t.params.rows; row++) { + elements.push((column + 1) * 10 + (row + 1)); + } + } + const fn = `mat${t.params.columns}x${t.params.rows}`; + await run( + t, + basicExpressionBuilder( + (_) => `${fn}(${elements.map((v) => `${v * 0x100000000}.0`).join(', ')}) * (1.0 / 0x100000000)` + ), + [], + concreteMatrixType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [ + { + input: [], + expected: concreteMatrixType.create(elements) + }] + + ); +}); + +g.test('concrete_matrix_column_vectors'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a matrix constructed from concrete column vectors produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const columnType = Type.vec(t.params.rows, elementType); + const matrixType = Type.mat(t.params.columns, t.params.rows, elementType); + const elements = []; + const columnVectors = []; + for (let column = 0; column < t.params.columns; column++) { + const columnElements = []; + for (let row = 0; row < t.params.rows; row++) { + const v = (column + 1) * 10 + (row + 1); + elements.push(v); + columnElements.push(v); + } + columnVectors.push(columnType.create(columnElements)); + } + const fn = t.params.infer_type ? `mat${t.params.columns}x${t.params.rows}` : `${matrixType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops.join(', ')})`), + columnVectors.map((v) => v.type), + matrixType, + t.params, + [ + { + input: columnVectors, + expected: matrixType.create(elements) + }] + + ); +}); + +g.test('abstract_matrix_column_vectors'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that a matrix constructed from abstract column vectors produces the expected value`). +params((u) => +u. +combine('concrete_type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const concreteElementType = Type[t.params.concrete_type]; + const concreteMatrixType = Type.mat(t.params.columns, t.params.rows, concreteElementType); + const elements = []; + const columnVectors = []; + for (let column = 0; column < t.params.columns; column++) { + const columnElements = []; + for (let row = 0; row < t.params.rows; row++) { + const v = (column + 1) * 10 + (row + 1); + elements.push(v); + columnElements.push(`${v * 0x100000000}`); + } + columnVectors.push(`vec${t.params.rows}(${columnElements.join(', ')})`); + } + const fn = `mat${t.params.columns}x${t.params.rows}`; + await run( + t, + basicExpressionBuilder((_) => `${fn}(${columnVectors.join(', ')}) * (1.0 / 0x100000000)`), + [], + concreteMatrixType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [ + { + input: [], + expected: concreteMatrixType.create(elements) + }] + + ); +}); + +g.test('concrete_array_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that an array constructed from concrete element values produces the expected value`). +params((u) => +u. +combine('inputSource', allInputSources). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16', 'vec3f', 'vec4i']). +combine('length', [1, 5, 10]). +combine('infer_type', [false, true]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const elementType = Type[t.params.type]; + const arrayType = Type.array(t.params.length, elementType); + const elements = []; + for (let i = 0; i < t.params.length; i++) { + elements.push((i + 1) * 10); + } + const fn = t.params.infer_type ? `array` : `${arrayType}`; + await run( + t, + basicExpressionBuilder((ops) => `${fn}(${ops.join(', ')})`), + elements.map((e) => elementType), + arrayType, + t.params, + [ + { + input: elements.map((e) => elementType.create(e)), + expected: arrayType.create(elements) + }] + + ); +}); + +g.test('abstract_array_elements'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that an array constructed from element values produces the expected value`). +params((u) => +u. +combine('abstract_type', [ +'abstract-int', +'abstract-float', +'vec3', +'vec4', +'mat2x3'] +). +expand('concrete_type', (t) => kConcreteTypesForAbstractType[t.abstract_type]). +combine('length', [1, 5, 10]) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(Type[t.params.concrete_type]).kind === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const count = t.params.length; + const concreteElementType = Type[t.params.concrete_type]; + const concreteArrayType = Type.array(count, concreteElementType); + const elements = []; + let i = 0; + const nextValue = () => ++i * 10; + for (let i = 0; i < count; i++) { + switch (t.params.abstract_type) { + case 'abstract-int':{ + const value = nextValue(); + elements.push({ args: `${value}`, value: concreteElementType.create(value) }); + break; + } + case 'abstract-float':{ + const value = nextValue(); + elements.push({ args: `${value}.0`, value: concreteElementType.create(value) }); + break; + } + case 'vec3':{ + const x = nextValue(); + const y = nextValue(); + const z = nextValue(); + elements.push({ + args: `vec3(${x}, ${y}, ${z})`, + value: concreteElementType.create([x, y, z]) + }); + break; + } + case 'vec4':{ + const x = nextValue(); + const y = nextValue(); + const z = nextValue(); + const w = nextValue(); + elements.push({ + args: `vec4(${x}.0, ${y}.0, ${z}.0, ${w}.0)`, + value: concreteElementType.create([x, y, z, w]) + }); + break; + } + case 'mat2x3':{ + const e00 = nextValue(); + const e01 = nextValue(); + const e02 = nextValue(); + const e10 = nextValue(); + const e11 = nextValue(); + const e12 = nextValue(); + elements.push({ + args: `mat2x3(vec3(${e00}.0, ${e01}.0, ${e02}.0), vec3(${e10}.0, ${e11}.0, ${e12}.0))`, + value: concreteElementType.create([e00, e01, e02, e10, e11, e12]) + }); + break; + } + } + } + const fn = `array`; + await run( + t, + basicExpressionBuilder((_) => `${fn}(${elements.map((e) => e.args).join(', ')})`), + [], + concreteArrayType, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [ + { + input: [], + expected: new ArrayValue(elements.map((e) => e.value)) + }] + + ); +}); + +g.test('structure'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc(`Test that an structure constructed from element values produces the expected value`). +params((u) => +u. +combine('member_types', [ +['bool'], +['u32'], +['vec3f'], +['i32', 'u32'], +['i32', 'f16', 'vec4i', 'mat3x2f'], +['bool', 'u32', 'f16', 'vec3f', 'vec2i'], +['i32', 'u32', 'f32', 'f16', 'vec3f', 'vec4i']] +). +combine('nested', [false, true]). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const values = t.params.member_types.map((ty, i) => Type[ty].create(i)); + + const builder = basicExpressionBuilder((ops) => + t.params.nested ? + `OuterStruct(10, MyStruct(${ops.join(', ')}), 20).inner.member_${t.params.member_index}` : + `MyStruct(${ops.join(', ')}).member_${t.params.member_index}` + ); + await run( + t, + (params) => { + return ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +${builder(params)} + +struct MyStruct { +${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; +struct OuterStruct { + pre : i32, + inner : MyStruct, + post : i32, +}; +`; + }, + t.params.member_types.map((ty) => Type[ty]), + memberType, + { inputSource: 'const' }, + [{ input: values, expected: values[t.params.member_index] }] + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/zero_value.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/zero_value.spec.js new file mode 100644 index 00000000000..c8df64d2e58 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/constructor/zero_value.spec.js @@ -0,0 +1,184 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for zero value constructors +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { basicExpressionBuilder, run } from '../expression.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('scalar'). +specURL('https://www.w3.org/TR/WGSL/#zero-value-builtin-function'). +desc(`Test that a zero value scalar constructor produces the expected zero value`). +params((u) => u.combine('type', ['bool', 'i32', 'u32', 'f32', 'f16'])). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const type = Type[t.params.type]; + await run( + t, + basicExpressionBuilder((ops) => `${type}()`), + [], + type, + { inputSource: 'const' }, + [{ input: [], expected: type.create(0) }] + ); +}); + +g.test('vector'). +specURL('https://www.w3.org/TR/WGSL/#zero-value-builtin-function'). +desc(`Test that a zero value vector constructor produces the expected zero value`). +params((u) => +u. +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']). +combine('width', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const type = Type.vec(t.params.width, Type[t.params.type]); + await run( + t, + basicExpressionBuilder((ops) => `${type}()`), + [], + type, + { inputSource: 'const' }, + [{ input: [], expected: type.create(0) }] + ); +}); + +g.test('vector_prefix'). +desc(`Test that a zero value vector constructor produces the expected zero value`). +params((u) => +u.combine('type', ['i32', 'u32', 'f32', 'f16']).combine('width', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const type = Type.vec(t.params.width, Type[t.params.type]); + await run( + t, + basicExpressionBuilder((ops) => `vec${t.params.width}()`), + [], + type, + { inputSource: 'const', constEvaluationMode: 'direct' }, + [{ input: [], expected: type.create(0) }] + ); +}); + +g.test('matrix'). +specURL('https://www.w3.org/TR/WGSL/#zero-value-builtin-function'). +desc(`Test that a zero value matrix constructor produces the expected zero value`). +params((u) => +u. +combine('type', ['f32', 'f16']). +combine('columns', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const type = Type.mat(t.params.columns, t.params.rows, Type[t.params.type]); + await run( + t, + basicExpressionBuilder((ops) => `${type}()`), + [], + type, + { inputSource: 'const' }, + [{ input: [], expected: type.create(0) }] + ); +}); + +g.test('array'). +specURL('https://www.w3.org/TR/WGSL/#zero-value-builtin-function'). +desc(`Test that a zero value matrix constructor produces the expected zero value`). +params((u) => +u. +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16', 'vec3f', 'vec4i']). +combine('length', [1, 5, 10]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const type = Type.array(t.params.length, Type[t.params.type]); + await run( + t, + basicExpressionBuilder((ops) => `${type}()`), + [], + type, + { inputSource: 'const' }, + [{ input: [], expected: type.create(0) }] + ); +}); + +g.test('structure'). +specURL('https://www.w3.org/TR/WGSL/#zero-value-builtin-function'). +desc(`Test that an structure constructed from element values produces the expected value`). +params((u) => +u. +combine('member_types', [ +['bool'], +['u32'], +['vec3f'], +['i32', 'u32'], +['i32', 'f16', 'vec4i', 'mat3x2f'], +['bool', 'u32', 'f16', 'vec3f', 'vec2i'], +['i32', 'u32', 'f32', 'f16', 'vec3f', 'vec4i']] +). +combine('nested', [false, true]). +beginSubcases(). +expand('member_index', (t) => t.member_types.map((_, i) => i)) +). +beforeAllSubcases((t) => { + if (t.params.member_types.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const memberType = Type[t.params.member_types[t.params.member_index]]; + const builder = basicExpressionBuilder((_) => + t.params.nested ? + `OuterStruct().inner.member_${t.params.member_index}` : + `MyStruct().member_${t.params.member_index}` + ); + await run( + t, + (params) => { + return ` +${t.params.member_types.includes('f16') ? 'enable f16;' : ''} + +${builder(params)} + +struct MyStruct { +${t.params.member_types.map((ty, i) => ` member_${i} : ${ty},`).join('\n')} +}; +struct OuterStruct { + pre : i32, + inner : MyStruct, + post : i32, +}; +`; + }, + [], + memberType, + { inputSource: 'const' }, + [{ input: [], expected: memberType.create(0) }] + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expectation.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expectation.js index f5c2726bbac..d859117054d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expectation.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expectation.js @@ -1,6 +1,12 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { compare } from '../../../util/compare.js';import { Matrix, Scalar, Vector } from '../../../util/conversion.js'; +**/import { compare } from '../../../util/compare.js';import { + ArrayValue, + MatrixValue, + + VectorValue, + isScalarValue } from +'../../../util/conversion.js'; import { FPInterval } from '../../../util/floating_point.js'; @@ -14,9 +20,10 @@ import { FPInterval } from '../../../util/floating_point.js'; export function isComparator(e) { return !( e instanceof FPInterval || - e instanceof Scalar || - e instanceof Vector || - e instanceof Matrix || + isScalarValue(e) || + e instanceof VectorValue || + e instanceof MatrixValue || + e instanceof ArrayValue || e instanceof Array); } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expression.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expression.js index e3d47b582c6..2c1a2c9473e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expression.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/expression.js @@ -7,14 +7,16 @@ import { MatrixType, ScalarType, - - TypeU32, - TypeVec, - - Vector, + Type, VectorType, - scalarTypeOf } from + + VectorValue, + isAbstractType, + scalarTypeOf, + ArrayType, + elementTypeOf } from '../../../util/conversion.js'; +import { align } from '../../../util/math.js'; import { toComparator } from './expectation.js'; @@ -35,6 +37,18 @@ export const onlyConstInputSource = ['const']; /** All input sources except const */ export const allButConstInputSource = ['uniform', 'storage_r', 'storage_rw']; +/** + * An enumerator of methods the const-expression is evaluated and assigned to the output. + * direct: Each case has a separate assignment statement to the output buffer, where the RHS of + * the assignment holds the case's evaluated expression. + * unrolled: The case expressions are all evaluated and stored in a module-scope 'const' array. + * This array is indexed and the value is copied to the output buffer using an unrolled + * sequence of assignment statements. + * loop: The case expressions are all evaluated and stored in a module-scope 'const' array. + * This array is indexed and the value is copied to the output buffer using a for loop. + */ + + /** Configuration for running a expression test */ @@ -48,103 +62,127 @@ export const allButConstInputSource = ['uniform', 'storage_r', 'storage_rw']; -// Helper for returning the stride for a given Type -function valueStride(ty) { - // AbstractFloats and AbstractInts are passed out of the shader via structs of - // 2x u32s and unpacking containers as arrays - if (scalarTypeOf(ty).kind === 'abstract-float' || scalarTypeOf(ty).kind === 'abstract-int') { - if (ty instanceof ScalarType) { - return 16; + + + + + + + +/** + * @returns the size and alignment in bytes of the type 'ty', taking into + * consideration storage alignment constraints and abstract numerics, which are + * encoded as a struct of holding two u32s. + */ +function sizeAndAlignmentOf(ty, source) { + if (ty instanceof ScalarType) { + if (ty.kind === 'abstract-float' || ty.kind === 'abstract-int') { + // AbstractFloats and AbstractInts are passed out of the shader via structs of + // 2x u32s and unpacking containers as arrays + return { size: 8, alignment: 8 }; } - if (ty instanceof VectorType) { - if (ty.width === 2) { - return 16; - } - // vec3s have padding to make them the same size as vec4s - return 32; - } - if (ty instanceof MatrixType) { - switch (ty.cols) { - case 2: - switch (ty.rows) { - case 2: - return 32; - case 3: - return 64; - case 4: - return 64; - } - break; - case 3: - switch (ty.rows) { - case 2: - return 48; - case 3: - return 96; - case 4: - return 96; - } - break; - case 4: - switch (ty.rows) { - case 2: - return 64; - case 3: - return 128; - case 4: - return 128; - } - break; - } - } - unreachable(`AbstractFloats have not yet been implemented for ${ty.toString()}`); + return { size: ty.size, alignment: ty.alignment }; + } + + if (ty instanceof VectorType) { + const out = sizeAndAlignmentOf(ty.elementType, source); + const n = ty.width === 3 ? 4 : ty.width; + out.size *= n; + out.alignment *= n; + return out; } if (ty instanceof MatrixType) { - switch (ty.cols) { - case 2: - switch (ty.rows) { - case 2: - return 16; - case 3: - return 32; - case 4: - return 32; - } - break; - case 3: - switch (ty.rows) { - case 2: - return 32; - case 3: - return 64; - case 4: - return 64; - } - break; - case 4: - switch (ty.rows) { - case 2: - return 32; - case 3: - return 64; - case 4: - return 64; - } - break; - } - unreachable( - `Attempted to get stride length for a matrix with dimensions (${ty.cols}x${ty.rows}), which isn't currently handled` - ); + const out = sizeAndAlignmentOf(ty.elementType, source); + const n = ty.rows === 3 ? 4 : ty.rows; + out.size *= n * ty.cols; + out.alignment *= n; + return out; } - // Handles scalars and vectors - return 16; + if (ty instanceof ArrayType) { + const out = sizeAndAlignmentOf(ty.elementType, source); + if (source === 'uniform') { + out.alignment = align(out.alignment, 16); + } + out.size *= ty.count; + return out; + } + + unreachable(`unhandled type: ${ty}`); } -// Helper for summing up all the stride values for an array of Types -function valueStrides(tys) { - return tys.map(valueStride).reduce((sum, c) => sum + c); +/** + * @returns the stride in bytes of the type 'ty', taking into consideration abstract numerics, + * which are encoded as a struct of 2 x u32. + */ +function strideOf(ty, source) { + const sizeAndAlign = sizeAndAlignmentOf(ty, source); + return align(sizeAndAlign.size, sizeAndAlign.alignment); +} + +/** + * Calls 'callback' with the layout information of each structure member with the types 'members'. + * @returns the byte size, stride and alignment of the structure. + */ +export function structLayout( +members, +source, +callback) + + + + + + +{ + let offset = 0; + let alignment = 1; + for (let i = 0; i < members.length; i++) { + const member = members[i]; + const sizeAndAlign = sizeAndAlignmentOf(member, source); + offset = align(offset, sizeAndAlign.alignment); + if (callback) { + callback({ + index: i, + type: member, + size: sizeAndAlign.size, + alignment: sizeAndAlign.alignment, + offset + }); + } + offset += sizeAndAlign.size; + alignment = Math.max(alignment, sizeAndAlign.alignment); + } + + if (source === 'uniform') { + alignment = align(alignment, 16); + } + + const size = offset; + const stride = align(size, alignment); + return { size, stride, alignment }; +} + +/** @returns the stride in bytes between two consecutive structures with the given members */ +export function structStride(members, source) { + return structLayout(members, source).stride; +} + +/** @returns the WGSL to describe the structure members in 'members' */ +function wgslMembers(members, source, memberName) { + const lines = []; + const layout = structLayout(members, source, (m) => { + lines.push(` @size(${m.size}) ${memberName(lines.length)} : ${m.type},`); + }); + const padding = layout.stride - layout.size; + if (padding > 0) { + // Pad with a 'f16' if the padding requires an odd multiple of 2 bytes. + // This is required as 'i32' has an alignment and size of 4 bytes. + const ty = (padding & 2) !== 0 ? 'f16' : 'i32'; + lines.push(` @size(${padding}) padding : ${ty},`); + } + return lines.join('\n'); } // Helper for returning the WGSL storage type for the given Type. @@ -157,17 +195,28 @@ function storageType(ty) { `Custom handling is implemented for 'abstract-float' values` ); if (ty.kind === 'bool') { - return TypeU32; + return Type.u32; } } if (ty instanceof VectorType) { - return TypeVec(ty.width, storageType(ty.elementType)); + return Type.vec(ty.width, storageType(ty.elementType)); + } + if (ty instanceof ArrayType) { + return Type.array(ty.count, storageType(ty.elementType)); } return ty; } +/** Structure used to hold [from|to]Storage conversion helpers */ + + + + + + + // Helper for converting a value of the type 'ty' from the storage type. -function fromStorage(ty, expr) { +function fromStorage(ty, expr, helpers) { if (ty instanceof ScalarType) { assert(ty.kind !== 'abstract-int', `'abstract-int' values should not be in input storage`); assert(ty.kind !== 'abstract-float', `'abstract-float' values should not be in input storage`); @@ -187,14 +236,29 @@ function fromStorage(ty, expr) { ); assert(ty.elementType.kind !== 'f64', `'No storage type defined for 'f64' values`); if (ty.elementType.kind === 'bool') { - return `${expr} != vec${ty.width}(0u)`; + return `(${expr} != vec${ty.width}(0u))`; } } + if (ty instanceof ArrayType && elementTypeOf(ty) === Type.bool) { + // array -> array + const conv = helpers.uniqueID(); + const inTy = Type.array(ty.count, Type.u32); + helpers.wgsl += ` +fn ${conv}(in : ${inTy}) -> ${ty} { + var out : ${ty}; + for (var i = 0; i < ${ty.count}; i++) { + out[i] = in[i] != 0; + } + return out; +} +`; + return `${conv}(${expr})`; + } return expr; } // Helper for converting a value of the type 'ty' to the storage type. -function toStorage(ty, expr) { +function toStorage(ty, expr, helpers) { if (ty instanceof ScalarType) { assert( ty.kind !== 'abstract-int', @@ -223,6 +287,21 @@ function toStorage(ty, expr) { return `select(vec${ty.width}(0u), vec${ty.width}(1u), ${expr})`; } } + if (ty instanceof ArrayType && elementTypeOf(ty) === Type.bool) { + // array -> array + const conv = helpers.uniqueID(); + const outTy = Type.array(ty.count, Type.u32); + helpers.wgsl += ` +fn ${conv}(in : ${ty}) -> ${outTy} { + var out : ${outTy}; + for (var i = 0; i < ${ty.count}; i++) { + out[i] = select(0u, 1u, in[i]); + } + return out; +} +`; + return `${conv}(${expr})`; + } return expr; } @@ -295,12 +374,13 @@ batch_size) // 2k appears to be a sweet-spot when benchmarking. return Math.floor( Math.min(1024 * 2, t.device.limits.maxUniformBufferBindingSize) / - valueStrides(parameterTypes) + structStride(parameterTypes, cfg.inputSource) ); case 'storage_r': case 'storage_rw': return Math.floor( - t.device.limits.maxStorageBufferBindingSize / valueStrides(parameterTypes) + t.device.limits.maxStorageBufferBindingSize / + structStride(parameterTypes, cfg.inputSource) ); } }(); @@ -324,17 +404,16 @@ batch_size) }; const processBatch = async (batchCases) => { - const checkBatch = await submitBatch( - t, - shaderBuilder, + const shaderBuilderParams = { parameterTypes, resultType, - batchCases, - cfg.inputSource, - pipelineCache - ); + cases: batchCases, + inputSource: cfg.inputSource, + constEvaluationMode: cfg.constEvaluationMode + }; + const checkBatch = await submitBatch(t, shaderBuilder, shaderBuilderParams, pipelineCache); checkBatch(); - void t.queue.onSubmittedWorkDone().finally(batchFinishedCallback); + await t.queue.onSubmittedWorkDone(); }; const pendingBatches = []; @@ -351,7 +430,7 @@ batch_size) } batchesInFlight += 1; - pendingBatches.push(processBatch(batchCases)); + pendingBatches.push(processBatch(batchCases).finally(batchFinishedCallback)); } await Promise.all(pendingBatches); @@ -362,25 +441,22 @@ batch_size) * buffer binding limits of the given inputSource. * @param t the GPUTest * @param shaderBuilder the shader builder function - * @param parameterTypes the list of expression parameter types - * @param resultType the return type for the expression overload - * @param cases list of test cases that fit within the binding limits of the device - * @param inputSource the source of the input values + * @param shaderBuilderParams the shader builder parameters * @param pipelineCache the cache of compute pipelines, shared between batches * @returns a function that checks the results are as expected */ async function submitBatch( t, shaderBuilder, -parameterTypes, -resultType, -cases, -inputSource, +shaderBuilderParams, pipelineCache) { + const { resultType, cases } = shaderBuilderParams; + // Construct a buffer to hold the results of the expression tests - const outputBufferSize = cases.length * valueStride(resultType); - const outputBuffer = t.device.createBuffer({ + const outputStride = structStride([resultType], 'storage_rw'); + const outputBufferSize = align(cases.length * outputStride, 4); + const outputBuffer = t.createBufferTracked({ size: outputBufferSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE }); @@ -388,10 +464,7 @@ pipelineCache) const [pipeline, group] = await buildPipeline( t, shaderBuilder, - parameterTypes, - resultType, - cases, - inputSource, + shaderBuilderParams, outputBuffer, pipelineCache ); @@ -414,7 +487,7 @@ pipelineCache) // Read the outputs from the output buffer const outputs = new Array(cases.length); for (let i = 0; i < cases.length; i++) { - outputs[i] = resultType.read(outputData, i * valueStride(resultType)); + outputs[i] = resultType.read(outputData, i * outputStride); } // The list of expectation failures @@ -457,14 +530,7 @@ function map(v, fn) { return [fn(v, 0)]; } -/** - * ShaderBuilder is a function used to construct the WGSL shader used by an - * expression test. - * @param parameterTypes the list of expression parameter types - * @param resultType the return type for the expression overload - * @param cases list of test cases that fit within the binding limits of the device - * @param inputSource the source of the input values - */ +/** The structured arguments for a ShaderBuilder function */ @@ -472,6 +538,15 @@ function map(v, fn) { + + + + + + +/** ShaderBuilder is a function used to construct the WGSL shader used by an expression test. */ + + /** * Helper that returns the WGSL to declare the output storage buffer for a shader */ @@ -483,7 +558,7 @@ function wgslOutputs(resultType, count) { { output_struct = ` struct Output { - @size(${valueStride(resultType)}) value : ${storageType(resultType)} + @size(${strideOf(resultType, 'storage_rw')}) value : ${storageType(resultType)} };`; } else { if (resultType instanceof ScalarType) { @@ -493,7 +568,7 @@ struct Output { }; struct Output { - @size(${valueStride(resultType)}) value: AF, + @size(${strideOf(resultType, 'storage_rw')}) value: AF, };`; } if (resultType instanceof VectorType) { @@ -504,7 +579,7 @@ struct Output { }; struct Output { - @size(${valueStride(resultType)}) value: array, + @size(${strideOf(resultType, 'storage_rw')}) value: array, };`; } @@ -517,7 +592,7 @@ struct Output { }; struct Output { - @size(${valueStride(resultType)}) value: array, ${cols}>, + @size(${strideOf(resultType, 'storage_rw')}) value: array, ${cols}>, };`; } @@ -532,12 +607,7 @@ struct Output { /** * Helper that returns the WGSL to declare the values array for a shader */ -function wgslValuesArray( -parameterTypes, -resultType, -cases, -expressionBuilder) -{ +function wgslValuesArray(cases, expressionBuilder) { return ` const values = array( ${cases.map((c) => expressionBuilder(map(c.input, (v) => v.wgsl()))).join(',\n ')} @@ -578,16 +648,15 @@ function wgslHeader(parameterTypes, resultType) { /** - * Returns a ShaderBuilder that builds a basic expression test shader. + * @returns the WGSL for a basic expression test shader. * @param expressionBuilder the expression builder */ function basicExpressionShaderBody( expressionBuilder, -parameterTypes, -resultType, -cases, -inputSource) +params) { + const { parameterTypes, resultType, cases, inputSource } = params; + assert( scalarTypeOf(resultType).kind !== 'abstract-int', `abstractIntShaderBuilder should be used when result type is 'abstract-int'` @@ -596,68 +665,99 @@ inputSource) scalarTypeOf(resultType).kind !== 'abstract-float', `abstractFloatShaderBuilder should be used when result type is 'abstract-float'` ); + let nextUniqueIDSuffix = 0; + const convHelpers = { + wgsl: '', + uniqueID: () => `cts_symbol_${nextUniqueIDSuffix++}` + }; if (inputSource === 'const') { + let constEvaluationMode = params.constEvaluationMode; + if (constEvaluationMode === undefined) { + if (parameterTypes.some((ty) => isAbstractType(scalarTypeOf(ty)))) { + // Directly assign the expression to the output, to avoid an + // intermediate store, which will concretize the value early + constEvaluationMode = 'direct'; + } else { + constEvaluationMode = globalTestConfig.unrollConstEvalLoops ? 'unrolled' : 'loop'; + } + } ////////////////////////////////////////////////////////////////////////// // Constant eval ////////////////////////////////////////////////////////////////////////// let body = ''; - if (parameterTypes.some((ty) => scalarTypeOf(ty).kind === 'abstract-float')) { - // Directly assign the expression to the output, to avoid an - // intermediate store, which will concretize the value early - body = cases. - map( - (c, i) => - ` outputs[${i}].value = ${toStorage( - resultType, - expressionBuilder(map(c.input, (v) => v.wgsl())) - )};` - ). - join('\n '); - } else if (globalTestConfig.unrollConstEvalLoops) { - body = cases. - map((_, i) => { - const value = `values[${i}]`; - return ` outputs[${i}].value = ${toStorage(resultType, value)};`; - }). - join('\n '); - } else { - body = ` + let valuesArray = ''; + switch (constEvaluationMode) { + case 'direct':{ + body = cases. + map( + (c, i) => + ` outputs[${i}].value = ${toStorage( + resultType, + expressionBuilder(map(c.input, (v) => v.wgsl())), + convHelpers + )};` + ). + join('\n '); + break; + } + case 'unrolled':{ + body = cases. + map((_, i) => { + const value = `values[${i}]`; + return ` outputs[${i}].value = ${toStorage(resultType, value, convHelpers)};`; + }). + join('\n '); + valuesArray = wgslValuesArray(cases, expressionBuilder); + break; + } + case 'loop':{ + body = ` for (var i = 0u; i < ${cases.length}; i++) { - outputs[i].value = ${toStorage(resultType, `values[i]`)}; + outputs[i].value = ${toStorage(resultType, `values[i]`, convHelpers)}; }`; + valuesArray = wgslValuesArray(cases, expressionBuilder); + break; + } } return ` ${wgslOutputs(resultType, cases.length)} -${wgslValuesArray(parameterTypes, resultType, cases, expressionBuilder)} +${valuesArray} + +${convHelpers.wgsl} @compute @workgroup_size(1) fn main() { ${body} -}`; +} +`; } else { ////////////////////////////////////////////////////////////////////////// // Runtime eval ////////////////////////////////////////////////////////////////////////// // returns the WGSL expression to load the ith parameter of the given type from the input buffer - const paramExpr = (ty, i) => fromStorage(ty, `inputs[i].param${i}`); + const paramExpr = (ty, i) => fromStorage(ty, `inputs[i].param${i}`, convHelpers); // resolves to the expression that calls the builtin - const expr = toStorage(resultType, expressionBuilder(parameterTypes.map(paramExpr))); + const expr = toStorage( + resultType, + expressionBuilder(parameterTypes.map(paramExpr)), + convHelpers + ); return ` struct Input { -${parameterTypes. - map((ty, i) => ` @size(${valueStride(ty)}) param${i} : ${storageType(ty)},`). - join('\n')} -}; +${wgslMembers(parameterTypes.map(storageType), inputSource, (i) => `param${i}`)} +} ${wgslOutputs(resultType, cases.length)} ${wgslInputVar(inputSource, cases.length)} +${convHelpers.wgsl} + @compute @workgroup_size(1) fn main() { for (var i = 0; i < ${cases.length}; i++) { @@ -673,16 +773,11 @@ fn main() { * @param expressionBuilder the expression builder */ export function basicExpressionBuilder(expressionBuilder) { - return ( - parameterTypes, - resultType, - cases, - inputSource) => - { + return (params) => { return `\ -${wgslHeader(parameterTypes, resultType)} +${wgslHeader(params.parameterTypes, params.resultType)} -${basicExpressionShaderBody(expressionBuilder, parameterTypes, resultType, cases, inputSource)}`; +${basicExpressionShaderBody(expressionBuilder, params)}`; }; } @@ -696,18 +791,13 @@ export function basicExpressionWithPredeclarationBuilder( expressionBuilder, predeclaration) { - return ( - parameterTypes, - resultType, - cases, - inputSource) => - { + return (params) => { return `\ -${wgslHeader(parameterTypes, resultType)} +${wgslHeader(params.parameterTypes, params.resultType)} ${predeclaration} -${basicExpressionShaderBody(expressionBuilder, parameterTypes, resultType, cases, inputSource)}`; +${basicExpressionShaderBody(expressionBuilder, params)}`; }; } @@ -716,12 +806,9 @@ ${basicExpressionShaderBody(expressionBuilder, parameterTypes, resultType, cases * @param op the compound operator */ export function compoundAssignmentBuilder(op) { - return ( - parameterTypes, - resultType, - cases, - inputSource) => - { + return (params) => { + const { parameterTypes, resultType, cases, inputSource } = params; + ////////////////////////////////////////////////////////////////////////// // Input validation ////////////////////////////////////////////////////////////////////////// @@ -779,13 +866,23 @@ ${body} ////////////////////////////////////////////////////////////////////////// // Runtime eval ////////////////////////////////////////////////////////////////////////// + let operation = ''; + if (inputSource === 'storage_rw' && objectEquals(resultType, storageType(resultType))) { + operation = ` + outputs[i].value = ${storageType(resultType)}(inputs[i].lhs); + outputs[i].value ${op} ${rhsType}(inputs[i].rhs);`; + } else { + operation = ` + var ret = ${lhsType}(inputs[i].lhs); + ret ${op} ${rhsType}(inputs[i].rhs); + outputs[i].value = ${storageType(resultType)}(ret);`; + } return ` ${wgslHeader(parameterTypes, resultType)} ${wgslOutputs(resultType, cases.length)} struct Input { - @size(${valueStride(lhsType)}) lhs : ${storageType(lhsType)}, - @size(${valueStride(rhsType)}) rhs : ${storageType(rhsType)}, +${wgslMembers([lhsType, rhsType].map(storageType), inputSource, (i) => ['lhs', 'rhs'][i])} } ${wgslInputVar(inputSource, cases.length)} @@ -793,9 +890,7 @@ ${wgslInputVar(inputSource, cases.length)} @compute @workgroup_size(1) fn main() { for (var i = 0; i < ${cases.length}; i++) { - var ret = ${lhsType}(inputs[i].lhs); - ret ${op} ${rhsType}(inputs[i].rhs); - outputs[i].value = ${storageType(resultType)}(ret); + ${operation} } } `; @@ -943,12 +1038,8 @@ function abstractFloatCaseBody(expr, resultType, i) { * @param expressionBuilder an expression builder that will return AbstractFloats */ export function abstractFloatShaderBuilder(expressionBuilder) { - return ( - parameterTypes, - resultType, - cases, - inputSource) => - { + return (params) => { + const { parameterTypes, resultType, cases, inputSource } = params; assert(inputSource === 'const', `'abstract-float' results are only defined for const-eval`); assert( scalarTypeOf(resultType).kind === 'abstract-float', @@ -1027,12 +1118,9 @@ function abstractIntCaseBody(expr, resultType, i) { * @param expressionBuilder an expression builder that will return AbstractInts */ export function abstractIntShaderBuilder(expressionBuilder) { - return ( - parameterTypes, - resultType, - cases, - inputSource) => - { + return (params) => { + const { parameterTypes, resultType, cases, inputSource } = params; + assert(inputSource === 'const', `'abstract-int' results are only defined for const-eval`); assert( scalarTypeOf(resultType).kind === 'abstract-int', @@ -1065,23 +1153,19 @@ ${body} * pipeline. * @param t the GPUTest * @param shaderBuilder the shader builder - * @param parameterTypes the list of expression parameter types - * @param resultType the return type for the expression overload - * @param cases list of test cases that fit within the binding limits of the device - * @param inputSource the source of the input values + * @param shaderBuilderParams the parameters for the shader builder * @param outputBuffer the buffer that will hold the output values of the tests * @param pipelineCache the cache of compute pipelines, shared between batches */ async function buildPipeline( t, shaderBuilder, -parameterTypes, -resultType, -cases, -inputSource, +shaderBuilderParams, outputBuffer, pipelineCache) { + const { parameterTypes, cases, inputSource } = shaderBuilderParams; + cases.forEach((c) => { const inputTypes = c.input instanceof Array ? c.input.map((i) => i.type) : [c.input.type]; if (!objectEquals(inputTypes, parameterTypes)) { @@ -1093,7 +1177,7 @@ pipelineCache) } }); - const source = shaderBuilder(parameterTypes, resultType, cases, inputSource); + const source = shaderBuilder(shaderBuilderParams); switch (inputSource) { case 'const':{ @@ -1121,27 +1205,23 @@ pipelineCache) // Input values come from a uniform or storage buffer // size in bytes of the input buffer - const inputSize = cases.length * valueStrides(parameterTypes); + const caseStride = structStride(parameterTypes, inputSource); + const inputSize = align(cases.length * caseStride, 4); // Holds all the parameter values for all cases const inputData = new Uint8Array(inputSize); // Pack all the input parameter values into the inputData buffer - { - const caseStride = valueStrides(parameterTypes); - for (let caseIdx = 0; caseIdx < cases.length; caseIdx++) { - const caseBase = caseIdx * caseStride; - let offset = caseBase; - for (let paramIdx = 0; paramIdx < parameterTypes.length; paramIdx++) { - const params = cases[caseIdx].input; - if (params instanceof Array) { - params[paramIdx].copyTo(inputData, offset); - } else { - params.copyTo(inputData, offset); - } - offset += valueStride(parameterTypes[paramIdx]); + for (let caseIdx = 0; caseIdx < cases.length; caseIdx++) { + const offset = caseIdx * caseStride; + structLayout(parameterTypes, inputSource, (m) => { + const arg = cases[caseIdx].input; + if (arg instanceof Array) { + arg[m.index].copyTo(inputData, offset + m.offset); + } else { + arg.copyTo(inputData, offset + m.offset); } - } + }); } // build the compute pipeline, if the shader hasn't been compiled already. @@ -1184,7 +1264,7 @@ pipelineCache) * If `cases.length` is not a multiple of `vectorWidth`, then the last scalar * test case value is repeated to fill the vector value. */ -function packScalarsToVector( +export function packScalarsToVector( parameterTypes, resultType, cases, @@ -1206,8 +1286,8 @@ vectorWidth) } const packedCases = []; - const packedParameterTypes = parameterTypes.map((p) => TypeVec(vectorWidth, p)); - const packedResultType = new VectorType(vectorWidth, resultType); + const packedParameterTypes = parameterTypes.map((p) => Type.vec(vectorWidth, p)); + const packedResultType = Type.vec(vectorWidth, resultType); const clampCaseIdx = (idx) => Math.min(idx, cases.length - 1); @@ -1221,7 +1301,7 @@ vectorWidth) const input = cases[clampCaseIdx(caseIdx + i)].input; inputElements[i] = input instanceof Array ? input[paramIdx] : input; } - packedInputs[paramIdx] = new Vector(inputElements); + packedInputs[paramIdx] = new VectorValue(inputElements); } // Gather the comparators for the packed cases diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/precedence.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/precedence.spec.js new file mode 100644 index 00000000000..6bdea30e436 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/precedence.spec.js @@ -0,0 +1,113 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution tests for operator precedence. +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { GPUTest } from '../../../gpu_test.js'; + +export const g = makeTestGroup(GPUTest); + +// The list of test cases and their expected results. + + + + +const kExpressions = { + add_mul: { expr: 'kThree + kSeven * kEleven', result: 80 }, + mul_add: { expr: 'kThree * kSeven + kEleven', result: 32 }, + sub_neg: { expr: 'kThree - - kSeven', result: 10 }, + neg_shl: { expr: '- kThree << u32(kSeven)', result: -384 }, + neg_shr: { expr: '- kThree >> u32(kSeven)', result: -1 }, + neg_add: { expr: '- kThree + kSeven', result: 4 }, + neg_mul: { expr: '- kThree * kSeven', result: -21 }, + neg_and: { expr: '- kThree & kSeven', result: 5 }, + neg_or: { expr: '- kThree | kSeven', result: -1 }, + neg_xor: { expr: '- kThree ^ kSeven', result: -6 }, + comp_add: { expr: '~ kThree + kSeven', result: 3 }, + mul_deref: { expr: 'kThree * * ptr_five', result: 15 }, + not_and: { expr: 'i32(! kFalse && kFalse)', result: 0 }, + not_or: { expr: 'i32(! kTrue || kTrue)', result: 1 }, + eq_and: { expr: 'i32(kFalse == kTrue && kFalse)', result: 0 }, + and_eq: { expr: 'i32(kFalse && kTrue == kFalse)', result: 0 }, + eq_or: { expr: 'i32(kFalse == kFalse || kTrue)', result: 1 }, + or_eq: { expr: 'i32(kTrue || kFalse == kFalse)', result: 1 }, + add_swizzle: { expr: '(vec + vec . y) . z', result: 8 } +}; + +g.test('precedence'). +desc( + ` + Test that operator precedence rules are correctly implemented. + ` +). +params((u) => +u. +combine('expr', keysOf(kExpressions)). +combine('decl', ['literal', 'const', 'override', 'var']). +combine('strip_spaces', [false, true]) +). +fn((t) => { + const expr = kExpressions[t.params.expr]; + + let decl = t.params.decl; + let expr_wgsl = expr.expr; + if (t.params.decl === 'literal') { + decl = 'const'; + expr_wgsl = expr_wgsl.replace(/kThree/g, '3'); + expr_wgsl = expr_wgsl.replace(/kSeven/g, '7'); + expr_wgsl = expr_wgsl.replace(/kEleven/g, '11'); + expr_wgsl = expr_wgsl.replace(/kFalse/g, 'false'); + expr_wgsl = expr_wgsl.replace(/kTrue/g, 'true'); + } + if (t.params.strip_spaces) { + expr_wgsl = expr_wgsl.replace(/ /g, ''); + } + const wgsl = ` + @group(0) @binding(0) var buffer : i32; + + ${decl} kFalse = false; + ${decl} kTrue = true; + + ${decl} kThree = 3; + ${decl} kSeven = 7; + ${decl} kEleven = 11; + + @compute @workgroup_size(1) + fn main() { + var five = 5; + var vec = vec4(1, kThree, 5, kSeven); + let ptr_five = &five; + + buffer = ${expr_wgsl}; + } + `; + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ code: wgsl }) + } + }); + + // Allocate a buffer and fill it with 0xdeadbeef. + const outputBuffer = t.makeBufferWithContents( + new Uint32Array([0xdeadbeef]), + GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + ); + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [{ binding: 0, resource: { buffer: outputBuffer } }] + }); + + // Run the shader. + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.queue.submit([encoder.finish()]); + + // Check that the result is as expected. + t.expectGPUBufferValuesEqual(outputBuffer, new Int32Array([expr.result])); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/indirection.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/address_of_and_indirection.spec.js similarity index 86% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/indirection.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/address_of_and_indirection.spec.js index 428839f71a0..f68dc188227 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/indirection.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/address_of_and_indirection.spec.js @@ -1,7 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for unary indirection (dereference) +Execution Tests for unary address-of and indirection (dereference) `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { keysOf } from '../../../../../common/util/data_tables.js'; import { GPUTest } from '../../../../gpu_test.js'; @@ -48,10 +48,15 @@ params((u) => u. combine('inputSource', allButConstInputSource). combine('vectorize', [undefined, 2, 3, 4]). -combine('scalarType', ['u32', 'i32', 'f32']). +combine('scalarType', ['bool', 'u32', 'i32', 'f32', 'f16']). combine('derefType', keysOf(kDerefCases)). filter((p) => !kDerefCases[p.derefType].requires_pointer_composite_access) ). +beforeAllSubcases((t) => { + if (t.params.scalarType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } +}). fn(async (t) => { const ty = scalarType(t.params.scalarType); const cases = sparseScalarF32Range().map((e) => { @@ -83,9 +88,14 @@ params((u) => u. combine('inputSource', allButConstInputSource). combine('vectorize', [undefined, 2, 3, 4]). -combine('scalarType', ['i32', 'f32']). +combine('scalarType', ['bool', 'u32', 'i32', 'f32', 'f16']). combine('derefType', keysOf(kDerefCases)) ). +beforeAllSubcases((t) => { + if (t.params.scalarType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } +}). fn(async (t) => { if ( kDerefCases[t.params.derefType].requires_pointer_composite_access && @@ -124,9 +134,14 @@ params((u) => u. combine('inputSource', allButConstInputSource). combine('vectorize', [undefined, 2, 3, 4]). -combine('scalarType', ['i32', 'f32']). +combine('scalarType', ['bool', 'u32', 'i32', 'f32', 'f16']). combine('derefType', keysOf(kDerefCases)) ). +beforeAllSubcases((t) => { + if (t.params.scalarType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } +}). fn(async (t) => { if ( kDerefCases[t.params.derefType].requires_pointer_composite_access && diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_arithmetic.spec.js index 868057236bf..55457e59d18 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_arithmetic.spec.js @@ -1,14 +1,14 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Execution Tests for AbstractFloat arithmetic unary expression operations +Execution Tests for Type.abstractFloat arithmetic unary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { onlyConstInputSource, run } from '../expression.js'; import { d } from './af_arithmetic.cache.js'; -import { abstractUnary } from './unary.js'; +import { abstractFloatUnary } from './unary.js'; export const g = makeTestGroup(GPUTest); @@ -27,5 +27,13 @@ combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { const cases = await d.get('negation'); - await run(t, abstractUnary('-'), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases, 1); + await run( + t, + abstractFloatUnary('-'), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases, + 1 + ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_assignment.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_assignment.spec.js index fdd793e1825..2288245f366 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_assignment.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/af_assignment.spec.js @@ -4,7 +4,7 @@ Execution Tests for assignment of AbstractFloats `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractFloat, TypeF16, TypeF32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { abstractFloatShaderBuilder, @@ -35,7 +35,15 @@ testing that extracting abstract floats works params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('abstract'); - await run(t, abstract_assignment(), [TypeAbstractFloat], TypeAbstractFloat, t.params, cases, 1); + await run( + t, + abstract_assignment(), + [Type.abstractFloat], + Type.abstractFloat, + t.params, + cases, + 1 + ); }); g.test('f32'). @@ -48,7 +56,7 @@ concretizing to f32 params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('f32'); - await run(t, concrete_assignment(), [TypeAbstractFloat], TypeF32, t.params, cases); + await run(t, concrete_assignment(), [Type.abstractFloat], Type.f32, t.params, cases); }); g.test('f16'). @@ -64,5 +72,5 @@ beforeAllSubcases((t) => { params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('f16'); - await run(t, concrete_assignment(), [TypeAbstractFloat], TypeF16, t.params, cases); + await run(t, concrete_assignment(), [Type.abstractFloat], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.cache.js new file mode 100644 index 00000000000..3ed097dc506 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.cache.js @@ -0,0 +1,11 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { abstractInt } from '../../../../util/conversion.js';import { fullI64Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; + +export const d = makeCaseCache('unary/ai_arithmetic', { + negation: () => { + return fullI64Range().map((e) => { + return { input: abstractInt(e), expected: abstractInt(-e) }; + }); + } +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.spec.js new file mode 100644 index 00000000000..6060edd7d50 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_arithmetic.spec.js @@ -0,0 +1,30 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for the abstract integer arithmetic unary expression operations +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { Type } from '../../../../util/conversion.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { d } from './ai_arithmetic.cache.js'; +import { abstractIntUnary } from './unary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('negation'). +specURL('https://www.w3.org/TR/WGSL/#arithmetic-expr'). +desc( + ` +Expression: -x +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('negation'); + await run(t, abstractIntUnary('-'), [Type.abstractInt], Type.abstractInt, t.params, cases); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_assignment.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_assignment.spec.js index 8d367bdb819..be05705c543 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_assignment.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_assignment.spec.js @@ -4,7 +4,7 @@ Execution Tests for assignment of AbstractInts `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeAbstractInt, TypeI32, TypeU32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { abstractIntShaderBuilder, @@ -35,7 +35,7 @@ testing that extracting abstract ints works params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('abstract'); - await run(t, abstract_assignment(), [TypeAbstractInt], TypeAbstractInt, t.params, cases, 1); + await run(t, abstract_assignment(), [Type.abstractInt], Type.abstractInt, t.params, cases, 1); }); g.test('i32'). @@ -48,7 +48,7 @@ concretizing to i32 params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('i32'); - await run(t, concrete_assignment(), [TypeAbstractInt], TypeI32, t.params, cases); + await run(t, concrete_assignment(), [Type.abstractInt], Type.i32, t.params, cases); }); g.test('u32'). @@ -61,5 +61,5 @@ concretizing to u32 params((u) => u.combine('inputSource', onlyConstInputSource)). fn(async (t) => { const cases = await d.get('u32'); - await run(t, concrete_assignment(), [TypeAbstractInt], TypeU32, t.params, cases); + await run(t, concrete_assignment(), [Type.abstractInt], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_complement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_complement.spec.js new file mode 100644 index 00000000000..c8d42096089 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/ai_complement.spec.js @@ -0,0 +1,32 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution Tests for the Type.abstractInt bitwise complement operation +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { GPUTest } from '../../../../gpu_test.js'; +import { abstractInt, Type } from '../../../../util/conversion.js'; +import { fullI64Range } from '../../../../util/math.js'; +import { onlyConstInputSource, run } from '../expression.js'; + +import { abstractIntUnary } from './unary.js'; + +export const g = makeTestGroup(GPUTest); + +g.test('complement'). +specURL('https://www.w3.org/TR/WGSL/#bit-expr'). +desc( + ` +Expression: ~x +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = fullI64Range().map((e) => { + return { input: abstractInt(e), expected: abstractInt(~e) }; + }); + await run(t, abstractIntUnary('~'), [Type.abstractInt], Type.abstractInt, t.params, cases); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_conversion.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_conversion.spec.js index 22ff61aa00d..8da4619fe77 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_conversion.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_conversion.spec.js @@ -4,7 +4,7 @@ Execution Tests for the boolean conversion operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeF16, TypeF32, TypeI32, TypeU32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { d } from './bool_conversion.cache.js'; @@ -31,7 +31,14 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('bool'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeBool], TypeBool, t.params, cases); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.bool], + Type.bool, + t.params, + cases + ); }); g.test('u32'). @@ -49,7 +56,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('u32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeU32], TypeBool, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.u32], Type.bool, t.params, cases); }); g.test('i32'). @@ -67,7 +74,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('i32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeI32], TypeBool, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.i32], Type.bool, t.params, cases); }); g.test('f32'). @@ -85,7 +92,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF32], TypeBool, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f32], Type.bool, t.params, cases); }); g.test('f16'). @@ -106,5 +113,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF16], TypeBool, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f16], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_logical.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_logical.spec.js index ac8da84846d..e09cb35d3f3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_logical.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/bool_logical.spec.js @@ -4,7 +4,7 @@ Execution Tests for the boolean unary logical expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { bool, TypeBool } from '../../../../util/conversion.js'; +import { bool, Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { unary } from './unary.js'; @@ -29,5 +29,5 @@ fn(async (t) => { { input: bool(false), expected: bool(true) }]; - await run(t, unary('!'), [TypeBool], TypeBool, t.params, cases); + await run(t, unary('!'), [Type.bool], Type.bool, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_arithmetic.spec.js index fd85be26dd9..1dbeffd6964 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_arithmetic.spec.js @@ -4,7 +4,7 @@ Execution Tests for the f16 arithmetic unary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF16 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { d } from './f16_arithmetic.cache.js'; @@ -28,5 +28,5 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('negation'); - await run(t, unary('-'), [TypeF16], TypeF16, t.params, cases); + await run(t, unary('-'), [Type.f16], Type.f16, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.cache.js index e7ffcd20180..19af40984a9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.cache.js @@ -1,17 +1,10 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { bool, f16, i32, u32 } from '../../../../util/conversion.js';import { FP, FPInterval } from '../../../../util/floating_point.js';import { - fullI32Range, - fullU32Range, - scalarF16Range, - scalarF32Range, - sparseMatrixF16Range, - sparseMatrixF32Range } from -'../../../../util/math.js'; +**/import { abstractInt, bool, f16, i32, u32 } from '../../../../util/conversion.js';import { FP, FPInterval } from '../../../../util/floating_point.js';import { fullI32Range, fullI64Range, fullU32Range } from '../../../../util/math.js'; import { makeCaseCache } from '../case_cache.js'; const f16FiniteRangeInterval = new FPInterval( - 'f32', + 'f16', FP.f16.constants().negative.min, FP.f16.constants().positive.max ); @@ -24,7 +17,7 @@ flatMap((cols) => [true, false].map((nonConst) => ({ [`f32_mat${cols}x${rows}_${nonConst ? 'non_const' : 'const'}`]: () => { return FP.f32.generateMatrixToMatrixCases( - sparseMatrixF32Range(cols, rows), + FP.f32.sparseMatrixRange(cols, rows), nonConst ? 'unfiltered' : 'finite', FP.f16.correctlyRoundedMatrix ); @@ -42,7 +35,7 @@ flatMap((cols) => [`f16_mat${cols}x${rows}_${nonConst ? 'non_const' : 'const'}`]: () => { // Input matrix is of f16 types, use f16.generateMatrixToMatrixCases. return FP.f16.generateMatrixToMatrixCases( - sparseMatrixF16Range(cols, rows), + FP.f16.sparseMatrixRange(cols, rows), nonConst ? 'unfiltered' : 'finite', FP.f16.correctlyRoundedMatrix ); @@ -52,6 +45,23 @@ flatMap((cols) => ). reduce((a, b) => ({ ...a, ...b }), {}); +// Cases: abstract_float_matCxR +// Note that abstract float values may be not exactly representable in f16 +// and/or out of range. +const abstract_float_mat_cases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`abstract_float_mat${cols}x${rows}`]: () => { + return FP.abstract.generateMatrixToMatrixCases( + FP.abstract.sparseMatrixRange(cols, rows), + 'finite', + FP.f16.correctlyRoundedMatrix + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + export const d = makeCaseCache('unary/f16_conversion', { bool: () => { return [ @@ -83,27 +93,43 @@ export const d = makeCaseCache('unary/f16_conversion', { return { input: i32(i), expected: FP.f16.correctlyRoundedInterval(i) }; }); }, + abstract_int: () => { + return [...fullI64Range(), 65504n, -65504n]. + filter((v) => f16FiniteRangeInterval.contains(Number(v))). + map((i) => { + return { input: abstractInt(i), expected: FP.f16.correctlyRoundedInterval(Number(i)) }; + }); + }, // Note that f32 values may be not exactly representable in f16 and/or out of range. f32_non_const: () => { return FP.f32.generateScalarToIntervalCases( - [...scalarF32Range(), 65535.996, -65535.996], + [...FP.f32.scalarRange(), 65535.996, -65535.996], 'unfiltered', FP.f16.correctlyRoundedInterval ); }, f32_const: () => { return FP.f32.generateScalarToIntervalCases( - [...scalarF32Range(), 65535.996, -65535.996], + [...FP.f32.scalarRange(), 65535.996, -65535.996], + 'finite', + FP.f16.correctlyRoundedInterval + ); + }, + // Note that abstract float values may be not exactly representable in f16. + abstract_float: () => { + return FP.abstract.generateScalarToIntervalCases( + [...FP.abstract.scalarRange(), 65535.996, -65535.996], 'finite', FP.f16.correctlyRoundedInterval ); }, // All f16 values are exactly representable in f16. f16: () => { - return scalarF16Range().map((f) => { + return FP.f16.scalarRange().map((f) => { return { input: f16(f), expected: FP.f16.correctlyRoundedInterval(f) }; }); }, ...f32_mat_cases, - ...f16_mat_cases + ...f16_mat_cases, + ...abstract_float_mat_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.spec.js index 562b68b3396..53e11c44ec6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f16_conversion.spec.js @@ -4,15 +4,8 @@ Execution Tests for the f32 conversion operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { - TypeBool, - TypeF16, - TypeF32, - TypeI32, - TypeMat, - TypeU32 } from -'../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { Type } from '../../../../util/conversion.js'; +import { allInputSources, run, onlyConstInputSource } from '../expression.js'; import { d } from './f16_conversion.cache.js'; import { unary } from './unary.js'; @@ -46,7 +39,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('bool'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeBool], TypeF16, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.bool], Type.f16, t.params, cases); }); g.test('u32'). @@ -66,7 +59,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'u32_const' : 'u32_non_const'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeU32], TypeF16, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.u32], Type.f16, t.params, cases); }); g.test('i32'). @@ -86,7 +79,36 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'i32_const' : 'i32_non_const'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeI32], TypeF16, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.i32], Type.f16, t.params, cases); +}); + +g.test('abstract_int'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +f16(e), where e is an AbstractInt + +Converted to f16, +/-Inf if out of range +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); +}). +fn(async (t) => { + const cases = await d.get('abstract_int'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractInt], + Type.f16, + t.params, + cases + ); }); g.test('f32'). @@ -106,7 +128,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get(t.params.inputSource === 'const' ? 'f32_const' : 'f32_non_const'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF32], TypeF16, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f32], Type.f16, t.params, cases); }); g.test('f32_mat'). @@ -132,8 +154,8 @@ fn(async (t) => { await run( t, matrixExperession(cols, rows), - [TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f16), t.params, cases ); @@ -156,7 +178,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF16], TypeF16, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f16], Type.f16, t.params, cases); }); g.test('f16_mat'). @@ -182,8 +204,63 @@ fn(async (t) => { await run( t, matrixExperession(cols, rows), - [TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF16), + [Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f16), + t.params, + cases + ); +}); + +g.test('abstract_float'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +f16(e), where e is an AbstractFloat + +Correctly rounded to f16 +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); +}). +fn(async (t) => { + const cases = await d.get('abstract_float'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractFloat], + Type.f16, + t.params, + cases + ); +}); + +g.test('abstract_float_mat'). +specURL('https://www.w3.org/TR/WGSL/#matrix-builtin-functions'). +desc(`AbstractFloat matrix to f16 matrix tests`). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); +}). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`abstract_float_mat${cols}x${rows}`); + await run( + t, + matrixExperession(cols, rows), + [Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(cols, rows, Type.f16), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_arithmetic.spec.js index bb6861b1d66..785f8f9aa1c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_arithmetic.spec.js @@ -4,7 +4,7 @@ Execution Tests for the f32 arithmetic unary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeF32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { d } from './f32_arithmetic.cache.js'; @@ -25,5 +25,5 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('negation'); - await run(t, unary('-'), [TypeF32], TypeF32, t.params, cases); + await run(t, unary('-'), [Type.f32], Type.f32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.cache.js index eb8fbe2c790..a401e000844 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.cache.js @@ -1,7 +1,8 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { bool, f16, f32, i32, u32 } from '../../../../util/conversion.js';import { FP } from '../../../../util/floating_point.js';import { +**/import { abstractInt, bool, f16, f32, i32, u32 } from '../../../../util/conversion.js';import { FP, FPInterval } from '../../../../util/floating_point.js';import { fullI32Range, + fullI64Range, fullU32Range, scalarF16Range, scalarF32Range, @@ -10,6 +11,12 @@ '../../../../util/math.js'; import { makeCaseCache } from '../case_cache.js'; +const f32FiniteRangeInterval = new FPInterval( + 'f32', + FP.f32.constants().negative.min, + FP.f32.constants().positive.max +); + // Cases: f32_matCxR_[non_]const const f32_mat_cases = [2, 3, 4]. flatMap((cols) => @@ -46,6 +53,23 @@ flatMap((cols) => ). reduce((a, b) => ({ ...a, ...b }), {}); +// Cases: abstract_float_matCxR +// Note that abstract float values may be not exactly representable in f32 +// and/or out of range. +const abstract_float_mat_cases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].map((rows) => ({ + [`abstract_float_mat${cols}x${rows}`]: () => { + return FP.abstract.generateMatrixToMatrixCases( + FP.abstract.sparseMatrixRange(cols, rows), + 'finite', + FP.f32.correctlyRoundedMatrix + ); + } +})) +). +reduce((a, b) => ({ ...a, ...b }), {}); + export const d = makeCaseCache('unary/f32_conversion', { bool: () => { return [ @@ -63,6 +87,13 @@ export const d = makeCaseCache('unary/f32_conversion', { return { input: i32(i), expected: FP.f32.correctlyRoundedInterval(i) }; }); }, + abstract_int: () => { + return [...fullI64Range()]. + filter((v) => f32FiniteRangeInterval.contains(Number(v))). + map((i) => { + return { input: abstractInt(i), expected: FP.f32.correctlyRoundedInterval(Number(i)) }; + }); + }, f32: () => { return scalarF32Range().map((f) => { return { input: f32(f), expected: FP.f32.correctlyRoundedInterval(f) }; @@ -74,6 +105,15 @@ export const d = makeCaseCache('unary/f32_conversion', { return { input: f16(f), expected: FP.f32.correctlyRoundedInterval(f) }; }); }, + // Note that abstract float values may be not exactly representable in f32. + abstract_float: () => { + return FP.abstract.generateScalarToIntervalCases( + [...FP.abstract.scalarRange()], + 'finite', + FP.f32.correctlyRoundedInterval + ); + }, ...f32_mat_cases, - ...f16_mat_cases + ...f16_mat_cases, + ...abstract_float_mat_cases }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.spec.js index 6cb4c322949..13e2fe8f62f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/f32_conversion.spec.js @@ -4,15 +4,8 @@ Execution Tests for the f32 conversion operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { - TypeBool, - TypeF16, - TypeF32, - TypeI32, - TypeMat, - TypeU32 } from -'../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { Type } from '../../../../util/conversion.js'; +import { allInputSources, run, onlyConstInputSource } from '../expression.js'; import { d } from './f32_conversion.cache.js'; import { unary } from './unary.js'; @@ -43,7 +36,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('bool'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeBool], TypeF32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.bool], Type.f32, t.params, cases); }); g.test('u32'). @@ -60,7 +53,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('u32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeU32], TypeF32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.u32], Type.f32, t.params, cases); }); g.test('i32'). @@ -77,7 +70,33 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('i32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeI32], TypeF32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.i32], Type.f32, t.params, cases); +}); + +g.test('abstract_int'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +f32(e), where e is an AbstractInt + +Converted to f32, +/-Inf if out of range +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('abstract_int'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractInt], + Type.f32, + t.params, + cases + ); }); g.test('f32'). @@ -94,7 +113,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF32], TypeF32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f32], Type.f32, t.params, cases); }); g.test('f32_mat'). @@ -117,8 +136,8 @@ fn(async (t) => { await run( t, matrixExperession(cols, rows), - [TypeMat(cols, rows, TypeF32)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f32)], + Type.mat(cols, rows, Type.f32), t.params, cases ); @@ -141,7 +160,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF16], TypeF32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f16], Type.f32, t.params, cases); }); g.test('f16_mat'). @@ -167,8 +186,57 @@ fn(async (t) => { await run( t, matrixExperession(cols, rows), - [TypeMat(cols, rows, TypeF16)], - TypeMat(cols, rows, TypeF32), + [Type.mat(cols, rows, Type.f16)], + Type.mat(cols, rows, Type.f32), + t.params, + cases + ); +}); + +g.test('abstract_float'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +f32(e), where e is an AbstractFloat + +Correctly rounded to f32 +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('abstract_float'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractFloat], + Type.f32, + t.params, + cases + ); +}); + +g.test('abstract_float_mat'). +specURL('https://www.w3.org/TR/WGSL/#matrix-builtin-functions'). +desc(`AbstractFloat matrix to f32 matrix tests`). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]) +). +fn(async (t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const cases = await d.get(`abstract_float_mat${cols}x${rows}`); + await run( + t, + matrixExperession(cols, rows), + [Type.mat(cols, rows, Type.abstractFloat)], + Type.mat(cols, rows, Type.f32), t.params, cases ); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_arithmetic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_arithmetic.spec.js index 56a50f0814d..c30b3d5aa33 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_arithmetic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_arithmetic.spec.js @@ -4,7 +4,7 @@ Execution Tests for the i32 arithmetic unary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeI32 } from '../../../../util/conversion.js'; +import { Type } from '../../../../util/conversion.js'; import { allInputSources, run } from '../expression.js'; import { d } from './i32_arithmetic.cache.js'; @@ -24,5 +24,5 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('negation'); - await run(t, unary('-'), [TypeI32], TypeI32, t.params, cases); + await run(t, unary('-'), [Type.i32], Type.i32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.cache.js deleted file mode 100644 index 00c8dd80194..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.cache.js +++ /dev/null @@ -1,11 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { i32 } from '../../../../util/conversion.js';import { fullI32Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; - -export const d = makeCaseCache('unary/i32_complement', { - complement: () => { - return fullI32Range().map((e) => { - return { input: i32(e), expected: i32(~e) }; - }); - } -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.spec.js index f3f4c71e8bb..0648c9ee3cc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_complement.spec.js @@ -4,10 +4,10 @@ Execution Tests for the i32 bitwise complement operation `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeI32 } from '../../../../util/conversion.js'; +import { i32, Type } from '../../../../util/conversion.js'; +import { fullI32Range } from '../../../../util/math.js'; import { allInputSources, run } from '../expression.js'; -import { d } from './i32_complement.cache.js'; import { unary } from './unary.js'; export const g = makeTestGroup(GPUTest); @@ -23,6 +23,8 @@ params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const cases = await d.get('complement'); - await run(t, unary('~'), [TypeI32], TypeI32, t.params, cases); + const cases = fullI32Range().map((e) => { + return { input: i32(e), expected: i32(~e) }; + }); + await run(t, unary('~'), [Type.i32], Type.i32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.cache.js index 39abb6a1cc0..ab5cac3b284 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.cache.js @@ -1,12 +1,21 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { kValue } from '../../../../util/constants.js';import { bool, f16, f32, i32, u32 } from '../../../../util/conversion.js';import { +**/import { kValue } from '../../../../util/constants.js';import { abstractFloat, +abstractInt, +bool, +f16, +f32, +i32, +u32 } from +'../../../../util/conversion.js'; +import { fullI32Range, fullU32Range, quantizeToF16, quantizeToF32, scalarF16Range, - scalarF32Range } from + scalarF32Range, + scalarF64Range } from '../../../../util/math.js'; import { reinterpretU32AsI32 } from '../../../../util/reinterpret.js'; import { makeCaseCache } from '../case_cache.js'; @@ -18,6 +27,11 @@ export const d = makeCaseCache('unary/i32_conversion', { { input: bool(false), expected: i32(0) }]; }, + abstractInt: () => { + return fullI32Range().map((i) => { + return { input: abstractInt(BigInt(i)), expected: i32(i) }; + }); + }, u32: () => { return fullU32Range().map((u) => { return { input: u32(u), expected: i32(reinterpretU32AsI32(u)) }; @@ -28,6 +42,27 @@ export const d = makeCaseCache('unary/i32_conversion', { return { input: i32(i), expected: i32(i) }; }); }, + abstractFloat: () => { + return scalarF64Range().map((f) => { + // Handles zeros and subnormals + if (Math.abs(f) < 1.0) { + return { input: abstractFloat(f), expected: i32(0) }; + } + + if (f <= kValue.i32.negative.min) { + return { input: abstractFloat(f), expected: i32(kValue.i32.negative.min) }; + } + + if (f >= kValue.i32.positive.max) { + return { input: abstractFloat(f), expected: i32(kValue.i32.positive.max) }; + } + + // All i32s are representable as f64, and both AbstractFloat and number + // are f64 internally, so there is no need for special casing like f32 and + // f16 below. + return { input: abstractFloat(f), expected: i32(Math.trunc(f)) }; + }); + }, f32: () => { return scalarF32Range().map((f) => { // Handles zeros and subnormals diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.spec.js index 797df86bba7..57768e7abc1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/i32_conversion.spec.js @@ -4,8 +4,8 @@ Execution Tests for the i32 conversion operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeF16, TypeF32, TypeI32, TypeU32 } from '../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { Type } from '../../../../util/conversion.js'; +import { allInputSources, run, onlyConstInputSource } from '../expression.js'; import { d } from './i32_conversion.cache.js'; import { unary } from './unary.js'; @@ -31,7 +31,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('bool'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeBool], TypeI32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.bool], Type.i32, t.params, cases); }); g.test('u32'). @@ -48,7 +48,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('u32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeU32], TypeI32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.u32], Type.i32, t.params, cases); }); g.test('i32'). @@ -65,7 +65,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('i32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeI32], TypeI32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.i32], Type.i32, t.params, cases); }); g.test('f32'). @@ -82,7 +82,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF32], TypeI32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f32], Type.i32, t.params, cases); }); g.test('f16'). @@ -102,5 +102,57 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF16], TypeI32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f16], Type.i32, t.params, cases); +}); + +g.test('abstract_int'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +i32(e), where e is an AbstractInt + +Identity operation if e is in bounds for i32, otherwise shader creation error +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('abstractInt'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractInt], + Type.i32, + t.params, + cases + ); +}); + +g.test('abstract_float'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +i32(e), where e is an AbstractFloat + +e is converted to i32, rounding towards zero +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('abstractFloat'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractFloat], + Type.i32, + t.params, + cases + ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.cache.js deleted file mode 100644 index 816093a7db5..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.cache.js +++ /dev/null @@ -1,11 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { u32 } from '../../../../util/conversion.js';import { fullU32Range } from '../../../../util/math.js';import { makeCaseCache } from '../case_cache.js'; - -export const d = makeCaseCache('unary/u32_complement', { - complement: () => { - return fullU32Range().map((e) => { - return { input: u32(e), expected: u32(~e) }; - }); - } -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.spec.js index 214e856c880..a15742738c6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_complement.spec.js @@ -4,10 +4,10 @@ Execution Tests for the u32 bitwise complement operation `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeU32 } from '../../../../util/conversion.js'; +import { Type, u32 } from '../../../../util/conversion.js'; +import { fullU32Range } from '../../../../util/math.js'; import { allInputSources, run } from '../expression.js'; -import { d } from './u32_complement.cache.js'; import { unary } from './unary.js'; export const g = makeTestGroup(GPUTest); @@ -23,6 +23,8 @@ params((u) => u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) ). fn(async (t) => { - const cases = await d.get('complement'); - await run(t, unary('~'), [TypeU32], TypeU32, t.params, cases); + const cases = fullU32Range().map((e) => { + return { input: u32(e), expected: u32(~e) }; + }); + await run(t, unary('~'), [Type.u32], Type.u32, t.params, cases); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.cache.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.cache.js index 33317a6e918..d43133a5f61 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.cache.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.cache.js @@ -1,12 +1,21 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { kValue } from '../../../../util/constants.js';import { bool, f16, f32, i32, u32 } from '../../../../util/conversion.js';import { +**/import { kValue } from '../../../../util/constants.js';import { abstractFloat, +abstractInt, +bool, +f16, +f32, +i32, +u32 } from +'../../../../util/conversion.js'; +import { fullI32Range, fullU32Range, quantizeToF16, quantizeToF32, scalarF16Range, - scalarF32Range } from + scalarF32Range, + scalarF64Range } from '../../../../util/math.js'; import { reinterpretI32AsU32 } from '../../../../util/reinterpret.js'; import { makeCaseCache } from '../case_cache.js'; @@ -18,6 +27,11 @@ export const d = makeCaseCache('unary/u32_conversion', { { input: bool(false), expected: u32(0) }]; }, + abstractInt: () => { + return fullU32Range().map((u) => { + return { input: abstractInt(BigInt(u)), expected: u32(u) }; + }); + }, u32: () => { return fullU32Range().map((u) => { return { input: u32(u), expected: u32(u) }; @@ -28,6 +42,22 @@ export const d = makeCaseCache('unary/u32_conversion', { return { input: i32(i), expected: u32(reinterpretI32AsU32(i)) }; }); }, + abstractFloat: () => { + return [...scalarF64Range(), -1].map((f) => { + // Handles zeros, subnormals, and negatives + if (f < 1.0) { + return { input: abstractFloat(f), expected: u32(0) }; + } + + if (f >= kValue.u32.max) { + return { input: abstractFloat(f), expected: u32(kValue.u32.max) }; + } + + // All u32s are representable as f64s and number is a f64 internally, so + // no need for special handling like is done for f32 and f16 below. + return { input: abstractFloat(f), expected: u32(Math.floor(f)) }; + }); + }, f32: () => { return scalarF32Range().map((f) => { // Handles zeros, subnormals, and negatives @@ -39,8 +69,8 @@ export const d = makeCaseCache('unary/u32_conversion', { return { input: f32(f), expected: u32(kValue.u32.max) }; } - // All f32 no larger than 2^24 has a precise interger part and a fractional part, just need - // to trunc towards 0 for the result integer. + // All f32 no larger than 2^24 has a precise integer part and a fractional + // part, just need to trunc towards 0 for the result integer. if (f <= 2 ** 24) { return { input: f32(f), expected: u32(Math.floor(f)) }; } @@ -61,16 +91,16 @@ export const d = makeCaseCache('unary/u32_conversion', { return { input: f16(f), expected: u32(0) }; } - // All f16 no larger than <= 2^12 has a precise interger part and a fractional part, just need - // to trunc towards 0 for the result integer. + // All f16 no larger than <= 2^12 has a precise integer part and a + // fractional part, just need to trunc towards 0 for the result integer. if (f <= 2 ** 12) { return { input: f16(f), expected: u32(Math.trunc(f)) }; } - // All f16s larger than 2 ** 12 are integers, so in theory one could use them directly, expect - // that number is actually f64 internally, so they need to be quantized to f16 first. - // Cannot just use trunc here, since that might produce a u32 value that is precise in f64, - // but not in f16. + // All f16s larger than 2 ** 12 are integers, so in theory one could use + // them directly, expect that number is actually f64 internally, so they + // need to be quantized to f16 first.Cannot just use trunc here, since + // that might produce a u32 value that is precise in f64, but not in f16. return { input: f16(f), expected: u32(quantizeToF16(f)) }; }); } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.spec.js index 7a9894d7dad..528e01f4cc6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/u32_conversion.spec.js @@ -4,8 +4,8 @@ Execution Tests for the u32 conversion operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { GPUTest } from '../../../../gpu_test.js'; -import { TypeBool, TypeF16, TypeF32, TypeI32, TypeU32 } from '../../../../util/conversion.js'; -import { allInputSources, run } from '../expression.js'; +import { Type } from '../../../../util/conversion.js'; +import { allInputSources, run, onlyConstInputSource } from '../expression.js'; import { d } from './u32_conversion.cache.js'; import { unary } from './unary.js'; @@ -31,7 +31,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('bool'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeBool], TypeU32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.bool], Type.u32, t.params, cases); }); g.test('u32'). @@ -48,7 +48,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('u32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeU32], TypeU32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.u32], Type.u32, t.params, cases); }); g.test('i32'). @@ -65,7 +65,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('i32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeI32], TypeU32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.i32], Type.u32, t.params, cases); }); g.test('f32'). @@ -82,7 +82,7 @@ u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, ). fn(async (t) => { const cases = await d.get('f32'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF32], TypeU32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f32], Type.u32, t.params, cases); }); g.test('f16'). @@ -102,7 +102,7 @@ beforeAllSubcases((t) => { }). fn(async (t) => { const cases = await d.get('f16'); - await run(t, vectorizeToExpression(t.params.vectorize), [TypeF16], TypeU32, t.params, cases); + await run(t, vectorizeToExpression(t.params.vectorize), [Type.f16], Type.u32, t.params, cases); }); g.test('abstract_int'). @@ -115,6 +115,44 @@ Identity operation if the e can be represented in u32, otherwise it produces a s ` ). params((u) => -u.combine('inputSource', allInputSources).combine('vectorize', [undefined, 2, 3, 4]) +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) ). -unimplemented(); \ No newline at end of file +fn(async (t) => { + const cases = await d.get('abstractInt'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractInt], + Type.u32, + t.params, + cases + ); +}); + +g.test('abstract_float'). +specURL('https://www.w3.org/TR/WGSL/#value-constructor-builtin-function'). +desc( + ` +u32(e), where e is an AbstractFloat + +e is converted to u32, rounding towards zero +` +). +params((u) => +u. +combine('inputSource', onlyConstInputSource). +combine('vectorize', [undefined, 2, 3, 4]) +). +fn(async (t) => { + const cases = await d.get('abstractFloat'); + await run( + t, + vectorizeToExpression(t.params.vectorize), + [Type.abstractFloat], + Type.u32, + t.params, + cases + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/unary.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/unary.js index 914d9fed4c6..1b46f377951 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/unary.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/expression/unary/unary.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { abstractFloatShaderBuilder, basicExpressionBuilder } from +**/import { abstractFloatShaderBuilder, abstractIntShaderBuilder, + basicExpressionBuilder } from '../expression.js'; @@ -10,6 +11,11 @@ export function unary(op) { } /* @returns a ShaderBuilder that evaluates a prefix unary operation that returns AbstractFloats */ -export function abstractUnary(op) { +export function abstractFloatUnary(op) { return abstractFloatShaderBuilder((value) => `${op}(${value})`); +} + +/* @returns a ShaderBuilder that evaluates a prefix unary operation that returns AbstractInts */ +export function abstractIntUnary(op) { + return abstractIntShaderBuilder((value) => `${op}(${value})`); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/call.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/call.spec.js index 43897ca432b..00d2451ecab 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/call.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/call.spec.js @@ -80,4 +80,117 @@ fn c() { ${f.expect_order(3, 7)} }` })); +}); + +g.test('arg_eval'). +desc('Test that arguments are evaluated left to right'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + a(b(), c(), d()); + ${f.expect_order(5)} +`, + extra: ` +fn a(p1 : u32, p2 : u32, p3 : u32) { + ${f.expect_order(4)} +} +fn b() -> u32 { + ${f.expect_order(1)} + return 0; +} +fn c() -> u32 { + ${f.expect_order(2)} + return 0; +} +fn d() -> u32 { + ${f.expect_order(3)} + return 0; +}` + })); +}); + +g.test('arg_eval_logical_and'). +desc('Test that arguments are evaluated left to right'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + a(b(${f.value(1)}) && c()); + a(b(${f.value(0)}) && c()); + ${f.expect_order(6)} +`, + extra: ` +fn a(p : bool) { + ${f.expect_order(3, 5)} +} +fn b(x : i32) -> bool { + ${f.expect_order(1, 4)} + return x == 1; +} +fn c() -> bool { + ${f.expect_order(2)} + return true; +}` + })); +}); + +g.test('arg_eval_logical_or'). +desc('Test that arguments are evaluated left to right'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + a(b(${f.value(1)}) || c()); + a(b(${f.value(0)}) || c()); + ${f.expect_order(6)} +`, + extra: ` +fn a(p : bool) { + ${f.expect_order(3, 5)} +} +fn b(x : i32) -> bool { + ${f.expect_order(1, 4)} + return x == 0; +} +fn c() -> bool { + ${f.expect_order(2)} + return true; +}` + })); +}); + +g.test('arg_eval_pointers'). +desc('Test that arguments are evaluated left to right'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + var x : i32 = ${f.value(0)}; + ${f.expect_order(0)} + _ = c(&x); + a(b(&x), c(&x)); + ${f.expect_order(5)} +`, + extra: ` +fn a(p1 : i32, p2 : i32) { + ${f.expect_order(4)} +} +fn b(p : ptr) -> i32 { + (*p)++; + ${f.expect_order(2)} + return 0; +} +fn c(p : ptr) -> i32 { + if (*p == 1) { + ${f.expect_order(3)} + } else { + ${f.expect_order(1)} + } + return 0; +}` + })); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/for.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/for.spec.js index 182f1e999ae..4f7714cf428 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/for.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/for.spec.js @@ -268,4 +268,54 @@ fn((t) => { ${f.expect_order(9)} ` ); +}); + +g.test('for_logical_and_condition'). +desc('Test flow control for a for-loop with a logical and condition'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + for (var i = ${f.value(0)}; a(i) && b(i); i++) { + ${f.expect_order(3, 6)} + } + ${f.expect_order(8)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(1, 4, 7)} + return i < ${f.value(2)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(2, 5)} + return i < ${f.value(5)}; +} + ` + })); +}); + +g.test('for_logical_or_condition'). +desc('Test flow control for a for-loop with a logical or condition'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + for (var i = ${f.value(0)}; a(i) || b(i); i++) { + ${f.expect_order(2, 4, 7, 10)} + } + ${f.expect_order(13)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(1, 3, 5, 8, 11)} + return i < ${f.value(2)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(6, 9, 12)} + return i < ${f.value(4)}; +} + ` + })); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/harness.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/harness.js index bb2869833f4..d15afe2942c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/harness.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/harness.js @@ -178,7 +178,7 @@ ${main_wgsl.extra} const inputBuffer = t.makeBufferWithContents(new Uint32Array(inputData), GPUBufferUsage.STORAGE); const maxOutputValues = 1000; - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: 4 * (1 + maxOutputValues), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/loop.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/loop.spec.js index adb5e0916df..829c5b49976 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/loop.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/loop.spec.js @@ -122,4 +122,64 @@ fn((t) => { ${f.expect_order(23)} ` ); +}); + +g.test('loop_break_if_logical_and_condition'). +desc('Test flow control for a loop with a logical and break if'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + var i = ${f.value(0)}; + loop { + ${f.expect_order(1, 4, 7)} + continuing { + i++; + break if !(a(i) && b(i)); + } + } + ${f.expect_order(9)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(2, 5, 8)} + return i < ${f.value(3)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(3, 6)} + return i < ${f.value(5)}; +} + ` + })); +}); + +g.test('loop_break_if_logical_or_condition'). +desc('Test flow control for a loop with a logical or break if'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + var i = ${f.value(0)}; + loop { + ${f.expect_order(1, 3, 6, 9)} + continuing { + i++; + break if !(a(i) || b(i)); + } + } + ${f.expect_order(12)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(2, 4, 7, 10)} + return i < ${f.value(2)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(5, 8, 11)} + return i < ${f.value(4)}; +} + ` + })); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/switch.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/switch.spec.js index 09664a067ea..597ef20c788 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/switch.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/switch.spec.js @@ -151,6 +151,39 @@ default: { } } ${f.expect_order(2)} +` + ); +}); + +g.test('switch_inside_loop_with_continue'). +desc('Test that flow control executes correct for a switch calling continue inside a loop'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest( + t, + (f) => ` +${f.expect_order(0)} +var i = ${f.value(0)}; +loop { + switch (i) { + case 1: { + ${f.expect_order(4)} + continue; + } + default: { + ${f.expect_order(1)} + break; + } + } + ${f.expect_order(2)} + + continuing { + ${f.expect_order(3, 5)} + i++; + break if i >= 2; + } +} +${f.expect_order(6)} ` ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/while.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/while.spec.js index f4bbc942ef5..b77e09bf486 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/while.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/flow_control/while.spec.js @@ -137,4 +137,58 @@ fn((t) => { ${f.expect_order(19)} ` ); +}); + +g.test('while_logical_and_condition'). +desc('Test flow control for a while-loop with a logical and condition'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + var i = ${f.value(0)}; + while (a(i) && b(i)) { + ${f.expect_order(3, 6)} + i++; + } + ${f.expect_order(8)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(1, 4, 7)} + return i < ${f.value(2)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(2, 5)} + return i < ${f.value(5)}; +} + ` + })); +}); + +g.test('while_logical_or_condition'). +desc('Test flow control for a while-loop with a logical or condition'). +params((u) => u.combine('preventValueOptimizations', [true, false])). +fn((t) => { + runFlowControlTest(t, (f) => ({ + entrypoint: ` + ${f.expect_order(0)} + var i = ${f.value(0)}; + while (a(i) || b(i)) { + ${f.expect_order(2, 4, 7, 10)} + i++; + } + ${f.expect_order(13)} + `, + extra: ` +fn a(i : i32) -> bool { + ${f.expect_order(1, 3, 5, 8, 11)} + return i < ${f.value(2)}; +} +fn b(i : i32) -> bool { + ${f.expect_order(6, 9, 12)} + return i < ${f.value(4)}; +} + ` + })); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/limits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/limits.spec.js new file mode 100644 index 00000000000..7e96b8b9142 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/limits.spec.js @@ -0,0 +1,439 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Execution tests for WGSL limits.`;import { makeTestGroup } from '../../../common/framework/test_group.js'; +import { keysOf } from '../../../common/util/data_tables.js'; +import { iterRange } from '../../../common/util/util.js'; +import { GPUTest } from '../../gpu_test.js'; +import { checkElementsEqualGenerated } from '../../util/check_contents.js'; + +export const g = makeTestGroup(GPUTest); + +// The limits that we test. +const kMaxStructMembers = 1023; +const kMaxCompositeNestingDepth = 15; +const kMaxBraceNestingDepth = 127; +const kMaxFunctionParameters = 255; +const kMaxSwitchCaseSelectors = 1023; +const kMaxPrivateStorageSize = 8192; +const kMaxFunctionStorageSize = 8192; +const kMaxConstArrayElements = 2047; + +/** + * Run a shader and check that the buffer output matches expectations. + * + * @param t The test object + * @param wgsl The shader source + * @param input The initial buffer contents + * @param expected The expected buffer contents after running the shader + * @param constants The optional pipeline overridable constant values + */ +function runShaderTest( +t, +wgsl, +input, +expected, +constants) +{ + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ code: wgsl }), + entryPoint: 'main', + constants + } + }); + + // Allocate a buffer and copy the input values to it. + const outputBuffer = t.makeBufferWithContents( + input, + GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + ); + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [{ binding: 0, resource: { buffer: outputBuffer } }] + }); + + // Run the shader. + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.queue.submit([encoder.finish()]); + + // Check that the output matches the expected values. + t.expectGPUBufferValuesPassCheck( + outputBuffer, + (data) => checkElementsEqualGenerated(data, expected), + { + type: Uint32Array, + typedLength: input.length + } + ); +} + +g.test('struct_members'). +desc(`Test that structures with the maximum number of members are supported.`). +fn((t) => { + let code = `struct S {`; + for (let m = 0; m < kMaxStructMembers; m++) { + code += ` m${m}: u32,\n`; + } + code += `} + + @group(0) @binding(0) var buffer : S; + + @compute @workgroup_size(1) + fn main() { + buffer = S(); + } + `; + + runShaderTest( + t, + code, + new Uint32Array([...iterRange(kMaxStructMembers, (_i) => 0xdeadbeef)]), + (_i) => 0 + ); +}); + +g.test('nesting_depth_composite_struct'). +desc(`Test that composite types can be nested up to the maximum level.`). +fn((t) => { + let code = `struct S0 { a : u32 }\n`; + for (let s = 1; s < kMaxCompositeNestingDepth; s++) { + code += `struct S${s} { a : S${s - 1} }\n`; + } + code += ` + @group(0) @binding(0) var buffer : S${kMaxCompositeNestingDepth - 1}; + + @compute @workgroup_size(1) + fn main() { + buffer = S${kMaxCompositeNestingDepth - 1}(); + } + `; + + runShaderTest(t, code, new Uint32Array([0xdeadbeef]), (_i) => 0); +}); + +g.test('nesting_depth_composite_array'). +desc(`Test that composite types can be nested up to the maximum level.`). +fn((t) => { + let type = ``; + for (let m = 0; m < kMaxCompositeNestingDepth; m++) { + type += `array<`; + } + type += 'u32'; + for (let m = 0; m < kMaxCompositeNestingDepth; m++) { + type += `, 1>`; + } + + const code = ` + @group(0) @binding(0) var buffer : ${type}; + + @compute @workgroup_size(1) + fn main() { + buffer = ${type}(); + } + `; + + runShaderTest(t, code, new Uint32Array([0xdeadbeef]), (_i) => 0); +}); + +g.test('nesting_depth_braces'). +desc(`Test that brace-enclosed statements can be nested up to the maximum level.`). +fn((t) => { + let code = `@group(0) @binding(0) var buffer : array; + @compute @workgroup_size(1) + + fn main() { + `; + // Note: We subtract one from the spec value to account for the function body, and another one + // for the nested statement itself. + for (let b = 0; b < kMaxBraceNestingDepth - 2; b++) { + code += ` {\n`; + } + code += ` buffer[0] = 42;\n`; + for (let b = 0; b < kMaxBraceNestingDepth - 2; b++) { + code += ` }\n`; + } + code += ` + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(kMaxBraceNestingDepth, (i) => i)]), (i) => { + return i === 0 ? 42 : i; + }); +}); + +g.test('function_parameters'). +desc(`Test that functions can have the maximum number of parameters.`). +fn((t) => { + let code = `@group(0) @binding(0) var buffer : array; + + fn bar(`; + for (let p = 0; p < kMaxFunctionParameters; p++) { + code += `p${p}: u32, `; + } + code += `) {`; + + for (let p = 0; p < kMaxFunctionParameters; p++) { + code += `buffer[${p}] = p${p};\n`; + } + + code += `} + + @compute @workgroup_size(1) + fn main() { + bar(`; + for (let p = 0; p < kMaxFunctionParameters; p++) { + code += `${p}, `; + } + code += `); + } + `; + + runShaderTest( + t, + code, + new Uint32Array([...iterRange(kMaxFunctionParameters, (_i) => 0xdeadbeef)]), + (i) => i + ); +}); + +g.test('switch_case_selectors'). +desc( + `Test that switch statements can have the maximum number of case selectors in separate clauses.` +). +fn((t) => { + let code = `@group(0) @binding(0) var buffer : array; + + @compute @workgroup_size(1) + fn main() { + switch (buffer[0]) { + default {}`; + for (let s = 0; s < kMaxSwitchCaseSelectors - 1; s++) { + code += ` + case ${s} { buffer[1] = ${s}; }`; + } + code += ` + }; + } + `; + + runShaderTest(t, code, new Uint32Array([42, 0xdeadbeef]), (_i) => 42); +}); + +g.test('switch_case_selectors_same_clause'). +desc( + `Test that switch statements can have the maximum number of case selectors in the same clause.` +). +fn((t) => { + let code = `@group(0) @binding(0) var buffer : array; + + @compute @workgroup_size(1) + fn main() { + switch (buffer[0]) { + default {} + case `; + for (let s = 0; s < kMaxSwitchCaseSelectors - 1; s++) { + code += `${s}, `; + } + code += ` { buffer[1] = 42; } + }; + } + `; + + runShaderTest(t, code, new Uint32Array([999, 0xdeadbeef]), (i) => { + return i === 0 ? 999 : 42; + }); +}); + +// A list of types used for array elements. +const kArrayElements = { + bool: { + size: 4, + to_u32: (x) => `u32(${x})` + }, + u32: { + size: 4, + to_u32: (x) => x + }, + vec4u: { + size: 16, + to_u32: (x) => `dot(${x}, ${x})` + } +}; + +g.test('private_array_byte_size'). +desc(`Test that arrays in the private address space up to the maximum size are supported.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const type = kArrayElements[t.params.type]; + const elements = Math.floor(kMaxPrivateStorageSize / type.size); + const code = ` + @group(0) @binding(0) var buffer : array; + + var arr : array<${t.params.type}, ${elements}>; + + @compute @workgroup_size(1) + fn main() { + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0); +}); + +g.test('private_array_combined_byte_size'). +desc(`Test the combined sizes of variables in the private address space.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const type = kArrayElements[t.params.type]; + const elements = Math.floor(kMaxPrivateStorageSize / type.size / 4); + const code = ` + @group(0) @binding(0) var buffer : array; + + var arr1 : array<${t.params.type}, ${elements}>; + var arr2 : array<${t.params.type}, ${elements}>; + var arr3 : array<${t.params.type}, ${elements}>; + var arr4 : array<${t.params.type}, ${elements}>; + + @compute @workgroup_size(1) + fn main() { + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr1[i]')} + ${type.to_u32('arr2[i]')} + + ${type.to_u32('arr3[i]')} + ${type.to_u32('arr4[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0); +}); + +g.test('function_array_byte_size'). +desc(`Test that arrays in the function address space up to the maximum size are supported.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const type = kArrayElements[t.params.type]; + const elements = Math.floor(kMaxFunctionStorageSize / type.size); + const code = ` + @group(0) @binding(0) var buffer : array; + + @compute @workgroup_size(1) + fn main() { + var arr : array<${t.params.type}, ${elements}>; + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0); +}); + +g.test('function_variable_combined_byte_size'). +desc(`Test the combined sizes of variables in the function address space.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const type = kArrayElements[t.params.type]; + const elements = Math.floor(kMaxFunctionStorageSize / type.size / 4); + const code = ` + @group(0) @binding(0) var buffer : array; + + @compute @workgroup_size(1) + fn main() { + var arr1 : array<${t.params.type}, ${elements}>; + var arr2 : array<${t.params.type}, ${elements}>; + var arr3 : array<${t.params.type}, ${elements}>; + var arr4 : array<${t.params.type}, ${elements}>; + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr1[i]')} + ${type.to_u32('arr2[i]')} + + ${type.to_u32('arr3[i]')} + ${type.to_u32('arr4[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0); +}); + +g.test('workgroup_array_byte_size'). +desc(`Test that arrays in the workgroup address space up to the maximum size are supported.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const maxSize = t.device.limits.maxComputeWorkgroupStorageSize; + const type = kArrayElements[t.params.type]; + const elements = Math.floor(maxSize / type.size); + const code = ` + @group(0) @binding(0) var buffer : array; + + var arr : array<${t.params.type}, ${elements}>; + + @compute @workgroup_size(1) + fn main() { + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0); +}); + +g.test('workgroup_array_byte_size_override'). +desc(`Test that arrays in the workgroup address space up to the maximum size are supported.`). +params((u) => u.combine('type', keysOf(kArrayElements))). +fn((t) => { + const maxSize = t.device.limits.maxComputeWorkgroupStorageSize; + const type = kArrayElements[t.params.type]; + const elements = Math.floor(maxSize / type.size); + const code = ` + @group(0) @binding(0) var buffer : array; + + // Set the default element count far too large, which we later override with a valid value. + override elements = ${elements} * 1000; + var arr : array<${t.params.type}, elements>; + + @compute @workgroup_size(1) + fn main() { + for (var i = 0; i < ${elements}; i++) { + buffer[i] = ${type.to_u32('arr[i]')}; + } + } + `; + + runShaderTest(t, code, new Uint32Array([...iterRange(elements, (_i) => 0xdeadbeef)]), (_i) => 0, { + elements + }); +}); + +g.test('const_array_elements'). +desc(`Test that constant array expressions with the maximum number of elements are supported.`). +fn((t) => { + const type = `array`; + + let expr = `${type}(`; + for (let i = 0; i < kMaxConstArrayElements; i++) { + expr += `${i}, `; + } + expr += `)`; + + const code = ` + @group(0) @binding(0) var buffer : ${type}; + + @compute @workgroup_size(1) + fn main() { + buffer = ${expr}; + } + `; + + runShaderTest( + t, + code, + new Uint32Array([...iterRange(kMaxConstArrayElements, (_i) => 0xdeadbeef)]), + (i) => i + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_layout.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_layout.spec.js index 53a797b7c87..8807156fb85 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_layout.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_layout.spec.js @@ -784,6 +784,137 @@ const kLayoutCases = { read_assign: `out = in[2].x`, write_assign: `out[2].x = in`, offset: 32 + }, + array_mat2x2f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 16, + f32: true + }, + array_mat2x2h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 8, + f16: true, + skip_uniform: true + }, + array_mat3x2f_stride: { + type: `array`, + read_assign: `out = u32(in[2][0][0])`, + write_assign: `out[2][0][0] = f32(in)`, + offset: 48, + f32: true, + skip_uniform: true + }, + array_mat3x2h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 12, + f16: true, + skip_uniform: true + }, + array_mat4x2f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 32, + f32: true + }, + array_mat4x2h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 16, + f16: true + }, + array_mat2x3f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 32, + f32: true + }, + array_mat2x3h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 16, + f16: true + }, + array_mat3x3f_stride: { + type: `array`, + read_assign: `out = u32(in[2][0][0])`, + write_assign: `out[2][0][0] = f32(in)`, + offset: 96, + f32: true + }, + array_mat3x3h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 24, + f16: true, + skip_uniform: true + }, + array_mat4x3f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 64, + f32: true + }, + array_mat4x3h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 32, + f16: true + }, + array_mat2x4f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 32, + f32: true + }, + array_mat2x4h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 16, + f16: true + }, + array_mat3x4f_stride: { + type: `array`, + read_assign: `out = u32(in[2][0][0])`, + write_assign: `out[2][0][0] = f32(in)`, + offset: 96, + f32: true + }, + array_mat3x4h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 24, + f16: true, + skip_uniform: true + }, + array_mat4x4f_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f32(in)`, + offset: 64, + f32: true + }, + array_mat4x4h_stride: { + type: `array`, + read_assign: `out = u32(in[1][0][0])`, + write_assign: `out[1][0][0] = f16(in)`, + offset: 32, + f16: true } }; @@ -815,7 +946,7 @@ fn((t) => { const testcase = kLayoutCases[t.params.case]; let code = ` ${testcase.f16 ? 'enable f16;' : ''} -${testcase.decl} +${testcase.decl ?? ''} @group(0) @binding(1) var out : u32; @@ -882,13 +1013,11 @@ fn main() { ), usage ); - t.trackForCleanup(in_buffer); const out_buffer = t.makeBufferWithContents( new Uint32Array([...iterRange(1, (x) => 0)]), GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); - t.trackForCleanup(out_buffer); const pipeline = t.device.createComputePipeline({ layout: 'auto', @@ -952,7 +1081,7 @@ fn((t) => { const testcase = kLayoutCases[t.params.case]; let code = ` ${testcase.f16 ? 'enable f16;' : ''} -${testcase.decl} +${testcase.decl ?? ''} @group(0) @binding(0) var in : u32; @@ -999,13 +1128,11 @@ fn main() { new Uint32Array([42]), GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE ); - t.trackForCleanup(in_buffer); const out_buffer = t.makeBufferWithContents( new Uint32Array([...iterRange(128, (x) => 0)]), GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); - t.trackForCleanup(out_buffer); const pipeline = t.device.createComputePipeline({ layout: 'auto', diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/adjacent.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/adjacent.spec.js index c049664e862..f223eba5abd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/adjacent.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/adjacent.spec.js @@ -211,7 +211,7 @@ function runTest(t) { const bytesPerScalar = 2; // f16 is 2 bytes wide. const bufByteSize = kNumValues * bytesPerScalar; - const hostSrcBuf = t.device.createBuffer({ + const hostSrcBuf = t.createBufferTracked({ size: bufByteSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE, mappedAtCreation: true @@ -223,11 +223,11 @@ function runTest(t) { hostSrcBuf.unmap(); } - const srcBuf = t.device.createBuffer({ + const srcBuf = t.createBufferTracked({ size: bufByteSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE }); - const dstBuf = t.device.createBuffer({ + const dstBuf = t.createBufferTracked({ size: bufByteSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/barrier.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/barrier.spec.js index 47ad99244b8..9ccd04c61d0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/barrier.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/barrier.spec.js @@ -43,22 +43,33 @@ const memoryModelTestParams = { numBehaviors: 2 }; -// The two kinds of non-atomic accesses tested. +// The three kinds of non-atomic accesses tested. // rw: read -> barrier -> write // wr: write -> barrier -> read // ww: write -> barrier -> write // Test the non-atomic memory types. -const kMemTypes = [MemoryType.NonAtomicStorageClass, MemoryType.NonAtomicWorkgroupClass]; +const kMemTypes = [ +MemoryType.NonAtomicStorageClass, +MemoryType.NonAtomicWorkgroupClass, +MemoryType.NonAtomicTextureClass]; + const storageMemoryBarrierStoreLoadTestCode = ` test_locations.value[x_0] = 1; - workgroupBarrier(); + storageBarrier(); let r0 = u32(test_locations.value[x_1]); atomicStore(&results.value[shuffled_workgroup * workgroupXSize + id_1].r0, r0); `; +const textureMemoryBarrierStoreLoadTestCode = ` + textureStore(texture_locations, indexToCoord(x_0), vec4u(1)); + textureBarrier(); + let r0 = textureLoad(texture_locations, indexToCoord(x_1)).x; + atomicStore(&results.value[shuffled_workgroup * workgroupXSize + id_1].r0, r0); +`; + const workgroupMemoryBarrierStoreLoadTestCode = ` wg_test_locations[x_0] = 1; workgroupBarrier(); @@ -75,11 +86,18 @@ const workgroupUniformLoadMemoryBarrierStoreLoadTestCode = ` const storageMemoryBarrierLoadStoreTestCode = ` let r0 = u32(test_locations.value[x_0]); - workgroupBarrier(); + storageBarrier(); test_locations.value[x_1] = 1; atomicStore(&results.value[shuffled_workgroup * workgroupXSize + id_0].r0, r0); `; +const textureMemoryBarrierLoadStoreTestCode = ` + let r0 = textureLoad(texture_locations, indexToCoord(x_0)).x; + textureBarrier(); + textureStore(texture_locations, indexToCoord(x_1), vec4u(1)); + atomicStore(&results.value[shuffled_workgroup * workgroupXSize + id_0].r0, r0); +`; + const workgroupMemoryBarrierLoadStoreTestCode = ` let r0 = u32(wg_test_locations[x_0]); workgroupBarrier(); @@ -100,6 +118,14 @@ const storageMemoryBarrierStoreStoreTestCode = ` test_locations.value[x_1] = 2; `; +const textureMemoryBarrierStoreStoreTestCode = ` + textureStore(texture_locations, indexToCoord(x_0), vec4u(1)); + textureBarrier(); + textureStore(texture_locations, indexToCoord(x_1), vec4u(2)); + textureBarrier(); + test_locations.value[x_1] = textureLoad(texture_locations, indexToCoord(x_1)).x; +`; + const workgroupMemoryBarrierStoreStoreTestCode = ` wg_test_locations[x_0] = 1; workgroupBarrier(); @@ -122,24 +148,42 @@ function getTestCode(p) { switch (p.accessPair) { - case 'rw': - return p.memType === MemoryType.NonAtomicStorageClass ? - storageMemoryBarrierLoadStoreTestCode : - p.normalBarrier ? - workgroupMemoryBarrierLoadStoreTestCode : - workgroupUniformLoadMemoryBarrierLoadStoreTestCode; - case 'wr': - return p.memType === MemoryType.NonAtomicStorageClass ? - storageMemoryBarrierStoreLoadTestCode : - p.normalBarrier ? - workgroupMemoryBarrierStoreLoadTestCode : - workgroupUniformLoadMemoryBarrierStoreLoadTestCode; - case 'ww': - return p.memType === MemoryType.NonAtomicStorageClass ? - storageMemoryBarrierStoreStoreTestCode : - p.normalBarrier ? - workgroupMemoryBarrierStoreStoreTestCode : - workgroupUniformLoadMemoryBarrierStoreStoreTestCode; + case 'rw':{ + switch (p.memType) { + case MemoryType.NonAtomicStorageClass: + return storageMemoryBarrierLoadStoreTestCode; + case MemoryType.NonAtomicTextureClass: + return textureMemoryBarrierLoadStoreTestCode; + default: + return p.normalBarrier ? + workgroupMemoryBarrierLoadStoreTestCode : + workgroupUniformLoadMemoryBarrierLoadStoreTestCode; + } + } + case 'wr':{ + switch (p.memType) { + case MemoryType.NonAtomicStorageClass: + return storageMemoryBarrierStoreLoadTestCode; + case MemoryType.NonAtomicTextureClass: + return textureMemoryBarrierStoreLoadTestCode; + default: + return p.normalBarrier ? + workgroupMemoryBarrierStoreLoadTestCode : + workgroupUniformLoadMemoryBarrierStoreLoadTestCode; + } + } + case 'ww':{ + switch (p.memType) { + case MemoryType.NonAtomicStorageClass: + return storageMemoryBarrierStoreStoreTestCode; + case MemoryType.NonAtomicTextureClass: + return textureMemoryBarrierStoreStoreTestCode; + default: + return p.normalBarrier ? + workgroupMemoryBarrierStoreStoreTestCode : + workgroupUniformLoadMemoryBarrierStoreStoreTestCode; + } + } } } @@ -162,11 +206,21 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase('shader-f16'); } t.skipIf( - !t.params.normalBarrier && t.params.memType === MemoryType.NonAtomicStorageClass, + !t.params.normalBarrier && t.params.memType !== MemoryType.NonAtomicWorkgroupClass, 'workgroupUniformLoad does not have storage memory semantics' ); + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && t.params.accessValueType === 'f16', + 'textures do not support f16 access' + ); }). fn(async (t) => { + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'requires RW storage textures feature' + ); + const resultCode = ` if (r0 == 1u) { atomicAdd(&test_results.seq, 1u); @@ -192,7 +246,8 @@ fn(async (t) => { memoryModelTestParams, testShader, resultShader, - t.params.accessValueType + t.params.accessValueType, + t.params.memType === MemoryType.NonAtomicTextureClass ); await memModelTester.run(15, 1); }); @@ -216,11 +271,21 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase('shader-f16'); } t.skipIf( - !t.params.normalBarrier && t.params.memType === MemoryType.NonAtomicStorageClass, + !t.params.normalBarrier && t.params.memType !== MemoryType.NonAtomicWorkgroupClass, 'workgroupUniformLoad does not have storage memory semantics' ); + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && t.params.accessValueType === 'f16', + 'textures do not support f16 access' + ); }). fn(async (t) => { + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'requires RW storage textures feature' + ); + const resultCode = ` if (r0 == 0u) { atomicAdd(&test_results.seq, 1u); @@ -246,7 +311,8 @@ fn(async (t) => { memoryModelTestParams, testShader, resultShader, - t.params.accessValueType + t.params.accessValueType, + t.params.memType === MemoryType.NonAtomicTextureClass ); await memModelTester.run(12, 1); }); @@ -270,11 +336,21 @@ beforeAllSubcases((t) => { t.selectDeviceOrSkipTestCase('shader-f16'); } t.skipIf( - !t.params.normalBarrier && t.params.memType === MemoryType.NonAtomicStorageClass, + !t.params.normalBarrier && t.params.memType !== MemoryType.NonAtomicWorkgroupClass, 'workgroupUniformLoad does not have storage memory semantics' ); + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && t.params.accessValueType === 'f16', + 'textures do not support f16 access' + ); }). fn(async (t) => { + t.skipIf( + t.params.memType === MemoryType.NonAtomicTextureClass && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'requires RW storage textures feature' + ); + const resultCode = ` if (mem_x_0 == 2u) { atomicAdd(&test_results.seq, 1u); @@ -300,7 +376,8 @@ fn(async (t) => { memoryModelTestParams, testShader, resultShader, - t.params.accessValueType + t.params.accessValueType, + t.params.memType === MemoryType.NonAtomicTextureClass ); await memModelTester.run(10, 1); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/memory_model_setup.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/memory_model_setup.js index c5af0901762..5c0ae85356c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/memory_model_setup.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/memory_model_setup.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { checkElementsPassPredicate } from '../../../util/check_contents.js';import { align } from '../../../util/math.js'; +import { PRNG } from '../../../util/prng.js'; /* All buffer sizes are counted in units of 4-byte words. */ @@ -16,6 +17,9 @@ export const kAccessValueTypes = ['f16', 'u32']; +/** The width used for textures (default compat limit in WebGPU). */ +const kWidth = 4096; + /* Parameter values are set heuristically, typically by a time-intensive search. */ @@ -83,6 +87,16 @@ const numReadOutputs = 2; +/** Represents a device texture and a utility buffer for resetting memory and copying parameters. */ + + + + + + + + + @@ -111,6 +125,10 @@ const numReadOutputs = 2; + + + + @@ -192,16 +210,23 @@ export class MemoryModelTester { + + + + /** Sets up a memory model test by initializing buffers and pipeline layouts. */ constructor( t, params, testShader, resultShader, - accessValueType = 'u32') + accessValueType = 'u32', + useTexture = false) { + this.prng = new PRNG(1); this.test = t; this.params = params; + this.useTexture = useTexture; const workgroupXSize = Math.min(params.workgroupSize, t.device.limits.maxComputeWorkgroupSizeX); const constants = ` @@ -218,12 +243,12 @@ export class MemoryModelTester { const testLocationsSize = testingThreads * numMemLocations * this.params.memStride * bytesPerWord; const testLocationsBuffer = { - deviceBuf: this.test.device.createBuffer({ + deviceBuf: this.test.createBufferTracked({ label: 'testLocationsBuffer', size: testLocationsSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE }), - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'testLocationsSrcBuf', size: testLocationsSize, usage: GPUBufferUsage.COPY_SRC @@ -233,12 +258,12 @@ export class MemoryModelTester { const readResultsSize = testingThreads * numReadOutputs * bytesPerWord; const readResultsBuffer = { - deviceBuf: this.test.device.createBuffer({ + deviceBuf: this.test.createBufferTracked({ label: 'readResultsBuffer', size: readResultsSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE }), - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'readResultsSrcBuf', size: readResultsSize, usage: GPUBufferUsage.COPY_SRC @@ -248,12 +273,12 @@ export class MemoryModelTester { const testResultsSize = this.params.numBehaviors * bytesPerWord; const testResultsBuffer = { - deviceBuf: this.test.device.createBuffer({ + deviceBuf: this.test.createBufferTracked({ label: 'testResultsBuffer', size: testResultsSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }), - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'testResultsSrcBuffer', size: testResultsSize, usage: GPUBufferUsage.COPY_SRC @@ -263,17 +288,37 @@ export class MemoryModelTester { const shuffledWorkgroupsSize = this.params.maxWorkgroups * bytesPerWord; const shuffledWorkgroupsBuffer = { - deviceBuf: this.test.device.createBuffer({ + deviceBuf: this.test.createBufferTracked({ size: shuffledWorkgroupsSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE }), - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ size: shuffledWorkgroupsSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE }), size: shuffledWorkgroupsSize }; + if (this.useTexture) { + const numTexels = testLocationsSize / bytesPerWord; + const width = kWidth; + const height = numTexels / width; + const textureSize = { width, height }; + const textureLocations = { + deviceTex: this.test.createTextureTracked({ + format: 'r32uint', + dimension: '2d', + size: textureSize, + usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.STORAGE_BINDING + }), + srcBuf: testLocationsBuffer.srcBuf, + size: testLocationsSize + }; + this.textures = { + testLocations: textureLocations + }; + } + // Combine 3 arrays into 1 buffer as we need to keep the number of storage buffers to 4 for compat. const falseSharingAvoidanceQuantum = 4096; const barrierSize = align(bytesPerWord, falseSharingAvoidanceQuantum); @@ -287,7 +332,7 @@ export class MemoryModelTester { ); const comboSize = barrierSize + scratchpadSize + scratchMemoryLocationsSize; - const comboBuffer = this.test.device.createBuffer({ + const comboBuffer = this.test.createBufferTracked({ label: 'comboBuffer', size: comboSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE @@ -295,7 +340,7 @@ export class MemoryModelTester { const barrierBuffer = { deviceBuf: comboBuffer, - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'barrierSrcBuf', size: barrierSize, usage: GPUBufferUsage.COPY_SRC @@ -306,7 +351,7 @@ export class MemoryModelTester { const scratchpadBuffer = { deviceBuf: comboBuffer, - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'scratchpadSrcBuf', size: scratchpadSize, usage: GPUBufferUsage.COPY_SRC @@ -317,7 +362,7 @@ export class MemoryModelTester { const scratchMemoryLocationsBuffer = { deviceBuf: comboBuffer, - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'scratchMemoryLocationsSrcBuf', size: scratchMemoryLocationsSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE @@ -328,12 +373,12 @@ export class MemoryModelTester { const stressParamsSize = numStressParams * bytesPerWord; const stressParamsBuffer = { - deviceBuf: this.test.device.createBuffer({ + deviceBuf: this.test.createBufferTracked({ label: 'stressParamsBuffer', size: stressParamsSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM }), - srcBuf: this.test.device.createBuffer({ + srcBuf: this.test.createBufferTracked({ label: 'stressParamsSrcBuf', size: stressParamsSize, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE @@ -363,10 +408,41 @@ export class MemoryModelTester { { binding: 4, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'uniform' } }] }); + + let layouts = [testLayout]; + if (this.useTexture) { + const textureLayout = this.test.device.createBindGroupLayout({ + label: 'textureLayout', + entries: [ + { + binding: 0, + visibility: GPUShaderStage.COMPUTE, + storageTexture: { + access: 'read-write', + format: 'r32uint', + viewDimension: '2d' + } + }] + + }); + layouts = [testLayout, textureLayout]; + + const texLocations = this.textures.testLocations.deviceTex; + this.textureBindGroup = this.test.device.createBindGroup({ + label: 'textureBindGroup', + entries: [ + { + binding: 0, + resource: texLocations.createView() + }], + + layout: textureLayout + }); + } this.testPipeline = this.test.device.createComputePipeline({ label: 'testPipeline', layout: this.test.device.createPipelineLayout({ - bindGroupLayouts: [testLayout] + bindGroupLayouts: layouts }), compute: { module: this.test.device.createShaderModule({ @@ -444,10 +520,16 @@ export class MemoryModelTester { this.copyBufferToBuffer(encoder, this.buffers.scratchpad); this.copyBufferToBuffer(encoder, this.buffers.scratchMemoryLocations); this.copyBufferToBuffer(encoder, this.buffers.stressParams); + if (this.useTexture) { + this.copyBufferToTexture(encoder, this.textures.testLocations); + } const testPass = encoder.beginComputePass(); testPass.setPipeline(this.testPipeline); testPass.setBindGroup(0, this.testBindGroup); + if (this.useTexture) { + testPass.setBindGroup(1, this.textureBindGroup); + } testPass.dispatchWorkgroups(numWorkgroups); testPass.end(); @@ -519,12 +601,29 @@ export class MemoryModelTester { ); } - /** Returns a random integer between 0 and the max. */ - getRandomInt(max) { - return Math.floor(Math.random() * max); + /** Utility method that simplifies copying source buffers to device textures. */ + copyBufferToTexture(encoder, texture) { + const bytesPerWord = 4; // always uses r32uint format. + const numTexels = texture.size / bytesPerWord; + const size = { width: kWidth, height: numTexels / kWidth }; + encoder.copyBufferToTexture( + { + buffer: texture.srcBuf, + offset: 0, + bytesPerRow: kWidth * bytesPerWord, + rowsPerImage: size.height + }, + { texture: texture.deviceTex }, + size + ); } - /** Returns a random number in between the min and max values. */ + /** Returns a random integer in the range [0, max). */ + getRandomInt(max) { + return this.prng.randomU32() % max; + } + + /** Returns a random number in the range [min, max). */ getRandomInRange(min, max) { if (min === max) { return min; @@ -777,6 +876,11 @@ const nonAtomicTestShaderBindings = [ commonTestShaderBindings]. join('\n'); +/** The extra binding for texture non-atomic texture tests. */ +const textureBindings = ` +@group(1) @binding(0) var texture_locations : texture_storage_2d; +`; + /** Bindings used in the result aggregation phase of the test. */ const resultShaderBindings = ` @group(0) @binding(0) var test_locations : Memory; @@ -818,6 +922,16 @@ const memoryLocationFunctions = ` } `; +/** + * Function to convert an index into an equivalent 2D coordinate for the texture. + */ +const textureFunctions = ` + const kWidth = ${kWidth}; + fn indexToCoord(idx : u32) -> vec2u { + return vec2u(idx % kWidth, idx / kWidth); + } +`; + /** Functions that help add stress to the test. */ const testShaderFunctions = ` //Force the invocations in the workgroup to wait for each other, but without the general memory ordering @@ -1048,6 +1162,18 @@ shaderEntryPoint, testShaderCommonHeader]. join('\n'); +/** The common shader code for the test shaders that perform non-atomic texture memory litmus tests. */ +const textureMemoryNonAtomicTestShaderCode = [ +shaderMemStructures, +nonAtomicTestShaderBindings, +textureBindings, +memoryLocationFunctions, +textureFunctions, +testShaderFunctions, +shaderEntryPoint, +testShaderCommonHeader]. +join('\n'); + /** The common shader code for test shaders that perform atomic workgroup class memory litmus tests. */ const workgroupMemoryAtomicTestShaderCode = [ shaderMemStructures, @@ -1082,7 +1208,9 @@ join('\n'); * Defines the types of possible memory a test is operating on. Used as part of the process of building shader code from * its composite parts. */ -export let MemoryType = /*#__PURE__*/function (MemoryType) {MemoryType["AtomicStorageClass"] = "atomic_storage";MemoryType["NonAtomicStorageClass"] = "non_atomic_storage";MemoryType["AtomicWorkgroupClass"] = "atomic_workgroup";MemoryType["NonAtomicWorkgroupClass"] = "non_atomic_workgroup";return MemoryType;}({}); +export let MemoryType = /*#__PURE__*/function (MemoryType) {MemoryType["AtomicStorageClass"] = "atomic_storage";MemoryType["NonAtomicStorageClass"] = "non_atomic_storage";MemoryType["AtomicWorkgroupClass"] = "atomic_workgroup";MemoryType["NonAtomicWorkgroupClass"] = "non_atomic_workgroup";MemoryType["NonAtomicTextureClass"] = "non_atomic_texture";return MemoryType;}({}); + + @@ -1120,21 +1248,26 @@ memoryType, testType) { let memoryTypeCode; - let isStorageAS = false; + let isGlobalSpace = false; switch (memoryType) { case MemoryType.AtomicStorageClass: memoryTypeCode = storageMemoryAtomicTestShaderCode; - isStorageAS = true; + isGlobalSpace = true; break; case MemoryType.NonAtomicStorageClass: memoryTypeCode = storageMemoryNonAtomicTestShaderCode; - isStorageAS = true; + isGlobalSpace = true; break; case MemoryType.AtomicWorkgroupClass: memoryTypeCode = workgroupMemoryAtomicTestShaderCode; break; case MemoryType.NonAtomicWorkgroupClass: memoryTypeCode = workgroupMemoryNonAtomicTestShaderCode; + break; + case MemoryType.NonAtomicTextureClass: + memoryTypeCode = textureMemoryNonAtomicTestShaderCode; + isGlobalSpace = true; + break; } let testTypeCode; switch (testType) { @@ -1142,7 +1275,7 @@ testType) testTypeCode = interWorkgroupTestShaderCode; break; case TestType.IntraWorkgroup: - if (isStorageAS) { + if (isGlobalSpace) { testTypeCode = storageIntraWorkgroupTestShaderCode; } else { testTypeCode = intraWorkgroupTestShaderCode; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/texture_intra_invocation_coherence.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/texture_intra_invocation_coherence.spec.js new file mode 100644 index 00000000000..ba13b74422d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/memory_model/texture_intra_invocation_coherence.spec.js @@ -0,0 +1,328 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Test that read/write storage textures are coherent within an invocation. + +Each invocation is assigned several random writing indices and a single +read index from among those. Writes are randomly predicated (except the +one corresponding to the read). Checks that an invocation can read data +it has written to the texture previously. +Does not test coherence between invocations + +Some platform (e.g. Metal) require a fence call to make writes visible +to reads performed by the same invocation. These tests attempt to ensure +WebGPU implementations emit correct fence calls.`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { unreachable, iterRange } from '../../../../common/util/util.js'; +import { GPUTest } from '../../../gpu_test.js'; +import { PRNG } from '../../../util/prng.js'; + +const kRWStorageFormats = ['r32uint', 'r32sint', 'r32float']; +const kDimensions = ['1d', '2d', '2d-array', '3d']; + +export const g = makeTestGroup(GPUTest); + +function indexToCoord(dim) { + switch (dim) { + case '1d':{ + return ` +fn indexToCoord(idx : u32) -> u32 { + return idx; +}`; + } + case '2d': + case '2d-array':{ + return ` +fn indexToCoord(idx : u32) -> vec2u { + return vec2u(idx % (wgx * num_wgs_x), idx / (wgx * num_wgs_x)); +}`; + } + case '3d':{ + return ` +fn indexToCoord(idx : u32) -> vec3u { + return vec3u(idx % (wgx * num_wgs_x), idx / (wgx * num_wgs_x), 0); +}`; + } + default:{ + unreachable(`unhandled dimension: ${dim}`); + } + } + return ``; +} + +function textureType(format, dim) { + let t = `texture_storage_`; + switch (dim) { + case '1d':{ + t += '1d'; + break; + } + case '2d':{ + t += '2d'; + break; + } + case '2d-array':{ + t += '2d_array'; + break; + } + case '3d':{ + t += '3d'; + break; + } + default:{ + unreachable(`unhandled dim: ${dim}`); + } + } + t += `<${format}, read_write>`; + return t; +} + +function textureStore(dim, index) { + let code = `textureStore(t, indexToCoord(${index}), `; + if (dim === '2d-array') { + code += `0, `; + } + code += `texel)`; + return code; +} + +function textureLoad(dim, format) { + let code = `textureLoad(t, indexToCoord(read_index[global_index])`; + if (dim === '2d-array') { + code += `, 0`; + } + code += `).x`; + if (format !== 'r32uint') { + code = `u32(${code})`; + } + return code; +} + +function texel(format) { + switch (format) { + case 'r32uint':{ + return 'vec4u(global_index,0,0,0)'; + } + case 'r32sint':{ + return 'vec4i(i32(global_index),0,0,0)'; + } + case 'r32float':{ + return 'vec4f(f32(global_index),0,0,0)'; + } + default:{ + unreachable('unhandled format: ${format}'); + } + } + return ''; +} + +function getTextureSize(numTexels, dim) { + const size = { width: 1, height: 1, depthOrArrayLayers: 1 }; + switch (dim) { + case '1d':{ + size.width = numTexels; + break; + } + case '2d': + case '2d-array': + case '3d':{ + size.width = numTexels / 2; + size.height = numTexels / 2; + // depthOrArrayLayers defaults to 1 + break; + } + default:{ + unreachable(`unhandled dim: ${dim}`); + } + } + return size; +} + +g.test('texture_intra_invocation_coherence'). +desc(`Tests writes from an invocation are visible to reads from the same invocation`). +params((u) => u.combine('format', kRWStorageFormats).combine('dim', kDimensions)). +beforeAllSubcases((t) => { + t.selectDeviceForTextureFormatOrSkipTestCase(t.params.format); +}). +fn((t) => { + t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures'); + + const wgx = 16; + const wgy = t.device.limits.maxComputeInvocationsPerWorkgroup / wgx; + const num_wgs_x = 2; + const num_wgs_y = 2; + const invocations = wgx * wgy * num_wgs_x * num_wgs_y; + const num_writes_per_invocation = 4; + + const code = ` +requires readonly_and_readwrite_storage_textures; + +@group(0) @binding(0) +var t : ${textureType(t.params.format, t.params.dim)}; + +@group(1) @binding(0) +var write_indices : array; + +@group(1) @binding(1) +var read_index : array; + +@group(1) @binding(2) +var write_mask : array; + +@group(1) @binding(3) +var output : array; + +const wgx = ${wgx}u; +const wgy = ${wgy}u; +const num_wgs_x = ${num_wgs_x}u; +const num_wgs_y = ${num_wgs_y}u; + +${indexToCoord(t.params.dim)} + +@compute @workgroup_size(wgx, wgy, 1) +fn main(@builtin(global_invocation_id) gid : vec3u) { + let global_index = gid.x + gid.y * num_wgs_x * wgx; + + let write_index = write_indices[global_index]; + let mask = write_mask[global_index]; + let texel = ${texel(t.params.format)}; + + if mask.x != 0 { + ${textureStore(t.params.dim, 'write_index.x')}; + } + if mask.y != 0 { + ${textureStore(t.params.dim, 'write_index.y')}; + } + if mask.z != 0 { + ${textureStore(t.params.dim, 'write_index.z')}; + } + if mask.w != 0 { + ${textureStore(t.params.dim, 'write_index.w')}; + } + output[global_index] = ${textureLoad(t.params.dim, t.params.format)}; +}`; + + // To get a variety of testing, seed the random number generator based on which case this is. + // This means subcases will not execute the same code. + const seed = + kRWStorageFormats.indexOf(t.params.format) * kRWStorageFormats.length + + kDimensions.indexOf(t.params.dim); + const prng = new PRNG(seed); + + const num_write_indices = invocations * num_writes_per_invocation; + const write_indices = new Uint32Array([...iterRange(num_write_indices, (x) => x)]); + const write_masks = new Uint32Array([...iterRange(num_write_indices, (x) => 0)]); + // Shuffle the indices. + for (let i = 0; i < num_write_indices; i++) { + const remaining = num_write_indices - i; + const swapIdx = prng.randomU32() % remaining + i; + const tmp = write_indices[swapIdx]; + write_indices[swapIdx] = write_indices[i]; + write_indices[i] = tmp; + + // Assign random write masks + const mask = prng.randomU32() % 2; + write_masks[i] = mask; + } + const num_read_indices = invocations; + const read_indices = new Uint32Array(num_read_indices); + for (let i = 0; i < num_read_indices; i++) { + // Pick a random index from index from this invocation's writes to read from. + // Ensure that write is not masked out. + const readIdx = prng.randomU32() % num_writes_per_invocation; + read_indices[i] = write_indices[num_writes_per_invocation * i + readIdx]; + write_masks[num_writes_per_invocation * i + readIdx] = 1; + } + + // Buffers + const write_index_buffer = t.makeBufferWithContents( + write_indices, + GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + ); + const read_index_buffer = t.makeBufferWithContents( + read_indices, + GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + ); + const write_mask_buffer = t.makeBufferWithContents( + write_masks, + GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE + ); + const output_buffer = t.makeBufferWithContents( + new Uint32Array([...iterRange(invocations, (x) => 0)]), + GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + ); + + // Texture + const texture_size = getTextureSize(invocations * num_writes_per_invocation, t.params.dim); + const texture = t.createTextureTracked({ + format: t.params.format, + dimension: t.params.dim === '2d-array' ? '2d' : t.params.dim, + size: texture_size, + usage: GPUTextureUsage.STORAGE_BINDING + }); + + const pipeline = t.device.createComputePipeline({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code + }), + entryPoint: 'main' + } + }); + + const bg0 = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: texture.createView({ + format: t.params.format, + dimension: t.params.dim, + mipLevelCount: 1, + arrayLayerCount: 1 + }) + }] + + }); + const bg1 = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(1), + entries: [ + { + binding: 0, + resource: { + buffer: write_index_buffer + } + }, + { + binding: 1, + resource: { + buffer: read_index_buffer + } + }, + { + binding: 2, + resource: { + buffer: write_mask_buffer + } + }, + { + binding: 3, + resource: { + buffer: output_buffer + } + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg0); + pass.setBindGroup(1, bg1); + pass.dispatchWorkgroups(num_wgs_x, num_wgs_y, 1); + pass.end(); + t.queue.submit([encoder.finish()]); + + const expectedOutput = new Uint32Array([...iterRange(num_read_indices, (x) => x)]); + t.expectGPUBufferValuesEqual(output_buffer, expectedOutput); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access.spec.js index 8e6cd5c80b3..12f83e42084 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access.spec.js @@ -7,6 +7,7 @@ Tests to check datatype clamping in shaders is correctly implemented for all ind TODO: add tests to check that textureLoad operations stay in-bounds. `;import { makeTestGroup } from '../../../common/framework/test_group.js'; import { assert } from '../../../common/util/util.js'; +import { Float16Array } from '../../../external/petamoriken/float16/float16.js'; import { GPUTest } from '../../gpu_test.js'; import { align } from '../../util/math.js'; import { generateTypes, supportedScalarTypes, supportsAtomics } from '../types.js'; @@ -25,6 +26,7 @@ const kMinI32 = -0x8000_0000; */ async function runShaderTest( t, +enables, stage, testSource, layout, @@ -34,14 +36,14 @@ dynamicOffsets) assert(stage === GPUShaderStage.COMPUTE, 'Only know how to deal with compute for now'); // Contains just zero (for now). - const constantsBuffer = t.device.createBuffer({ size: 4, usage: GPUBufferUsage.UNIFORM }); + const constantsBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.UNIFORM }); - const resultBuffer = t.device.createBuffer({ + const resultBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE }); - const source = ` + const source = `${enables} struct Constants { zero: u32 }; @@ -99,7 +101,9 @@ array, type, { zeroByteStart, zeroByteCount }) { - const constructor = { u32: Uint32Array, i32: Int32Array, f32: Float32Array }[type]; + const constructor = { u32: Uint32Array, i32: Int32Array, f16: Float16Array, f32: Float32Array }[ + type]; + assert(zeroByteCount % constructor.BYTES_PER_ELEMENT === 0); new constructor(array).fill(42); new constructor(array, zeroByteStart, zeroByteCount / constructor.BYTES_PER_ELEMENT).fill(0); @@ -122,6 +126,7 @@ desc( TODO: Test types like vec2>, if that's allowed. TODO: Test exprIndexAddon as constexpr. TODO: Test exprIndexAddon as pipeline-overridable constant expression. + TODO: Adjust test logic to support array of f16 in the uniform address space ` ). params((u) => @@ -168,10 +173,15 @@ combineWithParams([ { shadowingMode: 'function-scope' }] ). expand('isAtomic', (p) => supportsAtomics(p) ? [false, true] : [false]). -beginSubcases(). expand('baseType', supportedScalarTypes). +beginSubcases(). expandWithParams(generateTypes) ). +beforeAllSubcases((t) => { + if (t.params.baseType === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). fn(async (t) => { const { addressSpace, @@ -189,6 +199,13 @@ fn(async (t) => { assert(_kTypeInfo !== undefined, 'not an indexable type'); assert('arrayLength' in _kTypeInfo); + if (baseType === 'f16' && addressSpace === 'uniform' && containerType === 'array') { + // Array elements must be aligned to 16 bytes, but the logic in generateTypes + // creates an array of vec4 of the baseType. But for f16 that's only 8 bytes. + // We would need to write more complex logic for that. + t.skip('Test logic does not handle array of f16 in the uniform address space'); + } + let usesCanary = false; let globalSource = ''; let testFunctionSource = ''; @@ -429,6 +446,8 @@ fn runTest() -> u32 { }); + const enables = t.params.baseType === 'f16' ? 'enable f16;' : ''; + // Run it. if (bufferBindingSize !== undefined && baseType !== 'bool') { const expectedData = new ArrayBuffer(testBufferSize); @@ -450,6 +469,7 @@ fn runTest() -> u32 { // Run the shader, accessing the buffer. await runShaderTest( t, + enables, GPUShaderStage.COMPUTE, testSource, layout, @@ -475,6 +495,6 @@ fn runTest() -> u32 { bufferBindingEnd ); } else { - await runShaderTest(t, GPUShaderStage.COMPUTE, testSource, layout, []); + await runShaderTest(t, enables, GPUShaderStage.COMPUTE, testSource, layout, []); } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access_vertex.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access_vertex.spec.js index f964d330c38..4d26a2b40a3 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access_vertex.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/robust_access_vertex.spec.js @@ -210,7 +210,7 @@ class DrawCall { size -= 1; // Shave off one byte from the buffer size. length -= 1; // And one whole element from the writeBuffer. } - const buffer = this.test.device.createBuffer({ + const buffer = this.test.createBufferTracked({ size, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST // Ensure that buffer can be used by writeBuffer }); @@ -487,7 +487,7 @@ class F extends TextureTestMixin(GPUTest) { buffers }); - const colorAttachment = this.device.createTexture({ + const colorAttachment = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 2, height: 1, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -499,9 +499,9 @@ class F extends TextureTestMixin(GPUTest) { colorAttachments: [ { view: colorAttachmentView, - storeOp: 'store', clearValue: { r: 0.0, g: 1.0, b: 0.0, a: 1.0 }, - loadOp: 'clear' + loadOp: 'clear', + storeOp: 'store' }] }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/compute_builtins.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/compute_builtins.spec.js index 90de84fb44c..98baa860c02 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/compute_builtins.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/compute_builtins.spec.js @@ -147,11 +147,10 @@ fn((t) => { const kOutputElementSize = 16; // Create the output buffers. - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: totalInvocations * kOutputElementSize * 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -168,12 +167,11 @@ fn((t) => { pass.dispatchWorkgroups(t.params.numGroups.x, t.params.numGroups.y, t.params.numGroups.z); break; case 'indirect':{ - const dispatchBuffer = t.device.createBuffer({ + const dispatchBuffer = t.createBufferTracked({ size: 3 * Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.INDIRECT, mappedAtCreation: true }); - t.trackForCleanup(dispatchBuffer); const dispatchData = new Uint32Array(dispatchBuffer.getMappedRange()); dispatchData[0] = t.params.numGroups.x; dispatchData[1] = t.params.numGroups.y; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/fragment_builtins.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/fragment_builtins.spec.js index 557ebb04f65..79f61c083be 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/fragment_builtins.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/fragment_builtins.spec.js @@ -6,17 +6,22 @@ * test @interpolate * test builtin(sample_index) * test builtin(front_facing) +* test builtin(sample_mask) Note: @interpolate settings and sample_index affect whether or not the fragment shader is evaluated per-fragment or per-sample. With @interpolate(, sample) or usage of @builtin(sample_index) the fragment shader should be executed per-sample. -TODO: -* test frag_depth +* sample_mask output is tested in + src/webgpu/api/operation/render_pipeline/sample_mask.spec.ts + +* frag_depth output is tested in + src/webgpu/api/operation/rendering/depth_clip_clamp.spec.ts `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { ErrorWithExtra, assert, range, unreachable } from '../../../../common/util/util.js'; import { GPUTest } from '../../../gpu_test.js'; +import { getProvokingVertexForFlatInterpolationEitherSampling } from '../../../inter_stage.js'; import { getMultisampleFragmentOffsets } from '../../../multisample_info.js'; import { dotProduct, subtractVectors } from '../../../util/math.js'; import { TexelView } from '../../../util/texture/texel_view.js'; @@ -134,17 +139,15 @@ textures) assert(isTextureSameDimensions(textures[0], textures[3])); const { width, height, sampleCount } = textures[0]; - const copyBuffer = t.device.createBuffer({ + const copyBuffer = t.createBufferTracked({ size: width * height * sampleCount * 4 * 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(copyBuffer); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ size: copyBuffer.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(buffer); const pipeline = getCopyMultisamplePipelineForDevice(t.device, textures); const encoder = t.device.createCommandEncoder(); @@ -301,6 +304,7 @@ function isTriangleClockwise(windowPoints) { + /** * For each sample in texture, computes the values that would be provided * to the shader as `@builtin(position)` if the texture was a render target @@ -342,6 +346,22 @@ function generateFragmentInputs({ for (let y = 0; y < height; ++y) { for (let x = 0; x < width; ++x) { + let sampleMask = 0; + for (let sampleIndex = 0; sampleIndex < sampleCount; ++sampleIndex) { + const localSampleMask = 1 << sampleIndex; + const multisampleOffset = fragmentOffsets[sampleIndex]; + const sampleFragmentPoint = [x + multisampleOffset[0], y + multisampleOffset[1]]; + const sampleBarycentricCoords = calcBarycentricCoordinates( + windowPoints2D, + sampleFragmentPoint + ); + + const inside = isInsideTriangle(sampleBarycentricCoords); + if (inside) { + sampleMask |= localSampleMask; + } + } + for (let sampleIndex = 0; sampleIndex < sampleCount; ++sampleIndex) { const fragmentPoint = [x + 0.5, y + 0.5]; const multisampleOffset = fragmentOffsets[sampleIndex]; @@ -366,6 +386,7 @@ function generateFragmentInputs({ ndcPoints, windowPoints, sampleIndex, + sampleMask, frontFacing }); @@ -404,11 +425,17 @@ function computeFragmentPosition({ /** * Creates a function that will compute the interpolation of an inter-stage variable. */ -function createInterStageInterpolationFn( +async function createInterStageInterpolationFn( +t, interStagePoints, type, sampling) { + const provokingVertex = + type === 'flat' && sampling === 'either' ? + await getProvokingVertexForFlatInterpolationEitherSampling(t) : + 'first'; + return function ({ baseVertexIndex, fragmentBarycentricCoords, @@ -417,7 +444,9 @@ sampling) }) { const triangleInterStagePoints = interStagePoints.slice(baseVertexIndex, baseVertexIndex + 3); const barycentricCoords = - sampling === 'center' ? fragmentBarycentricCoords : sampleBarycentricCoords; + sampling === 'center' || sampling === undefined ? + fragmentBarycentricCoords : + sampleBarycentricCoords; switch (type) { case 'perspective': return triangleInterStagePoints[0].map((_, colNum) => @@ -434,7 +463,7 @@ sampling) ); break; case 'flat': - return triangleInterStagePoints[0]; + return triangleInterStagePoints[provokingVertex === 'first' ? 0 : 2]; break; default: unreachable(); @@ -447,12 +476,13 @@ sampling) * and then return [1, 0, 0, 0] if all interpolated values are between 0.0 and 1.0 inclusive * or [-1, 0, 0, 0] otherwise. */ -function createInterStageInterpolationBetween0And1TestFn( +async function createInterStageInterpolationBetween0And1TestFn( +t, interStagePoints, type, sampling) { - const interpolateFn = createInterStageInterpolationFn(interStagePoints, type, sampling); + const interpolateFn = await createInterStageInterpolationFn(t, interStagePoints, type, sampling); return function (fragData) { const interpolatedValues = interpolateFn(fragData); const allTrue = interpolatedValues.reduce((all, v) => all && v >= 0 && v <= 1, true); @@ -474,6 +504,13 @@ function computeFragmentFrontFacing({ frontFacing }) { return [frontFacing ? 1 : 0, 0, 0, 0]; } +/** + * Computes 'builtin(sample_mask)' + */ +function computeSampleMask({ sampleMask }) { + return [sampleMask, 0, 0, 0]; +} + /** * Renders float32 fragment shader inputs values to 4 rgba8unorm textures that * can be multisampled textures. It stores each of the channels, r, g, b, a of @@ -586,19 +623,17 @@ t, ` }); - const textures = range(4, () => { - const texture = t.device.createTexture({ - size: [width, height], - usage: - GPUTextureUsage.RENDER_ATTACHMENT | - GPUTextureUsage.TEXTURE_BINDING | - GPUTextureUsage.COPY_SRC, - format: 'rgba8unorm', - sampleCount - }); - t.trackForCleanup(texture); - return texture; - }); + const textures = range(4, () => + t.createTextureTracked({ + size: [width, height], + usage: + GPUTextureUsage.RENDER_ATTACHMENT | + GPUTextureUsage.TEXTURE_BINDING | + GPUTextureUsage.COPY_SRC, + format: 'rgba8unorm', + sampleCount + }) + ); const pipeline = t.device.createRenderPipeline({ layout: 'auto', @@ -621,11 +656,10 @@ t, } }); - const uniformBuffer = t.device.createBuffer({ + const uniformBuffer = t.createBufferTracked({ size: 8, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }); - t.trackForCleanup(uniformBuffer); t.device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([width, height])); const viewport = [0, 0, width, height, ...nearFar]; @@ -729,7 +763,8 @@ combine('interpolation', [ { type: 'linear', sampling: 'center' }, { type: 'linear', sampling: 'centroid' }, { type: 'linear', sampling: 'sample' }, -{ type: 'flat' }] +{ type: 'flat', sampling: 'first' }, +{ type: 'flat', sampling: 'either' }] ) ). beforeAllSubcases((t) => { @@ -810,11 +845,15 @@ u // .combine('nearFar', [[0, 1], [0.25, 0.75]]). combine('sampleCount', [1, 4]). combine('interpolation', [ +{ type: 'perspective' }, { type: 'perspective', sampling: 'center' }, { type: 'perspective', sampling: 'sample' }, +{ type: 'linear' }, { type: 'linear', sampling: 'center' }, { type: 'linear', sampling: 'sample' }, -{ type: 'flat' }] +{ type: 'flat' }, +{ type: 'flat', sampling: 'first' }, +{ type: 'flat', sampling: 'either' }] ) ). beforeAllSubcases((t) => { @@ -863,7 +902,7 @@ fn(async (t) => { nearFar, sampleCount, clipSpacePoints, - interpolateFn: createInterStageInterpolationFn(interStagePoints, type, sampling) + interpolateFn: await createInterStageInterpolationFn(t, interStagePoints, type, sampling) }); t.expectOK( @@ -997,7 +1036,8 @@ fn(async (t) => { nearFar, sampleCount, clipSpacePoints, - interpolateFn: createInterStageInterpolationBetween0And1TestFn( + interpolateFn: await createInterStageInterpolationBetween0And1TestFn( + t, interStagePoints, type, sampling @@ -1033,7 +1073,8 @@ combine('interpolation', [ { type: 'linear', sampling: 'center' }, { type: 'linear', sampling: 'centroid' }, { type: 'linear', sampling: 'sample' }, -{ type: 'flat' }] +{ type: 'flat', sampling: 'first' }, +{ type: 'flat', sampling: 'either' }] ) ). beforeAllSubcases((t) => { @@ -1117,7 +1158,8 @@ combine('interpolation', [ { type: 'linear', sampling: 'center' }, { type: 'linear', sampling: 'centroid' }, { type: 'linear', sampling: 'sample' }, -{ type: 'flat' }] +{ type: 'flat', sampling: 'first' }, +{ type: 'flat', sampling: 'either' }] ) ). beforeAllSubcases((t) => { @@ -1196,8 +1238,179 @@ fn(async (t) => { interpolateFn: computeFragmentFrontFacing }); - // Double check, first corner should be different than last based on the triangles we are drawing. - assert(expected[0] !== expected[expected.length - 4]); + assert(expected.indexOf(0) >= 0, 'expect some values to be 0'); + assert(expected.findIndex((v) => v !== 0) >= 0, 'expect some values to be non 0'); + + t.expectOK( + checkSampleRectsApproximatelyEqual({ + width, + height, + sampleCount, + actual, + expected, + maxDiffULPsForFloatFormat: 0 + }) + ); +}); + +g.test('inputs,sample_mask'). +desc( + ` + Test fragment shader builtin(sample_mask) values. + + Draws various triangles that should trigger different sample_mask values. + Checks that sample_mask matches what's expected. Note: the triangles + are selected so they do not intersect sample points as we don't want + to test precision issues on whether or not a sample point is inside + or outside the triangle when right on the edge. + + Example: x=-1, y=2, it draws the following triangle + + [ -0.8, -2 ] + [ 1.2, 2 ] + [ -0.8, 2 ] + + On to a 4x4 pixel texture + + -0.8, 2 + .----------------------. 1.2 2 + |...................../ + |..................../ + |.................../ + |................../ + |................./ + +-|---+-----+-----+/----+ --- + | |...|.....|...../ | ^ + | |...|.....|..../| | | + +-|---+-----+---/-+-----+ | + | |...|.....|../ | | | + | |...|.....|./ | | | + +-|---+-----+/----+-----+ texture / clip space + | |...|...../ | | | + | |...|..../| | | | + +-|---+---/-+-----+-----+ | + | |...|../ | | | | + | |...|./ | | | V + +-|---+/----+-----+-----+ --- + |.../ + |../ + |./ + |/ + / + . + -0.8, -2 + + Inside an individual pixel you might see this situation + + +-------------+ + |....s1|/ | + |......| | + |...../| s2 | + +------C------+ + |s3./ | | + |../ | | + |./ |s4 | + +-------------+ + + where s1, s2, s3, s4, are sample points and C is the center. For a sampleCount = 4 texture + the sample_mask is expected to emit sample_mask = 0b0101 + + ref: https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_standard_multisample_quality_levels + ` +). +params((u) => +u // +.combine('nearFar', [[0, 1], [0.25, 0.75]]). +combine('sampleCount', [1, 4]). +combine('interpolation', [ +// given that 'sample' effects whether things are run per-sample or per-fragment +// we test all of these to make sure they don't affect the result differently than expected. +{ type: 'perspective', sampling: 'center' }, +{ type: 'perspective', sampling: 'centroid' }, +{ type: 'perspective', sampling: 'sample' }, +{ type: 'linear', sampling: 'center' }, +{ type: 'linear', sampling: 'centroid' }, +{ type: 'linear', sampling: 'sample' }, +{ type: 'flat', sampling: 'first' }, +{ type: 'flat', sampling: 'either' }] +). +beginSubcases(). +combineWithParams([ +{ x: -1, y: -1 }, +{ x: -1, y: -2 }, +{ x: -1, y: 1 }, +{ x: -1, y: 3 }, +{ x: -2, y: -1 }, +{ x: -2, y: 3 }, +{ x: -3, y: -1 }, +{ x: -3, y: -2 }, +{ x: -3, y: 1 }, +{ x: 1, y: -1 }, +{ x: 1, y: -3 }, +{ x: 1, y: 1 }, +{ x: 1, y: 2 }, +{ x: 2, y: -2 }, +{ x: 2, y: -3 }, +{ x: 2, y: 1 }, +{ x: 2, y: 2 }, +{ x: 3, y: -1 }, +{ x: 3, y: -3 }, +{ x: 3, y: 1 }, +{ x: 3, y: 2 }, +{ x: 3, y: 3 }] +) +). +beforeAllSubcases((t) => { + const { + interpolation: { type, sampling } + } = t.params; + t.skipIfInterpolationTypeOrSamplingNotSupported({ type, sampling }); + t.skipIf(t.isCompatibility, 'sample_mask is not supported in compatibility mode'); +}). +fn(async (t) => { + const { + x, + y, + nearFar, + sampleCount, + interpolation: { type, sampling } + } = t.params; + + const clipSpacePoints = [ + [x + 0.2, -y, 0, 1], + [-x + 0.2, y, 0, 1], + [x + 0.2, y, 0, 1]]; + + + const interStagePoints = [ + [13, 14, 15, 16], + [17, 18, 19, 20], + [21, 22, 23, 24]]; + + + const width = 4; + const height = 4; + const actual = await renderFragmentShaderInputsTo4TexturesAndReadbackValues(t, { + interpolationType: type, + interpolationSampling: sampling, + sampleCount, + width, + height, + nearFar, + clipSpacePoints, + interStagePoints, + fragInCode: '@builtin(sample_mask) sample_mask: u32,', + outputCode: 'vec4f(f32(fin.sample_mask), 0, 0, 0)' + }); + + const expected = generateFragmentInputs({ + width, + height, + nearFar, + sampleCount, + clipSpacePoints, + interpolateFn: computeSampleMask + }); t.expectOK( checkSampleRectsApproximatelyEqual({ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/shared_structs.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/shared_structs.spec.js index 4582f615ced..98d92fb8fa4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/shared_structs.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/shared_structs.spec.js @@ -58,7 +58,7 @@ fn((t) => { // Allocate a buffer to hold the output structure. const bufferNumElements = 32; - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: bufferNumElements * Uint32Array.BYTES_PER_ELEMENT, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -167,7 +167,7 @@ fn((t) => { }); // Draw a red triangle. - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ size, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, format: 'rgba8unorm' @@ -292,7 +292,7 @@ fn((t) => { new Float32Array([1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0]), GPUBufferUsage.VERTEX ); - const renderTarget = t.device.createTexture({ + const renderTarget = t.createTextureTracked({ size: [31, 31], usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, format: 'rgba8unorm' diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/user_io.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/user_io.spec.js new file mode 100644 index 00000000000..0998100ef9c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/user_io.spec.js @@ -0,0 +1,210 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Test for user-defined shader I/O. + +passthrough: + * Data passed into vertex shader as uints and converted to test type + * Passed from vertex to fragment as test type + * Output from fragment shader as uint +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { range } from '../../../../common/util/util.js'; +import { GPUTest } from '../../../gpu_test.js'; + +export const g = makeTestGroup(GPUTest); + +function generateInterstagePassthroughCode(type) { + return ` +${type === 'f16' ? 'enable f16;' : ''} +struct IOData { + @builtin(position) pos : vec4f, + @location(0) @interpolate(flat, either) user0 : ${type}, + @location(1) @interpolate(flat, either) user1 : vec2<${type}>, + @location(2) @interpolate(flat, either) user2 : vec4<${type}>, +} + +struct VertexInput { + @builtin(vertex_index) idx : u32, + @location(0) in0 : u32, + @location(1) in1 : vec2u, + @location(2) in2 : vec4u, +} + +@vertex +fn vsMain(input : VertexInput) -> IOData { + const vertices = array( + vec4f(-1, -1, 0, 1), + vec4f(-1, 1, 0, 1), + vec4f( 1, -1, 0, 1), + ); + var data : IOData; + data.pos = vertices[input.idx]; + data.user0 = ${type}(input.in0); + data.user1 = vec2<${type}>(input.in1); + data.user2 = vec4<${type}>(input.in2); + return data; +} + +struct FragOutput { + @location(0) out0 : u32, + @location(1) out1 : vec2u, + @location(2) out2 : vec4u, +} + +@fragment +fn fsMain(input : IOData) -> FragOutput { + var out : FragOutput; + out.out0 = u32(input.user0); + out.out1 = vec2u(input.user1); + out.out2 = vec4u(input.user2); + return out; +} +`; +} + +function drawPassthrough(t, code) { + // Default limit is 32 bytes of color attachments. + // These attachments use 28 bytes (which is why vec3 is skipped). + const formats = ['r32uint', 'rg32uint', 'rgba32uint']; + const components = [1, 2, 4]; + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { + module: t.device.createShaderModule({ code }), + entryPoint: 'vsMain', + buffers: [ + { + arrayStride: 4, + attributes: [ + { + format: 'uint32', + offset: 0, + shaderLocation: 0 + }] + + }, + { + arrayStride: 8, + attributes: [ + { + format: 'uint32x2', + offset: 0, + shaderLocation: 1 + }] + + }, + { + arrayStride: 16, + attributes: [ + { + format: 'uint32x4', + offset: 0, + shaderLocation: 2 + }] + + }] + + }, + fragment: { + module: t.device.createShaderModule({ code }), + entryPoint: 'fsMain', + targets: formats.map((x) => { + return { format: x }; + }) + }, + primitive: { + topology: 'triangle-list' + } + }); + + const vertexBuffer = t.makeBufferWithContents( + new Uint32Array([ + // scalar: offset 0 + 1, 1, 1, 0, + // vec2: offset 16 + 2, 2, 2, 2, 2, 2, 0, 0, + // vec4: offset 48 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + ), + GPUBufferUsage.COPY_SRC | GPUBufferUsage.VERTEX + ); + + const bytesPerComponent = 4; + // 256 is the minimum bytes per row for texture to buffer copies. + const width = 256 / bytesPerComponent; + const height = 2; + const copyWidth = 4; + const outputTextures = range(3, (i) => + t.createTextureTracked({ + size: [width, height], + usage: + GPUTextureUsage.COPY_SRC | + GPUTextureUsage.RENDER_ATTACHMENT | + GPUTextureUsage.TEXTURE_BINDING, + format: formats[i] + }) + ); + + let bufferSize = 1; + for (const comp of components) { + bufferSize *= comp; + } + bufferSize *= outputTextures.length * bytesPerComponent * copyWidth; + const outputBuffer = t.createBufferTracked({ + size: bufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: outputTextures.map((t) => ({ + view: t.createView(), + loadOp: 'clear', + storeOp: 'store' + })) + }); + pass.setPipeline(pipeline); + pass.setVertexBuffer(0, vertexBuffer, 0, 12); + pass.setVertexBuffer(1, vertexBuffer, 16, 24); + pass.setVertexBuffer(2, vertexBuffer, 48, 48); + pass.draw(3); + pass.end(); + + // Copy 'copyWidth' samples from each attachment into a buffer to check the results. + let offset = 0; + let expectArray = []; + for (let i = 0; i < outputTextures.length; i++) { + encoder.copyTextureToBuffer( + { texture: outputTextures[i] }, + { + buffer: outputBuffer, + offset, + bytesPerRow: bytesPerComponent * components[i] * width, + rowsPerImage: height + }, + { width: copyWidth, height: 1 } + ); + offset += components[i] * bytesPerComponent * copyWidth; + for (let j = 0; j < components[i]; j++) { + const value = i + 1; + expectArray = expectArray.concat([value, value, value, value]); + } + } + t.queue.submit([encoder.finish()]); + + const expect = new Uint32Array(expectArray); + t.expectGPUBufferValuesEqual(outputBuffer, expect); +} + +g.test('passthrough'). +desc('Tests passing user-defined data from vertex input through fragment output'). +params((u) => u.combine('type', ['f32', 'f16', 'i32', 'u32'])). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = generateInterstagePassthroughCode(t.params.type); + drawPassthrough(t, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/workgroup_size.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/workgroup_size.spec.js index a683d352725..88338fe373e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/workgroup_size.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/shader_io/workgroup_size.spec.js @@ -116,7 +116,6 @@ fn main(@builtin(local_invocation_id) lid : vec3u, new Uint32Array([...iterRange(numWorkgroups * 4, (_i) => 0)]), GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); - t.trackForCleanup(buffer); const bg = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/stage.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/stage.spec.js index df09954c3f7..fd8783769c5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/stage.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/stage.spec.js @@ -35,7 +35,6 @@ fn main() { new Uint32Array([0, 0, 0, 0]), GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); - t.trackForCleanup(buffer); const bg = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), @@ -92,7 +91,7 @@ fn frag_main() -> @location(0) vec4f { const [width, height] = [8, 8]; const format = 'rgba8unorm'; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ size: { width, height }, usage: GPUTextureUsage.RENDER_ATTACHMENT | @@ -102,7 +101,7 @@ fn frag_main() -> @location(0) vec4f { }); // We'll copy one pixel only. - const dst = t.device.createBuffer({ + const dst = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/compound.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/compound.spec.js index 0c7f0edcaee..fe4de3ef727 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/compound.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/compound.spec.js @@ -52,7 +52,7 @@ fn main() { }); const maxOutputValues = 1000; - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: 4 * (1 + maxOutputValues), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/discard.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/discard.spec.js new file mode 100644 index 00000000000..644f73ee876 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/discard.spec.js @@ -0,0 +1,712 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Execution tests for discard. + +The discard statement converts invocations into helpers. +This results in the following conditions: + * No outputs are written + * No resources are written + * Atomics are undefined + +Conditions that still occur: + * Derivative calculations are correct + * Reads + * Writes to non-external memory +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { iterRange } from '../../../../common/util/util.js'; +import { GPUTest } from '../../../gpu_test.js'; +import { checkElementsPassPredicate } from '../../../util/check_contents.js'; + +export const g = makeTestGroup(GPUTest); + +// Framebuffer dimensions +const kWidth = 64; +const kHeight = 64; + +const kSharedCode = ` +@group(0) @binding(0) var output: array; +@group(0) @binding(1) var atomicIndex : atomic; +@group(0) @binding(2) var uniformValues : array; + +@vertex +fn vsMain(@builtin(vertex_index) index : u32) -> @builtin(position) vec4f { + const vertices = array( + vec2(-1, -1), vec2(-1, 0), vec2( 0, -1), + vec2(-1, 0), vec2( 0, 0), vec2( 0, -1), + + vec2( 0, -1), vec2( 0, 0), vec2( 1, -1), + vec2( 0, 0), vec2( 1, 0), vec2( 1, -1), + + vec2(-1, 0), vec2(-1, 1), vec2( 0, 0), + vec2(-1, 1), vec2( 0, 1), vec2( 0, 0), + + vec2( 0, 0), vec2( 0, 1), vec2( 1, 0), + vec2( 0, 1), vec2( 1, 1), vec2( 1, 0), + ); + return vec4f(vec2f(vertices[index]), 0, 1); +} +`; + +function drawFullScreen( +t, +code, +dataChecker, +framebufferChecker) +{ + const pipeline = t.device.createRenderPipeline({ + layout: 'auto', + vertex: { + module: t.device.createShaderModule({ code }), + entryPoint: 'vsMain' + }, + fragment: { + module: t.device.createShaderModule({ code }), + entryPoint: 'fsMain', + targets: [{ format: 'r32uint' }] + }, + primitive: { + topology: 'triangle-list' + } + }); + + const bytesPerWord = 4; + const framebuffer = t.createTextureTracked({ + size: [kWidth, kHeight], + usage: + GPUTextureUsage.COPY_SRC | + GPUTextureUsage.COPY_DST | + GPUTextureUsage.RENDER_ATTACHMENT | + GPUTextureUsage.TEXTURE_BINDING, + format: 'r32uint' + }); + + // Create a buffer to copy the framebuffer contents into. + // Initialize with a sentinel value and load this buffer to detect unintended writes. + const fbBuffer = t.makeBufferWithContents( + new Uint32Array([...iterRange(kWidth * kHeight, (x) => kWidth * kHeight)]), + GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST + ); + + // Create a buffer to hold the storage shader resources. + // (0,0) = vec2u width * height + // (0,1) = u32 + const dataSize = 2 * kWidth * kHeight * bytesPerWord; + const dataBufferSize = dataSize + bytesPerWord; + const dataBuffer = t.createBufferTracked({ + size: dataBufferSize, + usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + }); + + const uniformSize = bytesPerWord * 5; + const uniformBuffer = t.makeBufferWithContents( + // Loop bound, [derivative constants]. + new Uint32Array([4, 1, 4, 4, 7]), + GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + ); + + // 'atomicIndex' packed at the end of the buffer. + const bg = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: { + buffer: dataBuffer, + offset: 0, + size: dataSize + } + }, + { + binding: 1, + resource: { + buffer: dataBuffer, + offset: dataSize, + size: bytesPerWord + } + }, + { + binding: 2, + resource: { + buffer: uniformBuffer, + offset: 0, + size: uniformSize + } + }] + + }); + + const encoder = t.device.createCommandEncoder(); + encoder.copyBufferToTexture( + { + buffer: fbBuffer, + offset: 0, + bytesPerRow: kWidth * bytesPerWord, + rowsPerImage: kHeight + }, + { texture: framebuffer }, + { width: kWidth, height: kHeight } + ); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: framebuffer.createView(), + loadOp: 'load', + storeOp: 'store' + }] + + }); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bg); + pass.draw(24); + pass.end(); + encoder.copyTextureToBuffer( + { texture: framebuffer }, + { + buffer: fbBuffer, + offset: 0, + bytesPerRow: kWidth * bytesPerWord, + rowsPerImage: kHeight + }, + { width: kWidth, height: kHeight } + ); + t.queue.submit([encoder.finish()]); + + t.expectGPUBufferValuesPassCheck(dataBuffer, dataChecker, { + type: Float32Array, + typedLength: dataSize / bytesPerWord + }); + + t.expectGPUBufferValuesPassCheck(fbBuffer, framebufferChecker, { + type: Uint32Array, + typedLength: kWidth * kHeight + }); +} + +g.test('all'). +desc('Test a shader that discards all fragments'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + _ = uniformValues[0]; + discard; + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return 1; +} +`; + + // No storage writes occur. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === 0; + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + return 0; + } + }] + + } + ); + }; + + // No fragment outputs occur. + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === kWidth * kHeight; + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + return 0; + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('three_quarters'). +desc('Test a shader that discards all but the upper-left quadrant fragments'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + _ = uniformValues[0]; + if (pos.x >= 0.5 * ${kWidth} || pos.y >= 0.5 * ${kHeight}) { + discard; + } + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return idx; +} +`; + + // Only the the upper left quadrant is kept. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + const is_x = idx % 2 === 0; + if (is_x) { + return value < 0.5 * kWidth; + } else { + return value < 0.5 * kHeight; + } + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + const is_x = idx % 2 === 0; + if (is_x) { + const x = Math.floor(idx / 2) % kWidth; + if (x >= kWidth / 2) { + return 0; + } + } else { + const y = Math.floor((idx - 1) / kWidth); + if (y >= kHeight / 2) { + return 0; + } + } + if (is_x) { + return `< ${0.5 * kWidth}`; + } else { + return `< ${0.5 * kHeight}`; + } + } + }] + + } + ); + }; + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if (x < kWidth / 2 && y < kHeight / 2) { + return value < kWidth * kHeight / 4; + } else { + return value === kWidth * kHeight; + } + return value < kWidth * kHeight / 4; + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if (x < kWidth / 2 && y < kHeight / 2) { + return 'any'; + } else { + return 0; + } + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('function_call'). +desc('Test discards happening in a function call'). +fn((t) => { + const code = ` +${kSharedCode} + +fn foo(pos : vec2f) { + let p = vec2i(pos); + if p.x <= ${kWidth} / 2 && p.y <= ${kHeight} / 2 { + discard; + } + if p.x >= ${kWidth} / 2 && p.y >= ${kHeight} / 2 { + discard; + } +} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + _ = uniformValues[0]; + foo(pos.xy); + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return idx; +} +`; + + // Only the upper right and bottom left quadrants are kept. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + const is_x = idx % 2 === 0; + if (value === 0.0) { + return is_x ? a[idx + 1] === 0 : a[idx - 1] === 0; + } + + let expect = is_x ? kWidth : kHeight; + expect = 0.5 * expect; + if (value < expect) { + return is_x ? a[idx + 1] > 0.5 * kWidth : a[idx - 1] > 0.5 * kHeight; + } else { + return is_x ? a[idx + 1] < 0.5 * kWidth : a[idx - 1] < 0.5 * kHeight; + } + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + if (idx < kWidth * kHeight / 2) { + return 'any'; + } else { + return 0; + } + } + }] + + } + ); + }; + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if (x >= kWidth / 2 && y >= kHeight / 2 || x <= kWidth / 2 && y <= kHeight / 2) { + return value === kWidth * kHeight; + } else { + return value < kWidth * kHeight / 2; + } + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if ( + x <= kWidth / 2 && y <= kHeight / 2 || + x >= kWidth / 2 && y >= kHeight / 2) + { + return kWidth * kHeight; + } + return 'any'; + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('loop'). +desc('Test discards in a loop'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + _ = uniformValues[0]; + for (var i = 0; i < 2; i++) { + if i > 0 { + discard; + } + } + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return 1; +} +`; + + // No storage writes occur. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === 0; + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + return 0; + } + }] + + } + ); + }; + + // No fragment outputs occur. + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === kWidth * kHeight; + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + return kWidth * kHeight; + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('continuing'). +desc('Test discards in a loop'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + _ = uniformValues[0]; + var i = 0; + loop { + continuing { + if i > 0 { + discard; + } + i++; + break if i >= 2; + } + } + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return 1; +} +`; + + // No storage writes occur. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === 0; + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + return 0; + } + }] + + } + ); + }; + + // No fragment outputs occur. + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === kWidth * kHeight; + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + return kWidth * kHeight; + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('uniform_read_loop'). +desc('Test that helpers read a uniform value in a loop'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + discard; + for (var i = 0u; i < uniformValues[0]; i++) { + } + let idx = atomicAdd(&atomicIndex, 1); + output[idx] = pos.xy; + return 1; +} +`; + + // No storage writes occur. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === 0; + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + return 0; + } + }] + + } + ); + }; + + // No fragment outputs occur. + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + return value === kWidth * kHeight; + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + return kWidth * kHeight; + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); + +g.test('derivatives'). +desc('Test that derivatives are correct in the presence of discard'). +fn((t) => { + const code = ` +${kSharedCode} + +@fragment +fn fsMain(@builtin(position) pos : vec4f) -> @location(0) u32 { + let ipos = vec2i(pos.xy); + let lsb = ipos & vec2(0x1); + let left_sel = select(2, 4, lsb.y == 1); + let right_sel = select(1, 3, lsb.y == 1); + let uidx = select(left_sel, right_sel, lsb.x == 1); + if ((lsb.x | lsb.y) & 0x1) == 0 { + discard; + } + + let v = uniformValues[uidx]; + let idx = atomicAdd(&atomicIndex, 1); + let dx = dpdx(f32(v)); + let dy = dpdy(f32(v)); + output[idx] = vec2(dx, dy); + return idx; +} +`; + + // One pixel per quad is discarded. The derivatives values are always the same +/- 3. + const dataChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + if (idx < 3 * (2 * kWidth * kHeight) / 4) { + return value === -3 || value === 3; + } else { + return value === 0; + } + }, + { + predicatePrinter: [ + { + leftHeader: 'data exp ==', + getValueForCell: (idx) => { + if (idx < 3 * (2 * kWidth * kHeight) / 4) { + return '+/- 3'; + } else { + return 0; + } + } + }] + + } + ); + }; + + // 3/4 of the fragments are written. + const fbChecker = (a) => { + return checkElementsPassPredicate( + a, + (idx, value) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if (((x | y) & 0x1) === 0) { + return value === kWidth * kHeight; + } else { + return value < 3 * (kWidth * kHeight) / 4; + } + }, + { + predicatePrinter: [ + { + leftHeader: 'fb exp ==', + getValueForCell: (idx) => { + const x = idx % kWidth; + const y = Math.floor(idx / kWidth); + if (((x | y) & 0x1) === 0) { + return kWidth * kHeight; + } else { + return 'any'; + } + } + }] + + } + ); + }; + + drawFullScreen(t, code, dataChecker, fbChecker); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/increment_decrement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/increment_decrement.spec.js index 9ed58742835..b3db47e2109 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/increment_decrement.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/statement/increment_decrement.spec.js @@ -22,7 +22,8 @@ export function runStatementTest( t, fmt, values, -wgsl_main) +wgsl_main, +extras = {}) { const wgsl = ` struct Outputs { @@ -37,6 +38,8 @@ fn push_output(value : ${fmt}) { count += 1; } +${extras.global_decl ?? ''} + @compute @workgroup_size(1) fn main() { _ = &outputs; @@ -53,7 +56,7 @@ fn main() { }); const maxOutputValues = 1000; - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: 4 * (1 + maxOutputValues), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -378,4 +381,68 @@ fn((t) => { push_output(a.exp); ` ); +}); + +g.test('single_eval_increment'). +desc('Tests the left-hand-side reference of an increment is computed only once.'). +fn((t) => { + runStatementTest( + t, + 'i32', + new Int32Array([999, 0, 1, 2, 11, 21, 31]), + ` + var a: array = array(10, 20, 30); + + push_output(999); + a[bump()]++; + a[bump()]++; + a[bump()]++; + push_output(a[0]); + push_output(a[1]); + push_output(a[2]); +`, + { + global_decl: ` + var index_counter: i32 = 0; + fn bump() -> i32 { + let result = index_counter; + push_output(result); + index_counter = index_counter + 1; + return result; + } + ` + } + ); +}); + +g.test('single_eval_decrement'). +desc('Tests the left-hand-side reference of a decrement is computed only once.'). +fn((t) => { + runStatementTest( + t, + 'i32', + new Int32Array([999, 0, 1, 2, 9, 19, 29]), + ` + var a: array = array(10, 20, 30); + + push_output(999); + a[bump()]--; + a[bump()]--; + a[bump()]--; + push_output(a[0]); + push_output(a[1]); + push_output(a[2]); +`, + { + global_decl: ` + var index_counter: i32 = 0; + fn bump() -> i32 { + let result = index_counter; + push_output(result); + index_counter = index_counter + 1; + return result; + } + ` + } + ); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/value_init.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/value_init.spec.js new file mode 100644 index 00000000000..b34cecef8fd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/value_init.spec.js @@ -0,0 +1,329 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Test that variables in the shader are value initialized`;import { makeTestGroup } from '../../../common/framework/test_group.js'; +import { GPUTest } from '../../gpu_test.js'; +import { Type } from '../../util/conversion.js'; + +export const g = makeTestGroup(GPUTest); + +function generateShader( +isF16, +addressSpace, +typeDecl, +testValue, +comparison) +{ + let moduleScope = ` + ${isF16 ? 'enable f16;' : ''} + struct Output { + failed : atomic + } + @group(0) @binding(0) var output : Output; + `; + + let functionScope = ''; + switch (addressSpace) { + case 'private': + moduleScope += `\nvar testVar: ${typeDecl} = ${testValue};`; + break; + case 'function': + functionScope += `\nvar testVar: ${typeDecl} = ${testValue};`; + break; + } + + return ` + ${moduleScope} + @compute @workgroup_size(1, 1, 1) + fn main() { + ${functionScope} + ${comparison} + } + `; +} + +async function run(t, wgsl) { + const pipeline = await t.device.createComputePipelineAsync({ + layout: 'auto', + compute: { + module: t.device.createShaderModule({ + code: wgsl + }), + entryPoint: 'main' + } + }); + + const resultBuffer = t.createBufferTracked({ + size: 4, + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC + }); + + const bindGroup = t.device.createBindGroup({ + layout: pipeline.getBindGroupLayout(0), + entries: [ + { + binding: 0, + resource: { + buffer: resultBuffer + } + }] + + }); + + const encoder = t.device.createCommandEncoder(); + const pass = encoder.beginComputePass(); + pass.setPipeline(pipeline); + pass.setBindGroup(0, bindGroup); + pass.dispatchWorkgroups(1); + pass.end(); + t.queue.submit([encoder.finish()]); + t.expectGPUBufferValuesEqual(resultBuffer, new Uint32Array([0])); +} + +g.test('scalars'). +desc(`Test that scalars in private, and function storage classes can be initialized to a value.`). +params((u) => +u. +combine('addressSpace', ['private', 'function']). +combine('type', ['bool', 'f32', 'f16', 'i32', 'u32']) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const typeDecl = t.params.type; + const testValue = Type[typeDecl].create(5).wgsl(); + + const comparison = `if (testVar != ${testValue}) { + atomicStore(&output.failed, 1u); + }`; + const wgsl = generateShader( + t.params.type === 'f16', + t.params.addressSpace, + typeDecl, + testValue, + comparison + ); + + await run(t, wgsl); +}); + +g.test('vec'). +desc(`Test that vectors in private, and function storage classes can be initialized to a value.`). +params((u) => +u. +combine('addressSpace', ['private', 'function']). +combine('type', ['bool', 'f32', 'f16', 'i32', 'u32']). +combine('count', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const typeDecl = `vec${t.params.count}<${t.params.type}>`; + const testValue = `${typeDecl}(${Type[t.params.type].create(5).wgsl()})`; + + const comparison = `if (!all(testVar == ${testValue})) { + atomicStore(&output.failed, 1u); + }`; + const wgsl = generateShader( + t.params.type === 'f16', + t.params.addressSpace, + typeDecl, + testValue, + comparison + ); + + await run(t, wgsl); +}); + +g.test('mat'). +desc( + `Test that matrices in private, and function storage classes can be initialized to a value.` +). +params((u) => +u. +combine('addressSpace', ['private', 'function']). +combine('type', ['f32', 'f16']). +beginSubcases(). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const typeDecl = `mat${t.params.c}x${t.params.r}<${t.params.type}>`; + const testScalarValue = Type[t.params.type].create(5).wgsl(); + + let testValue = `${typeDecl}(`; + for (let c = 0; c < t.params.c; c++) { + for (let r = 0; r < t.params.r; r++) { + testValue += `${testScalarValue},`; + } + } + testValue += ')'; + + const comparison = `for ( var i = 0; i < ${t.params.c}; i++) { + for (var k = 0; k < ${t.params.r}; k++) { + if (testVar[i][k] != ${testScalarValue}) { + atomicStore(&output.failed, 1u); + } + } + }`; + const wgsl = generateShader( + t.params.type === 'f16', + t.params.addressSpace, + typeDecl, + testValue, + comparison + ); + + await run(t, wgsl); +}); + +g.test('array'). +desc(`Test that arrays in private, and function storage classes can be initialized to a value.`). +params((u) => +u. +combine('addressSpace', ['private', 'function']). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const arraySize = 4; + const typeDecl = `array<${t.params.type}, ${arraySize}>`; + const testScalarValue = Type[t.params.type].create(5).wgsl(); + + let testValue = `${typeDecl}(`; + for (let i = 0; i < arraySize; i++) { + testValue += `${testScalarValue},`; + } + testValue += ')'; + + const comparison = `for ( var i = 0; i < ${arraySize}; i++) { + if (testVar[i] != ${testScalarValue}) { + atomicStore(&output.failed, 1u); + } + }`; + const wgsl = generateShader( + t.params.type === 'f16', + t.params.addressSpace, + typeDecl, + testValue, + comparison + ); + + await run(t, wgsl); +}); + +g.test('array,nested'). +desc(`Test that arrays in private, and function storage classes can be initialized to a value.`). +params((u) => +u. +combine('addressSpace', ['private', 'function']). +combine('type', ['bool', 'i32', 'u32', 'f32', 'f16']) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn(async (t) => { + const arraySize = 4; + + const innerDecl = `array<${t.params.type}, ${arraySize}>`; + const typeDecl = `array<${innerDecl}, ${arraySize}>`; + const testScalarValue = Type[t.params.type].create(5).wgsl(); + + let testValue = `${typeDecl}(`; + for (let i = 0; i < arraySize; i++) { + testValue += `${innerDecl}(`; + for (let j = 0; j < arraySize; j++) { + testValue += `${testScalarValue},`; + } + testValue += `),`; + } + testValue += ')'; + + const comparison = ` + for ( var i = 0; i < ${arraySize}; i++) { + for ( var k = 0; k < ${arraySize}; k++) { + if (testVar[i][k] != ${testScalarValue}) { + atomicStore(&output.failed, 1u); + } + } + } + `; + const wgsl = generateShader( + t.params.type === 'f16', + t.params.addressSpace, + typeDecl, + testValue, + comparison + ); + + await run(t, wgsl); +}); + +g.test('struct'). +desc(`Test that structs in private, and function storage classes can be initialized to a value.`). +params((u) => u.combine('addressSpace', ['private', 'function'])). +fn(async (t) => { + let moduleScope = ` + struct Output { + failed : atomic + } + @group(0) @binding(0) var output : Output; + + struct A { + a: i32, + b: f32, + } + + struct S { + c: f32, + d: A, + e: array, + } + `; + + const typeDecl = 'S'; + const testValue = 'S(5.f, A(5i, 5.f), array(5i, 5i))'; + + let functionScope = ''; + switch (t.params.addressSpace) { + case 'private': + moduleScope += `\nvar testVar: ${typeDecl} = ${testValue};`; + break; + case 'function': + functionScope += `\nvar testVar: ${typeDecl} = ${testValue};`; + break; + } + + const comparison = ` + if (testVar.c != 5f || testVar.d.a != 5i || testVar.d.b != 5.f || testVar.e[0] != 5i || testVar.e[1] != 5i) { + atomicStore(&output.failed, 1u); + } + `; + + const wgsl = ` + ${moduleScope} + @compute @workgroup_size(1, 1, 1) + fn main() { + ${functionScope} + ${comparison} + } + `; + + await run(t, wgsl); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/zero_init.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/zero_init.spec.js index c7b21d5699e..f29bf720d4a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/zero_init.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/execution/zero_init.spec.js @@ -107,6 +107,10 @@ expandWithParams(function* (p) { [true, false] : [false]) { for (const scalarType of supportedScalarTypes({ isAtomic, ...p })) { + // Fewer subcases: supportedScalarTypes was expanded to include f16 + // but that may take too much time. It would require more complex code. + if (scalarType === 'f16') continue; + // Fewer subcases: For nested types, skip atomic u32 and non-atomic i32. if (p._containerDepth > 0) { if (scalarType === 'u32' && isAtomic) continue; @@ -461,12 +465,10 @@ fn(async (t) => { new Uint32Array([...iterRange(wg_memory_limits / 4, (_i) => 0xdeadbeef)]), GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST ); - t.trackForCleanup(inputBuffer); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: wg_memory_limits, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(outputBuffer); const bg = t.device.createBindGroup({ layout: fillPipeline.getBindGroupLayout(0), @@ -505,17 +507,15 @@ fn(async (t) => { } }); - const resultBuffer = t.device.createBuffer({ + const resultBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); - t.trackForCleanup(resultBuffer); - const zeroBuffer = t.device.createBuffer({ + const zeroBuffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.UNIFORM }); - t.trackForCleanup(zeroBuffer); const bindGroup = t.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/types.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/types.js index 5810b8e9f1c..7855490eea9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/types.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/types.js @@ -2,19 +2,32 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { keysOf } from '../../common/util/data_tables.js';import { assert } from '../../common/util/util.js';import { align } from '../util/math.js'; -const kArrayLength = 3; +const kDefaultArrayLength = 3; // never is the same as "must not" -export const HostSharableTypes = ['i32', 'u32', 'f32']; +export const HostSharableTypes = ['i32', 'u32', 'f16', 'f32']; + +// The alignment and size of a host shareable type. +// See "Alignment and Size" in the WGSL spec. https://w3.org/TR/WGSL/#alignment-and-size +// Note this is independent of the address space that values of this type might appear in. +// See RequiredAlignOf(...) for the 16-byte granularity requirement when +// values of a type are placed in the uniform address space. + + + + + + /** Info for each plain scalar type. */ export const kScalarTypeInfo = { 'i32': { layout: { alignment: 4, size: 4 }, supportsAtomics: true, arrayLength: 1, innerLength: 0 }, 'u32': { layout: { alignment: 4, size: 4 }, supportsAtomics: true, arrayLength: 1, innerLength: 0 }, + 'f16': { layout: { alignment: 2, size: 2 }, supportsAtomics: false, arrayLength: 1, innerLength: 0, feature: 'shader-f16' }, 'f32': { layout: { alignment: 4, size: 4 }, supportsAtomics: false, arrayLength: 1, innerLength: 0 }, 'bool': { layout: undefined, supportsAtomics: false, arrayLength: 1, innerLength: 0 } }; @@ -24,29 +37,71 @@ export const kScalarTypes = keysOf(kScalarTypeInfo); /** Info for each vecN<> container type. */ export const kVectorContainerTypeInfo = { - 'vec2': { layout: { alignment: 8, size: 8 }, arrayLength: 2, innerLength: 0 }, - 'vec3': { layout: { alignment: 16, size: 12 }, arrayLength: 3, innerLength: 0 }, - 'vec4': { layout: { alignment: 16, size: 16 }, arrayLength: 4, innerLength: 0 } + 'vec2': { arrayLength: 2, innerLength: 0 }, + 'vec3': { arrayLength: 3, innerLength: 0 }, + 'vec4': { arrayLength: 4, innerLength: 0 } }; /** List of all vecN<> container types. */ export const kVectorContainerTypes = keysOf(kVectorContainerTypeInfo); +/** Returns the vector layout for a given vector container and base type, or undefined if that base type has no layout */ +function vectorLayout( +vectorContainer, +baseType) +{ + const n = kVectorContainerTypeInfo[vectorContainer].arrayLength; + const scalarLayout = kScalarTypeInfo[baseType].layout; + if (scalarLayout === undefined) { + return undefined; + } + if (n === 3) { + return { alignment: scalarLayout.alignment * 4, size: scalarLayout.size * 3 }; + } + return { alignment: scalarLayout.alignment * n, size: scalarLayout.size * n }; +} + /** Info for each matNxN<> container type. */ export const kMatrixContainerTypeInfo = { - 'mat2x2': { layout: { alignment: 8, size: 16 }, arrayLength: 2, innerLength: 2 }, - 'mat3x2': { layout: { alignment: 8, size: 24 }, arrayLength: 3, innerLength: 2 }, - 'mat4x2': { layout: { alignment: 8, size: 32 }, arrayLength: 4, innerLength: 2 }, - 'mat2x3': { layout: { alignment: 16, size: 32 }, arrayLength: 2, innerLength: 3 }, - 'mat3x3': { layout: { alignment: 16, size: 48 }, arrayLength: 3, innerLength: 3 }, - 'mat4x3': { layout: { alignment: 16, size: 64 }, arrayLength: 4, innerLength: 3 }, - 'mat2x4': { layout: { alignment: 16, size: 32 }, arrayLength: 2, innerLength: 4 }, - 'mat3x4': { layout: { alignment: 16, size: 48 }, arrayLength: 3, innerLength: 4 }, - 'mat4x4': { layout: { alignment: 16, size: 64 }, arrayLength: 4, innerLength: 4 } + 'mat2x2': { arrayLength: 2, innerLength: 2 }, + 'mat3x2': { arrayLength: 3, innerLength: 2 }, + 'mat4x2': { arrayLength: 4, innerLength: 2 }, + 'mat2x3': { arrayLength: 2, innerLength: 3 }, + 'mat3x3': { arrayLength: 3, innerLength: 3 }, + 'mat4x3': { arrayLength: 4, innerLength: 3 }, + 'mat2x4': { arrayLength: 2, innerLength: 4 }, + 'mat3x4': { arrayLength: 3, innerLength: 4 }, + 'mat4x4': { arrayLength: 4, innerLength: 4 } }; /** List of all matNxN<> container types. */ export const kMatrixContainerTypes = keysOf(kMatrixContainerTypeInfo); +export const kMatrixContainerTypeLayoutInfo = +{ + 'f16': { + 'mat2x2': { layout: { alignment: 4, size: 8 } }, + 'mat3x2': { layout: { alignment: 4, size: 12 } }, + 'mat4x2': { layout: { alignment: 4, size: 16 } }, + 'mat2x3': { layout: { alignment: 8, size: 16 } }, + 'mat3x3': { layout: { alignment: 8, size: 24 } }, + 'mat4x3': { layout: { alignment: 8, size: 32 } }, + 'mat2x4': { layout: { alignment: 8, size: 16 } }, + 'mat3x4': { layout: { alignment: 8, size: 24 } }, + 'mat4x4': { layout: { alignment: 8, size: 32 } } + }, + 'f32': { + 'mat2x2': { layout: { alignment: 8, size: 16 } }, + 'mat3x2': { layout: { alignment: 8, size: 24 } }, + 'mat4x2': { layout: { alignment: 8, size: 32 } }, + 'mat2x3': { layout: { alignment: 16, size: 32 } }, + 'mat3x3': { layout: { alignment: 16, size: 48 } }, + 'mat4x3': { layout: { alignment: 16, size: 64 } }, + 'mat2x4': { layout: { alignment: 16, size: 32 } }, + 'mat3x4': { layout: { alignment: 16, size: 48 } }, + 'mat4x4': { layout: { alignment: 16, size: 64 } } + } +}; + @@ -140,7 +195,7 @@ export const TexelFormats = [ { format: 'rg32uint', _shaderType: 'u32' }, { format: 'rg32sint', _shaderType: 'i32' }, { format: 'rg32float', _shaderType: 'f32' }, -{ format: 'rgba32uint', _shaderType: 'i32' }, +{ format: 'rgba32uint', _shaderType: 'u32' }, { format: 'rgba32sint', _shaderType: 'i32' }, { format: 'rgba32float', _shaderType: 'f32' }]; @@ -161,10 +216,39 @@ export function* generateTypes({ -}) { +}) + + + + + + + + + + + + + + + + + + + + + + + + +{ const scalarInfo = kScalarTypeInfo[baseType]; if (isAtomic) { assert(scalarInfo.supportsAtomics, 'type does not support atomics'); + assert( + containerType === 'scalar' || containerType === 'array', + "can only generate atomic inner types with containerType 'scalar' or 'array'" + ); } const scalarType = isAtomic ? `atomic<${baseType}>` : baseType; @@ -189,21 +273,29 @@ export function* generateTypes({ for (const vectorType of kVectorContainerTypes) { yield { type: `${vectorType}<${scalarType}>`, - _kTypeInfo: { elementBaseType: baseType, ...kVectorContainerTypeInfo[vectorType] } + _kTypeInfo: { + elementBaseType: baseType, + ...kVectorContainerTypeInfo[vectorType], + layout: vectorLayout(vectorType, scalarType), + supportsAtomics: false + } }; } } if (containerType === 'matrix') { - // Matrices can only be f32. - if (baseType === 'f32') { + // Matrices can only be f16 or f32. + if (baseType === 'f16' || baseType === 'f32') { for (const matrixType of kMatrixContainerTypes) { - const matrixInfo = kMatrixContainerTypeInfo[matrixType]; + const matrixDimInfo = kMatrixContainerTypeInfo[matrixType]; + const matrixLayoutInfo = kMatrixContainerTypeLayoutInfo[baseType][matrixType]; yield { type: `${matrixType}<${scalarType}>`, _kTypeInfo: { - elementBaseType: `vec${matrixInfo.innerLength}<${scalarType}>`, - ...matrixInfo + elementBaseType: `vec${matrixDimInfo.innerLength}<${scalarType}>`, + ...matrixDimInfo, + ...matrixLayoutInfo, + supportsAtomics: false } }; } @@ -212,37 +304,53 @@ export function* generateTypes({ // Array types if (containerType === 'array') { + let arrayElemType = scalarType; + let arrayElementCount = kDefaultArrayLength; + let supportsAtomics = scalarInfo.supportsAtomics; + let layout = undefined; + if (scalarInfo.layout) { + // Compute the layout of the array type. + // Adjust the array element count or element type as needed. + if (addressSpace === 'uniform') { + // Use a vec4 of the scalar type, to achieve a 16 byte alignment without internal padding. + // This works for 4-byte scalar types, and does not work for f16. + // It is the caller's responsibility to filter out the f16 case. + assert(!isAtomic, 'the uniform case is making vec4 of scalar, which cannot handle atomics'); + arrayElemType = `vec4<${baseType}>`; + supportsAtomics = false; + const arrayElemLayout = vectorLayout('vec4', baseType); + // assert(arrayElemLayout.alignment % 16 === 0); // Callers responsibility to avoid + arrayElementCount = align(arrayElementCount, 4) / 4; + const arrayByteSize = arrayElementCount * arrayElemLayout.size; + layout = { alignment: arrayElemLayout.alignment, size: arrayByteSize }; + } else { + // The ordinary case. Use scalarType as the element type. + const stride = arrayStride(scalarInfo.layout); + let arrayByteSize = arrayElementCount * stride; + if (addressSpace === 'storage') { + // The buffer effective binding size must be a multiple of 4. + // Adjust the array element count as needed. + while (arrayByteSize % 4 > 0) { + arrayElementCount++; + arrayByteSize = arrayElementCount * stride; + } + } + layout = { alignment: scalarInfo.layout.alignment, size: arrayByteSize }; + } + } + const arrayTypeInfo = { elementBaseType: `${baseType}`, - arrayLength: kArrayLength, - layout: scalarInfo.layout ? - { - alignment: scalarInfo.layout.alignment, - size: - addressSpace === 'uniform' ? - // Uniform storage class must have array elements aligned to 16. - kArrayLength * - arrayStride({ - ...scalarInfo.layout, - alignment: 16 - }) : - kArrayLength * arrayStride(scalarInfo.layout) - } : - undefined + arrayLength: arrayElementCount, + layout, + supportsAtomics }; // Sized - if (addressSpace === 'uniform') { - yield { - type: `array,${kArrayLength}>`, - _kTypeInfo: arrayTypeInfo - }; - } else { - yield { type: `array<${scalarType},${kArrayLength}>`, _kTypeInfo: arrayTypeInfo }; - } + yield { type: `array<${arrayElemType},${arrayElementCount}>`, _kTypeInfo: arrayTypeInfo }; // Unsized if (addressSpace === 'storage') { - yield { type: `array<${scalarType}>`, _kTypeInfo: arrayTypeInfo }; + yield { type: `array<${arrayElemType}>`, _kTypeInfo: arrayTypeInfo }; } } @@ -272,7 +380,7 @@ export function supportsAtomics(p) } -/** Generates an iterator of supported base types (i32/u32/f32/bool) */ +/** Generates an iterator of supported base types (i32/u32/f16/f32/bool) */ export function* supportedScalarTypes(p) { for (const scalarType of kScalarTypes) { const info = kScalarTypeInfo[scalarType]; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/const.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/const.spec.js index 2ab34e65bf5..700a680f34f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/const.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/const.spec.js @@ -3,6 +3,7 @@ **/export const description = ` Validation tests for const declarations `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); @@ -58,4 +59,245 @@ const a = 4; const b = S(4).a; `; t.expectCompileResult(t.params.target === 'a', wgsl); +}); + +const kTypeCases = { + bool: { + code: `const x : bool = true;`, + valid: true + }, + i32: { + code: `const x : i32 = 1i;`, + valid: true + }, + u32: { + code: `const x : u32 = 1u;`, + valid: true + }, + f32: { + code: `const x : f32 = 1f;`, + valid: true + }, + f16: { + code: `enable f16;\nconst x : f16 = 1h;`, + valid: true + }, + abstract_int: { + code: ` + const x = 0xffffffffff; + const_assert x == 0xffffffffff;`, + valid: true + }, + abstract_float: { + code: ` + const x = 3937509.87755102; + const_assert x != 3937510.0; + const_assert x != 3937509.75;`, + valid: true + }, + vec2i: { + code: `const x : vec2i = vec2i();`, + valid: true + }, + vec3u: { + code: `const x : vec3u = vec3u();`, + valid: true + }, + vec4f: { + code: `const x : vec4f = vec4f();`, + valid: true + }, + mat2x2: { + code: `const x : mat2x2f = mat2x2f();`, + valid: true + }, + mat4x3f: { + code: `const x : mat4x3 = mat4x3();`, + valid: true + }, + array_sized: { + code: `const x : array = array(1,2,3,4);`, + valid: true + }, + array_runtime: { + code: `const x : array = array(1,2,3);`, + valid: false + }, + struct: { + code: `struct S { x : u32 }\nconst x : S = S(0);`, + valid: true + }, + atomic: { + code: `const x : atomic = 0;`, + valid: false + }, + vec_abstract_int: { + code: ` + const x = vec2(0xffffffffff,0xfffffffff0); + const_assert x.x == 0xffffffffff; + const_assert x.y == 0xfffffffff0;`, + valid: true + }, + array_abstract_int: { + code: ` + const x = array(0xffffffffff,0xfffffffff0); + const_assert x[0] == 0xffffffffff; + const_assert x[1] == 0xfffffffff0;`, + valid: true + } +}; + +g.test('type'). +desc('Test const types'). +params((u) => u.combine('case', keysOf(kTypeCases))). +beforeAllSubcases((t) => { + if (t.params.case === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kTypeCases[t.params.case]; + const code = testcase.code; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +const kInitCases = { + no_init: { + code: `const x : u32;`, + valid: false + }, + no_type: { + code: `const x = 0;`, + valid: true + }, + no_init_no_type: { + code: `const x;`, + valid: false + }, + init_matching_type: { + code: `const x : i32 = 1i;`, + valid: true + }, + init_mismatch_type: { + code: `const x : u32 = 1i;`, + valid: false + }, + abs_int_init_convert: { + code: `const x : u32 = 1;`, + valid: true + }, + abs_float_init_convert: { + code: `const x : f32 = 1.0;`, + valid: true + }, + init_const_expr: { + code: `const x = 0;\nconst y = x + 2;`, + valid: true + }, + init_override_expr: { + code: `override x : u32;\nconst y = x * 2;`, + valid: false + }, + init_runtime_expr: { + code: `var x = 1i;\nconst y = x - 1;`, + valid: false + }, + init_func: { + code: `const x = max(1,2);`, + valid: true + }, + init_non_const_func: { + code: `const x = foo(1); + fn foo(p : i32) -> i32 { return p; }`, + valid: false + } +}; + +g.test('initializer'). +desc('Test const initializers'). +params((u) => u.combine('case', keysOf(kInitCases))). +fn((t) => { + const testcase = kInitCases[t.params.case]; + const code = testcase.code; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +g.test('function_scope'). +desc('Test that const declarations are allowed in functions'). +fn((t) => { + const code = `fn foo() { const x = 0; }`; + t.expectCompileResult(true, code); +}); + +g.test('immutable'). +desc('Test that const declarations are immutable'). +fn((t) => { + const code = ` + const x = 0; + fn foo() { + x = 1; + }`; + t.expectCompileResult(false, code); +}); + +g.test('assert'). +desc('Test value can be checked by a const_assert'). +fn((t) => { + const code = ` + const x = 0; + const_assert x == 0;`; + t.expectCompileResult(true, code); +}); + +g.test('placement'). +desc('Tests @const is not allowed to appear'). +params((u) => +u.combine('scope', [ +'private-var', +'storage-var', +'struct-member', +'fn-decl', +'fn-param', +'fn-var', +'fn-return', +'while-stmt', +undefined] +) +). +fn((t) => { + const scope = t.params.scope; + + const attr = '@const'; + const code = ` + ${scope === 'private-var' ? attr : ''} + var priv_var : i32; + + ${scope === 'storage-var' ? attr : ''} + @group(0) @binding(0) + var stor_var : i32; + + struct A { + ${scope === 'struct-member' ? attr : ''} + a : i32, + } + + @vertex + ${scope === 'fn-decl' ? attr : ''} + fn f( + ${scope === 'fn-param' ? attr : ''} + @location(0) b : i32, + ) -> ${scope === 'fn-return' ? attr : ''} @builtin(position) vec4f { + ${scope === 'fn-var' ? attr : ''} + var func_v : i32; + + ${scope === 'while-stmt' ? attr : ''} + while false {} + + return vec4(1, 1, 1, 1); + } + `; + + t.expectCompileResult(scope === undefined, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/context_dependent_resolution.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/context_dependent_resolution.spec.js new file mode 100644 index 00000000000..af2a3f172bc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/context_dependent_resolution.spec.js @@ -0,0 +1,393 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Tests that context dependent names do not participate in name resolution. +That is, a declaration named the same as a context dependent name will not interfere. + +Context-dependent names: + * Attribute names + * Built-in value names + * Diagnostic severity control + * Diagnostic triggering rules + * Enable extensions + * Language extensions + * Swizzles + * Interpolation type + * Interpolation sampling +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kAttributeCases = { + align: `struct S { @align(16) x : u32 }`, + binding: `@group(0) @binding(0) var s : sampler;`, + builtin: `@vertex fn main() -> @builtin(position) vec4f { return vec4f(); }`, + // const is not writable + // diagnostic is a keyword + group: `@group(0) @binding(0) var s : sampler;`, + id: `@id(1) override x : i32;`, + interpolate: `@fragment fn main(@location(0) @interpolate(flat, either) x : i32) { }`, + invariant: `@fragment fn main(@builtin(position) @invariant pos : vec4f) { }`, + location: `@fragment fn main(@location(0) x : f32) { }`, + must_use: `@must_use fn foo() -> u32 { return 0; }`, + size: `struct S { @size(4) x : u32 }`, + workgroup_size: `@compute @workgroup_size(1) fn main() { }`, + compute: `@compute @workgroup_size(1) fn main() { }`, + fragment: `@fragment fn main() { }`, + vertex: `@vertex fn main() -> @builtin(position) vec4f { return vec4f(); }` +}; + +g.test('attribute_names'). +desc('Tests attribute names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kAttributeCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +fn((t) => { + const code = ` + ${t.params.decl} ${t.params.case} : u32 = 0; + ${kAttributeCases[t.params.case]} + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kBuiltinCases = { + vertex_index: ` + @vertex + fn main(@builtin(vertex_index) idx : u32) -> @builtin(position) vec4f + { return vec4f(); }`, + instance_index: ` + @vertex + fn main(@builtin(instance_index) idx : u32) -> @builtin(position) vec4f + { return vec4f(); }`, + position_vertex: ` + @vertex fn main() -> @builtin(position) vec4f + { return vec4f(); }`, + position_fragment: `@fragment fn main(@builtin(position) pos : vec4f) { }`, + front_facing: `@fragment fn main(@builtin(front_facing) x : bool) { }`, + frag_depth: `@fragment fn main() -> @builtin(frag_depth) f32 { return 0; }`, + sample_index: `@fragment fn main(@builtin(sample_index) x : u32) { }`, + sample_mask_input: `@fragment fn main(@builtin(sample_mask) x : u32) { }`, + sample_mask_output: `@fragment fn main() -> @builtin(sample_mask) u32 { return 0; }`, + local_invocation_id: ` + @compute @workgroup_size(1) + fn main(@builtin(local_invocation_id) id : vec3u) { }`, + local_invocation_index: ` + @compute @workgroup_size(1) + fn main(@builtin(local_invocation_index) id : u32) { }`, + global_invocation_id: ` + @compute @workgroup_size(1) + fn main(@builtin(global_invocation_id) id : vec3u) { }`, + workgroup_id: ` + @compute @workgroup_size(1) + fn main(@builtin(workgroup_id) id : vec3u) { }`, + num_workgroups: ` + @compute @workgroup_size(1) + fn main(@builtin(num_workgroups) id : vec3u) { }` +}; + +g.test('builtin_value_names'). +desc('Tests builtin value names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kBuiltinCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +beforeAllSubcases((t) => { + const wgsl = kBuiltinCases[t.params.case]; + t.skipIf( + t.isCompatibility && wgsl.includes('sample_mask'), + 'sample_mask is not supported in compatibility mode' + ); + t.skipIf( + t.isCompatibility && wgsl.includes('sample_index'), + 'sample_index is not supported in compatibility mode' + ); +}). +fn((t) => { + const code = ` + ${t.params.decl} ${t.params.case} : u32 = 0; + ${kBuiltinCases[t.params.case]} + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kDiagnosticSeverityCases = { + error: ` + diagnostic(error, derivative_uniformity); + @diagnostic(error, derivative_uniformity) fn foo() { } + `, + warning: ` + diagnostic(warning, derivative_uniformity); + @diagnostic(warning, derivative_uniformity) fn foo() { } + `, + off: ` + diagnostic(off, derivative_uniformity); + @diagnostic(off, derivative_uniformity) fn foo() { } + `, + info: ` + diagnostic(info, derivative_uniformity); + @diagnostic(info, derivative_uniformity) fn foo() { } + ` +}; + +g.test('diagnostic_severity_names'). +desc('Tests diagnostic severity names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kDiagnosticSeverityCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +fn((t) => { + const code = ` + ${kDiagnosticSeverityCases[t.params.case]} + ${t.params.decl} ${t.params.case} : u32 = 0; + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kDiagnosticRuleCases = { + derivative_uniformity: ` + diagnostic(off, derivative_uniformity); + @diagnostic(warning, derivative_uniformity) fn foo() { }`, + unknown_rule: ` + diagnostic(off, unknown_rule); + @diagnostic(warning, unknown_rule) fn foo() { }`, + unknown: ` + diagnostic(off, unknown.rule); + @diagnostic(warning, unknown.rule) fn foo() { }`, + rule: ` + diagnostic(off, unknown.rule); + @diagnostic(warning, unknown.rule) fn foo() { }` +}; + +g.test('diagnostic_rule_names'). +desc('Tests diagnostic rule names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kDiagnosticRuleCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +fn((t) => { + const code = ` + ${kDiagnosticRuleCases[t.params.case]} + ${t.params.decl} ${t.params.case} : u32 = 0; + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kEnableCases = { + f16: `enable f16;` +}; + +g.test('enable_names'). +desc('Tests enable extension names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kEnableCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + const code = ` + ${kEnableCases[t.params.case]} + ${t.params.decl} ${t.params.case} : u32 = 0; + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kLanguageCases = { + readonly_and_readwrite_storage_textures: `requires readonly_and_readwrite_storage_textures;`, + packed_4x8_integer_dot_product: `requires packed_4x8_integer_dot_product;`, + unrestricted_pointer_parameters: `requires unrestricted_pointer_parameters;`, + pointer_composite_access: `requires pointer_composite_access;` +}; + +g.test('language_names'). +desc('Tests language extension names do not use name resolution'). +params((u) => +u. +combine('case', keysOf(kLanguageCases)). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +fn((t) => { + t.skipIf(!t.hasLanguageFeature(t.params.case), 'Missing language feature'); + const code = ` + ${kLanguageCases[t.params.case]} + ${t.params.decl} ${t.params.case} : u32 = 0; + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kSwizzleCases = [ +'x', +'y', +'z', +'w', +'xy', +'yxz', +'wxyz', +'xyxy', +'r', +'g', +'b', +'a', +'rgb', +'arr', +'bgra', +'agra']; + + +g.test('swizzle_names'). +desc('Tests swizzle names do not use name resolution'). +params((u) => +u. +combine('case', kSwizzleCases). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +fn((t) => { + let code = `${t.params.decl} ${t.params.case} : u32 = 0;\n`; + if (t.params.case.length === 1) { + for (let i = 2; i <= 4; i++) { + code += `${t.params.decl} ${t.params.case.padEnd(i, t.params.case[0])} : u32 = 0;\n`; + } + } + code += `fn foo() { + var x : vec4f; + _ = x.${t.params.case}; + `; + if (t.params.case.length === 1) { + for (let i = 2; i <= 4; i++) { + code += `_ = x.${t.params.case.padEnd(i, t.params.case[0])};\n`; + } + } + code += `} + fn use_var() -> u32 { + return ${t.params.case}; + }`; + t.expectCompileResult(true, code); +}); + +const kInterpolationTypeCases = ['perspective', 'linear', 'flat']; + +g.test('interpolation_type_names'). +desc('Tests interpolation type names do not use name resolution'). +params((u) => +u. +combine('case', kInterpolationTypeCases). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && t.params.case === 'linear', + 'compatibility mode does not support linear interpolation type' + ); +}). +fn((t) => { + const attr = + t.isCompatibility && t.params.case === 'flat' ? + `@interpolate(flat, either)` : + `@interpolate(${t.params.case})`; + const code = ` + ${t.params.decl} ${t.params.case} : u32 = 0; + @fragment fn main(@location(0) ${attr} x : f32) { } + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kInterpolationSamplingCases = ['center', 'centroid', 'sample']; + +g.test('interpolation_sampling_names'). +desc('Tests interpolation type names do not use name resolution'). +params((u) => +u. +combine('case', kInterpolationSamplingCases). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && t.params.case === 'sample', + 'compatibility mode does not support sample sampling' + ); +}). +fn((t) => { + const code = ` + ${t.params.decl} ${t.params.case} : u32 = 0; + @fragment fn main(@location(0) @interpolate(perspective, ${t.params.case}) x : f32) { } + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); + +const kInterpolationFlatCases = ['first', 'either']; + +g.test('interpolation_flat_names'). +desc('Tests interpolation type names do not use name resolution'). +params((u) => +u. +combine('case', kInterpolationFlatCases). +beginSubcases(). +combine('decl', ['override', 'const', 'var']) +). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && t.params.case === 'first', + 'compatibility mode does not support first sampling' + ); +}). +fn((t) => { + const code = ` + ${t.params.decl} ${t.params.case} : u32 = 0; + @fragment fn main(@location(0) @interpolate(flat, ${t.params.case}) x : u32) { } + fn use_var() -> u32 { + return ${t.params.case}; + } + `; + + t.expectCompileResult(true, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/let.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/let.spec.js new file mode 100644 index 00000000000..cfed50a2c90 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/let.spec.js @@ -0,0 +1,236 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for let declarations +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + +const kTypeCases = { + bool: { + code: `let x : bool = true;`, + valid: true + }, + i32: { + code: `let x : i32 = 1i;`, + valid: true + }, + u32: { + code: `let x : u32 = 1u;`, + valid: true + }, + f32: { + code: `let x : f32 = 1f;`, + valid: true + }, + f16: { + code: `let x : f16 = 1h;`, + valid: true + }, + vec2i: { + code: `let x : vec2i = vec2i();`, + valid: true + }, + vec3u: { + code: `let x : vec3u = vec3u();`, + valid: true + }, + vec4f: { + code: `let x : vec4f = vec4f();`, + valid: true + }, + mat2x2: { + code: `let x : mat2x2f = mat2x2f();`, + valid: true + }, + mat4x3f: { + code: `let x : mat4x3 = mat4x3();`, + valid: true + }, + array_sized: { + code: `let x : array = array(1,2,3,4);`, + valid: true + }, + array_runtime: { + code: `let x : array = array(1,2,3);`, + valid: false + }, + struct: { + code: `let x : S = S(0);`, + valid: true, + decls: `struct S { x : u32 }` + }, + atomic: { + code: `let x : atomic = 0;`, + valid: false + }, + ptr_function: { + code: ` + var x : i32; + let y : ptr = &x;`, + valid: true + }, + ptr_storage: { + code: `let y : ptr = &x[0];`, + valid: true, + decls: `@group(0) @binding(0) var x : array;` + }, + load_rule: { + code: ` + var x : i32 = 1; + let y : i32 = x;`, + valid: true + } +}; + +g.test('type'). +desc('Test let types'). +params((u) => u.combine('case', keysOf(kTypeCases))). +beforeAllSubcases((t) => { + if (t.params.case === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kTypeCases[t.params.case]; + const code = ` +${t.params.case === 'f16' ? 'enable f16;' : ''} +${testcase.decls ?? ''} +fn foo() { + ${testcase.code} +}`; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +const kInitCases = { + no_init: { + code: `let x : u32;`, + valid: false + }, + no_type: { + code: `let x = 1;`, + valid: true + }, + init_matching_type: { + code: `let x : u32 = 1u;`, + valid: true + }, + init_mismatch_type: { + code: `let x : u32 = 1i;`, + valid: false + }, + ptr_type_mismatch: { + code: `var x : i32;\nlet y : ptr = &x;`, + valid: false + }, + ptr_access_mismatch: { + code: `let y : ptr = &x;`, + valid: false, + decls: `@group(0) @binding(0) var x : u32;` + }, + ptr_addrspace_mismatch: { + code: `let y = ptr = &x;`, + valid: false, + decls: `@group(0) @binding(0) var x : u32;` + }, + init_const_expr: { + code: `let y = x * 2;`, + valid: true, + decls: `const x = 1;` + }, + init_override_expr: { + code: `let y = x + 1;`, + valid: true, + decls: `override x = 1;` + }, + init_runtime_expr: { + code: `var x = 1;\nlet y = x << 1;`, + valid: true + } +}; + +g.test('initializer'). +desc('Test let initializers'). +params((u) => u.combine('case', keysOf(kInitCases))). +fn((t) => { + const testcase = kInitCases[t.params.case]; + const code = ` +${testcase.decls ?? ''} +fn foo() { + ${testcase.code} +}`; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +g.test('module_scope'). +desc('Test that let declarations are disallowed module scope'). +fn((t) => { + const code = `let x = 0;`; + t.expectCompileResult(false, code); +}); + +const kTestTypes = [ +'f32', +'i32', +'u32', +'bool', +'vec2', +'vec2', +'vec2', +'vec2', +'vec3', +'vec3', +'vec3', +'vec3', +'vec4', +'vec4', +'vec4', +'vec4', +'mat2x2', +'mat2x3', +'mat2x4', +'mat3x2', +'mat3x3', +'mat3x4', +'mat4x2', +'mat4x3', +'mat4x4', +// [1]: 12 is a random number here. find a solution to replace it. +'array', +'array', +'array', +'array']; + + +g.test('initializer_type'). +desc( + ` + If present, the initializer's type must match the store type of the variable. + Testing scalars, vectors, and matrices of every dimension and type. + TODO: add test for: structs - arrays of vectors and matrices - arrays of different length +` +). +params((u) => u.beginSubcases().combine('lhsType', kTestTypes).combine('rhsType', kTestTypes)). +fn((t) => { + const { lhsType, rhsType } = t.params; + + const code = ` + @fragment + fn main() { + let a : ${lhsType} = ${rhsType}(); + } + `; + + const expectation = lhsType === rhsType; + t.expectCompileResult(expectation, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/override.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/override.spec.js index 561527a6225..abd02be5a9c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/override.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/override.spec.js @@ -3,6 +3,7 @@ **/export const description = ` Validation tests for override declarations `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); @@ -28,4 +29,199 @@ override b : i32 = c; override c : i32 = ${t.params.target}; `; t.expectCompileResult(t.params.target === 'a', wgsl); +}); + +const kIdCases = { + min: { + code: `@id(0) override x = 1;`, + valid: true + }, + max: { + code: `@id(65535) override x = 1;`, + valid: true + }, + neg: { + code: `@id(-1) override x = 1;`, + valid: false + }, + too_large: { + code: `@id(65536) override x = 1;`, + valid: false + }, + duplicate: { + code: ` + @id(1) override x = 1; + @id(1) override y = 1;`, + valid: false + } +}; + +g.test('id'). +desc('Test id attributes'). +params((u) => u.combine('case', keysOf(kIdCases))). +fn((t) => { + const testcase = kIdCases[t.params.case]; + const code = testcase.code; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +const kTypeCases = { + bool: { + code: `override x : bool;`, + valid: true + }, + i32: { + code: `override x : i32;`, + valid: true + }, + u32: { + code: `override x : u32;`, + valid: true + }, + f32: { + code: `override x : f32;`, + valid: true + }, + f16: { + code: `enable f16;\noverride x : f16;`, + valid: true + }, + abs_int_conversion: { + code: `override x = 1;`, + valid: true + }, + abs_float_conversion: { + code: `override x = 1.0;`, + valid: true + }, + vec2_bool: { + code: `override x : vec2;`, + valid: false + }, + vec2i: { + code: `override x : vec2i;`, + valid: false + }, + vec3u: { + code: `override x : vec3u;`, + valid: false + }, + vec4f: { + code: `override x : vec4f;`, + valid: false + }, + mat2x2f: { + code: `override x : mat2x2f;`, + valid: false + }, + matrix: { + code: `override x : mat4x3;`, + valid: false + }, + array: { + code: `override x : array;`, + valid: false + }, + struct: { + code: `struct S { x : u32 }\noverride x : S;`, + valid: false + }, + atomic: { + code: `override x : atomic;`, + valid: false + } +}; + +g.test('type'). +desc('Test override types'). +params((u) => u.combine('case', keysOf(kTypeCases))). +beforeAllSubcases((t) => { + if (t.params.case === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kTypeCases[t.params.case]; + const code = testcase.code; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +const kInitCases = { + no_init_no_type: { + code: `override x;`, + valid: false + }, + no_init: { + code: `override x : u32;`, + valid: true + }, + no_type: { + code: `override x = 1;`, + valid: true + }, + init_matching_type: { + code: `override x : u32 = 1u;`, + valid: true + }, + init_mismatch_type: { + code: `override x : u32 = 1i;`, + valid: false + }, + init_mismatch_vector: { + code: `override x : u32 = vec2i();`, + valid: false + }, + abs_int_init_convert: { + code: `override x : f32 = 1;`, + valid: true + }, + abs_float_init_convert: { + code: `override x : f32 = 1.0;`, + valid: true + }, + init_const_expr: { + code: `const x = 1;\noverride y = 2 * x;`, + valid: true + }, + init_override_expr: { + code: `override x = 1;\noverride y = x + 2;`, + valid: true + }, + init_runtime_expr: { + code: `var x = 2;\noverride y = x;`, + valid: false + }, + const_func_init: { + code: `override x = max(1, 2);`, + valid: true + }, + non_const_func_init: { + code: `override x = foo(1); + fn foo(p : i32) -> i32 { return p; }`, + valid: false + }, + mix_order_init: { + code: `override x = y; + override y : i32;`, + valid: true + } +}; + +g.test('initializer'). +desc('Test override initializers'). +params((u) => u.combine('case', keysOf(kInitCases))). +fn((t) => { + const testcase = kInitCases[t.params.case]; + const code = testcase.code; + const expect = testcase.valid; + t.expectCompileResult(expect, code); +}); + +g.test('function_scope'). +desc('Test that override declarations are disallowed in functions'). +fn((t) => { + const code = `fn foo() { override x : u32; }`; + t.expectCompileResult(false, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var.spec.js index ff4f705d878..82bd326d057 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var.spec.js @@ -4,8 +4,18 @@ Validation tests for host-shareable types. `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { keysOf } from '../../../../common/util/data_tables.js'; +import { kAccessModeInfo, kAddressSpaceInfo } from '../../types.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; +import { + explicitSpaceExpander, + getVarDeclShader, + accessModeExpander, + supportsRead, + supportsWrite } from + +'./util.js'; + export const g = makeTestGroup(ShaderValidationTest); // The set of types and their properties. @@ -526,4 +536,326 @@ fn((t) => { }`; t.expectCompileResult(true, wgsl); +}); + +g.test('address_space_access_mode'). +desc('Test that only storage accepts an access mode'). +params((u) => +u. +combine('address_space', ['private', 'storage', 'uniform', 'function', 'workgroup']). +combine('access_mode', ['', 'read', 'write', 'read_write']). +combine('trailing_comma', [true, false]) +). +fn((t) => { + let fdecl = ``; + let mdecl = ``; + // Most address spaces do not accept an access mode, but should accept no + // template argument or a trailing comma. + let shouldPass = t.params.access_mode === ''; + let suffix = ``; + if (t.params.access_mode === '') { + suffix += t.params.trailing_comma ? ',' : ''; + } else { + suffix += `,${t.params.access_mode}`; + suffix += t.params.trailing_comma ? ',' : ''; + } + // 'handle' unchecked since it is untypable. + switch (t.params.address_space) { + case 'private': + mdecl = `var x : u32;`; + break; + case 'storage': + mdecl = `@group(0) @binding(0) var x : u32;`; + shouldPass = t.params.access_mode !== 'write'; + break; + case 'uniform': + mdecl = `@group(0) @binding(0) var x : u32;`; + break; + case 'workgroup': + mdecl = `var x : u32;`; + break; + case 'function': + fdecl = `var x : u32;`; + break; + } + const code = `${mdecl} + fn foo() { + ${fdecl} + }`; + t.expectCompileResult(shouldPass, code); +}); + +// Address spaces that can hold an i32 variable. +const kNonHandleAddressSpaces = keysOf(kAddressSpaceInfo).filter( + (as) => as !== 'handle' +); + +g.test('explicit_access_mode'). +desc('Validate uses of an explicit access mode on a var declaration'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params( + (u) => + u. + combine('addressSpace', kNonHandleAddressSpaces). + combine('explicitSpace', [true, false]) + // Only keep cases where: + // *if* the address space must be specified on a var decl (e.g. var) + // then the address space will actually be specified in this test case. + .filter((t) => kAddressSpaceInfo[t.addressSpace].spell !== 'must' || t.explicitSpace). + combine('explicitAccess', [true]). + combine('accessMode', keysOf(kAccessModeInfo)). + combine('stage', ['compute']) // Only need to check compute shaders +). +fn((t) => { + const prog = getVarDeclShader(t.params); + const info = kAddressSpaceInfo[t.params.addressSpace]; + + const ok = + // The address space must be explicitly specified. + t.params.explicitSpace && + // The address space must allow an access mode to be spelled, and the + // access mode must be in the list of modes for the address space. + info.spellAccessMode !== 'never' && + info.accessModes.includes(t.params.accessMode); + + t.expectCompileResult(ok, prog); +}); + +g.test('implicit_access_mode'). +desc('Validate an implicit access mode on a var declaration'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params( + (u) => + u. + combine('addressSpace', kNonHandleAddressSpaces). + expand('explicitSpace', explicitSpaceExpander). + combine('explicitAccess', [false]). + combine('accessMode', ['']). + combine('stage', ['compute']) // Only need to check compute shaders +). +fn((t) => { + const prog = getVarDeclShader(t.params); + + // 7.3 var Declarations + // "The access mode always has a default value,.." + const ok = true; + + t.expectCompileResult(ok, prog); +}); + +g.test('read_access'). +desc('A variable can be read from when the access mode permits'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params( + (u) => + u. + combine('addressSpace', kNonHandleAddressSpaces). + expand('explicitSpace', explicitSpaceExpander). + combine('explicitAccess', [false, true]). + expand('accessMode', accessModeExpander). + combine('stage', ['compute']) // Only need to check compute shaders +). +fn((t) => { + const prog = getVarDeclShader(t.params, 'let copy = x;'); + const ok = supportsRead(t.params); + t.expectCompileResult(ok, prog); +}); + +g.test('write_access'). +desc('A variable can be written to when the access mode permits'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params( + (u) => + u. + combine('addressSpace', kNonHandleAddressSpaces). + expand('explicitSpace', explicitSpaceExpander). + combine('explicitAccess', [false, true]). + expand('accessMode', accessModeExpander). + combine('stage', ['compute']) // Only need to check compute shaders +). +fn((t) => { + const prog = getVarDeclShader(t.params, 'x = 0;'); + const ok = supportsWrite(t.params); + t.expectCompileResult(ok, prog); +}); + +const kTestTypes = [ +'f32', +'i32', +'u32', +'bool', +'vec2', +'vec2', +'vec2', +'vec2', +'vec3', +'vec3', +'vec3', +'vec3', +'vec4', +'vec4', +'vec4', +'vec4', +'mat2x2', +'mat2x3', +'mat2x4', +'mat3x2', +'mat3x3', +'mat3x4', +'mat4x2', +'mat4x3', +'mat4x4', +// [1]: 12 is a random number here. find a solution to replace it. +'array', +'array', +'array', +'array']; + + +g.test('initializer_type'). +desc( + ` + If present, the initializer's type must match the store type of the variable. + Testing scalars, vectors, and matrices of every dimension and type. + TODO: add test for: structs - arrays of vectors and matrices - arrays of different length +` +). +params((u) => u.beginSubcases().combine('lhsType', kTestTypes).combine('rhsType', kTestTypes)). +fn((t) => { + const { lhsType, rhsType } = t.params; + + const code = ` + @fragment + fn main() { + var a : ${lhsType} = ${rhsType}(); + } + `; + + const expectation = lhsType === rhsType; + t.expectCompileResult(expectation, code); +}); + +g.test('var_access_mode_bad_other_template_contents'). +desc( + 'A variable declaration with explicit access mode with varying other template list contents' +). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params((u) => +u. +combine('accessMode', ['read', 'read_write']). +combine('prefix', ['storage,', '', ',']). +combine('suffix', [',storage', ',read', ',', '']) +). +fn((t) => { + const prog = `@group(0) @binding(0) + var<${t.params.prefix}${t.params.accessMode}${t.params.suffix}> x: i32;`; + const ok = t.params.prefix === 'storage,' && t.params.suffix === ''; + t.expectCompileResult(ok, prog); +}); + +g.test('var_access_mode_bad_template_delim'). +desc('A variable declaration has explicit access mode with varying template list delimiters'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). +params((u) => +u. +combine('accessMode', ['read', 'read_write']). +combine('prefix', ['', '<', '>', ',']). +combine('suffix', ['', '<', '>', ',']) +). +fn((t) => { + const prog = `@group(0) @binding(0) + var ${t.params.prefix}storage,${t.params.accessMode}${t.params.suffix} x: i32;`; + const ok = t.params.prefix === '<' && t.params.suffix === '>'; + t.expectCompileResult(ok, prog); +}); + +g.test('shader_stage'). +desc('Test the limitations of address space and shader stage'). +params((u) => +u. +combine('stage', ['compute', 'vertex', 'fragment']). +combine('kind', [ +'handle_ro', +'handle_wo', +'handle_rw', +'function', +'private', +'storage_ro', +'storage_rw', +'uniform', +'workgroup'] +) +). +fn((t) => { + t.skipIf( + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures') && + t.params.kind === 'handle_rw', + 'Unsupported language feature' + ); + let mdecl = ``; + let fdecl = ``; + let expect = true; + switch (t.params.kind) { + case 'handle_ro': + mdecl = `@group(0) @binding(0) var v : sampler;`; + break; + case 'handle_wo': + mdecl = `@group(0) @binding(0) var v : texture_storage_2d;`; + expect = t.params.stage !== 'vertex'; + break; + case 'handle_rw': + mdecl = `@group(0) @binding(0) var v : texture_storage_2d;`; + expect = t.params.stage !== 'vertex'; + break; + case 'function': + fdecl = `var v : u32;`; + break; + case 'private': + mdecl = `var v : i32;`; + break; + case 'storage_ro': + mdecl = `@group(0) @binding(0) var v : u32;`; + break; + case 'storage_rw': + mdecl = `@group(0) @binding(0) var v : u32;`; + expect = t.params.stage !== 'vertex'; + break; + case 'uniform': + mdecl = `@group(0) @binding(0) var v : u32;`; + break; + case 'workgroup': + mdecl = `var v : u32;`; + expect = t.params.stage === 'compute'; + break; + } + let func = ``; + switch (t.params.stage) { + case 'compute': + func = `@compute @workgroup_size(1) + fn main() { + ${fdecl} + _ = v; + }`; + break; + case 'vertex': + func = `@vertex + fn main() -> @builtin(position) vec4f { + ${fdecl} + _ = v; + return vec4f(); + }`; + break; + case 'fragment': + func = `@fragment + fn main() { + ${fdecl} + _ = v; + }`; + break; + } + + const code = ` + ${mdecl} + ${func}`; + t.expectCompileResult(expect, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var_access_mode.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var_access_mode.spec.js deleted file mode 100644 index 466c9e32cd5..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/var_access_mode.spec.js +++ /dev/null @@ -1,116 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = ` -7.3 var Declarations - -The access mode always has a default value, and except for variables in the -storage address space, must not be specified in the WGSL source. See §13.3 Address Spaces. -`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../common/util/data_tables.js'; -import { kAccessModeInfo, kAddressSpaceInfo } from '../../types.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - -import { - explicitSpaceExpander, - getVarDeclShader, - accessModeExpander, - supportsRead, - supportsWrite } from - -'./util.js'; - -// Address spaces that can hold an i32 variable. -const kNonHandleAddressSpaces = keysOf(kAddressSpaceInfo).filter( - (as) => as !== 'handle' -); - -export const g = makeTestGroup(ShaderValidationTest); - -g.test('explicit_access_mode'). -desc('Validate uses of an explicit access mode on a var declaration'). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params( - (u) => - u. - combine('addressSpace', kNonHandleAddressSpaces). - combine('explicitSpace', [true, false]) - // Only keep cases where: - // *if* the address space must be specified on a var decl (e.g. var) - // then the address space will actually be specified in this test case. - .filter((t) => kAddressSpaceInfo[t.addressSpace].spell !== 'must' || t.explicitSpace). - combine('explicitAccess', [true]). - combine('accessMode', keysOf(kAccessModeInfo)). - combine('stage', ['compute']) // Only need to check compute shaders -). -fn((t) => { - const prog = getVarDeclShader(t.params); - const info = kAddressSpaceInfo[t.params.addressSpace]; - - const ok = - // The address space must be explicitly specified. - t.params.explicitSpace && - // The address space must allow an access mode to be spelled, and the - // access mode must be in the list of modes for the address space. - info.spellAccessMode !== 'never' && - info.accessModes.includes(t.params.accessMode); - - t.expectCompileResult(ok, prog); -}); - -g.test('implicit_access_mode'). -desc('Validate an implicit access mode on a var declaration'). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params( - (u) => - u. - combine('addressSpace', kNonHandleAddressSpaces). - expand('explicitSpace', explicitSpaceExpander). - combine('explicitAccess', [false]). - combine('accessMode', ['']). - combine('stage', ['compute']) // Only need to check compute shaders -). -fn((t) => { - const prog = getVarDeclShader(t.params); - - // 7.3 var Declarations - // "The access mode always has a default value,.." - const ok = true; - - t.expectCompileResult(ok, prog); -}); - -g.test('read_access'). -desc('A variable can be read from when the access mode permits'). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params( - (u) => - u. - combine('addressSpace', kNonHandleAddressSpaces). - expand('explicitSpace', explicitSpaceExpander). - combine('explicitAccess', [false, true]). - expand('accessMode', accessModeExpander). - combine('stage', ['compute']) // Only need to check compute shaders -). -fn((t) => { - const prog = getVarDeclShader(t.params, 'let copy = x;'); - const ok = supportsRead(t.params); - t.expectCompileResult(ok, prog); -}); - -g.test('write_access'). -desc('A variable can be written to when the access mode permits'). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params( - (u) => - u. - combine('addressSpace', kNonHandleAddressSpaces). - expand('explicitSpace', explicitSpaceExpander). - combine('explicitAccess', [false, true]). - expand('accessMode', accessModeExpander). - combine('stage', ['compute']) // Only need to check compute shaders -). -fn((t) => { - const prog = getVarDeclShader(t.params, 'x = 0;'); - const ok = supportsWrite(t.params); - t.expectCompileResult(ok, prog); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/array.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/array.spec.js new file mode 100644 index 00000000000..401c919a2ac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/array.spec.js @@ -0,0 +1,236 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for array access expressions + +* Index type +* Result type +* Early-evaluation errors +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { + Type, + elementTypeOf, + kConcreteNumericScalarsAndVectors, + kAllBoolScalarsAndVectors } from +'../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('index_type'). +desc('Tests valid index types for array access expressions'). +params((u) => +u.combine('type', [ +'bool', +'u32', +'i32', +'abstract-int', +'f32', +'f16', +'abstract-float', +'vec2i'] +) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const ty = Type[t.params.type]; + const enable = ty.requiresF16() ? 'enable f16;' : ''; + const code = `${enable} + fn foo() { + var x = array(1,2,3); + let tmp = x[${ty.create(0).wgsl()}]; + }`; + const expect = + t.params.type === 'i32' || t.params.type === 'u32' || t.params.type === 'abstract-int'; + t.expectCompileResult(expect, code); +}); + +const kTypes = objectsToRecord([ +...kConcreteNumericScalarsAndVectors, +...kAllBoolScalarsAndVectors] +); +const kTypeKeys = keysOf(kTypes); + +g.test('result_type'). +desc('Tests that correct result type is produced for an access expression'). +params((u) => +u. +combine('type', kTypeKeys). +combine('elements', [0, 4]). +filter((t) => { + const ty = kTypes[t.type]; + if (t.elements === 0) { + if (elementTypeOf(ty) === Type.bool) { + return false; + } + } + return true; +}) +). +beforeAllSubcases((t) => { + const ty = kTypes[t.params.type]; + if (ty.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const ty = kTypes[t.params.type]; + const enable = ty.requiresF16() ? 'enable f16;' : ''; + const arrayTy = Type['array'](t.params.elements, ty); + const module_decl = + t.params.elements === 0 ? + `@group(0) @binding(0) var x : ${arrayTy.toString()};` : + ``; + const function_decl = t.params.elements === 0 ? `` : `var x : ${arrayTy.toString()};`; + const code = `${enable} + ${module_decl} + fn foo() { + ${function_decl} + let tmp1 : ${ty.toString()} = x[0]; + let tmp2 : ${ty.toString()} = x[1]; + let tmp3 : ${ty.toString()} = x[2]; + }`; + t.expectCompileResult(true, code); +}); + + + + + + + + +const kOutOfBoundsCases = { + const_module_in_bounds: { + code: `const x = array(1,2,3)[0];`, + result: true + }, + const_module_oob_neg: { + code: `const x = array(1,2,3)[-1];`, + result: false + }, + const_module_oob_pos: { + code: `const x = array(1,2,3)[3];`, + result: false + }, + const_func_in_bounds: { + code: `fn foo() { + const x = array(1,2,3)[0]; + }`, + result: true + }, + const_func_oob_neg: { + code: `fn foo { + const x = array(1,2,3)[-1]; + }`, + result: false + }, + const_func_oob_pos: { + code: `fn foo { + const x = array(1,2,3)[3]; + }`, + result: false + }, + override_in_bounds: { + code: `override x : i32; + fn y() -> u32 { + let tmp = array(1,2,3)[x]; + return 0; + }`, + result: true, + pipeline: true, + value: 0 + }, + override_oob_neg: { + code: `override x : i32; + fn y() -> u32 { + let tmp = array(1,2,3)[x]; + return 0; + }`, + result: false, + pipeline: true, + value: -1 + }, + override_oob_pos: { + code: `override x : i32; + fn y() -> u32 { + let tmp = array(1,2,3)[x]; + return 0; + }`, + result: false, + pipeline: true, + value: 3 + }, + runtime_in_bounds: { + code: `fn foo() { + let idx = 0; + let x = array(1,2,3)[idx]; + }`, + result: true + }, + runtime_oob_neg: { + code: `fn foo() { + let idx = -1; + let x = array(1,2,3)[idx]; + }`, + result: true + }, + runtime_oob_pos: { + code: `fn foo() { + let idx = 3; + let x = array(1,2,3)[idx]; + }`, + result: true + }, + runtime_array_const_oob_neg: { + code: `@group(0) @binding(0) var x : array; + fn y() -> u32 { + let tmp = x[-1]; + return 0; + }`, + result: false + }, + runtime_array_override_oob_neg: { + code: `@group(0) @binding(0) var v : array; + override x : i32; + fn y() -> u32 { + let tmp = v[x]; + return 0; + }`, + result: false, + pipeline: true, + value: -1 + } +}; + +g.test('early_eval_errors'). +desc('Tests early evaluation errors for out-of-bounds indexing'). +params((u) => u.combine('case', keysOf(kOutOfBoundsCases))). +fn((t) => { + const testcase = kOutOfBoundsCases[t.params.case]; + if (testcase.pipeline) { + const v = testcase.value ?? 0; + t.expectPipelineResult({ + expectedResult: testcase.result, + code: testcase.code, + constants: { x: v }, + reference: ['y()'] + }); + } else { + t.expectCompileResult(testcase.result, testcase.code); + } +}); + +g.test('abstract_array_concrete_index'). +desc('Tests that a concrete index type on an abstract array remains abstract'). +fn((t) => { + const code = ` + const idx = 0i; + const_assert array(0xfffffffff,2,3)[idx] == 0xfffffffff;`; + t.expectCompileResult(true, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/matrix.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/matrix.spec.js new file mode 100644 index 00000000000..96d0078a272 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/matrix.spec.js @@ -0,0 +1,218 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix access expressions + +* Index type +* Result type +* Early-evaluation errors +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { Type } from '../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('index_type'). +desc('Tests valid index types for array access expressions'). +params((u) => +u.combine('type', [ +'bool', +'u32', +'i32', +'abstract-int', +'f32', +'f16', +'abstract-float', +'vec2i'] +) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const ty = Type[t.params.type]; + const enable = ty.requiresF16() ? 'enable f16;' : ''; + const code = `${enable} + fn foo() { + var x = mat2x2(1,2,3,4); + let tmp = x[${ty.create(0).wgsl()}]; + }`; + const expect = + t.params.type === 'i32' || t.params.type === 'u32' || t.params.type === 'abstract-int'; + t.expectCompileResult(expect, code); +}); + +g.test('result_type'). +desc('Tests that correct result type is produced for an access expression'). +params((u) => +u. +combine('element', ['f16', 'f32']). +combine('columns', [2, 3, 4]). +beginSubcases(). +combine('rows', [2, 3, 4]). +combine('decl', ['function', 'module']) +). +beforeAllSubcases((t) => { + if (t.params.element === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const enable = t.params.element === 'f16' ? 'enable f16;' : ''; + const scalarTy = Type[t.params.element]; + const vectorTy = Type['vec'](t.params.rows, scalarTy); + const matrixTy = Type['mat'](t.params.columns, t.params.rows, scalarTy); + const module_decl = + t.params.decl === 'module' ? + `@group(0) @binding(0) var x : ${matrixTy.toString()};` : + ``; + const function_decl = t.params.decl === 'module' ? `` : `var x : ${matrixTy.toString()};`; + const code = `${enable} + ${module_decl} + fn foo() { + ${function_decl} + let tmp1 : ${vectorTy.toString()} = x[0]; + let tmp2 : ${vectorTy.toString()} = x[1]; + }`; + t.expectCompileResult(true, code); +}); + + + + + + + + +const kOutOfBoundsCases = { + const_module_in_bounds: { + code: `const x = mat2x2(1,2,3,4)[0];`, + result: true + }, + const_module_oob_neg: { + code: `const x = mat2x2(1,2,3,4)[-1];`, + result: false + }, + const_module_oob_pos: { + code: `const x = mat2x2(1,2,3,4)[2];`, + result: false + }, + const_func_in_bounds: { + code: `fn foo() { + const x = mat2x2(1,2,3,4)[0]; + }`, + result: true + }, + const_func_oob_neg: { + code: `fn foo { + const x = mat2x2(1,2,3,4)[-1]; + }`, + result: false + }, + const_func_oob_pos: { + code: `fn foo { + const x = mat2x2(1,2,3,4)[2]; + }`, + result: false + }, + override_in_bounds: { + code: `override x : i32; + fn y() -> u32 { + let tmp = mat2x2(1,2,3,4)[x]; + return 0; + }`, + result: true, + pipeline: true, + value: 0 + }, + override_oob_neg: { + code: `override x : i32; + fn y() -> u32 { + let tmp = mat2x2(1,2,3,4)[x]; + return 0; + }`, + result: false, + pipeline: true, + value: -1 + }, + override_oob_pos: { + code: `override x : i32; + fn y() -> u32 { + let tmp = mat2x2(1,2,3,4)[x]; + return 0; + }`, + result: false, + pipeline: true, + value: 2 + }, + runtime_in_bounds: { + code: `fn foo() { + let idx = 0; + let x = mat2x2(1,2,3,4)[idx]; + }`, + result: true + }, + runtime_oob_neg: { + code: `fn foo() { + let idx = -1; + let x = mat2x2(1,2,3,4)[idx]; + }`, + result: true + }, + runtime_oob_pos: { + code: `fn foo() { + let idx = 3; + let x = mat2x2(1,2,3,4)[idx]; + }`, + result: true + }, + runtime_array_const_oob_neg: { + code: `@group(0) @binding(0) var x : mat2x2; + fn y() -> u32 { + let tmp = x[-1]; + return 0; + }`, + result: false + }, + runtime_array_override_oob_neg: { + code: `@group(0) @binding(0) var v : mat2x2; + override x : i32; + fn y() -> u32 { + let tmp = v[x]; + return 0; + }`, + result: false, + pipeline: true, + value: -1 + } +}; + +g.test('early_eval_errors'). +desc('Tests early evaluation errors for out-of-bounds indexing'). +params((u) => u.combine('case', keysOf(kOutOfBoundsCases))). +fn((t) => { + const testcase = kOutOfBoundsCases[t.params.case]; + if (testcase.pipeline) { + const v = testcase.value ?? 0; + t.expectPipelineResult({ + expectedResult: testcase.result, + code: testcase.code, + constants: { x: v }, + reference: ['y()'] + }); + } else { + t.expectCompileResult(testcase.result, testcase.code); + } +}); + +g.test('abstract_matrix_concrete_index'). +desc('Tests that a concrete index type on an abstract array remains abstract'). +fn((t) => { + const code = ` + const idx = 0i; + const_assert mat2x2(1.11001100110011008404,1,1,1)[0i][0i] == 1.11001100110011008404;`; + t.expectCompileResult(true, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/structure.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/structure.spec.js new file mode 100644 index 00000000000..d9b0380496b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/structure.spec.js @@ -0,0 +1,116 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for structure access expressions. + +* Correct result type +* Identifier matching +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('identifier_mismatch'). +desc('Tests that the member identifier must match a member in the declaration'). +params((u) => u.combine('decl', ['value', 'ref'])). +fn((t) => { + const code = ` + struct S { + x : u32 + } + fn foo() { + ${t.params.decl === 'value' ? 'let' : 'var'} v : S = S(); + _ = v.y; + }`; + t.expectCompileResult(false, code); +}); + +g.test('shadowed_member'). +desc('Tests that other declarations do not interfere with member determination'). +params((u) => u.combine('decl', ['value', 'ref'])). +fn((t) => { + const code = ` + struct S { + x : u32 + } + fn foo() { + var x : i32; + ${t.params.decl === 'value' ? 'let' : 'var'} v : S = S(); + let tmp : u32 = v.x; + }`; + t.expectCompileResult(true, code); +}); + +g.test('result_type'). +desc('Tests correct result types are returned'). +params((u) => u.combine('decl', ['value', 'ref'])). +fn((t) => { + const types = [ + 'i32', + 'u32', + 'f32', + 'bool', + 'array', + 'array', + 'vec2f', + 'vec3u', + 'vec4i', + 'mat2x2f', + 'T']; + + let code = ` + struct T { + a : f32 + } + struct S {\n`; + + for (let i = 0; i < types.length; i++) { + code += `m${i} : ${types[i]},\n`; + } + + code += `} + fn foo() { + var x : i32; + ${t.params.decl === 'value' ? 'let' : 'var'} v : S = S();\n`; + + for (let i = 0; i < types.length; i++) { + code += `let tmp${i} : ${types[i]} = v.m${i};\n`; + } + + code += `}`; + t.expectCompileResult(true, code); +}); + +g.test('result_type_f16'). +desc('Tests correct type is returned for f16'). +params((u) => u.combine('decl', ['value', 'ref'])). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + const code = ` + enable f16; + struct S { + x : f16 + } + fn foo() { + ${t.params.decl === 'value' ? 'let' : 'var'} v : S = S(); + let tmp : f16 = v.x; + }`; + t.expectCompileResult(true, code); +}); + +g.test('result_type_runtime_array'). +desc('Tests correct type is returned for runtime arrays'). +fn((t) => { + const code = ` + struct S { + x : array + } + @group(0) @binding(0) var v : S; + fn foo() { + let tmp : u32 = v.x[0]; + let tmp_ptr : ptr> = &v.x; + }`; + t.expectCompileResult(true, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/vector.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/vector.spec.js index b881b8ccf58..7b90ce94049 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/vector.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/access/vector.spec.js @@ -4,11 +4,12 @@ Validation tests for vector accesses `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { keysOf } from '../../../../../common/util/data_tables.js'; +import { Type, isConvertible } from '../../../../util/conversion.js'; import { ShaderValidationTest } from '../../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); -const kCases = { +const kConcreteCases = { // indexing with literal literal_0: { wgsl: 'let r : T = v[0];', ok: true }, literal_1: { wgsl: 'let r : T = v[1];', ok: true }, @@ -174,15 +175,223 @@ const kCases = { array_idx: { wgsl: 'let r : T = v[array()];', ok: false } }; -g.test('vector'). -desc('Tests validation of vector indexed and swizzles'). +const kAbstractCases = { + // indexing with literal + literal_0: { wgsl: 'const r = V[0];', result_width: 1, ok: true }, + literal_1: { wgsl: 'const r = V[1];', result_width: 1, ok: true }, + literal_2: { wgsl: 'const r = V[2];', result_width: 1, ok: (width) => width > 2 }, + literal_3: { wgsl: 'const r = V[3];', result_width: 1, ok: (width) => width > 3 }, + literal_0i: { wgsl: 'const r = V[0i];', result_width: 1, ok: true }, + literal_1i: { wgsl: 'const r = V[1i];', result_width: 1, ok: true }, + literal_2i: { wgsl: 'const r = V[2i];', result_width: 1, ok: (width) => width > 2 }, + literal_3i: { wgsl: 'const r = V[3i];', result_width: 1, ok: (width) => width > 3 }, + literal_0u: { wgsl: 'const r = V[0u];', result_width: 1, ok: true }, + literal_1u: { wgsl: 'const r = V[1u];', result_width: 1, ok: true }, + literal_2u: { wgsl: 'const r = V[2u];', result_width: 1, ok: (width) => width > 2 }, + literal_3u: { wgsl: 'const r = V[3u];', result_width: 1, ok: (width) => width > 3 }, + + // indexing with 'const' variable + const_0: { wgsl: 'const i = 0; const r = V[i];', result_width: 1, ok: true }, + const_1: { wgsl: 'const i = 1; const r = V[i];', result_width: 1, ok: true }, + const_2: { + wgsl: 'const i = 2; const r = V[i];', + result_width: 1, + ok: (width) => width > 2 + }, + const_3: { + wgsl: 'const i = 3; const r = V[i];', + result_width: 1, + ok: (width) => width > 3 + }, + const_0i: { wgsl: 'const i = 0i; const r = V[i];', result_width: 1, ok: true }, + const_1i: { wgsl: 'const i = 1i; const r = V[i];', result_width: 1, ok: true }, + const_2i: { + wgsl: 'const i = 2i; const r = V[i];', + result_width: 1, + ok: (width) => width > 2 + }, + const_3i: { + wgsl: 'const i = 3i; const r = V[i];', + result_width: 1, + ok: (width) => width > 3 + }, + const_0u: { wgsl: 'const i = 0u; const r = V[i];', result_width: 1, ok: true }, + const_1u: { wgsl: 'const i = 1u; const r = V[i];', result_width: 1, ok: true }, + const_2u: { + wgsl: 'const i = 2u; const r = V[i];', + result_width: 1, + ok: (width) => width > 2 + }, + const_3u: { + wgsl: 'const i = 3u; const r = V[i];', + result_width: 1, + ok: (width) => width > 3 + }, + + // indexing with 'let' variable + let_0: { wgsl: 'let i = 0; const r = V[i];', ok: false }, + let_1: { wgsl: 'let i = 1; const r = V[i];', ok: false }, + let_2: { wgsl: 'let i = 2; const r = V[i];', ok: false }, + let_3: { wgsl: 'let i = 3; const r = V[i];', ok: false }, + let_0i: { wgsl: 'let i = 0i; const r = V[i];', ok: false }, + let_1i: { wgsl: 'let i = 1i; const r = V[i];', ok: false }, + let_2i: { wgsl: 'let i = 2i; const r = V[i];', ok: false }, + let_3i: { wgsl: 'let i = 3i; const r = V[i];', ok: false }, + let_0u: { wgsl: 'let i = 0u; const r = V[i];', ok: false }, + let_1u: { wgsl: 'let i = 1u; const r = V[i];', ok: false }, + let_2u: { wgsl: 'let i = 2u; const r = V[i];', ok: false }, + let_3u: { wgsl: 'let i = 3u; const r = V[i];', ok: false }, + + // indexing with 'var' variable + var_0: { wgsl: 'var i = 0; const r = V[i];', ok: false }, + var_1: { wgsl: 'var i = 1; const r = V[i];', ok: false }, + var_2: { wgsl: 'var i = 2; const r = V[i];', ok: false }, + var_3: { wgsl: 'var i = 3; const r = V[i];', ok: false }, + var_0i: { wgsl: 'var i = 0i; const r = V[i];', ok: false }, + var_1i: { wgsl: 'var i = 1i; const r = V[i];', ok: false }, + var_2i: { wgsl: 'var i = 2i; const r = V[i];', ok: false }, + var_3i: { wgsl: 'var i = 3i; const r = V[i];', ok: false }, + var_0u: { wgsl: 'var i = 0u; const r = V[i];', ok: false }, + var_1u: { wgsl: 'var i = 1u; const r = V[i];', ok: false }, + var_2u: { wgsl: 'var i = 2u; const r = V[i];', ok: false }, + var_3u: { wgsl: 'var i = 3u; const r = V[i];', ok: false }, + + // indexing with const expression + const_expr_0: { wgsl: 'const r = V[0 / 2];', result_width: 1, ok: true }, + const_expr_1: { wgsl: 'const r = V[2 / 2];', result_width: 1, ok: true }, + const_expr_2: { wgsl: 'const r = V[4 / 2];', result_width: 1, ok: (width) => width > 2 }, + const_expr_3: { wgsl: 'const r = V[6 / 2];', result_width: 1, ok: (width) => width > 3 }, + const_expr_2_via_trig: { + wgsl: 'const r = V[i32(tan(1.10714872) + 0.5)];', + result_width: 1, + ok: (width) => width > 2 + }, + const_expr_3_via_trig: { + wgsl: 'const r = V[u32(tan(1.24904577) + 0.5)];', + result_width: 1, + ok: (width) => width > 3 + }, + const_expr_2_via_vec2: { + wgsl: 'const r = V[vec2(3, 2)[1]];', + result_width: 1, + ok: (width) => width > 2 + }, + const_expr_3_via_vec2: { + wgsl: 'const r = V[vec2(3, 2).x];', + result_width: 1, + ok: (width) => width > 3 + }, + const_expr_2_via_vec2u: { + wgsl: 'const r = V[vec2u(3, 2)[1]];', + result_width: 1, + ok: (width) => width > 2 + }, + const_expr_3_via_vec2i: { + wgsl: 'const r = V[vec2i(3, 2).x];', + result_width: 1, + ok: (width) => width > 3 + }, + const_expr_2_via_array: { + wgsl: 'const r = V[array(3, 2)[1]];', + result_width: 1, + ok: (width) => width > 2 + }, + const_expr_3_via_array: { + wgsl: 'const r = V[array(3, 2)[0]];', + result_width: 1, + ok: (width) => width > 3 + }, + const_expr_2_via_struct: { + wgsl: 'const r = V[S(2).i];', + result_width: 1, + ok: (width) => width > 2 + }, + const_expr_3_via_struct: { + wgsl: 'const r = V[S(3).i];', + result_width: 1, + ok: (width) => width > 3 + }, + + // single element convenience name accesses + x: { wgsl: 'const r = V.x;', result_width: 1, ok: true }, + y: { wgsl: 'const r = V.y;', result_width: 1, ok: true }, + z: { wgsl: 'const r = V.z;', result_width: 1, ok: (width) => width > 2 }, + w: { wgsl: 'const r = V.w;', result_width: 1, ok: (width) => width > 3 }, + r: { wgsl: 'const r = V.r;', result_width: 1, ok: true }, + g: { wgsl: 'const r = V.g;', result_width: 1, ok: true }, + b: { wgsl: 'const r = V.b;', result_width: 1, ok: (width) => width > 2 }, + a: { wgsl: 'const r = V.a;', result_width: 1, ok: (width) => width > 3 }, + + // swizzles + xy: { wgsl: 'const r = V.xy;', result_width: 2, ok: true }, + yx: { wgsl: 'const r = V.yx;', result_width: 2, ok: true }, + xyx: { wgsl: 'const r = V.xyx;', result_width: 3, ok: true }, + xyz: { wgsl: 'const r = V.xyz;', result_width: 3, ok: (width) => width > 2 }, + zyx: { wgsl: 'const r = V.zyx;', result_width: 3, ok: (width) => width > 2 }, + xyxy: { wgsl: 'const r = V.xyxy;', result_width: 4, ok: true }, + xyxz: { wgsl: 'const r = V.xyxz;', result_width: 4, ok: (width) => width > 2 }, + xyzw: { wgsl: 'const r = V.xyzw;', result_width: 4, ok: (width) => width > 3 }, + yxwz: { wgsl: 'const r = V.yxwz;', result_width: 4, ok: (width) => width > 3 }, + rg: { wgsl: 'const r = V.rg;', result_width: 2, ok: true }, + gr: { wgsl: 'const r = V.gr;', result_width: 2, ok: true }, + rgg: { wgsl: 'const r = V.rgg;', result_width: 3, ok: true }, + rgb: { wgsl: 'const r = V.rgb;', result_width: 3, ok: (width) => width > 2 }, + grb: { wgsl: 'const r = V.grb;', result_width: 3, ok: (width) => width > 2 }, + rgbr: { wgsl: 'const r = V.rgbr;', result_width: 4, ok: (width) => width > 2 }, + rgba: { wgsl: 'const r = V.rgba;', result_width: 4, ok: (width) => width > 3 }, + gbra: { wgsl: 'const r = V.gbra;', result_width: 4, ok: (width) => width > 3 }, + + // swizzle chains + xy_yx: { wgsl: 'const r = V.xy.yx;', result_width: 2, ok: true }, + xyx_xxy: { wgsl: 'const r = V.xyx.xxy;', result_width: 3, ok: true }, + xyz_zyx: { wgsl: 'const r = V.xyz.zyx;', result_width: 3, ok: (width) => width > 2 }, + xyxy_rrgg: { wgsl: 'const r = V.xyxy.rrgg;', result_width: 4, ok: true }, + rbrg_xyzw: { wgsl: 'const r = V.rbrg.xyzw;', result_width: 4, ok: (width) => width > 2 }, + xyxz_rbg_yx: { + wgsl: 'const r = V.xyxz.rbg.yx;', + result_width: 2, + ok: (width) => width > 2 + }, + wxyz_bga_xy: { + wgsl: 'const r = V.wxyz.bga.xy;', + result_width: 2, + ok: (width) => width > 3 + }, + + // error: invalid convenience letterings + xq: { wgsl: 'const r = V.xq;', ok: false }, + py: { wgsl: 'const r = V.py;', ok: false }, + + // error: mixed convenience letterings + xg: { wgsl: 'const r = V.xg;', ok: false }, + ryb: { wgsl: 'const r = V.ryb;', ok: false }, + xgza: { wgsl: 'const r = V.xgza;', ok: false }, + + // error: too many swizzle elements + xxxxx: { wgsl: 'const r = V.xxxxx;', ok: false }, + rrrrr: { wgsl: 'const r = V.rrrrr;', ok: false }, + yxwxy: { wgsl: 'const r = V.yxwxy;', ok: false }, + rgbar: { wgsl: 'const r = V.rgbar;', ok: false }, + + // error: invalid index Value + literal_5: { wgsl: 'const r = V[5];', ok: false }, + literal_minus_1: { wgsl: 'const r = V[-1];', ok: false }, + + // error: invalid index type + float_idx: { wgsl: 'const r = V[1.0];', ok: false }, + bool_idx: { wgsl: 'const r = V[true];', ok: false }, + array_idx: { wgsl: 'const r = V[array()];', ok: false } +}; + +g.test('concrete'). +desc('Tests validation of vector indexed and swizzles for concrete data types'). params((u) => u. combine('vector_decl', ['const', 'let', 'var', 'param']). combine('vector_width', [2, 3, 4]). combine('element_type', ['i32', 'u32', 'f32', 'f16', 'bool']). beginSubcases(). -combine('case', keysOf(kCases)) +combine('case', keysOf(kConcreteCases)) ). beforeAllSubcases((t) => { if (t.params.element_type === 'f16') { @@ -190,7 +399,7 @@ beforeAllSubcases((t) => { } }). fn((t) => { - const c = kCases[t.params.case]; + const c = kConcreteCases[t.params.case]; const enables = t.params.element_type === 'f16' ? 'enable f16;' : ''; const prefix = `${enables} @@ -221,4 +430,54 @@ fn main() { `; const pass = typeof c.ok === 'function' ? c.ok(t.params.vector_width) : c.ok; t.expectCompileResult(pass, code); +}); + +g.test('abstract'). +desc('Tests validation of vector indexed and swizzles for abstract data types'). +params((u) => +u. +combine('vector_width', [2, 3, 4]). +combine('abstract_type', ['int', 'float']). +combine('concrete_type', ['u32', 'i32', 'f32', 'f16']). +beginSubcases(). +combine('case', keysOf(kAbstractCases)) +). +beforeAllSubcases((t) => { + if (t.params.concrete_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const enables = t.params.concrete_type === 'f16' ? 'enable f16;' : ''; + const c = kAbstractCases[t.params.case]; + const elem = t.params.abstract_type === 'int' ? '0' : '0.0'; + const vec_str = `vec${t.params.vector_width}(${Array(t.params.vector_width). + fill(elem). + join(', ')})`; + + const conversion_type = + 'result_width' in c ? + c.result_width === 1 ? + `${t.params.concrete_type}` : + `vec${c.result_width}<${t.params.concrete_type}>` : + ''; + const conversion = 'result_width' in c ? `const c: ${conversion_type} = r;` : ''; + + const code = `${enables} +struct S { + i : i32, +} + +@compute @workgroup_size(1) +fn main() { + ${c.wgsl.replace('V', vec_str)} + ${conversion} +} +`; + const convertible = isConvertible( + Type[`abstract-${t.params.abstract_type}`], + Type[t.params.concrete_type] + ); + const pass = convertible && (typeof c.ok === 'function' ? c.ok(t.params.vector_width) : c.ok); + t.expectCompileResult(pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/add_sub_mul.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/add_sub_mul.spec.js new file mode 100644 index 00000000000..cf1b68a8555 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/add_sub_mul.spec.js @@ -0,0 +1,317 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for add/sub/mul expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { assert } from '../../../../../common/util/util.js'; +import { kBit } from '../../../../util/constants.js'; +import { + concreteTypeOf, + isAbstractType, + isConvertible, + kAllScalarsAndVectors, + kConcreteNumericScalarsAndVectors, + ScalarType, + scalarTypeOf, + Type, + + VectorType } from +'../../../../util/conversion.js'; +import { nextAfterF16, nextAfterF32 } from '../../../../util/math.js'; +import { reinterpretU16AsF16, reinterpretU32AsF32 } from '../../../../util/reinterpret.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; +import { + kConstantAndOverrideStages, + validateConstOrOverrideBinaryOpEval } from +'../call/builtin/const_override_validation.js'; + +import { resultType } from './result_type.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators tested in this file. +const kOperators = { + add: { op: '+' }, + sub: { op: '-' }, + mul: { op: '*' } +}; + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); +const kConcreteNumericScalarAndVectorTypes = objectsToRecord(kConcreteNumericScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector expressions are only accepted for compatible numeric types. + ` +). +params((u) => +u. +combine('lhs', keysOf(kScalarAndVectorTypes)). +combine( + 'rhs', + // Skip vec3 and vec4 on the RHS to keep the number of subcases down. + // vec3 + vec3 and vec4 + vec4 is tested in execution tests. + keysOf(kScalarAndVectorTypes).filter( + (value) => !(value.startsWith('vec3') || value.startsWith('vec4')) + ) +). +combine('compound_assignment', [false, true]). +beginSubcases(). +combine('op', keysOf(kOperators)) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const op = kOperators[t.params.op]; + const lhs = kScalarAndVectorTypes[t.params.lhs]; + const rhs = kScalarAndVectorTypes[t.params.rhs]; + const lhsElement = scalarTypeOf(lhs); + const rhsElement = scalarTypeOf(rhs); + const hasBool = lhsElement === Type.bool || rhsElement === Type.bool; + const hasF16 = lhsElement === Type.f16 || rhsElement === Type.f16; + const resType = resultType({ lhs, rhs, canConvertScalarToVector: true }); + const resTypeIsTypeable = resType && !isAbstractType(scalarTypeOf(resType)); + const code = t.params.compound_assignment ? + ` +${hasF16 ? 'enable f16;' : ''} +fn f() { + var v = ${lhs.create(0).wgsl()}; + v ${op.op}= ${rhs.create(0).wgsl()}; +} +` : + ` +${hasF16 ? 'enable f16;' : ''} +const lhs = ${lhs.create(0).wgsl()}; +const rhs = ${rhs.create(0).wgsl()}; +const foo ${resTypeIsTypeable ? `: ${resType}` : ''} = lhs ${op.op} rhs; +`; + let valid = !hasBool && resType !== null; + if (valid && t.params.compound_assignment) { + valid = valid && isConvertible(resType, concreteTypeOf(lhs)); + } + t.expectCompileResult(valid, code); +}); + +g.test('scalar_vector_out_of_range'). +desc( + ` + Checks that constant or override evaluation of add/sub/mul operations on scalar/vectors that produce out of range values cause validation errors. + - Checks for all concrete numeric scalar and vector types, including scalar * vector and vector * scalar. + - Checks for all vector elements that could cause the out of range to happen. + - Checks for pairs of values at one ULP difference at the boundary of the out of range. + ` +). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('lhs', keysOf(kConcreteNumericScalarAndVectorTypes)). +expand('rhs', (p) => { + if (kScalarAndVectorTypes[p.lhs] instanceof VectorType) { + return [p.lhs, scalarTypeOf(kScalarAndVectorTypes[p.lhs]).toString()]; + } + return [p.lhs]; +}). +beginSubcases(). +expand('swap', (p) => { + if (p.lhs === p.rhs) { + return [false]; + } + return [false, true]; +}). +combine('nonZeroIndex', [0, 1, 2, 3]). +filter((p) => { + const lType = kScalarAndVectorTypes[p.lhs]; + if (lType instanceof VectorType) { + return lType.width > p.nonZeroIndex; + } + return p.nonZeroIndex === 0; +}). +combine('valueCase', ['halfmax', 'halfmax+ulp', 'sqrtmax', 'sqrtmax+ulp']). +combine('stage', kConstantAndOverrideStages) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const { op, valueCase, nonZeroIndex, swap } = t.params; + let { lhs, rhs } = t.params; + + const elementType = scalarTypeOf(kScalarAndVectorTypes[lhs]); + + // Handle the swapping of LHS and RHS to test all cases of scalar * vector. + if (swap) { + [rhs, lhs] = [lhs, rhs]; + } + + // What is the maximum representable value for the type? Also how do we add a ULP? + let maxValue = 0; + let nextAfter = (v) => v + 1; + let outOfRangeIsError = false; + switch (elementType) { + case Type.f16: + maxValue = reinterpretU16AsF16(kBit.f16.positive.max); + nextAfter = (v) => nextAfterF16(v, 'positive', 'no-flush'); + outOfRangeIsError = true; + break; + case Type.f32: + maxValue = reinterpretU32AsF32(kBit.f32.positive.max); + nextAfter = (v) => nextAfterF32(v, 'positive', 'no-flush'); + outOfRangeIsError = true; + break; + case Type.u32: + maxValue = kBit.u32.max; + break; + case Type.i32: + maxValue = kBit.i32.positive.max; + break; + } + + // Decide on the test value that may or may not do an out of range computation. + let value; + switch (valueCase) { + case 'halfmax': + value = Math.floor(maxValue / 2); + break; + case 'halfmax+ulp': + value = nextAfter(Math.ceil(maxValue / 2)); + break; + case 'sqrtmax': + value = Math.floor(Math.sqrt(maxValue)); + break; + case 'sqrtmax+ulp': + value = nextAfter(Math.ceil(Math.sqrt(maxValue))); + break; + } + + // What value will be computed by the test? + let computedValue; + let leftValue = value; + const rightValue = value; + switch (op) { + case 'add': + computedValue = value + value; + break; + case 'sub': + computedValue = -value - value; + leftValue = -value; + break; + case 'mul': + computedValue = value * value; + break; + } + + // Creates either a scalar with the value, or a vector with the value only at a specific index. + const create = (type, index, value) => { + if (type instanceof ScalarType) { + return type.create(value); + } else { + assert(type instanceof VectorType); + const values = new Array(type.width); + values.fill(0); + values[index] = value; + return type.create(values); + } + }; + + // Check if there is overflow + const success = Math.abs(computedValue) <= maxValue || !outOfRangeIsError; + validateConstOrOverrideBinaryOpEval( + t, + kOperators[op].op, + success, + t.params.stage, + create(kScalarAndVectorTypes[lhs], nonZeroIndex, leftValue), + t.params.stage, + create(kScalarAndVectorTypes[rhs], nonZeroIndex, rightValue) + ); +}); + + + + + + + +const kInvalidTypes = { + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `i32(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `i32(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_type_with_itself'). +desc( + ` + Validates that expressions are never accepted for non-scalar, non-vector, and non-matrix types. + ` +). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('type', keysOf(kInvalidTypes)). +combine('control', [true, false]). +beginSubcases() +). +fn((t) => { + const op = kOperators[t.params.op]; + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${expr} ${op.op} ${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/and_or_xor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/and_or_xor.spec.js new file mode 100644 index 00000000000..d53569ac161 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/and_or_xor.spec.js @@ -0,0 +1,176 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for logical and bitwise and/or/xor expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { + concreteTypeOf, + isAbstractType, + isConvertible, + isIntegerType, + kAllScalarsAndVectors, + scalarTypeOf, + Type } from +'../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +import { resultType } from './result_type.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators and a flag for whether they support boolean values or not. +const kOperators = { + and: { op: '&', supportsBool: true }, + or: { op: '|', supportsBool: true }, + xor: { op: '^', supportsBool: false } +}; + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector expressions are only accepted for bool or compatible integer types. + ` +). +params((u) => +u. +combine('lhs', keysOf(kScalarAndVectorTypes)). +combine( + 'rhs', + // Skip vec3 and vec4 on the RHS to keep the number of subcases down. + // vec3 + vec3 and vec4 + vec4 is tested in execution tests. + keysOf(kScalarAndVectorTypes).filter( + (value) => !(value.startsWith('vec3') || value.startsWith('vec4')) + ) +). +combine('compound_assignment', [false, true]). +beginSubcases(). +combine('op', keysOf(kOperators)) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const op = kOperators[t.params.op]; + const lhs = kScalarAndVectorTypes[t.params.lhs]; + const rhs = kScalarAndVectorTypes[t.params.rhs]; + const lhsElement = scalarTypeOf(lhs); + const rhsElement = scalarTypeOf(rhs); + const hasBool = lhsElement === Type.bool || rhsElement === Type.bool; + const hasF16 = lhsElement === Type.f16 || rhsElement === Type.f16; + const resType = + isIntegerType(lhsElement) && isIntegerType(rhsElement) || hasBool && op.supportsBool ? + resultType({ lhs, rhs, canConvertScalarToVector: false }) : + null; + const resTypeIsTypeable = resType && !isAbstractType(scalarTypeOf(resType)); + const code = t.params.compound_assignment ? + ` +${hasF16 ? 'enable f16;' : ''} +fn f() { + var foo = ${lhs.create(0).wgsl()}; + foo ${op.op}= ${rhs.create(0).wgsl()}; +} +` : + ` +${hasF16 ? 'enable f16;' : ''} +const lhs = ${lhs.create(0).wgsl()}; +const rhs = ${rhs.create(0).wgsl()}; +const foo ${resTypeIsTypeable ? `: ${resType}` : ''} = lhs ${op.op} rhs; +`; + + let valid = resType !== null; + if (valid && t.params.compound_assignment) { + valid = valid && isConvertible(resType, concreteTypeOf(lhs)); + } + + t.expectCompileResult(valid, code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `i32(${e}[0][0])` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `i32(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `i32(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('type', keysOf(kInvalidTypes)). +combine('control', [true, false]). +beginSubcases() +). +fn((t) => { + const op = kOperators[t.params.op]; + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${expr} ${op.op} ${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/bitwise_shift.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/bitwise_shift.spec.js index ff3e1ae5258..2894eafb016 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/bitwise_shift.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/bitwise_shift.spec.js @@ -3,6 +3,13 @@ **/export const description = ` Validation tests for the bitwise shift binary expression operations `;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + numElementsOf, + scalarTypeOf } from +'../../../../util/conversion.js'; import { ShaderValidationTest } from '../../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); @@ -21,6 +28,146 @@ function vectorize(v, size) { return v; } +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector expressions are only accepted when the LHS is an integer and the RHS is abstract or unsigned. + ` +). +params((u) => +u. +combine('lhs', keysOf(kScalarAndVectorTypes)). +combine( + 'rhs', + // Skip vec3 and vec4 on the RHS to keep the number of subcases down. + keysOf(kScalarAndVectorTypes).filter( + (value) => !(value.startsWith('vec3') || value.startsWith('vec4')) + ) +). +combine('compound_assignment', [false, true]). +beginSubcases(). +combine('op', ['<<', '>>']) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const lhs = kScalarAndVectorTypes[t.params.lhs]; + const rhs = kScalarAndVectorTypes[t.params.rhs]; + const lhsElement = scalarTypeOf(lhs); + const rhsElement = scalarTypeOf(rhs); + const hasF16 = lhsElement === Type.f16 || rhsElement === Type.f16; + const code = t.params.compound_assignment ? + ` +${hasF16 ? 'enable f16;' : ''} +fn f() { + var foo = ${lhs.create(0).wgsl()}; + foo ${t.params.op}= ${rhs.create(0).wgsl()}; +} +` : + ` +${hasF16 ? 'enable f16;' : ''} +const lhs = ${lhs.create(0).wgsl()}; +const rhs = ${rhs.create(0).wgsl()}; +const foo = lhs ${t.params.op} rhs; +`; + + // The LHS must be an integer, and the RHS must be an abstract/unsigned integer. + // The vector widths must also match. + const lhs_valid = [Type.abstractInt, Type.i32, Type.u32].includes(lhsElement); + const rhs_valid = [Type.abstractInt, Type.u32].includes(rhsElement); + const valid = lhs_valid && rhs_valid && numElementsOf(lhs) === numElementsOf(rhs); + t.expectCompileResult(valid, code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `u32(${e}[0][0])` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `u32(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `u32(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u. +combine('op', ['<<', '>>']). +combine('type', keysOf(kInvalidTypes)). +combine('control', [true, false]). +beginSubcases() +). +fn((t) => { + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${expr} ${t.params.op} ${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); + const kLeftShiftCases = [ // rhs >= bitwidth fails { lhs: `0u`, rhs: `31u`, pass: true }, @@ -56,7 +203,16 @@ const kLeftShiftCases = [ // Shift by negative is an error { lhs: `1`, rhs: `-1`, pass: false }, { lhs: `1i`, rhs: `-1`, pass: false }, -{ lhs: `1u`, rhs: `-1`, pass: false }]; +{ lhs: `1u`, rhs: `-1`, pass: false }, + +// Signed overflow (sign change) for abstract +{ lhs: `1`, rhs: `63`, pass: false }, +{ lhs: `2`, rhs: `62`, pass: false }, +{ + lhs: `${0b0100000000000000000000000000000000000000000000000000000000000000}`, + rhs: `1u`, + pass: false +}]; g.test('shift_left_concrete'). @@ -80,28 +236,6 @@ fn main() { t.expectCompileResult(t.params.case.pass, code); }); -g.test('shift_left_vec_size_mismatch'). -desc('Tests validation of binary left shift of vectors with mismatched sizes'). -params((u) => -u. -combine('vectorize_lhs', [2, 3, 4]) // -.combine('vectorize_rhs', [2, 3, 4]) -). -fn((t) => { - const lhs = `1`; - const rhs = `1`; - const lhs_vec_size = t.params.vectorize_lhs; - const rhs_vec_size = t.params.vectorize_rhs; - const code = ` -@compute @workgroup_size(1) -fn main() { - const r = ${vectorize(lhs, lhs_vec_size)} << ${vectorize(rhs, rhs_vec_size)}; -} - `; - const pass = lhs_vec_size === rhs_vec_size; - t.expectCompileResult(pass, code); -}); - const kRightShiftCases = [ // rhs >= bitwidth fails { lhs: `0u`, rhs: `31u`, pass: true }, @@ -143,24 +277,60 @@ fn main() { t.expectCompileResult(t.params.case.pass, code); }); -g.test('shift_right_vec_size_mismatch'). -desc('Tests validation of binary right shift of vectors with mismatched sizes'). +g.test('shift_left_abstract'). +desc('Validates that the result when the LHS is abstract is also abstract'). +fn((t) => { + const wgsl = ` + const lhs = 0xfffff0000; // too large for 32 bits + const res = lhs << 4u; + const_assert res == 0xfffff00000;`; + t.expectCompileResult(true, wgsl); +}); + +g.test('shift_right_abstract'). +desc('Validates that the result when the LHS is abstract is also abstract'). +fn((t) => { + const wgsl = ` + const lhs = 0xfffff0000; // too large for 32 bits + const res = lhs >> 1u; + const_assert res == 0x7ffff8000;`; + t.expectCompileResult(true, wgsl); +}); + +g.test('partial_eval_errors'). +desc('Tests partial evaluation errors for left shift'). params((u) => u. -combine('vectorize_lhs', [2, 3, 4]) // -.combine('vectorize_rhs', [2, 3, 4]) +combine('op', ['<<', '>>']). +combine('type', ['i32', 'u32']). +beginSubcases(). +combine('stage', ['shader', 'pipeline']). +combine('value', [32, 33, 64]) ). fn((t) => { - const lhs = `1`; - const rhs = `1`; - const lhs_vec_size = t.params.vectorize_lhs; - const rhs_vec_size = t.params.vectorize_rhs; - const code = ` -@compute @workgroup_size(1) -fn main() { - const r = ${vectorize(lhs, lhs_vec_size)} >> ${vectorize(rhs, rhs_vec_size)}; -} - `; - const pass = lhs_vec_size === rhs_vec_size; - t.expectCompileResult(pass, code); + const u32 = Type.u32; + let rhs = 'o'; + if (t.params.stage === 'shader') { + rhs = `${u32.create(t.params.value).wgsl()}`; + } + const wgsl = ` +override o = 0u; +fn foo() { + var v : ${t.params.type} = 0; + let tmp = v ${t.params.op} ${rhs}; +}`; + + const expect = t.params.value <= 32; + if (t.params.stage === 'shader') { + t.expectCompileResult(expect, wgsl); + } else { + const constants = {}; + constants['o'] = t.params.value; + t.expectPipelineResult({ + expectedResult: expect, + code: wgsl, + constants, + reference: ['o'] + }); + } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/comparison.spec.js new file mode 100644 index 00000000000..75ab1b6daa7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/comparison.spec.js @@ -0,0 +1,186 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for comparison expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { + isFloatType, + kAllScalarsAndVectors, + ScalarType, + scalarTypeOf, + Type, + VectorType } from +'../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +// A list of comparison operators and a flag for whether they support boolean values or not. +const kComparisonOperators = { + eq: { op: '==', supportsBool: true }, + ne: { op: '!=', supportsBool: true }, + gt: { op: '>', supportsBool: false }, + ge: { op: '>=', supportsBool: false }, + lt: { op: '<', supportsBool: false }, + le: { op: '<=', supportsBool: false } +}; + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector comparison expressions are only accepted for compatible types. + ` +). +params((u) => +u. +combine('lhs', keysOf(kScalarAndVectorTypes)). +combine( + 'rhs', + // Skip vec3 and vec4 on the RHS to keep the number of subcases down. + keysOf(kScalarAndVectorTypes).filter( + (value) => !(value.startsWith('vec3') || value.startsWith('vec4')) + ) +). +beginSubcases(). +combine('op', keysOf(kComparisonOperators)) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const lhs = kScalarAndVectorTypes[t.params.lhs]; + const rhs = kScalarAndVectorTypes[t.params.rhs]; + const lhsElement = scalarTypeOf(lhs); + const rhsElement = scalarTypeOf(rhs); + const hasF16 = lhsElement === Type.f16 || rhsElement === Type.f16; + const code = ` +${hasF16 ? 'enable f16;' : ''} +const lhs = ${lhs.create(0).wgsl()}; +const rhs = ${rhs.create(0).wgsl()}; +const foo = lhs ${kComparisonOperators[t.params.op].op} rhs; +`; + + let valid = false; + + // Determine if the element types are comparable. + let elementIsCompatible = false; + if (lhsElement === Type.abstractInt) { + // Abstract integers are comparable to any other numeric type. + elementIsCompatible = rhsElement !== Type.bool; + } else if (rhsElement === Type.abstractInt) { + // Abstract integers are comparable to any other numeric type. + elementIsCompatible = lhsElement !== Type.bool; + } else if (lhsElement === Type.abstractFloat) { + // Abstract floats are comparable to any other float type. + elementIsCompatible = isFloatType(rhsElement); + } else if (rhsElement === Type.abstractFloat) { + // Abstract floats are comparable to any other float type. + elementIsCompatible = isFloatType(lhsElement); + } else { + // Non-abstract types are only comparable to values with the exact same type. + elementIsCompatible = lhsElement === rhsElement; + } + + // Determine if the full type is comparable. + if (lhs instanceof ScalarType && rhs instanceof ScalarType) { + valid = elementIsCompatible; + } else if (lhs instanceof VectorType && rhs instanceof VectorType) { + // Vectors are only comparable if the vector widths match. + valid = lhs.width === rhs.width && elementIsCompatible; + } + + if (lhsElement === Type.bool) { + valid &&= kComparisonOperators[t.params.op].supportsBool; + } + + t.expectCompileResult(valid, code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `${e}[0]` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `textureLoad(${e}, vec2(), 0)` + }, + + sampler: { + expr: 's', + control: (e) => `textureSampleLevel(t, ${e}, vec2(), 0)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that comparison expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u. +combine('op', keysOf(kComparisonOperators)). +combine('type', keysOf(kInvalidTypes)). +combine('control', [true, false]). +beginSubcases() +). +fn((t) => { + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${expr} ${kComparisonOperators[t.params.op].op} ${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/div_rem.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/div_rem.spec.js new file mode 100644 index 00000000000..d09d6013055 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/div_rem.spec.js @@ -0,0 +1,285 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for division and remainder expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { assert } from '../../../../../common/util/util.js'; +import { kBit } from '../../../../util/constants.js'; +import { + ScalarType, + Type, + + VectorType, + concreteTypeOf, + isAbstractType, + isConvertible, + kAllScalarsAndVectors, + kConcreteNumericScalarsAndVectors, + scalarTypeOf } from +'../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; +import { + kConstantAndOverrideStages, + validateConstOrOverrideBinaryOpEval } from +'../call/builtin/const_override_validation.js'; + +import { resultType } from './result_type.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators tested in this file. +const kOperators = { + div: { op: '/' }, + rem: { op: '%' } +}; + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); +const kConcreteNumericScalarAndVectorTypes = objectsToRecord(kConcreteNumericScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector expressions are only accepted for compatible numeric types. + ` +). +params((u) => +u. +combine('lhs', keysOf(kScalarAndVectorTypes)). +combine( + 'rhs', + // Skip vec3 and vec4 on the RHS to keep the number of subcases down. + // vec3 + vec3 and vec4 + vec4 is tested in execution tests. + keysOf(kScalarAndVectorTypes).filter( + (value) => !(value.startsWith('vec3') || value.startsWith('vec4')) + ) +). +combine('compound_assignment', [false, true]). +beginSubcases(). +combine('op', keysOf(kOperators)). +combine('rhs_value', [0, 1]) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const op = kOperators[t.params.op]; + const lhs = kScalarAndVectorTypes[t.params.lhs]; + const rhs = kScalarAndVectorTypes[t.params.rhs]; + const lhsElement = scalarTypeOf(lhs); + const rhsElement = scalarTypeOf(rhs); + const hasBool = lhsElement === Type.bool || rhsElement === Type.bool; + const hasF16 = lhsElement === Type.f16 || rhsElement === Type.f16; + const resType = resultType({ lhs, rhs, canConvertScalarToVector: true }); + const resTypeIsTypeable = resType && !isAbstractType(scalarTypeOf(resType)); + const code = t.params.compound_assignment ? + ` +${hasF16 ? 'enable f16;' : ''} +fn f() { + var v = ${lhs.create(0).wgsl()}; + v ${op.op}= ${rhs.create(t.params.rhs_value).wgsl()}; +} +` : + ` +${hasF16 ? 'enable f16;' : ''} +const lhs = ${lhs.create(1).wgsl()}; +const rhs = ${rhs.create(t.params.rhs_value).wgsl()}; +const foo ${resTypeIsTypeable ? `: ${resType}` : ''} = lhs ${op.op} rhs; +`; + + const scalarLHS = scalarTypeOf(concreteTypeOf(lhs)); + const integral = scalarLHS === Type.u32 || scalarLHS === Type.i32; + let valid = !hasBool && resType !== null; + if (valid && t.params.compound_assignment) { + valid = + valid && + isConvertible(resType, concreteTypeOf(lhs)) && ( + !integral || t.params.rhs_value === 1); + } else { + valid = valid && t.params.rhs_value === 1; + } + t.expectCompileResult(valid, code); +}); + +g.test('scalar_vector_out_of_range'). +desc( + ` + Checks that constant or override evaluation of div/rem operations on scalar/vectors that produce out of division by 0 or out of range values cause validation errors. + - Checks for all concrete numeric scalar and vector types, including scalar * vector and vector * scalar. + - Checks for all vector elements that could cause the out of range to happen. + - Checks for valid small cases and 0, also the minimum i32. + ` +). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('lhs', keysOf(kConcreteNumericScalarAndVectorTypes)). +expand('rhs', (p) => { + if (kScalarAndVectorTypes[p.lhs] instanceof VectorType) { + return [p.lhs, scalarTypeOf(kScalarAndVectorTypes[p.lhs]).toString()]; + } + return [p.lhs]; +}). +beginSubcases(). +expand('swap', (p) => { + if (p.lhs === p.rhs) { + return [false]; + } + return [false, true]; +}). +combine('nonOneIndex', [0, 1, 2, 3]). +filter((p) => { + const lType = kScalarAndVectorTypes[p.lhs]; + if (lType instanceof VectorType) { + return lType.width > p.nonOneIndex; + } + return p.nonOneIndex === 0; +}). +expandWithParams((p) => { + const cases = [ + { leftValue: 42, rightValue: 0, error: true, leftRuntime: false }, + { leftValue: 42, rightValue: 0, error: true, leftRuntime: true }, + { leftValue: 0, rightValue: 0, error: true, leftRuntime: true }, + { leftValue: 0, rightValue: 42, error: false, leftRuntime: false }]; + + if (p.lhs === 'i32') { + cases.push({ + leftValue: -kBit.i32.negative.min, + rightValue: -1, + error: true, + leftRuntime: false + }); + cases.push({ + leftValue: -kBit.i32.negative.min + 1, + rightValue: -1, + error: false, + leftRuntime: false + }); + } + return cases; +}). +combine('stage', kConstantAndOverrideStages) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kScalarAndVectorTypes[t.params.lhs]) === Type.f16 || + scalarTypeOf(kScalarAndVectorTypes[t.params.rhs]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const { op, leftValue, rightValue, error, leftRuntime, nonOneIndex, swap } = t.params; + let { lhs, rhs } = t.params; + + // Handle the swapping of LHS and RHS to test all cases of scalar * vector. + if (swap) { + [rhs, lhs] = [lhs, rhs]; + } + + // Creates either a scalar with the value, or a vector with the value only at a specific index. + const create = (type, index, value) => { + if (type instanceof ScalarType) { + return type.create(value); + } else { + assert(type instanceof VectorType); + const values = new Array(type.width); + values.fill(1); + values[index] = value; + return type.create(values); + } + }; + + // Check if there is overflow + validateConstOrOverrideBinaryOpEval( + t, + kOperators[op].op, + !error, + leftRuntime ? 'runtime' : t.params.stage, + create(kScalarAndVectorTypes[lhs], nonOneIndex, leftValue), + t.params.stage, + create(kScalarAndVectorTypes[rhs], nonOneIndex, rightValue) + ); +}); + + + + + + + +const kInvalidTypes = { + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `i32(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `i32(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_type_with_itself'). +desc( + ` + Validates that expressions are never accepted for non-scalar, non-vector, and non-matrix types. + ` +). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('type', keysOf(kInvalidTypes)). +combine('control', [true, false]). +beginSubcases() +). +fn((t) => { + const op = kOperators[t.params.op]; + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${expr} ${op.op} ${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/binary_ops.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/parse.spec.js similarity index 89% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/binary_ops.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/parse.spec.js index d605a762938..cf3ccef3399 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/binary_ops.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/parse.spec.js @@ -1,8 +1,8 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validation tests for binary ops`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../common/util/data_tables.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; +**/export const description = `Validation tests for binary ops`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/result_type.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/result_type.js new file mode 100644 index 00000000000..d7a6d546a34 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/binary/result_type.js @@ -0,0 +1,67 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { isAbstractType, isConvertible, + Type, + + VectorType } from +'../../../../util/conversion.js'; + +/** + * @returns the resulting type of a binary arithmetic operation with the operands `lhs` and `rhs` + */ +export function resultType(args) + + + +{ + const { lhs, rhs, canConvertScalarToVector } = args; + + if (lhs === rhs) { + return lhs; + } + + if (lhs instanceof VectorType && rhs instanceof VectorType) { + // vector vector + if (lhs.width !== rhs.width) { + return null; + } + const elementType = resultType({ + lhs: lhs.elementType, + rhs: rhs.elementType, + canConvertScalarToVector + }); + return elementType !== null ? Type.vec(lhs.width, elementType) : null; + } + + if (args.canConvertScalarToVector) { + if (lhs instanceof VectorType && !(rhs instanceof VectorType)) { + // vector scalar + const elementType = resultType({ + lhs: lhs.elementType, + rhs, + canConvertScalarToVector + }); + return elementType !== null ? Type.vec(lhs.width, elementType) : null; + } + + if (!(lhs instanceof VectorType) && rhs instanceof VectorType) { + // scalar vector + const elementType = resultType({ + lhs, + rhs: rhs.elementType, + canConvertScalarToVector + }); + return elementType !== null ? Type.vec(rhs.width, elementType) : null; + } + } + + if (isAbstractType(lhs) || isAbstractType(rhs)) { + if (isConvertible(lhs, rhs)) { + return rhs; + } + if (isConvertible(rhs, lhs)) { + return lhs; + } + } + return null; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/abs.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/abs.spec.js index 255c8ab2e24..407449d057b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/abs.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/abs.spec.js @@ -6,9 +6,9 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - elementType, - kAllFloatAndIntegerScalarsAndVectors } from + Type, + kAllNumericScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -21,7 +21,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatAndIntegerScalarsAndVectors); +const kValuesTypes = objectsToRecord(kAllNumericScalarsAndVectors); g.test('values'). desc( @@ -38,7 +38,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -51,4 +51,112 @@ fn((t) => { [kValuesTypes[t.params.type].create(t.params.value)], t.params.stage ); +}); + +const kTests = { + valid: { + src: `_ = abs(1);`, + pass: true + }, + alias: { + src: `_ = abs(i32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = abs(false);`, + pass: false + }, + vec_bool: { + src: `_ = abs(vec2(false, true));`, + pass: false + }, + matrix: { + src: `_ = abs(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = abs(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = abs(a);`, + pass: false + }, + array_runtime: { + src: `_ = abs(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = abs(a);`, + pass: false + }, + enumerant: { + src: `_ = abs(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1u; + let p: ptr = &a; + _ = abs(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1u; + let p: ptr = &a; + _ = abs(*p);`, + pass: true + }, + sampler: { + src: `_ = abs(s);`, + pass: false + }, + texture: { + src: `_ = abs(t);`, + pass: false + }, + no_params: { + src: `_ = abs();`, + pass: false + }, + too_many_params: { + src: `_ = abs(1, 2);`, + pass: false + }, + must_use: { + src: `abs(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias i32_alias = i32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acos.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acos.spec.js index d7caeca828b..0c96399268e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acos.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acos.spec.js @@ -6,18 +6,18 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; +import { absBigInt } from '../../../../../util/math.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +25,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,15 +39,23 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinusTwoToTwo, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { - const expectedResult = Math.abs(t.params.value) <= 1; + const expectedResult = + typeof t.params.value === 'bigint' ? + absBigInt(t.params.value) <= 1n : + Math.abs(t.params.value) <= 1; validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,7 +65,8 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -71,8 +80,142 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = acos(1);`, + pass: true + }, + alias: { + src: `_ = acos(f32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = acos(false);`, + pass: false + }, + i32: { + src: `_ = acos(1i);`, + pass: false + }, + u32: { + src: `_ = acos(1u);`, + pass: false + }, + vec_bool: { + src: `_ = acos(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = acos(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = acos(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = acos(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = acos(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = acos(a);`, + pass: false + }, + array_runtime: { + src: `_ = acos(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = acos(a);`, + pass: false + }, + enumerant: { + src: `_ = acos(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = acos(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = acos(*p);`, + pass: true + }, + sampler: { + src: `_ = acos(s);`, + pass: false + }, + texture: { + src: `_ = acos(t);`, + pass: false + }, + no_params: { + src: `_ = acos();`, + pass: false + }, + too_many_params: { + src: `_ = acos(1, 2);`, + pass: false + }, + + greater_then_one: { + src: `_ = acos(1.1f);`, + pass: false + }, + less_then_negative_one: { + src: `_ = acos(-1.1f);`, + pass: false + }, + + must_use: { + src: `acos(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acosh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acosh.spec.js index 037d058fb6e..888c0ad4f74 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acosh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/acosh.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -18,7 +17,7 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -26,7 +25,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,16 +39,25 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(fullRangeForType(kValuesTypes[u.type]), kMinusTwoToTwo)) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.acosh(t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.acosh(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -59,7 +67,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); g.test('integer_argument'). desc( @@ -73,8 +81,137 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, - [type.create(1)], + /* expectedResult */type === Type.f32, + [type.create(type === Type.abstractInt ? 1n : 1)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = acosh(1);`, + pass: true + }, + alias: { + src: `_ = acosh(f32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = acosh(false);`, + pass: false + }, + i32: { + src: `_ = acosh(1i);`, + pass: false + }, + u32: { + src: `_ = acosh(1u);`, + pass: false + }, + vec_bool: { + src: `_ = acosh(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = acosh(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = acosh(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = acosh(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = acosh(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = acosh(a);`, + pass: false + }, + array_runtime: { + src: `_ = acosh(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = acosh(a);`, + pass: false + }, + enumerant: { + src: `_ = acosh(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = acosh(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = acosh(*p);`, + pass: true + }, + sampler: { + src: `_ = acosh(s);`, + pass: false + }, + texture: { + src: `_ = acosh(t);`, + pass: false + }, + no_params: { + src: `_ = acosh();`, + pass: false + }, + too_many_params: { + src: `_ = acosh(1, 2);`, + pass: false + }, + + less_then_one: { + src: `_ = acosh(.9f);`, + pass: false + }, + + must_use: { + src: `acosh(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/all.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/all.spec.js new file mode 100644 index 00000000000..83d2cfaf829 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/all.spec.js @@ -0,0 +1,191 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'all';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, elementTypeOf, kAllScalarsAndVectors } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kArgumentTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('argument_types'). +desc( + ` +Validates that scalar and vector arguments are rejected by ${builtin}() if not bool or vecN +` +). +params((u) => u.combine('type', keysOf(kArgumentTypes))). +fn((t) => { + const type = kArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */elementTypeOf(type) === Type.bool, + [type.create(0)], + 'constant', + /* returnType */Type.bool + ); +}); + +const kTests = { + valid: { + src: `_ = ${builtin}(true);`, + pass: true + }, + alias: { + src: `_ = ${builtin}(bool_alias(true));`, + pass: true + }, + bool: { + src: `_ = ${builtin}(false);`, + pass: true + }, + i32: { + src: `_ = ${builtin}(1i);`, + pass: false + }, + u32: { + src: `_ = ${builtin}(1u);`, + pass: false + }, + f32: { + src: `_ = ${builtin}(1.0f);`, + pass: false + }, + f16: { + src: `_ = ${builtin}(1.0h);`, + pass: false + }, + vec_bool: { + src: `_ = ${builtin}(vec2(false, true));`, + pass: true + }, + vec2_bool_implicit: { + src: `_ = ${builtin}(vec2(false, true));`, + pass: true + }, + vec3_bool_implicit: { + src: `_ = ${builtin}(vec3(true));`, + pass: true + }, + vec_i32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_f32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_f16: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = ${builtin}(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = ${builtin}(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = ${builtin}(a);`, + pass: false + }, + array_runtime: { + src: `_ = ${builtin}(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = ${builtin}(a);`, + pass: false + }, + enumerant: { + src: `_ = ${builtin}(read_write);`, + pass: false + }, + ptr: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(p);`, + pass: false + }, + ptr_deref: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(*p);`, + pass: true + }, + sampler: { + src: `_ = ${builtin}(s);`, + pass: false + }, + texture: { + src: `_ = ${builtin}(t);`, + pass: false + }, + no_args: { + src: `_ = ${builtin}();`, + pass: false + }, + too_many_args: { + src: `_ = ${builtin}(true, true);`, + pass: false + } +}; + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(true); }`); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +beforeAllSubcases((t) => { + if (t.params.test.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const src = kTests[t.params.test].src; + const enables = t.params.test.includes('f16') ? 'enable f16;' : ''; + const code = ` + ${enables} + alias bool_alias = bool; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: bool, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + @vertex + fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); + }`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/any.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/any.spec.js new file mode 100644 index 00000000000..7298c941307 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/any.spec.js @@ -0,0 +1,191 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'any';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, elementTypeOf, kAllScalarsAndVectors } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kArgumentTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('argument_types'). +desc( + ` +Validates that scalar and vector arguments are rejected by ${builtin}() if not bool or vecN +` +). +params((u) => u.combine('type', keysOf(kArgumentTypes))). +fn((t) => { + const type = kArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */elementTypeOf(type) === Type.bool, + [type.create(0)], + 'constant', + /* returnType */Type.bool + ); +}); + +const kTests = { + valid: { + src: `_ = ${builtin}(true);`, + pass: true + }, + alias: { + src: `_ = ${builtin}(bool_alias(true));`, + pass: true + }, + bool: { + src: `_ = ${builtin}(false);`, + pass: true + }, + i32: { + src: `_ = ${builtin}(1i);`, + pass: false + }, + u32: { + src: `_ = ${builtin}(1u);`, + pass: false + }, + f32: { + src: `_ = ${builtin}(1.0f);`, + pass: false + }, + f16: { + src: `_ = ${builtin}(1.0h);`, + pass: false + }, + vec_bool: { + src: `_ = ${builtin}(vec2(false, true));`, + pass: true + }, + vec2_bool_implicit: { + src: `_ = ${builtin}(vec2(false, true));`, + pass: true + }, + vec3_bool_implicit: { + src: `_ = ${builtin}(vec3(true));`, + pass: true + }, + vec_i32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_f32: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + vec_f16: { + src: `_ = ${builtin}(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = ${builtin}(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = ${builtin}(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = ${builtin}(a);`, + pass: false + }, + array_runtime: { + src: `_ = ${builtin}(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = ${builtin}(a);`, + pass: false + }, + enumerant: { + src: `_ = ${builtin}(read_write);`, + pass: false + }, + ptr: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(p);`, + pass: false + }, + ptr_deref: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(*p);`, + pass: true + }, + sampler: { + src: `_ = ${builtin}(s);`, + pass: false + }, + texture: { + src: `_ = ${builtin}(t);`, + pass: false + }, + no_args: { + src: `_ = ${builtin}();`, + pass: false + }, + too_many_args: { + src: `_ = ${builtin}(true, true);`, + pass: false + } +}; + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(true); }`); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +beforeAllSubcases((t) => { + if (t.params.test.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const src = kTests[t.params.test].src; + const enables = t.params.test.includes('f16') ? 'enable f16;' : ''; + const code = ` + ${enables} + alias bool_alias = bool; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: bool, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + @vertex + fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); + }`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.js index 9a18b77e36f..65c557156b5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.js @@ -106,4 +106,16 @@ fn main() { }`; t.expectCompileResult(t.params.mode !== 'write', code); +}); + +g.test('must_use'). +desc('Test that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var v : array; + fn foo() { + ${t.params.use ? '_ =' : ''} arrayLength(&v); + }`; + t.expectCompileResult(t.params.use, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asin.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asin.spec.js index ec5c51fe15b..e12dbf6b2b8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asin.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asin.spec.js @@ -6,18 +6,18 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; +import { absBigInt } from '../../../../../util/math.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +25,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,15 +39,23 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinusTwoToTwo, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { - const expectedResult = Math.abs(t.params.value) <= 1; + const expectedResult = + typeof t.params.value === 'bigint' ? + absBigInt(t.params.value) <= 1n : + Math.abs(t.params.value) <= 1; validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,7 +65,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -71,8 +79,142 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = asin(1);`, + pass: true + }, + alias: { + src: `_ = asin(f32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = asin(false);`, + pass: false + }, + i32: { + src: `_ = asin(1i);`, + pass: false + }, + u32: { + src: `_ = asin(1u);`, + pass: false + }, + vec_bool: { + src: `_ = asin(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = asin(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = asin(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = asin(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = asin(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = asin(a);`, + pass: false + }, + array_runtime: { + src: `_ = asin(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = asin(a);`, + pass: false + }, + enumerant: { + src: `_ = asin(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = asin(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = asin(*p);`, + pass: true + }, + sampler: { + src: `_ = asin(s);`, + pass: false + }, + texture: { + src: `_ = asin(t);`, + pass: false + }, + no_params: { + src: `_ = asin();`, + pass: false + }, + too_many_params: { + src: `_ = asin(1, 2);`, + pass: false + }, + + greater_then_one: { + src: `_ = asin(1.1f);`, + pass: false + }, + less_then_negative_one: { + src: `_ = asin(-1.1f);`, + pass: false + }, + + must_use: { + src: `asin(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asinh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asinh.spec.js index ccc73de0fce..d958d09ba6d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asinh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/asinh.spec.js @@ -6,19 +6,19 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf, + Type } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; -import { linearRange } from '../../../../../util/math.js'; +import { linearRange, linearRangeBigInt } from '../../../../../util/math.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, + rangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -26,7 +26,12 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +const additionalRangeForType = rangeForType( + linearRange(-2000, 2000, 10), + linearRangeBigInt(-2000n, 2000n, 10) +); g.test('values'). desc( @@ -41,17 +46,21 @@ combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). expand('value', (u) => -unique(fullRangeForType(kValuesTypes[u.type]), linearRange(-2000, 2000, 10)) +unique(fullRangeForType(kValuesTypes[u.type]), additionalRangeForType(kValuesTypes[u.type])) ) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.asinh(t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.asinh(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -61,7 +70,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -75,8 +84,133 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = asinh(1);`, + pass: true + }, + alias: { + src: `_ = asinh(f32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = asinh(false);`, + pass: false + }, + i32: { + src: `_ = asinh(1i);`, + pass: false + }, + u32: { + src: `_ = asinh(1u);`, + pass: false + }, + vec_bool: { + src: `_ = asinh(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = asinh(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = asinh(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = asinh(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = asinh(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = asinh(a);`, + pass: false + }, + array_runtime: { + src: `_ = asinh(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = asinh(a);`, + pass: false + }, + enumerant: { + src: `_ = asinh(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = asinh(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = asinh(*p);`, + pass: true + }, + sampler: { + src: `_ = asinh(s);`, + pass: false + }, + texture: { + src: `_ = asinh(t);`, + pass: false + }, + no_params: { + src: `_ = asinh();`, + pass: false + }, + too_many_params: { + src: `_ = asinh(1, 2);`, + pass: false + }, + + must_use: { + src: `asinh(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan.spec.js index 2cd971e678d..4c4c9ab70bf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan.spec.js @@ -6,18 +6,17 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinus3PiTo3Pi, + minusThreePiToThreePiRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,10 +38,15 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -58,7 +62,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -72,8 +76,133 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = atan(1);`, + pass: true + }, + alias: { + src: `_ = atan(f32_alias(1));`, + pass: true + }, + + bool: { + src: `_ = atan(false);`, + pass: false + }, + i32: { + src: `_ = atan(1i);`, + pass: false + }, + u32: { + src: `_ = atan(1u);`, + pass: false + }, + vec_bool: { + src: `_ = atan(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = atan(vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = atan(vec2(1, 1));`, + pass: false + }, + matrix: { + src: `_ = atan(mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = atan(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = atan(a);`, + pass: false + }, + array_runtime: { + src: `_ = atan(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = atan(a);`, + pass: false + }, + enumerant: { + src: `_ = atan(read_write);`, + pass: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = atan(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = atan(*p);`, + pass: true + }, + sampler: { + src: `_ = atan(s);`, + pass: false + }, + texture: { + src: `_ = atan(t);`, + pass: false + }, + no_params: { + src: `_ = atan();`, + pass: false + }, + too_many_params: { + src: `_ = atan(1, 2);`, + pass: false + }, + + must_use: { + src: `atan(1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan2.spec.js index e0fded50b14..2a5a558c877 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atan2.spec.js @@ -6,13 +6,13 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - Vector, - VectorType, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + VectorValue, + kFloatScalarsAndVectors, + kConcreteIntegerScalarsAndVectors, + kAllMatrices, + kAllBoolScalarsAndVectors, + scalarTypeOf, + Type } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -20,7 +20,7 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kSparseMinus3PiTo3Pi, + sparseMinusThreePiToThreePiRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -28,7 +28,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kFloatScalarsAndVectors); g.test('values'). desc( @@ -42,19 +42,29 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('y', (u) => unique(kSparseMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type], 4))). -expand('x', (u) => unique(kSparseMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type], 4))) +expand('y', (u) => +unique( + sparseMinusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type], 4) +) +). +expand('x', (u) => +unique( + sparseMinusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type], 4) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; const expectedResult = isRepresentable( - Math.abs(Math.atan2(t.params.y, t.params.x)), - elementType(type) + Math.abs(Math.atan2(Number(t.params.x), Number(t.params.y))), + scalarTypeOf(type) ); validateConstOrOverrideBuiltinEval( t, @@ -65,42 +75,282 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kInvalidArgumentTypes = objectsToRecord([ +Type.f32, +...kConcreteIntegerScalarsAndVectors, +...kAllBoolScalarsAndVectors, +...kAllMatrices] +); -g.test('integer_argument_y'). +g.test('invalid_argument_y'). desc( ` Validates that scalar and vector integer arguments are rejected by ${builtin}() ` ). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +params((u) => u.combine('type', keysOf(kInvalidArgumentTypes))). fn((t) => { - const yTy = kIntegerArgumentTypes[t.params.type]; - const xTy = yTy instanceof Vector ? new VectorType(yTy.size, TypeF32) : TypeF32; + const yTy = kInvalidArgumentTypes[t.params.type]; + const xTy = yTy instanceof VectorValue ? Type.vec(yTy.size, Type.f32) : Type.f32; validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */yTy === TypeF32, + /* expectedResult */yTy === Type.f32, [yTy.create(1), xTy.create(1)], 'constant' ); }); -g.test('integer_argument_x'). +g.test('invalid_argument_x'). desc( ` Validates that scalar and vector integer arguments are rejected by ${builtin}() ` ). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +params((u) => u.combine('type', keysOf(kInvalidArgumentTypes))). fn((t) => { - const xTy = kIntegerArgumentTypes[t.params.type]; - const yTy = xTy instanceof Vector ? new VectorType(xTy.size, TypeF32) : TypeF32; + const xTy = kInvalidArgumentTypes[t.params.type]; + const yTy = xTy instanceof VectorValue ? Type.vec(xTy.size, Type.f32) : Type.f32; validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */xTy === TypeF32, + /* expectedResult */xTy === Type.f32, [yTy.create(1), xTy.create(1)], 'constant' ); +}); + +const kTests = { + af: { + src: `_ = atan2(1.2, 2.2);`, + pass: true, + is_f16: false + }, + ai: { + src: `_ = atan2(1, 2);`, + pass: true, + is_f16: false + }, + ai_af: { + src: `_ = atan2(1, 2.1);`, + pass: true, + is_f16: false + }, + af_ai: { + src: `_ = atan2(1.2, 2);`, + pass: true, + is_f16: false + }, + ai_f32: { + src: `_ = atan2(1, 1.2f);`, + pass: true, + is_f16: false + }, + f32_ai: { + src: `_ = atan2(1.2f, 1);`, + pass: true, + is_f16: false + }, + af_f32: { + src: `_ = atan2(1.2, 2.2f);`, + pass: true, + is_f16: false + }, + f32_af: { + src: `_ = atan2(2.2f, 1.2);`, + pass: true, + is_f16: false + }, + f16_ai: { + src: `_ = atan2(1.2h, 1);`, + pass: true, + is_f16: true + }, + ai_f16: { + src: `_ = atan2(1, 1.2h);`, + pass: true, + is_f16: true + }, + af_f16: { + src: `_ = atan2(1.2, 1.2h);`, + pass: true, + is_f16: true + }, + f16_af: { + src: `_ = atan2(1.2h, 1.2);`, + pass: true, + is_f16: true + }, + + mixed_types: { + src: `_ = atan2(1.2f, vec2(1.2f));`, + pass: false, + is_f16: false + }, + mixed_types_2: { + src: `_ = atan2(vec2(1.2f), 1.2f);`, + pass: false, + is_f16: false + }, + f16_f32: { + src: `_ = atan2(1.2h, 1.2f);`, + pass: false, + is_f16: true + }, + u32_f32: { + src: `_ = atan2(1u, 1.2f);`, + pass: false, + is_f16: false + }, + f32_u32: { + src: `_ = atan2(1.2f, 1u);`, + pass: false, + is_f16: false + }, + f32_i32: { + src: `_ = atan2(1.2f, 1i);`, + pass: false, + is_f16: false + }, + i32_f32: { + src: `_ = atan2(1i, 1.2f);`, + pass: false, + is_f16: false + }, + f32_bool: { + src: `_ = atan2(1.2f, true);`, + pass: false, + is_f16: false + }, + bool_f32: { + src: `_ = atan2(false, 1.2f);`, + pass: false, + is_f16: false + }, + vec_f32: { + src: `_ = atan2(vec2(1i), vec2(1.2f));`, + pass: false, + is_f16: false + }, + f32_vec: { + src: `_ = atan2(vec2(1.2f), vec2(1i));`, + pass: false, + is_f16: false + }, + matrix: { + src: `_ = atan2(mat2x2(1, 1, 1, 1), mat2x2(1, 1, 1, 1));`, + pass: false, + is_f16: false + }, + atomic: { + src: ` _ = atan2(a, a);`, + pass: false, + is_f16: false + }, + array: { + src: `var a: array; + _ = atan2(a, a);`, + pass: false, + is_f16: false + }, + array_runtime: { + src: `_ = atan2(k.arry, k.arry);`, + pass: false, + is_f16: false + }, + struct: { + src: `var a: A; + _ = atan2(a, a);`, + pass: false, + is_f16: false + }, + enumerant: { + src: `_ = atan2(read_write, read_write);`, + pass: false, + is_f16: false + }, + ptr: { + src: `var a = 1f; + let p: ptr = &a; + _ = atan2(p, p);`, + pass: false, + is_f16: false + }, + ptr_deref: { + src: `var a = 1f; + let p: ptr = &a; + _ = atan2(*p, *p);`, + pass: true, + is_f16: false + }, + sampler: { + src: `_ = atan2(s, s);`, + pass: false, + is_f16: false + }, + texture: { + src: `_ = atan2(t, t);`, + pass: false, + is_f16: false + }, + no_params: { + src: `_ = atan2();`, + pass: false, + is_f16: false + }, + too_many_params: { + src: `_ = atan2(1, 2, 3);`, + pass: false, + is_f16: false + }, + + must_use: { + src: `atan2(1, 2);`, + pass: false, + is_f16: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +${kTests[t.params.test].is_f16 ? 'enable f16;' : ''} +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1, 2); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atanh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atanh.spec.js index e252551219b..4218dcbc550 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atanh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atanh.spec.js @@ -6,18 +6,18 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; +import { absBigInt } from '../../../../../util/math.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +25,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,15 +39,23 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinusTwoToTwo, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { - const expectedResult = Math.abs(t.params.value) < 1; + const expectedResult = + typeof t.params.value === 'bigint' ? + absBigInt(t.params.value) < 1n : + Math.abs(t.params.value) < 1; validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,7 +65,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -71,8 +79,150 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = { + valid: { + src: `_ = atanh(.1);`, + pass: true + }, + alias: { + src: `_ = atanh(f32_alias(.1));`, + pass: true + }, + + bool: { + src: `_ = atanh(false);`, + pass: false + }, + i32: { + src: `_ = atanh(0i);`, + pass: false + }, + u32: { + src: `_ = atanh(0u);`, + pass: false + }, + vec_bool: { + src: `_ = atanh(vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = atanh(vec2(0, 0));`, + pass: false + }, + vec_u32: { + src: `_ = atanh(vec2(0, 0));`, + pass: false + }, + matrix: { + src: `_ = atanh(mat2x2(0, 0, 0, 0));`, + pass: false + }, + atomic: { + src: ` _ = atanh(a);`, + pass: false + }, + array: { + src: `var a: array; + _ = atanh(a);`, + pass: false + }, + array_runtime: { + src: `_ = atanh(k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = atanh(a);`, + pass: false + }, + enumerant: { + src: `_ = atanh(read_write);`, + pass: false + }, + ptr: { + src: `var a = 0f; + let p: ptr = &a; + _ = atanh(p);`, + pass: false + }, + ptr_deref: { + src: `var a = 0f; + let p: ptr = &a; + _ = atanh(*p);`, + pass: true + }, + sampler: { + src: `_ = atanh(s);`, + pass: false + }, + texture: { + src: `_ = atanh(t);`, + pass: false + }, + no_params: { + src: `_ = atanh();`, + pass: false + }, + too_many_params: { + src: `_ = atanh(0, .2);`, + pass: false + }, + + one: { + src: `_ = atanh(1f);`, + pass: false + }, + greater_then_one: { + src: `_ = atanh(1.1f);`, + pass: false + }, + negative_one: { + src: `_ = atanh(-1f);`, + pass: false + }, + less_then_negative_one: { + src: `_ = atanh(-1.1f);`, + pass: false + }, + + must_use: { + src: `atanh(0.1);`, + pass: false + } +}; + +g.test('parameters'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.test].src; + const code = ` +alias f32_alias = f32; + +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: texture_2d; + +var a: atomic; + +struct A { + i: u32, +} +struct B { + arry: array, +} +@group(0) @binding(3) var k: B; + + +@vertex +fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atomics.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atomics.spec.js index 3d51650c95d..8e413b6ee5c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atomics.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/atomics.spec.js @@ -8,18 +8,44 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); + + + + const kAtomicOps = { - add: { src: 'atomicAdd(&a,1)' }, - sub: { src: 'atomicSub(&a,1)' }, - max: { src: 'atomicMax(&a,1)' }, - min: { src: 'atomicMin(&a,1)' }, - and: { src: 'atomicAnd(&a,1)' }, - or: { src: 'atomicOr(&a,1)' }, - xor: { src: 'atomicXor(&a,1)' }, - load: { src: 'atomicLoad(&a)' }, - store: { src: 'atomicStore(&a,1)' }, - exchange: { src: 'atomicExchange(&a,1)' }, - compareexchangeweak: { src: 'atomicCompareExchangeWeak(&a,1,1)' } + add: (a) => { + return `atomicAdd(${a},1)`; + }, + sub: (a) => { + return `atomicSub(${a},1)`; + }, + max: (a) => { + return `atomicMax(${a},1)`; + }, + min: (a) => { + return `atomicMin(${a},1)`; + }, + and: (a) => { + return `atomicAnd(${a},1)`; + }, + or: (a) => { + return `atomicOr(${a},1)`; + }, + xor: (a) => { + return `atomicXor(${a},1)`; + }, + load: (a) => { + return `atomicLoad(${a})`; + }, + store: (a) => { + return `atomicStore(${a},1)`; + }, + exchange: (a) => { + return `atomicExchange(${a},1)`; + }, + compareexchangeweak: (a) => { + return `atomicCompareExchangeWeak(${a},1,1)`; + } }; g.test('stage'). @@ -35,7 +61,7 @@ combine('stage', ['fragment', 'vertex', 'compute']) // .combine('atomicOp', keysOf(kAtomicOps)) ). fn((t) => { - const atomicOp = kAtomicOps[t.params.atomicOp].src; + const atomicOp = kAtomicOps[t.params.atomicOp](`&a`); let code = ` @group(0) @binding(0) var a: atomic; `; @@ -67,4 +93,220 @@ fn((t) => { const pass = t.params.stage !== 'vertex'; t.expectCompileResult(pass, code); +}); + +function generateAtomicCode( +type, +access, +aspace, +style, +op) +{ + let moduleVar = ``; + let functionVar = ``; + let param = ``; + let aParam = ``; + if (style === 'var') { + aParam = `&a`; + switch (aspace) { + case 'storage': + moduleVar = `@group(0) @binding(0) var a : atomic<${type}>;\n`; + break; + case 'workgroup': + moduleVar = `var a : atomic<${type}>;\n`; + break; + case 'uniform': + moduleVar = `@group(0) @binding(0) var a : atomic<${type}>;\n`; + break; + case 'private': + moduleVar = `var a : atomic<${type}>;\n`; + break; + case 'function': + functionVar = `var a : atomic<${type}>;\n`; + break; + default: + break; + } + } else { + const aspaceParam = aspace === 'storage' ? `, ${access}` : ``; + param = `p : ptr<${aspace}, atomic<${type}>${aspaceParam}>`; + aParam = `p`; + } + + return ` +${moduleVar} +fn foo(${param}) { + ${functionVar} + ${kAtomicOps[op](aParam)}; +} +`; +} + +g.test('atomic_parameterization'). +desc('Tests the valid atomic parameters'). +params((u) => +u. +combine('op', keysOf(kAtomicOps)). +beginSubcases(). +combine('aspace', ['storage', 'workgroup', 'private', 'uniform', 'function']). +combine('access', ['read', 'read_write']). +combine('type', ['i32', 'u32']). +combine('style', ['param', 'var']). +filter((t) => { + switch (t.aspace) { + case 'uniform': + return t.style === 'param' && t.access === 'read'; + case 'workgroup': + return t.access === 'read_write'; + case 'function': + case 'private': + return t.style === 'param' && t.access === 'read_write'; + default: + return true; + } +}) +). +fn((t) => { + if ( + t.params.style === 'param' && + !(t.params.aspace === 'function' || t.params.aspace === 'private')) + { + t.skipIfLanguageFeatureNotSupported('unrestricted_pointer_parameters'); + } + + const aspaceOK = t.params.aspace === 'storage' || t.params.aspace === 'workgroup'; + const accessOK = t.params.access === 'read_write'; + t.expectCompileResult( + aspaceOK && accessOK, + generateAtomicCode( + t.params.type, + t.params.access, + t.params.aspace, + t.params.style, + t.params.op + ) + ); +}); + +g.test('data_parameters'). +desc('Validates that data parameters must match atomic type (or be implicitly convertible)'). +params((u) => +u. +combine('op', [ +'atomicStore', +'atomicAdd', +'atomicSub', +'atomicMax', +'atomicMin', +'atomicAnd', +'atomicOr', +'atomicXor', +'atomicExchange', +'atomicCompareExchangeWeak1', +'atomicCompareExchangeWeak2'] +). +beginSubcases(). +combine('atomicType', ['i32', 'u32']). +combine('dataType', ['i32', 'u32', 'f32', 'AbstractInt']) +). +fn((t) => { + let dataValue = ''; + switch (t.params.dataType) { + case 'i32': + dataValue = '1i'; + break; + case 'u32': + dataValue = '1u'; + break; + case 'f32': + dataValue = '1f'; + break; + case 'AbstractInt': + dataValue = '1'; + break; + } + let op = ''; + switch (t.params.op) { + case 'atomicCompareExchangeWeak1': + op = `atomicCompareExchangeWeak(&a, ${dataValue}, 1)`; + break; + case 'atomicCompareExchangeWeak2': + op = `atomicCompareExchangeWeak(&a, 1, ${dataValue})`; + break; + default: + op = `${t.params.op}(&a, ${dataValue})`; + break; + } + const code = ` +var a : atomic<${t.params.atomicType}>; +fn foo() { + ${op}; +} +`; + + const expect = t.params.atomicType === t.params.dataType || t.params.dataType === 'AbstractInt'; + t.expectCompileResult(expect, code); +}); + +g.test('return_types'). +desc('Validates return types of atomics'). +params((u) => +u. +combine('op', keysOf(kAtomicOps)). +beginSubcases(). +combine('atomicType', ['i32', 'u32']). +combine('returnType', ['i32', 'u32', 'f32']) +). +fn((t) => { + let op = `${kAtomicOps[t.params.op]('&a')}`; + switch (t.params.op) { + case 'compareexchangeweak': + op = `let tmp : ${t.params.returnType} = ${op}.old_value`; + break; + default: + op = `let tmp : ${t.params.returnType} = ${op}`; + break; + } + const code = ` +var a : atomic<${t.params.atomicType}>; +fn foo() { + ${op}; +} +`; + + const expect = t.params.atomicType === t.params.returnType && t.params.op !== 'store'; + t.expectCompileResult(expect, code); +}); + +g.test('non_atomic'). +desc('Test that non-atomic integers are rejected by all atomic functions.'). +params((u) => +u. +combine('op', keysOf(kAtomicOps)). +combine('addrspace', ['storage', 'workgroup']). +combine('type', ['i32', 'u32']). +combine('atomic', [true, false]) +). +fn((t) => { + let type = t.params.type; + if (t.params.atomic) { + type = `atomic<${type}>`; + } + + let decl = ''; + if (t.params.addrspace === 'storage') { + decl = `@group(0) @binding(0) var a : ${type}`; + } else if (t.params.addrspace === 'workgroup') { + decl = `var a : ${type}`; + } + + const op = `${kAtomicOps[t.params.op]('&a')}`; + const code = ` +${decl}; +fn foo() { + ${op}; +} +`; + + t.expectCompileResult(t.params.atomic, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/bitcast.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/bitcast.spec.js index 71ef456929d..613798288dd 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/bitcast.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/bitcast.spec.js @@ -390,4 +390,25 @@ fn main() { let dst = bitcast<${dst_type}>(src); }`; t.expectCompileResult(true, code); +}); + +g.test('must_use'). +desc('Test that bitcast result must be used'). +params((u) => +u. +combine('case', [ +'bitcast(1i)', +'bitcast(1u)', +'bitcast(vec2i())', +'bitcast(vec3u())', +'bitcast(vec4f())'] +). +combine('use', [true, false]) +). +fn((t) => { + const code = ` + fn foo() { + ${t.params.use ? '_ =' : ''} ${t.params.case}; + }`; + t.expectCompileResult(t.params.use, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ceil.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ceil.spec.js index 714846eba8c..ed3fbc984a8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ceil.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ceil.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,8 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +69,136 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1.0f)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1.f,2.f)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(f32_alias(1.f))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1.f,1.f,1.f,1.f))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: f32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1.0f); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/clamp.spec.js index ae83f29898c..e55db09017c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/clamp.spec.js @@ -6,9 +6,11 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - elementType, - kAllFloatAndIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + kConcreteIntegerScalarsAndVectors, + scalarTypeOf, + isConvertible } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -21,7 +23,10 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatAndIntegerScalarsAndVectors); +const kValuesTypes = objectsToRecord([ +...kConvertableToFloatScalarsAndVectors, +...kConcreteIntegerScalarsAndVectors] +); g.test('values'). desc( @@ -40,7 +45,7 @@ expand('low', (u) => fullRangeForType(kValuesTypes[u.type], 4)). expand('high', (u) => fullRangeForType(kValuesTypes[u.type], 4)) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -54,4 +59,256 @@ fn((t) => { [type.create(t.params.e), type.create(t.params.low), type.create(t.params.high)], t.params.stage ); +}); + +g.test('mismatched'). +desc( + ` +Validates that even with valid types, if types do not match, ${builtin}() errors +` +). +params((u) => +u. +combine('e', keysOf(kValuesTypes)). +beginSubcases(). +combine('low', keysOf(kValuesTypes)). +combine('high', keysOf(kValuesTypes)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.e]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const e = kValuesTypes[t.params.e]; + const low = kValuesTypes[t.params.low]; + const high = kValuesTypes[t.params.high]; + + // Skip if shader-16 isn't available. + t.skipIf(scalarTypeOf(low) === Type.f16 || scalarTypeOf(high) === Type.f16); + + // If there exists 1 type of the 3 args that the other 2 can be converted into, then the args + // are valid. + const expectedResult = + isConvertible(low, e) && isConvertible(high, e) || + isConvertible(e, low) && isConvertible(high, low) || + isConvertible(e, high) && isConvertible(low, high); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [e.create(1), low.create(0), high.create(2)], + 'constant' + ); +}); + +const kStages = ['constant', 'override', 'runtime']; + +g.test('low_high'). +desc( + ` +Validates that low <= high. +` +). +params((u) => +u. +combine('type', keysOf(kValuesTypes)). +combine('lowStage', kStages). +combine('highStage', kStages). +beginSubcases(). +combineWithParams([ +{ low: 0, high: 1 }, +{ low: 1, high: 1 }, +{ low: 1, high: 0 }] +). +filter((t) => { + // Avoid abstracts since the runtime value will force concretization. + const ty = kValuesTypes[t.type]; + const scalar = scalarTypeOf(ty); + return scalar !== Type.abstractInt && scalar !== Type.abstractFloat; +}) +). +beforeAllSubcases((t) => { + const ty = kValuesTypes[t.params.type]; + if (ty.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const ty = kValuesTypes[t.params.type]; + const scalar = scalarTypeOf(ty); + let low_arg = ''; + let high_arg = ''; + switch (t.params.lowStage) { + case 'constant': + low_arg = `${ty.create(t.params.low).wgsl()}`; + break; + case 'override': + low_arg = `${ty.toString()}(o_low)`; + break; + case 'runtime': + low_arg = 'v_low'; + break; + } + switch (t.params.highStage) { + case 'constant': + high_arg = `${ty.create(t.params.high).wgsl()}`; + break; + case 'override': + high_arg = `${ty.toString()}(o_high)`; + break; + case 'runtime': + high_arg = 'v_high'; + break; + } + const enable = `${ty.requiresF16() ? 'enable f16;' : ''}`; + const wgsl = ` +${enable} +override o_low : ${scalar}; +override o_high : ${scalar}; +fn foo() { + var v_low : ${t.params.type}; + var v_high : ${t.params.type}; + var v : ${t.params.type}; + let tmp = clamp(v, ${low_arg}, ${high_arg}); +}`; + const error = t.params.low > t.params.high; + const shader_error = + error && t.params.lowStage === 'constant' && t.params.highStage === 'constant'; + const pipeline_error = + error && t.params.lowStage !== 'runtime' && t.params.highStage !== 'runtime'; + t.expectCompileResult(!shader_error, wgsl); + if (!shader_error) { + const constants = {}; + constants['o_low'] = t.params.low; + constants['o_high'] = t.params.high; + t.expectPipelineResult({ + expectedResult: !pipeline_error, + code: wgsl, + constants, + reference: ['o_low', 'o_high'] + }); + } +}); + +g.test('low_high_abstract'). +desc('Values low <= high for abstracts'). +params((u) => +u. +combine('type', ['abstract-int', 'abstract-float']). +beginSubcases(). +combineWithParams([ +{ low: 0, high: 1 }, +{ low: 1, high: 1 }, +{ low: 1, high: 0 }] +) +). +fn((t) => { + const ty = kValuesTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */t.params.low <= t.params.high, + [ty.create(1), ty.create(t.params.low), ty.create(t.params.high)], + 'constant' + ); +}); + + + + + + + + + + +function typesToArguments(types, pass) { + return types.reduce( + (res, type) => ({ + ...res, + [type.toString()]: { arg: type.create(0).wgsl(), pass } + }), + {} + ); +} + +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kInputArgTypes = { + ...typesToArguments([Type.f32], true), + ...typesToArguments([Type.bool, Type.mat2x2f], false), + alias: { arg: 'f32_alias(1.f)', pass: true }, + vec_bool: { arg: 'vec2(false,true)', pass: false }, + atomic: { arg: 'a', pass: false }, + array: { + preamble: 'var arry: array;', + arg: 'arry', + pass: false + }, + array_runtime: { arg: 'k.arry', pass: false }, + struct: { + preamble: 'var x: A;', + arg: 'x', + pass: false + }, + enumerant: { arg: 'read_write', pass: false }, + ptr: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + arg: 'p', + pass: false + }, + ptr_deref: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + arg: '*p', + pass: true + }, + sampler: { arg: 's', pass: false }, + texture: { arg: 't', pass: false } +}; + +g.test('arguments'). +desc( + ` +Test compilation validation of ${builtin} with variously typed arguments + - Note that this passes the same type for all args. Mismatching types are tested separately above. +` +). +params((u) => u.combine('type', keysOf(kInputArgTypes))). +fn((t) => { + const type = kInputArgTypes[t.params.type]; + t.expectCompileResult( + type.pass, + `alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${type.preamble ? type.preamble : ''} + _ = ${builtin}(${type.arg},${type.arg},${type.arg}); + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1.f,0.f,1.f); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/const_override_validation.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/const_override_validation.js index 0b61930d724..c9a6e64cb98 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/const_override_validation.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/const_override_validation.js @@ -2,105 +2,142 @@ * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { assert, unreachable } from '../../../../../../common/util/util.js';import { kValue } from '../../../../../util/constants.js';import { - TypeF16, + Type, - elementType, - elementsOf, - isAbstractType } from + elementTypeOf, + isAbstractType, + scalarElementsOf, + scalarTypeOf } from '../../../../../util/conversion.js'; import { scalarF16Range, scalarF32Range, scalarF64Range, - linearRange } from + linearRange, + linearRangeBigInt, + quantizeToF32, + quantizeToF16 } from + '../../../../../util/math.js'; -/// A linear sweep between -2 to 2 -export const kMinusTwoToTwo = linearRange(-2, 2, 10); +/** @returns a function that can select between ranges depending on type */ +export function rangeForType( +number_range, +bigint_range) +{ + return (type) => { + switch (scalarTypeOf(type).kind) { + case 'abstract-float': + case 'f32': + case 'f16': + return number_range; + case 'abstract-int': + return bigint_range; + } + unreachable(`Received unexpected type '${type}'`); + }; +} -/// An array of values ranging from -3π to 3π, with a focus on multiples of π -export const kMinus3PiTo3Pi = [ --3 * Math.PI, --2.999 * Math.PI, +/* @returns a linear sweep between -2 to 2 for type */ --2.501 * Math.PI, --2.5 * Math.PI, --2.499 * Math.PI, +export const minusTwoToTwoRangeForType = rangeForType( + linearRange(-2, 2, 10), + [-2n, -1n, 0n, 1n, 2n] +); --2.001 * Math.PI, --2.0 * Math.PI, --1.999 * Math.PI, +/* @returns array of values ranging from -3π to 3π, with a focus on multiples of π */ +export const minusThreePiToThreePiRangeForType = rangeForType( + [ + -3 * Math.PI, + -2.999 * Math.PI, --1.501 * Math.PI, --1.5 * Math.PI, --1.499 * Math.PI, + -2.501 * Math.PI, + -2.5 * Math.PI, + -2.499 * Math.PI, --1.001 * Math.PI, --1.0 * Math.PI, --0.999 * Math.PI, + -2.001 * Math.PI, + -2.0 * Math.PI, + -1.999 * Math.PI, --0.501 * Math.PI, --0.5 * Math.PI, --0.499 * Math.PI, + -1.501 * Math.PI, + -1.5 * Math.PI, + -1.499 * Math.PI, --0.001, -0, -0.001, + -1.001 * Math.PI, + -1.0 * Math.PI, + -0.999 * Math.PI, -0.499 * Math.PI, -0.5 * Math.PI, -0.501 * Math.PI, + -0.501 * Math.PI, + -0.5 * Math.PI, + -0.499 * Math.PI, -0.999 * Math.PI, -1.0 * Math.PI, -1.001 * Math.PI, + -0.001, + 0, + 0.001, -1.499 * Math.PI, -1.5 * Math.PI, -1.501 * Math.PI, + 0.499 * Math.PI, + 0.5 * Math.PI, + 0.501 * Math.PI, -1.999 * Math.PI, -2.0 * Math.PI, -2.001 * Math.PI, + 0.999 * Math.PI, + 1.0 * Math.PI, + 1.001 * Math.PI, -2.499 * Math.PI, -2.5 * Math.PI, -2.501 * Math.PI, + 1.499 * Math.PI, + 1.5 * Math.PI, + 1.501 * Math.PI, -2.999 * Math.PI, -3 * Math.PI]; + 1.999 * Math.PI, + 2.0 * Math.PI, + 2.001 * Math.PI, + 2.499 * Math.PI, + 2.5 * Math.PI, + 2.501 * Math.PI, -/// A minimal array of values ranging from -3π to 3π, with a focus on multiples -/// of π. Used when multiple parameters are being passed in, so the number of -/// cases becomes the square or more of this list. -export const kSparseMinus3PiTo3Pi = [ --3 * Math.PI, --2.5 * Math.PI, --2.0 * Math.PI, --1.5 * Math.PI, --1.0 * Math.PI, --0.5 * Math.PI, -0, -0.5 * Math.PI, -Math.PI, -1.5 * Math.PI, -2.0 * Math.PI, -2.5 * Math.PI, -3 * Math.PI]; + 2.999 * Math.PI, + 3 * Math.PI], + [-2n, -1n, 0n, 1n, 2n] +); + +/** + * @returns a minimal array of values ranging from -3π to 3π, with a focus on + * multiples of π. + * + * Used when multiple parameters are being passed in, so the number of cases + * becomes the square or more of this list. */ +export const sparseMinusThreePiToThreePiRangeForType = rangeForType( + [ + -3 * Math.PI, + -2.5 * Math.PI, + -2.0 * Math.PI, + -1.5 * Math.PI, + -1.0 * Math.PI, + -0.5 * Math.PI, + 0, + 0.5 * Math.PI, + Math.PI, + 1.5 * Math.PI, + 2.0 * Math.PI, + 2.5 * Math.PI, + 3 * Math.PI], + + [-2n, -1n, 0n, 1n, 2n] +); /// The evaluation stages to test export const kConstantAndOverrideStages = ['constant', 'override']; + /** * @returns true if evaluation stage `stage` supports expressions of type @p. */ export function stageSupportsType(stage, type) { - if (stage === 'override' && isAbstractType(elementType(type))) { + if (stage === 'override' && isAbstractType(elementTypeOf(type))) { // Abstract numerics are concretized before being used in an override expression. return false; } @@ -115,23 +152,26 @@ export function stageSupportsType(stage, type) { * @param expectedResult false if an error is expected, true if no error is expected * @param args the arguments to pass to the builtin * @param stage the evaluation stage + * @param returnType the explicit return type of the result variable, if provided (implicit otherwise) */ export function validateConstOrOverrideBuiltinEval( t, builtin, expectedResult, args, -stage) +stage, +returnType) { - const elTys = args.map((arg) => elementType(arg.type)); - const enables = elTys.some((ty) => ty === TypeF16) ? 'enable f16;' : ''; + const elTys = args.map((arg) => elementTypeOf(arg.type)); + const enables = elTys.some((ty) => ty === Type.f16) ? 'enable f16;' : ''; + const optionalVarType = returnType ? `: ${returnType.toString()}` : ''; switch (stage) { case 'constant':{ t.expectCompileResult( expectedResult, `${enables} -const v = ${builtin}(${args.map((arg) => arg.wgsl()).join(', ')});` +const v ${optionalVarType} = ${builtin}(${args.map((arg) => arg.wgsl()).join(', ')});` ); break; } @@ -143,7 +183,7 @@ const v = ${builtin}(${args.map((arg) => arg.wgsl()).join(', ')});` let numOverrides = 0; for (const arg of args) { const argOverrides = []; - for (const el of elementsOf(arg)) { + for (const el of scalarElementsOf(arg)) { const name = `o${numOverrides++}`; overrideDecls.push(`override ${name} : ${el.type};`); argOverrides.push(name); @@ -155,7 +195,7 @@ const v = ${builtin}(${args.map((arg) => arg.wgsl()).join(', ')});` expectedResult, code: `${enables} ${overrideDecls.join('\n')} -var v = ${builtin}(${callArgs.join(', ')});`, +var v ${optionalVarType} = ${builtin}(${callArgs.join(', ')});`, constants, reference: ['v'] }); @@ -164,12 +204,80 @@ var v = ${builtin}(${callArgs.join(', ')});`, } } +/** + * Runs a validation test to check that evaluation of `binaryOp` either evaluates with or without + * error at shader creation time or pipeline creation time. + * @param t the ShaderValidationTest + * @param binaryOp the symbol of the binary operator + * @param expectedResult false if an error is expected, true if no error is expected + * @param leftStage the evaluation stage for the left argument + * @param left the left-hand side of the binary operation + * @param rightStage the evaluation stage for the right argument + * @param right the right-hand side of the binary operation + */ +export function validateConstOrOverrideBinaryOpEval( +t, +binaryOp, +expectedResult, +leftStage, +left, +rightStage, +right) +{ + const allArgs = [left, right]; + const elTys = allArgs.map((arg) => elementTypeOf(arg.type)); + const enables = elTys.some((ty) => ty === Type.f16) ? 'enable f16;' : ''; + + const codeLines = [enables]; + const constants = {}; + let numOverrides = 0; + + function addOperand(name, stage, value) { + switch (stage) { + case 'runtime': + assert(!isAbstractType(value.type)); + codeLines.push(`var ${name} = ${value.wgsl()};`); + return name; + + case 'constant': + codeLines.push(`const ${name} = ${value.wgsl()};`); + return name; + + case 'override':{ + assert(!isAbstractType(value.type)); + const argOverrides = []; + for (const el of scalarElementsOf(value)) { + const elName = `o${numOverrides++}`; + codeLines.push(`override ${elName} : ${el.type};`); + constants[elName] = Number(el.value); + argOverrides.push(elName); + } + return `${value.type}(${argOverrides.join(', ')})`; + } + } + } + + const leftOperand = addOperand('left', leftStage, left); + const rightOperand = addOperand('right', rightStage, right); + + if (leftStage === 'override' || rightStage === 'override') { + t.expectPipelineResult({ + expectedResult, + code: codeLines.join('\n'), + constants, + reference: [`${leftOperand} ${binaryOp} ${rightOperand}`] + }); + } else { + codeLines.push(`fn f() { _ = ${leftOperand} ${binaryOp} ${rightOperand}; }`); + t.expectCompileResult(expectedResult, codeLines.join('\n')); + } +} /** @returns a sweep of the representable values for element type of `type` */ export function fullRangeForType(type, count) { if (count === undefined) { count = 25; } - switch (elementType(type)?.kind) { + switch (scalarTypeOf(type)?.kind) { case 'abstract-float': return scalarF64Range({ pos_sub: Math.ceil(count * 1 / 5), @@ -191,6 +299,9 @@ export function fullRangeForType(type, count) { ); case 'u32': return linearRange(0, kValue.u32.max, count).map((f) => Math.floor(f)); + case 'abstract-int': + // Returned values are already ints, so don't need to be floored. + return linearRangeBigInt(kValue.i64.negative.min, kValue.i64.positive.max, count); } unreachable(); } @@ -204,4 +315,125 @@ export function unique(...arrays) { } } return [...set]; +} + + + + + + + + + + + + + +/** + * Provides an easy way to validate steps in an equation that will trigger a validation error with + * constant or override values due to overflow/underflow. Typical call pattern is: + * + * const vCheck = new ConstantOrOverrideValueChecker(t, Type.f32); + * const c = vCheck.checkedResult(a + b); + * const d = vCheck.checkedResult(c * c); + * const expectedResult = vCheck.allChecksPassed(); + */ +export class ConstantOrOverrideValueChecker { + #allChecksPassed = true; + #floatLimits; + #quantizeFn; + + constructor( + t, + type) + {this.t = t; + switch (type) { + case Type.f32: + this.#quantizeFn = quantizeToF32; + this.#floatLimits = kValue.f32; + break; + case Type.f16: + this.#quantizeFn = quantizeToF16; + this.#floatLimits = kValue.f16; + break; + default: + this.#quantizeFn = (v) => v; + break; + } + } + + quantize(value) { + return this.#quantizeFn(value); + } + + // Some overflow floating point values may fall into an abiguously rounded scenario, where they + // can either round up to Infinity or down to the maximum representable value. In these cases the + // test should be skipped, because it's valid for implementations to differ. + // See: https://www.w3.org/TR/WGSL/#floating-point-overflow + isAmbiguousOverflow(value) { + // Non-finite values are not ambiguous, and can still be validated. + if (!Number.isFinite(value)) { + return false; + } + + // Values within the min/max range for the given type are not ambiguous. + if ( + !this.#floatLimits || + value <= this.#floatLimits.positive.max && value >= this.#floatLimits.negative.min) + { + return false; + } + + // If a value falls outside the min/max range, check to see if it is under + // 2^(EMAX(T)+1). If so, the rounding behavior is implementation specific, + // and should not be validated. + return Math.abs(value) < Math.pow(2, this.#floatLimits.emax + 1); + } + + // Returns true if the value may be quantized to zero with the given type. + isNearZero(value) { + if (!Number.isFinite(value)) { + return false; + } + if (!this.#floatLimits) { + return value === 0; + } + + return value < this.#floatLimits.positive.min && value > this.#floatLimits.negative.max; + } + + checkedResult(value) { + if (this.isAmbiguousOverflow(value)) { + this.t.skip(`Checked value, ${value}, was within the ambiguous overflow rounding range.`); + } + + const quantizedValue = this.quantize(value); + if (!Number.isFinite(quantizedValue)) { + this.#allChecksPassed = false; + } + return quantizedValue; + } + + checkedResultBigInt(value) { + if (kValue.i64.isOOB(value)) { + this.#allChecksPassed = false; + } + return value; + } + + skipIfCheckFails(value) { + if (this.isAmbiguousOverflow(value)) { + this.t.skip(`Checked value, ${value}, was within the ambiguous overflow rounding range.`); + } + + const quantizedValue = this.quantize(value); + if (!Number.isFinite(quantizedValue)) { + this.t.skip(`Checked value, ${value}, was not finite after quantization.`); + } + return value; + } + + allChecksPassed() { + return this.#allChecksPassed; + } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cos.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cos.spec.js index 4f3a485b5f4..5d5cde71c7b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cos.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cos.spec.js @@ -6,18 +6,17 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinus3PiTo3Pi, + minusThreePiToThreePiRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,10 +38,15 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -56,7 +60,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -70,8 +74,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cosh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cosh.spec.js index 27f975252c7..a496f0184ef 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cosh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cosh.spec.js @@ -6,11 +6,9 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -24,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -41,13 +39,17 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.cosh(t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.cosh(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,22 +59,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(0)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countLeadingZeros.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countLeadingZeros.spec.js new file mode 100644 index 00000000000..549ff06a7d4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countLeadingZeros.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'countLeadingZeros';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // countLeadingZeros() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countOneBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countOneBits.spec.js new file mode 100644 index 00000000000..24ff7f79a5c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countOneBits.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'countOneBits';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // countOneBits() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countTrailingZeros.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countTrailingZeros.spec.js new file mode 100644 index 00000000000..82af773fd34 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/countTrailingZeros.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'countTrailingZeros';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // countTrailingZeros() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cross.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cross.spec.js new file mode 100644 index 00000000000..50f50e44fbd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/cross.spec.js @@ -0,0 +1,122 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'cross';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatVec3, + scalarTypeOf } from + +'../../../../../util/conversion.js'; +import { quantizeToF16, quantizeToF32 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVec3); + +function quantizeFunctionForScalarType(type) { + switch (type) { + case Type.f32: + return quantizeToF32; + case Type.f16: + return quantizeToF16; + default: + return (v) => v; + } +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let expectedResult = true; + + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const quantizeFn = quantizeFunctionForScalarType(scalarType); + + // Should be invalid if the cross product calculations result in intermediate + // values that exceed the maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + const ab = quantizeFn(a * b); + if (ab === Infinity || ab === -Infinity) { + expectedResult = false; + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates cross(vec3(a, a, a), vec3(b, b, b)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(1.0)', + bad_3arg: '(1.0, 2.0, 3.0)', + // Wrong vector size + bad_vec2: '(vec2(0), vec2(1))', + bad_vec4: '(vec4(0), vec4(1))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1))', + bad_0array: '(array(1.1,2.2), vec3(1))', + bad_0struct: '(modf(2.2), vec3(1))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true)', + bad_1array: '(vec3(0), array(1.1,2.2))', + bad_1struct: '(vec3(0), modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/degrees.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/degrees.spec.js index 10aac98de2c..2262cf9ab85 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/degrees.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/degrees.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -24,7 +23,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -41,13 +40,17 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(t.params.value * 180 / Math.PI, elementType(type)); + const expectedResult = isRepresentable( + Number(t.params.value) * 180 / Math.PI, + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,7 +60,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -71,8 +74,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_too_few: '()', + bad_too_many: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/derivatives.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/derivatives.spec.js new file mode 100644 index 00000000000..9a8113caf89 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/derivatives.spec.js @@ -0,0 +1,140 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for derivative builtins. +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kConcreteF16ScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kDerivativeBuiltins = [ +'dpdx', +'dpdxCoarse', +'dpdxFine', +'dpdy', +'dpdyCoarse', +'dpdyFine', +'fwidth', +'fwidthCoarse', +'fwidthFine']; + + +const kEntryPoints = { + none: { supportsDerivative: true, code: `` }, + fragment: { + supportsDerivative: true, + code: `@fragment +fn main() { + foo(); +}` + }, + vertex: { + supportsDerivative: false, + code: `@vertex +fn main() -> @builtin(position) vec4f { + foo(); + return vec4f(); +}` + }, + compute: { + supportsDerivative: false, + code: `@compute @workgroup_size(1) +fn main() { + foo(); +}` + }, + fragment_and_compute: { + supportsDerivative: false, + code: `@fragment +fn main1() { + foo(); +} + +@compute @workgroup_size(1) +fn main2() { + foo(); +} +` + }, + compute_without_call: { + supportsDerivative: true, + code: `@compute @workgroup_size(1) +fn main() { +} +` + } +}; + +g.test('only_in_fragment'). +specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). +desc( + ` +Derivative functions must only be used in the fragment shader stage. +` +). +params((u) => +u.combine('entry_point', keysOf(kEntryPoints)).combine('call', ['bar', ...kDerivativeBuiltins]) +). +fn((t) => { + const config = kEntryPoints[t.params.entry_point]; + const code = ` +${config.code} +fn bar(f : f32) -> f32 { return f; } + +fn foo() { + _ = ${t.params.call}(1.0); +}`; + t.expectCompileResult(t.params.call === 'bar' || config.supportsDerivative, code); +}); + +// The list of invalid argument types to test, with an f32 control case. +const kArgumentTypes = objectsToRecord([ +Type.f32, +...kConcreteIntegerScalarsAndVectors, +...kConcreteF16ScalarsAndVectors, +Type.mat2x2f] +); + +g.test('invalid_argument_types'). +specURL('https://www.w3.org/TR/WGSL/#derivative-builtin-functions'). +desc( + ` +Derivative builtins only accept f32 scalar and vector types. +` +). +params((u) => +u.combine('type', keysOf(kArgumentTypes)).combine('call', ['', ...kDerivativeBuiltins]) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kArgumentTypes[t.params.type]; + const code = ` +${scalarTypeOf(kArgumentTypes[t.params.type]) === Type.f16 ? 'enable f16;' : ''} + +fn foo() { + let x: ${type.toString()} = ${t.params.call}(${type.create(1).wgsl()}); +}`; + t.expectCompileResult(kArgumentTypes[t.params.type] === Type.f32 || t.params.call === '', code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false]).combine('func', kDerivativeBuiltins)). +fn((t) => { + const code = ` + fn foo() { + ${t.params.use ? '_ =' : ''} ${t.params.func}(1.0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/determinant.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/determinant.spec.js new file mode 100644 index 00000000000..8bade808a26 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/determinant.spec.js @@ -0,0 +1,95 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'determinant';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// Generate a dictionary mapping each matrix type variation (columns,rows, +// floating point type) to a nontrivial matrix value of that type. +const kMatrixCases = [2, 3, 4]. +flatMap((cols) => +[2, 3, 4].flatMap((rows) => +['abstract-int', 'abstract-float', 'f32', 'f16'].map((type) => ({ + [`mat${cols}x${rows}_${type}`]: (() => { + const suffix = (() => { + switch (type) { + case 'abstract-int': + return ''; + case 'abstract-float': + return '.0'; + case 'f32': + return 'f'; + case 'f16': + return 'h'; + } + })(); + return `(mat${cols}x${rows}(${[...Array(cols * rows).keys()]. + map((e) => `${e}${suffix}`). + join(', ')}))`; + })() +})) +) +). +reduce((a, b) => ({ ...a, ...b }), {}); + +g.test('matrix_args'). +desc(`Test compilation failure of ${builtin} with variously shaped matrices`). +params((u) => +u. +combine('cols', [2, 3, 4]). +combine('rows', [2, 3, 4]). +combine('type', ['abstract-int', 'abstract-float', 'f32', 'f16']) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const cols = t.params.cols; + const rows = t.params.rows; + const type = t.params.type; + const arg = kMatrixCases[`mat${cols}x${rows}_${type}`]; + t.expectCompileResult( + cols === rows, + t.wrapInEntryPoint(`const c = ${builtin}${arg};`, type === 'f16' ? ['f16'] : []) + ); +}); + +const kArgCases = { + good: '(mat2x2(0.0, 2.0, 3.0, 4.0))', // Included to check test implementation + bad_no_parens: '', + // Bad number of args + bad_too_few: '()', + bad_too_many: '(mat2x2(0.0, 2.0, 3.0, 4.0), mat2x2(0.0, 2.0, 3.0, 4.0))', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/distance.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/distance.spec.js new file mode 100644 index 00000000000..355a8f82163 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/distance.spec.js @@ -0,0 +1,129 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'distance';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarType); + + // Distance equation: length(a - b) + // Should be invalid if the calculations result in intermediate values that + // exceed the maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + const ab = vCheck.checkedResult(a - b); + + // Only calculates the full length if the type is a vector. Otherwise abs(a-b) is used. + if (kValidArgumentTypes[t.params.type].width > 1) { + const ab2 = vCheck.checkedResult(ab * ab); + const sqrLen = vCheck.checkedResult(ab2 * kValidArgumentTypes[t.params.type].width); + // If the squared length is near zero it may fail on some implementations, so skip the test. + if (vCheck.isNearZero(sqrLen)) { + t.skip(`Squared length of ${sqrLen} is at or near 0.`); + } + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates distance(vecN(a), vecN(b)) or distance(a, b); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_3arg: '(vec3(0), vec3(1), vec3(2))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1))', + bad_0array: '(array(1.1,2.2), vec3(1))', + bad_0struct: '(modf(2.2), vec3(1))', + bad_0int: '(0i, vec3(1))', + bad_0vec2i: '(vec2i(), vec3(1))', + bad_0vec3i: '(vec3i(), vec3(1))', + bad_0vec4i: '(vec4i(), vec3(1))', + bad_0uint: '(0u, vec3(1))', + bad_0vec2u: '(vec2u(), vec3(1))', + bad_0vec3u: '(vec3u(), vec3(1))', + bad_0vec4u: '(vec4u(), vec3(1))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true)', + bad_1array: '(vec3(0), array(1.1,2.2))', + bad_1struct: '(vec3(0), modf(2.2))', + bad_1int: '(vec3(0), 0i)', + bad_1vec2i: '(vec3(0), vec2i())', + bad_1vec3i: '(vec3(0), vec3i())', + bad_1vec4i: '(vec3(0), vec4i())', + bad_1uint: '(vec3(0), 0u)', + bad_1vec2u: '(vec3(0), vec2u())', + bad_1vec3u: '(vec3(0), vec3u())', + bad_1vec4u: '(vec3(0), vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot.spec.js new file mode 100644 index 00000000000..56164710ca9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot.spec.js @@ -0,0 +1,123 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'dot';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, kConvertableToFloatVectors, scalarTypeOf } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarType); + + // Dot product equation: (a[0]*b[0]) + (a[1]*b[1]) + ... (a[N]*b[N]) + // Should be invalid if the dot product calculations result in intermediate + // values that exceed the maximum representable float value for the given type. + if (scalarType === Type.abstractInt) { + // Need to handle the AbstractInt case separately becasue all values are + // treated as BigInt in that case. + const a = BigInt(t.params.a); + const b = BigInt(t.params.b); + const vecSize = BigInt(kValidArgumentTypes[t.params.type].width); + const ab = vCheck.checkedResultBigInt(a * b); + vCheck.checkedResultBigInt(ab * vecSize); + } else { + const a = Number(t.params.a); + const b = Number(t.params.b); + const vecSize = kValidArgumentTypes[t.params.type].width; + const ab = vCheck.checkedResult(a * b); + vCheck.checkedResult(ab * vecSize); + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates dot(vecN(a), vecN(b)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_3arg: '(vec3(0), vec3(1), vec3(2))', + // Mismatched vector size + bad_vec_size: '(vec2(0), vec3(1))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1))', + bad_0array: '(array(1.1,2.2), vec3(1))', + bad_0struct: '(modf(2.2), vec3(1))', + bad_0int: '(0i, vec3(1))', + bad_0uint: '(0u, vec3(1))', + bad_0f32: '(0.0, vec3(1))', + bad_0f16: '(0.0h, vec3(1))', + bad_0abstract: '(0, vec3(1))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true)', + bad_1array: '(vec3(0), array(1.1,2.2))', + bad_1struct: '(vec3(0), modf(2.2))', + bad_1int: '(vec3(0), 0i)', + bad_1uint: '(vec3(0), 0u)', + bad_1f32: '(vec3(0), 0.0)', + bad_1f16: '(vec3(0), 0.0h)', + bad_1abstract: '(vec3(0), 0)' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4I8Packed.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4I8Packed.spec.js index 327e8cc13a6..f72eb87f97d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4I8Packed.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4I8Packed.spec.js @@ -6,20 +6,25 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'dot4I8Packed'; -const kGoodArgs = '(1u,2u)'; -const kBadArgs = { - '0args': '()', - '1args': '(1u)', - '3args': '(1u,2u,3u)', - '0i32': '(1i,2u)', - '0f32': '(1f,2u)', - '0bool': '(false,2u)', - '0vec2u': '(vec2u(),2u)', - '1i32': '(1u,2i)', - '1f32': '(1u,2f)', - '1bool': '(1u,true)', - '1vec2u': '(1u,vec2u())' +const kArgCases = { + good: '(1u,2u)', + bad_0args: '()', + bad_1args: '(1u)', + bad_3args: '(1u,2u,3u)', + bad_0i32: '(1i,2u)', + bad_0f32: '(1f,2u)', + bad_0bool: '(false,2u)', + bad_0vec2u: '(vec2u(),2u)', + bad_1i32: '(1u,2i)', + bad_1f32: '(1u,2f)', + bad_1bool: '(1u,true)', + bad_1vec2u: '(1u,vec2u())', + bad_bool_bool: '(false,true)', + bad_bool2_bool2: '(vec2(),vec2(false,true))', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -43,17 +48,19 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4U8Packed.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4U8Packed.spec.js index 2f2a6c3cab0..315e69bfb9d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4U8Packed.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/dot4U8Packed.spec.js @@ -6,20 +6,25 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'dot4U8Packed'; -const kGoodArgs = '(1u,2u)'; -const kBadArgs = { - '0args': '()', - '1args': '(1u)', - '3args': '(1u,2u,3u)', - '0i32': '(1i,2u)', - '0f32': '(1f,2u)', - '0bool': '(false,2u)', - '0vec2u': '(vec2u(),2u)', - '1i32': '(1u,2i)', - '1f32': '(1u,2f)', - '1bool': '(1u,true)', - '1vec2u': '(1u,vec2u())' +const kArgCases = { + good: '(1u,2u)', + bad_0args: '()', + bad_1args: '(1u)', + bad_3args: '(1u,2u,3u)', + bad_0i32: '(1i,2u)', + bad_0f32: '(1f,2u)', + bad_0bool: '(false,2u)', + bad_0vec2u: '(vec2u(),2u)', + bad_1i32: '(1u,2i)', + bad_1f32: '(1u,2f)', + bad_1bool: '(1u,true)', + bad_1vec2u: '(1u,vec2u())', + bad_bool_bool: '(false,true)', + bad_bool2_bool2: '(vec2(),vec2(false,true))', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -43,17 +48,19 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp.spec.js index 74a88161140..e677442d4a4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp.spec.js @@ -7,24 +7,52 @@ import { makeTestGroup } from '../../../../../../common/framework/test_group.js' import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { kValue } from '../../../../../util/constants.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { kConstantAndOverrideStages, + rangeForType, stageSupportsType, validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +const valueForType = rangeForType( + [ + -1e2, + -1e3, + -4, + -3, + -2, + -1, + -1e-1, + -1e-2, + -1e-3, + 0, + 1e-3, + 1e-2, + 1e-1, + 1, + 2, + 3, + 4, + 1e2, + 1e3, + Math.log2(kValue.f16.positive.max) - 0.1, + Math.log2(kValue.f16.positive.max) + 0.1, + Math.log2(kValue.f32.positive.max) - 0.1, + Math.log2(kValue.f32.positive.max) + 0.1], + + [-100n, -1000n, -4n, -3n, -2n, -1n, 0n, 1n, 2n, 3n, 4n, 100n, 1000n] +); g.test('values'). desc( @@ -38,40 +66,20 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -combine('value', [ --1e2, --1e3, --4, --3, --2, --1, --1e-1, --1e-2, --1e-3, -0, -1e-3, -1e-2, -1e-1, -1, -2, -3, -4, -1e2, -1e3, -Math.log2(kValue.f16.positive.max) - 0.1, -Math.log2(kValue.f16.positive.max) + 0.1, -Math.log2(kValue.f32.positive.max) - 0.1, -Math.log2(kValue.f32.positive.max) + 0.1] -) +expand('value', (u) => valueForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.exp(t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.exp(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -81,22 +89,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(0)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp2.spec.js index c38d5f90ef9..5455216d752 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/exp2.spec.js @@ -7,24 +7,52 @@ import { makeTestGroup } from '../../../../../../common/framework/test_group.js' import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { kValue } from '../../../../../util/constants.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { kConstantAndOverrideStages, + rangeForType, stageSupportsType, validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +const valueForType = rangeForType( + [ + -1e2, + -1e3, + -4, + -3, + -2, + -1, + -1e-1, + -1e-2, + -1e-3, + 0, + 1e-3, + 1e-2, + 1e-1, + 1, + 2, + 3, + 4, + 1e2, + 1e3, + Math.log2(kValue.f16.positive.max) - 0.1, + Math.log2(kValue.f16.positive.max) + 0.1, + Math.log2(kValue.f32.positive.max) - 0.1, + Math.log2(kValue.f32.positive.max) + 0.1], + + [-100n, -1000n, -4n, -3n, -2n, -1n, 0n, 1n, 2n, 3n, 4n, 100n, 1000n] +); g.test('values'). desc( @@ -38,40 +66,20 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -combine('value', [ --1e2, --1e3, --4, --3, --2, --1, --1e-1, --1e-2, --1e-3, -0, -1e-3, -1e-2, -1e-1, -1, -2, -3, -4, -1e2, -1e3, -Math.log2(kValue.f16.positive.max) - 0.1, -Math.log2(kValue.f16.positive.max) + 0.1, -Math.log2(kValue.f32.positive.max) - 0.1, -Math.log2(kValue.f32.positive.max) + 0.1] -) +expand('value', (u) => valueForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.pow(2, t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.pow(2, Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -81,22 +89,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(0)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/extractBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/extractBits.spec.js new file mode 100644 index 00000000000..fba6dc6bf7d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/extractBits.spec.js @@ -0,0 +1,263 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'extractBits';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors, + u32 } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors on valid inputs +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])). +combineWithParams([ +{ offset: 0, count: 0 }, +{ offset: 0, count: 31 }, +{ offset: 0, count: 32 }, +{ offset: 4, count: 0 }, +{ offset: 4, count: 27 }, +{ offset: 4, count: 28 }, +{ offset: 16, count: 0 }, +{ offset: 16, count: 15 }, +{ offset: 16, count: 16 }, +{ offset: 32, count: 0 }] +) +). +fn((t) => { + const expectedResult = true; // extractBits() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [ + kValuesTypes[t.params.type].create(t.params.value), + u32(t.params.offset), + u32(t.params.count)], + + t.params.stage + ); +}); + +g.test('count_offset'). +desc( + ` +Validates that count and offset must be smaller than the size of the primitive. +` +). +params((u) => +u. +combine('offsetStage', [...kConstantAndOverrideStages, 'runtime']). +combine('countStage', [...kConstantAndOverrideStages, 'runtime']). +beginSubcases(). +combineWithParams([ +// offset + count < 32 +{ offset: 0, count: 31 }, +{ offset: 1, count: 30 }, +{ offset: 31, count: 0 }, +{ offset: 30, count: 1 }, +// offset + count == 32 +{ offset: 0, count: 32 }, +{ offset: 1, count: 31 }, +{ offset: 16, count: 16 }, +{ offset: 31, count: 1 }, +{ offset: 32, count: 0 }, +// offset + count > 32 +{ offset: 2, count: 31 }, +{ offset: 31, count: 2 }, +// offset > 32 +{ offset: 33, count: 0 }, +{ offset: 33, count: 1 }, +// count > 32 +{ offset: 0, count: 33 }, +{ offset: 1, count: 33 }] +) +). +fn((t) => { + let offsetArg = ''; + let countArg = ''; + switch (t.params.offsetStage) { + case 'constant': + offsetArg = `${Type.u32.create(t.params.offset).wgsl()}`; + break; + case 'override': + offsetArg = `o_offset`; + break; + case 'runtime': + offsetArg = 'v_offset'; + break; + } + switch (t.params.countStage) { + case 'constant': + countArg = `${Type.u32.create(t.params.count).wgsl()}`; + break; + case 'override': + countArg = `o_count`; + break; + case 'runtime': + countArg = 'v_count'; + break; + } + const wgsl = ` +override o_offset : u32; +override o_count : u32; +fn foo() { + var v_offset : u32; + var v_count : u32; + var e : u32; + let tmp = extractBits(e, ${offsetArg}, ${countArg}); +}`; + + const error = t.params.offset + t.params.count > 32; + const shader_error = + error && t.params.offsetStage === 'constant' && t.params.countStage === 'constant'; + const pipeline_error = + error && t.params.offsetStage !== 'runtime' && t.params.countStage !== 'runtime'; + t.expectCompileResult(!shader_error, wgsl); + if (!shader_error) { + const constants = {}; + constants['o_offset'] = t.params.offset; + constants['o_count'] = t.params.count; + t.expectPipelineResult({ + expectedResult: !pipeline_error, + code: wgsl, + constants, + reference: ['o_offset', 'o_count'] + }); + } +}); + + + + + + + + + + +function typesToArguments(types, pass) { + return types.reduce( + (res, type) => ({ + ...res, + [type.toString()]: { arg: type.create(0).wgsl(), pass } + }), + {} + ); +} + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kInputArgTypes = { + ...typesToArguments([Type.u32], true), + ...typesToArguments([...kFloatScalarsAndVectors, Type.bool, Type.mat2x2f], false), + alias: { arg: 'u32_alias(1)', pass: true }, + vec_bool: { arg: 'vec2(false,true)', pass: false }, + atomic: { arg: 'a', pass: false }, + array: { + preamble: 'var arry: array;', + arg: 'arry', + pass: false + }, + array_runtime: { arg: 'k.arry', pass: false }, + struct: { + preamble: 'var x: A;', + arg: 'x', + pass: false + }, + enumerant: { arg: 'read_write', pass: false }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + arg: 'p', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + arg: '*p', + pass: true + }, + sampler: { arg: 's', pass: false }, + texture: { arg: 't', pass: false } +}; + +g.test('typed_arguments'). +desc( + ` +Test compilation validation of ${builtin} with variously typed arguments + - For failing input types, just use the same type for offset and count to reduce combinations. +` +). +params((u) => +u. +combine('input', keysOf(kInputArgTypes)). +beginSubcases(). +combine('offset', keysOf(kInputArgTypes)). +expand('count', (u) => kInputArgTypes[u.input].pass ? keysOf(kInputArgTypes) : [u.offset]) +). +fn((t) => { + const input = kInputArgTypes[t.params.input]; + const offset = kInputArgTypes[t.params.offset]; + const count = kInputArgTypes[t.params.count]; + t.expectCompileResult( + input.pass && offset.pass && count.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${input.preamble ? input.preamble : ''} + ${offset.preamble && offset !== input ? offset.preamble : ''} + ${count.preamble && count !== input && count !== offset ? count.preamble : ''} + _ = ${builtin}(${input.arg},${offset.arg},${count.arg}); + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u,0u,1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/faceForward.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/faceForward.spec.js new file mode 100644 index 00000000000..77946e3e9e8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/faceForward.spec.js @@ -0,0 +1,152 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'faceForward';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatVectors, + scalarTypeOf } from + +'../../../../../util/conversion.js'; +import { quantizeToF16, quantizeToF32 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +function quantizeFunctionForScalarType(type) { + switch (type) { + case Type.f32: + return quantizeToF32; + case Type.f16: + return quantizeToF16; + default: + return (v) => v; + } +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('c', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let expectedResult = true; + + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const quantizeFn = quantizeFunctionForScalarType(scalarType); + + // Face Forward equation: dot(b, c) < 0 ? -a : a + // Should be invalid if the calculations result in intermediate values that + // exceed the maximum representable float value for the given type. + const b = Number(t.params.b); + const c = Number(t.params.c); + const bc = quantizeFn(b * c); + const dp = quantizeFn(bc * kValidArgumentTypes[t.params.type].width); + + if (!Number.isFinite(dp)) { + expectedResult = false; + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates faceForward(vecN(a), vecN(b), vecN(c)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b), type.create(t.params.c)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1), vec3(0.5))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_2arg: '(vec3(0), vec3(1))', + bad_4arg: '(vec3(0), vec3(1), vec3(0.5), vec3(3))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1), vec3(0.5))', + bad_0array: '(array(1.1,2.2), vec3(1), vec3(0.5))', + bad_0struct: '(modf(2.2), vec3(1), vec3(0.5))', + bad_0int: '(1i, vec3(1), vec3(0.5))', + bad_0uint: '(1u, vec3(1), vec3(0.5))', + bad_0vec2i: '(vec2i(0), vec2(1), vec2(0.5))', + bad_0vec3i: '(vec3i(0), vec3(1), vec3(0.5))', + bad_0vec4i: '(vec4i(0), vec4(1), vec4(0.5))', + bad_0vec2u: '(vec2u(0), vec2(1), vec2(0.5))', + bad_0vec3u: '(vec3u(0), vec3(1), vec3(0.5))', + bad_0vec4u: '(vec4u(0), vec4(1), vec4(0.5))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true, vec3(0.5))', + bad_1array: '(vec3(0), array(1.1,2.2), vec3(0.5))', + bad_1struct: '(vec3(0), modf(2.2), vec3(0.5))', + bad_1int: '(vec3(0), 1i, vec3(0.5))', + bad_1uint: '(vec3(0), 1u, vec3(0.5))', + bad_1vec2i: '(vec2(1), vec2i(1), vec2(0.5))', + bad_1vec3i: '(vec3(1), vec3i(1), vec3(0.5))', + bad_1vec4i: '(vec4(1), vec4i(1), vec4(0.5))', + bad_1vec2u: '(vec2(1), vec2u(1), vec2(0.5))', + bad_1vec3u: '(vec3(1), vec3u(1), vec3(0.5))', + bad_1vec4u: '(vec4(1), vec4u(1), vec4(0.5))', + // Bad value type for arg 2 + bad_2bool: '(vec3(0), vec3(1), true)', + bad_2array: '(vec3(0), vec3(1), array(1.1,2.2))', + bad_2struct: '(vec3(0), vec3(1), modf(2.2))', + bad_2int: '(vec3(0), vec3(1), 1i)', + bad_2uint: '(vec3(0), vec3(1), 1u)', + bad_2vec2i: '(vec2(1), vec2(1), vec2i(1))', + bad_2vec3i: '(vec3(1), vec3(1), vec3i(1))', + bad_2vec4i: '(vec4(1), vec4(1), vec4i(1))', + bad_2vec2u: '(vec2(1), vec2(1), vec2u(1))', + bad_2vec3u: '(vec3(1), vec3(1), vec3u(1))', + bad_2vec4u: '(vec4(1), vec4(1), vec4u(1))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstLeadingBit.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstLeadingBit.spec.js new file mode 100644 index 00000000000..ab922438680 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstLeadingBit.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'firstLeadingBit';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // firstLeadingBit() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstTrailingBit.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstTrailingBit.spec.js new file mode 100644 index 00000000000..9b0bc5f58fd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/firstTrailingBit.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'firstTrailingBit';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // firstTrailingBit() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/floor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/floor.spec.js index 2c72c68649b..6aa6f753104 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/floor.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/floor.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +68,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fma.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fma.spec.js new file mode 100644 index 00000000000..e18380f0ccc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fma.spec.js @@ -0,0 +1,141 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'fma';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, kConvertableToFloatVectors, scalarTypeOf } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() only errors in cases +where the algorithm produces OOB results. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('c', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarType); + + // Fused Multiply Add equation: a * b + c + // Should be invalid if the calculations result in intermediate values that + // exceed the maximum representable float value for the given type. + // IEEE fma, which is allowed by WGSL, allows cases where the intermediate + // values may overflow. In those cases only check the final result. + const a = Number(t.params.a); + const b = Number(t.params.b); + const c = Number(t.params.c); + vCheck.checkedResult(a * b + c); + + if (vCheck.allChecksPassed()) { + // If the end result is valid but the intermediate a*b multiplication + // fails then the test should be skipped, because implementations which + // perform a non-fused fma may still fail. Since it's ambiguous this + // should not be considered a CTS failure. + vCheck.skipIfCheckFails(a * b); + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates fma(vecN(a), vecN(b), vecN(c)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b), type.create(t.params.c)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1), vec3(0.5))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_2arg: '(vec3(0), vec3(1))', + bad_4arg: '(vec3(0), vec3(1), vec3(0.5), vec3(3))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1), vec3(0.5))', + bad_0array: '(array(1.1,2.2), vec3(1), vec3(0.5))', + bad_0struct: '(modf(2.2), vec3(1), vec3(0.5))', + bad_0int: '(1i, vec3(1), vec3(0.5))', + bad_0uint: '(1u, vec3(1), vec3(0.5))', + bad_0vec2i: '(vec2i(0), vec2(1), vec2(0.5))', + bad_0vec3i: '(vec3i(0), vec3(1), vec3(0.5))', + bad_0vec4i: '(vec4i(0), vec4(1), vec4(0.5))', + bad_0vec2u: '(vec2u(0), vec2(1), vec2(0.5))', + bad_0vec3u: '(vec3u(0), vec3(1), vec3(0.5))', + bad_0vec4u: '(vec4u(0), vec4(1), vec4(0.5))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true, vec3(0.5))', + bad_1array: '(vec3(0), array(1.1,2.2), vec3(0.5))', + bad_1struct: '(vec3(0), modf(2.2), vec3(0.5))', + bad_1int: '(vec3(0), 1i, vec3(0.5))', + bad_1uint: '(vec3(0), 1u, vec3(0.5))', + bad_1vec2i: '(vec2(1), vec2i(1), vec2(0.5))', + bad_1vec3i: '(vec3(1), vec3i(1), vec3(0.5))', + bad_1vec4i: '(vec4(1), vec4i(1), vec4(0.5))', + bad_1vec2u: '(vec2(1), vec2u(1), vec2(0.5))', + bad_1vec3u: '(vec3(1), vec3u(1), vec3(0.5))', + bad_1vec4u: '(vec4(1), vec4u(1), vec4(0.5))', + // Bad value type for arg 2 + bad_2bool: '(vec3(0), vec3(1), true)', + bad_2array: '(vec3(0), vec3(1), array(1.1,2.2))', + bad_2struct: '(vec3(0), vec3(1), modf(2.2))', + bad_2int: '(vec3(0), vec3(1), 1i)', + bad_2uint: '(vec3(0), vec3(1), 1u)', + bad_2vec2i: '(vec2(1), vec2(1), vec2i(1))', + bad_2vec3i: '(vec3(1), vec3(1), vec3i(1))', + bad_2vec4i: '(vec4(1), vec4(1), vec4i(1))', + bad_2vec2u: '(vec2(1), vec2(1), vec2u(1))', + bad_2vec3u: '(vec3(1), vec3(1), vec3u(1))', + bad_2vec4u: '(vec4(1), vec4(1), vec4u(1))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fract.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fract.spec.js new file mode 100644 index 00000000000..2eb0f5a7a38 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/fract.spec.js @@ -0,0 +1,94 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'fract';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() error on invalid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = true; + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/frexp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/frexp.spec.js new file mode 100644 index 00000000000..e4a87551bbe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/frexp.spec.js @@ -0,0 +1,94 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'frexp';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() error on invalid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = true; + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/insertBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/insertBits.spec.js new file mode 100644 index 00000000000..ecb124f5587 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/insertBits.spec.js @@ -0,0 +1,287 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'insertBits';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors, + u32 } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors on valid inputs +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type], 5)). +expand('newbits', (u) => fullRangeForType(kValuesTypes[u.type], 5)). +combineWithParams([ +{ offset: 0, count: 0 }, +{ offset: 0, count: 31 }, +{ offset: 0, count: 32 }, +{ offset: 4, count: 0 }, +{ offset: 4, count: 27 }, +{ offset: 4, count: 28 }, +{ offset: 16, count: 0 }, +{ offset: 16, count: 15 }, +{ offset: 16, count: 16 }, +{ offset: 32, count: 0 }] +) +). +fn((t) => { + const expectedResult = true; // insertBits() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [ + kValuesTypes[t.params.type].create(t.params.value), + kValuesTypes[t.params.type].create(t.params.newbits), + u32(t.params.offset), + u32(t.params.count)], + + t.params.stage + ); +}); + +g.test('mismatched'). +desc( + ` +Validates that even with valid types, if arg0 and arg1 do not match types ${builtin}() errors +` +). +params((u) => u.combine('arg0', keysOf(kValuesTypes)).combine('arg1', keysOf(kValuesTypes))). +fn((t) => { + const arg0 = kValuesTypes[t.params.arg0]; + const arg1 = kValuesTypes[t.params.arg1]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */t.params.arg0 === t.params.arg1, + [arg0.create(0), arg1.create(1), u32(0), u32(32)], + 'constant' + ); +}); + +g.test('count_offset'). +desc( + ` +Validates that count and offset must be smaller than the size of the primitive. +` +). +params((u) => +u. +combine('offsetStage', [...kConstantAndOverrideStages, 'runtime']). +combine('countStage', [...kConstantAndOverrideStages, 'runtime']). +beginSubcases(). +combineWithParams([ +// offset + count < 32 +{ offset: 0, count: 31 }, +{ offset: 1, count: 30 }, +{ offset: 31, count: 0 }, +{ offset: 30, count: 1 }, +// offset + count == 32 +{ offset: 0, count: 32 }, +{ offset: 1, count: 31 }, +{ offset: 16, count: 16 }, +{ offset: 31, count: 1 }, +{ offset: 32, count: 0 }, +// offset + count > 32 +{ offset: 2, count: 31 }, +{ offset: 31, count: 2 }, +// offset > 32 +{ offset: 33, count: 0 }, +{ offset: 33, count: 1 }, +// count > 32 +{ offset: 0, count: 33 }, +{ offset: 1, count: 33 }] +) +). +fn((t) => { + let offsetArg = ''; + let countArg = ''; + switch (t.params.offsetStage) { + case 'constant': + offsetArg = `${Type.u32.create(t.params.offset).wgsl()}`; + break; + case 'override': + offsetArg = `o_offset`; + break; + case 'runtime': + offsetArg = 'v_offset'; + break; + } + switch (t.params.countStage) { + case 'constant': + countArg = `${Type.u32.create(t.params.count).wgsl()}`; + break; + case 'override': + countArg = `o_count`; + break; + case 'runtime': + countArg = 'v_count'; + break; + } + const wgsl = ` +override o_offset : u32; +override o_count : u32; +fn foo() { + var v_offset : u32; + var v_count : u32; + var e : u32; + var newbits : u32; + let tmp = insertBits(e, newbits, ${offsetArg}, ${countArg}); +}`; + + const error = t.params.offset + t.params.count > 32; + const shader_error = + error && t.params.offsetStage === 'constant' && t.params.countStage === 'constant'; + const pipeline_error = + error && t.params.offsetStage !== 'runtime' && t.params.countStage !== 'runtime'; + t.expectCompileResult(!shader_error, wgsl); + if (!shader_error) { + const constants = {}; + constants['o_offset'] = t.params.offset; + constants['o_count'] = t.params.count; + t.expectPipelineResult({ + expectedResult: !pipeline_error, + code: wgsl, + constants, + reference: ['o_offset', 'o_count'] + }); + } +}); + + + + + + + + + + +function typesToArguments(types, pass) { + return types.reduce( + (res, type) => ({ + ...res, + [type.toString()]: { arg: type.create(0).wgsl(), pass } + }), + {} + ); +} + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kInputArgTypes = { + ...typesToArguments([Type.u32], true), + ...typesToArguments([...kFloatScalarsAndVectors, Type.bool, Type.mat2x2f], false), + alias: { arg: 'u32_alias(1)', pass: true }, + vec_bool: { arg: 'vec2(false,true)', pass: false }, + atomic: { arg: 'a', pass: false }, + array: { + preamble: 'var arry: array;', + arg: 'arry', + pass: false + }, + array_runtime: { arg: 'k.arry', pass: false }, + struct: { + preamble: 'var x: A;', + arg: 'x', + pass: false + }, + enumerant: { arg: 'read_write', pass: false }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + arg: 'p', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + arg: '*p', + pass: true + }, + sampler: { arg: 's', pass: false }, + texture: { arg: 't', pass: false } +}; + +g.test('typed_arguments'). +desc( + ` +Test compilation validation of ${builtin} with variously typed arguments + - The input types are matching to reduce testing permutations. Mismatching input types are + validated in 'mismatched' test above. + - For failing input types, just use the same type for offset and count to reduce combinations. +` +). +params((u) => +u. +combine('input', keysOf(kInputArgTypes)). +beginSubcases(). +combine('offset', keysOf(kInputArgTypes)). +expand('count', (u) => kInputArgTypes[u.input].pass ? keysOf(kInputArgTypes) : [u.offset]) +). +fn((t) => { + const input = kInputArgTypes[t.params.input]; + const offset = kInputArgTypes[t.params.offset]; + const count = kInputArgTypes[t.params.count]; + t.expectCompileResult( + input.pass && offset.pass && count.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${input.preamble ? input.preamble : ''} + ${offset.preamble && offset !== input ? offset.preamble : ''} + ${count.preamble && count !== input && count !== offset ? count.preamble : ''} + _ = ${builtin}(${input.arg},${input.arg},${offset.arg},${count.arg}); + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(0u,1u,0u,1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/inverseSqrt.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/inverseSqrt.spec.js index bb6c089450f..128a9d390c4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/inverseSqrt.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/inverseSqrt.spec.js @@ -6,11 +6,9 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -18,7 +16,7 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -26,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,17 +38,27 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinusTwoToTwo, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; const expectedResult = - t.params.value > 0 && isRepresentable(1 / Math.sqrt(t.params.value), elementType(type)); + t.params.value > 0 && + isRepresentable( + 1 / Math.sqrt(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -60,22 +68,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(1)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ldexp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ldexp.spec.js new file mode 100644 index 00000000000..cb227717989 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/ldexp.spec.js @@ -0,0 +1,253 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'ldexp';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + scalarTypeOf, + + kConvertableToFloatScalarsAndVectors, + kConcreteSignedIntegerScalarsAndVectors } from + +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypesA = objectsToRecord(kConvertableToFloatScalarsAndVectors); +const kValidArgumentTypesB = objectsToRecord([ +Type.abstractInt, +Type.vec(2, Type.abstractInt), +Type.vec(3, Type.abstractInt), +Type.vec(4, Type.abstractInt), +...kConcreteSignedIntegerScalarsAndVectors] +); + +function supportedSecondArgTypes(typeAKey) { + const typeA = kValidArgumentTypesA[typeAKey]; + + switch (typeA.width) { + case 1: + return objectsToRecord([Type.abstractInt, Type.i32]); + default: + return objectsToRecord([ + Type.vec(typeA.width, Type.abstractInt), + Type.vec(typeA.width, Type.i32)] + ); + } +} + +function biasForType(type) { + switch (type) { + case Type.f16: + return 15; + case Type.f32: + return 127; + case Type.abstractFloat: + case Type.abstractInt: + return 1023; + default: + throw new Error(`Invalid bias type ${type}`); + } +} + +function biasRange(type) { + const bias = biasForType(scalarTypeOf(type)); + return [-bias - 2, -bias, Math.floor(-bias * 0.5), 0, Math.floor(bias * 0.5), bias, bias + 2]; +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('typeA', keysOf(kValidArgumentTypesA)). +expand('typeB', (u) => keysOf(supportedSecondArgTypes(u.typeA))). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypesA[u.typeA])). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypesB[u.typeB])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypesA[u.typeA], 5)). +expand('b', (u) => biasRange(kValidArgumentTypesA[u.typeA])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypesA[t.params.typeA]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const typeA = kValidArgumentTypesA[t.params.typeA]; + const bias = biasForType(scalarTypeOf(typeA)); + const scalarTypeA = scalarTypeOf(typeA); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarTypeA); + + const typeB = kValidArgumentTypesB[t.params.typeB]; + + const validExponent = Number(t.params.b) <= bias + 1; + + // Should be invalid if the calculations result in values that exceed the + // maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + vCheck.checkedResult(a * Math.pow(2, b)); + + // Validates ldexp(a, b) or ldexp(vecN(a), vecN(b)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + validExponent && vCheck.allChecksPassed(), + [typeA.create(t.params.a), typeB.create(t.params.b)], + t.params.stage + ); +}); + +g.test('partial_values'). +desc('Validates e2 <= bias + 1 when e1 is a runtime value'). +params((u) => +u. +combine('stage', ['constant', 'override', 'runtime']). +combine('typeA', keysOf(kValidArgumentTypesA)). +filter((t) => { + const ty = kValidArgumentTypesA[t.typeA]; + const scalar = scalarTypeOf(ty); + return scalar !== Type.abstractInt && scalar !== Type.abstractFloat; +}). +expand('typeB', (u) => keysOf(supportedSecondArgTypes(u.typeA))). +filter((t) => { + const ty = kValidArgumentTypesB[t.typeB]; + const scalar = scalarTypeOf(ty); + return scalar !== Type.abstractInt && scalar !== Type.abstractFloat; +}). +beginSubcases(). +expandWithParams((p) => { + const ty = kValidArgumentTypesA[p.typeA]; + const scalar = scalarTypeOf(ty); + const cases = []; + const bias = biasForType(scalar); + cases.push({ value: bias }); + cases.push({ value: bias + 1 }); + cases.push({ value: bias + 2 }); + return cases; +}) +). +beforeAllSubcases((t) => { + const ty = kValidArgumentTypesA[t.params.typeA]; + if (ty.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const tyA = kValidArgumentTypesA[t.params.typeA]; + const tyB = kValidArgumentTypesB[t.params.typeB]; + const scalarB = scalarTypeOf(tyB); + const enable = `${tyA.requiresF16() ? 'enable f16;' : ''}`; + let bArg = ''; + switch (t.params.stage) { + case 'constant': + bArg = `${tyB.create(t.params.value).wgsl()}`; + break; + case 'override': + bArg = `${tyB.toString()}(o_b)`; + break; + case 'runtime': + bArg = 'v_b'; + break; + } + const wgsl = ` +${enable} +override o_b : ${scalarB.toString()}; +fn foo() { + var v_b : ${tyB.toString()}; + var v : ${tyA.toString()}; + let tmp = ldexp(v, ${bArg}); +}`; + + const bias = biasForType(scalarTypeOf(tyA)); + const error = t.params.value > bias + 1; + const shader_error = error && t.params.stage === 'constant'; + const pipeline_error = error && t.params.stage === 'override'; + t.expectCompileResult(!shader_error, wgsl); + if (!shader_error) { + const constants = {}; + constants['o_b'] = t.params.value; + t.expectPipelineResult({ + expectedResult: !pipeline_error, + code: wgsl, + constants, + reference: ['o_b'] + }); + } +}); + +const kArgCases = { + good: '(vec3(0), vec3(1))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_3arg: '(vec3(0), vec3(1), vec3(2))', + // Bad value combinations + bad_vec_scalar: '(vec3(0), 1)', + bad_scalar_vec: '(0, vec3(1))', + bad_vec_sizes: '(vec3(0), vec2(1))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1))', + bad_0array: '(array(1.1,2.2), vec3(1))', + bad_0struct: '(modf(2.2), vec3(1))', + bad_0int: '(0i, 1i)', + bad_0uint: '(0u, 1i)', + bad_0vec2i: '(vec2i(0), vec2i(1))', + bad_0vec3i: '(vec3i(0), vec3i(1))', + bad_0vec4i: '(vec4i(0), vec4i(1))', + bad_0vec2u: '(vec2u(0), vec2i(1))', + bad_0vec3u: '(vec3u(0), vec3i(1))', + bad_0vec4u: '(vec4u(0), vec4i(1))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true)', + bad_1array: '(vec3(0), array(1.1,2.2))', + bad_1struct: '(vec3(0), modf(2.2))', + bad_1f32: '(0f, 1f)', + bad_1f16: '(0f, 1h)', + bad_1uint: '(0f, 1u)', + bad_1vec2f: '(vec2f(0), vec2f(1))', + bad_1vec3f: '(vec3f(0), vec3f(1))', + bad_1vec4f: '(vec4f(0), vec4f(1))', + bad_1vec2h: '(vec2f(0), vec2h(1))', + bad_1vec3h: '(vec3f(0), vec3h(1))', + bad_1vec4h: '(vec4f(0), vec4h(1))', + bad_1vec2u: '(vec2f(0), vec2u(1))', + bad_1vec3u: '(vec3f(0), vec3u(1))', + bad_1vec4u: '(vec4f(0), vec4u(1))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/length.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/length.spec.js index 12a28233e55..02cf2bd90c5 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/length.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/length.spec.js @@ -7,14 +7,13 @@ import { makeTestGroup } from '../../../../../../common/framework/test_group.js' import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalars, - kAllFloatVector2, - kAllFloatVector3, - kAllFloatVector4, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalar, + kConvertableToFloatVec2, + kConvertableToFloatVec3, + kConvertableToFloatVec4, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -49,16 +48,25 @@ type) { - const squareSum = vec.reduce((prev, curr) => prev + curr * curr, 0); + const vec_number = vec.map((e) => Number(e)); + const squareSum = vec_number.reduce((prev, curr) => prev + Number(curr) * Number(curr), 0); const result = Math.sqrt(squareSum); return { - isIntermediateRepresentable: isRepresentable(squareSum, type), - isResultRepresentable: isRepresentable(result, type), + isIntermediateRepresentable: isRepresentable( + squareSum, + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ), + isResultRepresentable: isRepresentable( + result, + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ), result }; } -const kScalarTypes = objectsToRecord(kAllFloatScalars); +const kScalarTypes = objectsToRecord(kConvertableToFloatScalar); g.test('scalar'). desc( @@ -76,7 +84,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kScalarTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kScalarTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kScalarTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -92,7 +100,7 @@ fn((t) => { ); }); -const kVec2Types = objectsToRecord(kAllFloatVector2); +const kVec2Types = objectsToRecord(kConvertableToFloatVec2); g.test('vec2'). desc( @@ -108,11 +116,11 @@ filter((u) => stageSupportsType(u.stage, kVec2Types[u.type])). beginSubcases(). expand('x', (u) => fullRangeForType(kVec2Types[u.type], 5)). expand('y', (u) => fullRangeForType(kVec2Types[u.type], 5)). -expand('_result', (u) => [calculate([u.x, u.y], elementType(kVec2Types[u.type]))]). +expand('_result', (u) => [calculate([u.x, u.y], scalarTypeOf(kVec2Types[u.type]))]). filter((u) => u._result.isResultRepresentable === u._result.isIntermediateRepresentable) ). beforeAllSubcases((t) => { - if (elementType(kVec2Types[t.params.type]) === TypeF16) { + if (scalarTypeOf(kVec2Types[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -127,7 +135,7 @@ fn((t) => { ); }); -const kVec3Types = objectsToRecord(kAllFloatVector3); +const kVec3Types = objectsToRecord(kConvertableToFloatVec3); g.test('vec3'). desc( @@ -144,11 +152,11 @@ beginSubcases(). expand('x', (u) => fullRangeForType(kVec3Types[u.type], 4)). expand('y', (u) => fullRangeForType(kVec3Types[u.type], 4)). expand('z', (u) => fullRangeForType(kVec3Types[u.type], 4)). -expand('_result', (u) => [calculate([u.x, u.y, u.z], elementType(kVec3Types[u.type]))]). +expand('_result', (u) => [calculate([u.x, u.y, u.z], scalarTypeOf(kVec3Types[u.type]))]). filter((u) => u._result.isResultRepresentable === u._result.isIntermediateRepresentable) ). beforeAllSubcases((t) => { - if (elementType(kVec3Types[t.params.type]) === TypeF16) { + if (scalarTypeOf(kVec3Types[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -163,7 +171,7 @@ fn((t) => { ); }); -const kVec4Types = objectsToRecord(kAllFloatVector4); +const kVec4Types = objectsToRecord(kConvertableToFloatVec4); g.test('vec4'). desc( @@ -181,11 +189,11 @@ expand('x', (u) => fullRangeForType(kVec4Types[u.type], 3)). expand('y', (u) => fullRangeForType(kVec4Types[u.type], 3)). expand('z', (u) => fullRangeForType(kVec4Types[u.type], 3)). expand('w', (u) => fullRangeForType(kVec4Types[u.type], 3)). -expand('_result', (u) => [calculate([u.x, u.y, u.z, u.w], elementType(kVec4Types[u.type]))]). +expand('_result', (u) => [calculate([u.x, u.y, u.z, u.w], scalarTypeOf(kVec4Types[u.type]))]). filter((u) => u._result.isResultRepresentable === u._result.isIntermediateRepresentable) ). beforeAllSubcases((t) => { - if (elementType(kVec4Types[t.params.type]) === TypeF16) { + if (scalarTypeOf(kVec4Types[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -200,7 +208,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -214,8 +222,42 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0mat: '(mat2x2f())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log.spec.js index fb911b41883..5b735772350 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +68,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log2.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log2.spec.js index 4e538fbb776..60403807a6c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log2.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/log2.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +68,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/max.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/max.spec.js new file mode 100644 index 00000000000..6a550cfbc40 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/max.spec.js @@ -0,0 +1,91 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'max';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllNumericScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kAllNumericScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValuesTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValuesTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValuesTypes[t.params.type]; + const expectedResult = true; // should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.1, 2.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(1.0)', + bad_3arg: '(1.0, 2.0, 3.0)', + // Bad value for arg 0 + bad_0bool: '(false, 1.0)', + bad_0array: '(array(1.1,2.2), 1.0)', + bad_0struct: '(modf(2.2), 1.0)', + // Bad value type for arg 1 + bad_1bool: '(1.0, true)', + bad_1array: '(1.0, array(1.1,2.2))', + bad_1struct: '(1.0, modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/min.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/min.spec.js new file mode 100644 index 00000000000..377480a0294 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/min.spec.js @@ -0,0 +1,91 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'min';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllNumericScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kAllNumericScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValuesTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValuesTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValuesTypes[t.params.type]; + const expectedResult = true; // should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.1, 2.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(1.0)', + bad_3arg: '(1.0, 2.0, 3.0)', + // Bad value for arg 0 + bad_0bool: '(false, 1.0)', + bad_0array: '(array(1.1,2.2), 1.0)', + bad_0struct: '(modf(2.2), 1.0)', + // Bad value type for arg 1 + bad_1bool: '(1.0, true)', + bad_1array: '(1.0, array(1.1,2.2))', + bad_1struct: '(1.0, modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/mix.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/mix.spec.js new file mode 100644 index 00000000000..4e480d9550e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/mix.spec.js @@ -0,0 +1,142 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'mix';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, kConvertableToFloatVectors, scalarTypeOf } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('c', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarType); + + // Mix equation: a * (1 - c) + b * c + // Should be invalid if the mix calculations result in intermediate + // values that exceed the maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + const c = Number(t.params.c); + const c1 = vCheck.checkedResult(1 - c); + const ac1 = vCheck.checkedResult(a * c1); + const bc = vCheck.checkedResult(b * c); + vCheck.checkedResult(ac1 + bc); + + const type = kValidArgumentTypes[t.params.type]; + + // Validates mix(vecN(a), vecN(b), vecN(c)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b), type.create(t.params.c)], + t.params.stage + ); + + // Validates mix(vecN(a), vecN(b), c)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b), scalarType.create(t.params.c)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1), vec3(0.5))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_2arg: '(vec3(0), vec3(1))', + bad_4arg: '(vec3(0), vec3(1), vec3(0.5), vec3(3))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1), vec3(0.5))', + bad_0array: '(array(1.1,2.2), vec3(1), vec3(0.5))', + bad_0struct: '(modf(2.2), vec3(1), vec3(0.5))', + bad_0int: '(1i, vec3(1), vec3(0.5))', + bad_0uint: '(1u, vec3(1), vec3(0.5))', + bad_0vec2i: '(vec2i(0), vec2(1), vec2(0.5))', + bad_0vec3i: '(vec3i(0), vec3(1), vec3(0.5))', + bad_0vec4i: '(vec4i(0), vec4(1), vec4(0.5))', + bad_0vec2u: '(vec2u(0), vec2(1), vec2(0.5))', + bad_0vec3u: '(vec3u(0), vec3(1), vec3(0.5))', + bad_0vec4u: '(vec4u(0), vec4(1), vec4(0.5))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true, vec3(0.5))', + bad_1array: '(vec3(0), array(1.1,2.2), vec3(0.5))', + bad_1struct: '(vec3(0), modf(2.2), vec3(0.5))', + bad_1int: '(vec3(0), 1i, vec3(0.5))', + bad_1uint: '(vec3(0), 1u, vec3(0.5))', + bad_1vec2i: '(vec2(1), vec2i(1), vec2(0.5))', + bad_1vec3i: '(vec3(1), vec3i(1), vec3(0.5))', + bad_1vec4i: '(vec4(1), vec4i(1), vec4(0.5))', + bad_1vec2u: '(vec2(1), vec2u(1), vec2(0.5))', + bad_1vec3u: '(vec3(1), vec3u(1), vec3(0.5))', + bad_1vec4u: '(vec4(1), vec4u(1), vec4(0.5))', + // Bad value type for arg 2 + bad_2bool: '(vec3(0), vec3(1), true)', + bad_2array: '(vec3(0), vec3(1), array(1.1,2.2))', + bad_2struct: '(vec3(0), vec3(1), modf(2.2))', + bad_2int: '(vec3(0), vec3(1), 1i)', + bad_2uint: '(vec3(0), vec3(1), 1u)', + bad_2vec2i: '(vec2(1), vec2(1), vec2i(1))', + bad_2vec3i: '(vec3(1), vec3(1), vec3i(1))', + bad_2vec4i: '(vec4(1), vec4(1), vec4i(1))', + bad_2vec2u: '(vec2(1), vec2(1), vec2u(1))', + bad_2vec3u: '(vec3(1), vec3(1), vec3u(1))', + bad_2vec4u: '(vec4(1), vec4(1), vec4u(1))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/modf.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/modf.spec.js index d3937bc4f34..fc5d4baff00 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/modf.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/modf.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,8 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +69,136 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(0)], 'constant' ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1.0f)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1.f,2.f)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(f32_alias(1.f))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1.f,1.f,1.f,1.f))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: f32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1.0f); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/normalize.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/normalize.spec.js new file mode 100644 index 00000000000..b696401dbac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/normalize.spec.js @@ -0,0 +1,146 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'normalize';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatVectors, + scalarTypeOf } from + +'../../../../../util/conversion.js'; +import { quantizeToF16, quantizeToF32 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +function quantizeFunctionForScalarType(type) { + switch (type) { + case Type.f32: + return quantizeToF32; + case Type.f16: + return quantizeToF16; + default: + return (v) => v; + } +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() rejects invalid values +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let expectedResult = true; + + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const quantizeFn = quantizeFunctionForScalarType(scalarType); + + // Should be invalid if the normalization calculations result in intermediate + // values that exceed the maximum representable float value for the given type, + // or if the length is smaller than the smallest representable float value. + const v = Number(t.params.value); + const vv = quantizeFn(v * v); + const dp = quantizeFn(vv * kValidArgumentTypes[t.params.type].width); + const len = quantizeFn(Math.sqrt(dp)); + if (vv === Infinity || dp === Infinity || len === 0) { + expectedResult = false; + } + + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValidArgumentTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +const kInvalidArgumentTypes = objectsToRecord([ +Type.f32, +Type.f16, +Type.abstractInt, +Type.bool, +Type.vec(2, Type.bool), +Type.vec(3, Type.bool), +Type.vec(4, Type.bool), +...kConcreteIntegerScalarsAndVectors] +); + +g.test('invalid_argument'). +desc( + ` +Validates that all scalar arguments and vector integer or boolean arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kInvalidArgumentTypes))). +beforeAllSubcases((t) => { + if (kInvalidArgumentTypes[t.params.type] === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = false; // should always error with invalid argument types + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kInvalidArgumentTypes[t.params.type].create(0)], + 'constant' + ); +}); + +const kArgCases = { + good: '(vec3f(1, 0, 0))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(vec3f(),vec3f())', + // Bad value for arg 0 + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16float.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16float.spec.js new file mode 100644 index 00000000000..7c75f2cbb4b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16float.spec.js @@ -0,0 +1,100 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const kFn = 'pack2x16float';export const description = `Validate ${kFn}`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../../webgpu/util/constants.js'; +import { f32, vec2 } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; + +const kArgCases = { + good: '(vec2f())', + good_vec2_abstract_float: '(vec2(0.1))', + bad_0args: '()', + bad_2args: '(vec2f(),vec2f())', + bad_abstract_int: '(1)', + bad_i32: '(1i)', + bad_f32: '(1f)', + bad_u32: '(1u)', + bad_abstract_float: '(0.1)', + bad_bool: '(false)', + bad_vec4f: '(vec4f())', + bad_vec4u: '(vec4u())', + bad_vec4i: '(vec4i())', + bad_vec4b: '(vec4())', + bad_vec3f: '(vec3f())', + bad_array: '(array(1.0, 2.0, 3.0, 4.0))', + bad_struct: '(modf(1.1))' +}; +const kGoodArgs = kArgCases['good']; +const kReturnType = 'u32'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good' || t.params.arg === 'good_vec2_abstract_float', + `const c = ${kFn}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${kFn} return value type`). +params((u) => u.combine('type', ['u32', 'i32', 'f32', 'bool', 'vec2u'])). +fn((t) => { + t.expectCompileResult( + t.params.type === kReturnType, + `const c: ${t.params.type} = ${kFn}${kGoodArgs};` + ); +}); + +g.test('must_use'). +desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); +}); + +g.test('value_range'). +desc( + `Test failures of ${kFn} when at least one of the input value is out of the range of binary16` +). +params((u) => +u. +combine('constantOrOverrideStage', ['constant', 'override']). +combine('value0', [ +kValue.f16.positive.max, +kValue.f16.positive.max + 1, +kValue.f16.negative.min, +kValue.f16.negative.min - 1] +). +combine('value1', [ +kValue.f16.positive.max, +kValue.f16.positive.max + 1, +kValue.f16.negative.min, +kValue.f16.negative.min - 1] +) +). +fn((t) => { + const { constantOrOverrideStage, value0, value1 } = t.params; + + const success = + value0 >= kValue.f16.negative.min && + value0 <= kValue.f16.positive.max && + value1 >= kValue.f16.negative.min && + value1 <= kValue.f16.positive.max; + + validateConstOrOverrideBuiltinEval( + t, + kFn, + success, + [vec2(f32(value0), f32(value1))], + constantOrOverrideStage + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16snorm.spec.js new file mode 100644 index 00000000000..1059208d458 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16snorm.spec.js @@ -0,0 +1,58 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const kFn = 'pack2x16snorm';export const description = `Validate ${kFn}`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +const kArgCases = { + good: '(vec2f())', + good_vec2_abstract_float: '(vec2(0.1))', + bad_0args: '()', + bad_2args: '(vec2f(),vec2f())', + bad_abstract_int: '(1)', + bad_i32: '(1i)', + bad_f32: '(1f)', + bad_u32: '(1u)', + bad_abstract_float: '(0.1)', + bad_bool: '(false)', + bad_vec4f: '(vec4f())', + bad_vec4u: '(vec4u())', + bad_vec4i: '(vec4i())', + bad_vec4b: '(vec4())', + bad_vec3f: '(vec3f())', + bad_array: '(array(1.0, 2.0, 3.0, 4.0))', + bad_struct: '(modf(1.1))' +}; +const kGoodArgs = kArgCases['good']; +const kReturnType = 'u32'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good' || t.params.arg === 'good_vec2_abstract_float', + `const c = ${kFn}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${kFn} return value type`). +params((u) => u.combine('type', ['u32', 'i32', 'f32', 'bool', 'vec2u'])). +fn((t) => { + t.expectCompileResult( + t.params.type === kReturnType, + `const c: ${t.params.type} = ${kFn}${kGoodArgs};` + ); +}); + +g.test('must_use'). +desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16unorm.spec.js new file mode 100644 index 00000000000..eb29dd5b415 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack2x16unorm.spec.js @@ -0,0 +1,58 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const kFn = 'pack2x16unorm';export const description = `Validate ${kFn}`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +const kArgCases = { + good: '(vec2f())', + good_vec2_abstract_float: '(vec2(0.1))', + bad_0args: '()', + bad_2args: '(vec2f(),vec2f())', + bad_abstract_int: '(1)', + bad_i32: '(1i)', + bad_f32: '(1f)', + bad_u32: '(1u)', + bad_abstract_float: '(0.1)', + bad_bool: '(false)', + bad_vec4f: '(vec4f())', + bad_vec4u: '(vec4u())', + bad_vec4i: '(vec4i())', + bad_vec4b: '(vec4())', + bad_vec3f: '(vec3f())', + bad_array: '(array(1.0, 2.0, 3.0, 4.0))', + bad_struct: '(modf(1.1))' +}; +const kGoodArgs = kArgCases['good']; +const kReturnType = 'u32'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good' || t.params.arg === 'good_vec2_abstract_float', + `const c = ${kFn}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${kFn} return value type`). +params((u) => u.combine('type', ['u32', 'i32', 'f32', 'bool', 'vec2u'])). +fn((t) => { + t.expectCompileResult( + t.params.type === kReturnType, + `const c: ${t.params.type} = ${kFn}${kGoodArgs};` + ); +}); + +g.test('must_use'). +desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8snorm.spec.js new file mode 100644 index 00000000000..09c9008d616 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8snorm.spec.js @@ -0,0 +1,58 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const kFn = 'pack4x8snorm';export const description = `Validate ${kFn}`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +const kArgCases = { + good: '(vec4f())', + good_vec4_abstract_float: '(vec4(0.1))', + bad_0args: '()', + bad_2args: '(vec4f(),vec4f())', + bad_abstract_int: '(1)', + bad_i32: '(1i)', + bad_f32: '(1f)', + bad_u32: '(1u)', + bad_abstract_float: '(0.1)', + bad_bool: '(false)', + bad_vec4u: '(vec4u())', + bad_vec4i: '(vec4i())', + bad_vec4b: '(vec4())', + bad_vec2f: '(vec2f())', + bad_vec3f: '(vec3f())', + bad_array: '(array(1.0, 2.0, 3.0, 4.0))', + bad_struct: '(modf(1.1))' +}; +const kGoodArgs = kArgCases['good']; +const kReturnType = 'u32'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good' || t.params.arg === 'good_vec4_abstract_float', + `const c = ${kFn}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${kFn} return value type`). +params((u) => u.combine('type', ['u32', 'i32', 'f32', 'bool', 'vec2u'])). +fn((t) => { + t.expectCompileResult( + t.params.type === kReturnType, + `const c: ${t.params.type} = ${kFn}${kGoodArgs};` + ); +}); + +g.test('must_use'). +desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8unorm.spec.js new file mode 100644 index 00000000000..a0ff836f445 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4x8unorm.spec.js @@ -0,0 +1,58 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const kFn = 'pack4x8unorm';export const description = `Validate ${kFn}`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +const kArgCases = { + good: '(vec4f())', + good_vec4_abstract_float: '(vec4(0.1))', + bad_0args: '()', + bad_2args: '(vec4f(),vec4f())', + bad_abstract_int: '(1)', + bad_i32: '(1i)', + bad_f32: '(1f)', + bad_u32: '(1u)', + bad_abstract_float: '(0.1)', + bad_bool: '(false)', + bad_vec4u: '(vec4u())', + bad_vec4i: '(vec4i())', + bad_vec4b: '(vec4())', + bad_vec2f: '(vec2f())', + bad_vec3f: '(vec3f())', + bad_array: '(array(1.0, 2.0, 3.0, 4.0))', + bad_struct: '(modf(1.1))' +}; +const kGoodArgs = kArgCases['good']; +const kReturnType = 'u32'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good' || t.params.arg === 'good_vec4_abstract_float', + `const c = ${kFn}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${kFn} return value type`). +params((u) => u.combine('type', ['u32', 'i32', 'f32', 'bool', 'vec2u'])). +fn((t) => { + t.expectCompileResult( + t.params.type === kReturnType, + `const c: ${t.params.type} = ${kFn}${kGoodArgs};` + ); +}); + +g.test('must_use'). +desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8.spec.js index 7247b5fa2bd..4d9caa575c9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8.spec.js @@ -6,19 +6,22 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'pack4xI8'; -const kGoodArgs = '(vec4i())'; -const kBadArgs = { - '0args': '()', - '2args': '(vec4i(),vec4i())', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec4u': '(vec4u())', - '0vec4f': '(vec4f())', - '0vec4b': '(vec4())', - '0vec2i': '(vec2i())', - '0vec3i': '(vec3i())' +const kArgCases = { + good: '(vec4i())', + bad_0args: '()', + bad_2args: '(vec4i(),vec4i())', + bad_0i32: '(1i)', + bad_0f32: '(1f)', + bad_0bool: '(false)', + bad_0vec4u: '(vec4u())', + bad_0vec4f: '(vec4f())', + bad_0vec4b: '(vec4())', + bad_0vec2i: '(vec2i())', + bad_0vec3i: '(vec3i())', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -42,17 +45,18 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8Clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8Clamp.spec.js index b84dacbf6b0..dcd3af2633e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8Clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xI8Clamp.spec.js @@ -6,19 +6,22 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'pack4xI8Clamp'; -const kGoodArgs = '(vec4i())'; -const kBadArgs = { - '0args': '()', - '2args': '(vec4i(),vec4i())', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec4u': '(vec4u())', - '0vec4f': '(vec4f())', - '0vec4b': '(vec4())', - '0vec2i': '(vec2i())', - '0vec3i': '(vec3i())' +const kArgCases = { + good: '(vec4i())', + bad_0args: '()', + bad_2args: '(vec4i(),vec4i())', + bad_0i32: '(1i)', + bad_0f32: '(1f)', + bad_0bool: '(false)', + bad_0vec4u: '(vec4u())', + bad_0vec4f: '(vec4f())', + bad_0vec4b: '(vec4())', + bad_0vec2i: '(vec2i())', + bad_0vec3i: '(vec3i())', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -42,17 +45,18 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8.spec.js index c9cf334f514..ef5483c2aed 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8.spec.js @@ -6,19 +6,22 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'pack4xU8'; -const kGoodArgs = '(vec4u())'; -const kBadArgs = { - '0args': '()', - '2args': '(vec4u(),vec4u())', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec4i': '(vec4i())', - '0vec4f': '(vec4f())', - '0vec4b': '(vec4())', - '0vec2u': '(vec2u())', - '0vec3u': '(vec3u())' +const kArgCases = { + good: '(vec4u())', + bad_0args: '()', + bad_2args: '(vec4u(),vec4u())', + bad_0i32: '(1i)', + bad_0f32: '(1f)', + bad_0bool: '(false)', + bad_0vec4i: '(vec4i())', + bad_0vec4f: '(vec4f())', + bad_0vec4b: '(vec4())', + bad_0vec2u: '(vec2u())', + bad_0vec3u: '(vec3u())', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -42,17 +45,18 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8Clamp.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8Clamp.spec.js index b197d48b2a1..46505239aab 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8Clamp.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pack4xU8Clamp.spec.js @@ -6,19 +6,22 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; const kFeature = 'packed_4x8_integer_dot_product'; const kFn = 'pack4xU8Clamp'; -const kGoodArgs = '(vec4u())'; -const kBadArgs = { - '0args': '()', - '2args': '(vec4u(),vec4u())', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec4i': '(vec4i())', - '0vec4f': '(vec4f())', - '0vec4b': '(vec4())', - '0vec2u': '(vec2u())', - '0vec3u': '(vec3u())' +const kArgCases = { + good: '(vec4u())', + bad_0args: '()', + bad_2args: '(vec4u(),vec4u())', + bad_0i32: '(1i)', + bad_0f32: '(1f)', + bad_0bool: '(false)', + bad_0vec4i: '(vec4i())', + bad_0vec4f: '(vec4f())', + bad_0vec4b: '(vec4())', + bad_0vec2u: '(vec2u())', + bad_0vec3u: '(vec3u())', + bad_0array: '(array(1))', + bad_0struct: '(modf(1.1))' }; +const kGoodArgs = kArgCases['good']; export const g = makeTestGroup(ShaderValidationTest); @@ -42,17 +45,18 @@ fn((t) => { t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('args'). +desc(`Test compilation failure of ${kFn} with various numbers of and types of arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + t.expectCompileResult(t.params.arg === 'good', `const c = ${kFn}${kArgCases[t.params.arg]};`); }); g.test('must_use'). desc(`Result of ${kFn} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${kFn}${kGoodArgs}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pow.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pow.spec.js new file mode 100644 index 00000000000..66e13ff2dfb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/pow.spec.js @@ -0,0 +1,175 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'pow';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from + +'../../../../../util/conversion.js'; +import { quantizeToF16, quantizeToF32 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +function quantizeFunctionForScalarType(type) { + switch (type) { + case Type.f32: + return quantizeToF32; + case Type.f16: + return quantizeToF16; + default: + return (v) => v; + } +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() rejects invalid values + +TODO(http://github.com/gpuweb/issues/4527): This validation matches what is currently in Tint but +it needs to be clarified in the spec if this is the desired behavior. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let expectedResult = true; + + const a = Number(t.params.a); + const b = Number(t.params.b); + if (a < 0 || a === 0 && b <= 0) { + expectedResult = false; + } + + if (expectedResult) { + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const quantizeFn = quantizeFunctionForScalarType(scalarType); + + // Should be invalid if the pow calculation results in values that exceed + // the maximum representable float value for the given type + const p = quantizeFn(Math.pow(a, b)); + if (!Number.isFinite(p)) { + expectedResult = false; + } + } + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kInvalidArgumentTypes = objectsToRecord([ +Type.bool, +Type.vec(2, Type.bool), +Type.vec(3, Type.bool), +Type.vec(4, Type.bool), +...kConcreteIntegerScalarsAndVectors] +); + +g.test('invalid_argument'). +desc( + ` +Validates that all integer or boolean scalar and vector arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kInvalidArgumentTypes))). +beforeAllSubcases((t) => { + if (kInvalidArgumentTypes[t.params.type] === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = false; // should always error with invalid argument types + const type = kInvalidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(1), type.create(2)], + 'constant' + ); +}); + +const kArgCases = { + good: '(2.0, 2.0)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1args: '(2.0)', + bad_3args: '(2.0,2.0,2.0)', + // Bad value for arg 0 + bad_0bool: '(false, 2.0)', + bad_0array: '(array(1.1,2.2), 2.0)', + bad_0struct: '(modf(2.2), 2.0)', + bad_0uint: '(1u, 2.0)', + bad_0int: '(1i, 2.0)', + bad_0vec2i: '(vec2i(), 2.0)', + bad_0vec2u: '(vec2u(), 2.0)', + bad_0vec3i: '(vec3i(), 2.0)', + bad_0vec3u: '(vec3u(), 2.0)', + bad_0vec4i: '(vec4i(), 2.0)', + bad_0vec4u: '(vec4u(), 2.0)', + // Bad value for arg 1 + bad_1bool: '(2.0, false)', + bad_1array: '(2.0, array(1.1,2.2))', + bad_1struct: '(2.0, modf(2.2))', + bad_1uint: '(2.0, 1u)', + bad_1int: '(2.0, 1i)', + bad_1vec2i: '(2.0, vec2i())', + bad_1vec2u: '(2.0, vec2u())', + bad_1vec3i: '(2.0, vec3i())', + bad_1vec3u: '(2.0, vec3u())', + bad_1vec4i: '(2.0, vec4i())', + bad_1vec4u: '(2.0, vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/quantizeToF16.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/quantizeToF16.spec.js new file mode 100644 index 00000000000..cbea6ffa409 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/quantizeToF16.spec.js @@ -0,0 +1,113 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'quantizeToF16';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, kConcreteF32ScalarsAndVectors } from '../../../../../util/conversion.js'; +import { quantizeToF16 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord([ +Type.abstractFloat, +Type.vec(2, Type.abstractFloat), +Type.vec(3, Type.abstractFloat), +Type.vec(4, Type.abstractFloat), +...kConcreteF32ScalarsAndVectors] +); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() error on invalid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +fn((t) => { + let expectedResult = true; + + // Should be invalid if the quantized value exceeds the maximum representable + // 16-bit float value. + const f16Value = quantizeToF16(Number(t.params.value)); + if (f16Value === Infinity || f16Value === -Infinity) { + expectedResult = false; + } + + const type = kValidArgumentTypes[t.params.type]; + + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCasesF16 = { + bad_0f16: '(1h)', + bad_0vec2h: '(vec2h())', + bad_0vec3h: '(vec3h())', + bad_0vec4h: '(vec4h())' +}; + +const kArgCases = { + good: '(vec3f())', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.0, 2.0)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())', + ...kArgCasesF16 +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +beforeAllSubcases((t) => { + if (t.params.arg in kArgCasesF16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/radians.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/radians.spec.js index 51e1c451a31..6d8a5511dec 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/radians.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/radians.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +68,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_too_few: '()', + bad_too_many: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reflect.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reflect.spec.js new file mode 100644 index 00000000000..f90cfc116a5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reflect.spec.js @@ -0,0 +1,131 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'reflect';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatVectors, + scalarTypeOf } from + +'../../../../../util/conversion.js'; +import { quantizeToF16, quantizeToF32 } from '../../../../../util/math.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +function quantizeFunctionForScalarType(type) { + switch (type) { + case Type.f32: + return quantizeToF32; + case Type.f16: + return quantizeToF16; + default: + return (v) => v; + } +} + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let expectedResult = true; + + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const quantizeFn = quantizeFunctionForScalarType(scalarType); + + // Reflect equation: a - 2 * dot(b, a) * b + // Should be invalid if the reflect calculations result in intermediate + // values that exceed the maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + const ab = quantizeFn(a * b); + const dp = quantizeFn(ab * kValidArgumentTypes[t.params.type].width); + const dp2 = quantizeFn(dp * 2); + const dp2b = quantizeFn(dp2 * b); + const a_dp2b = quantizeFn(a - dp2b); + + if ( + !Number.isFinite(ab) || + !Number.isFinite(dp) || + !Number.isFinite(dp2) || + !Number.isFinite(dp2b) || + !Number.isFinite(a_dp2b)) + { + expectedResult = false; + } + + const type = kValidArgumentTypes[t.params.type]; + + // Validates reflect(vecN(a, a, a), vecN(b, b, b)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(vec3(0), vec3(1))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_3arg: '(vec3(0), vec3(1), vec3(2))', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1))', + bad_0array: '(array(1.1,2.2), vec3(1))', + bad_0struct: '(modf(2.2), vec3(1))', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true)', + bad_1array: '(vec3(0), array(1.1,2.2))', + bad_1struct: '(vec3(0), modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/refract.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/refract.spec.js new file mode 100644 index 00000000000..334a197b1cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/refract.spec.js @@ -0,0 +1,175 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'refract';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { Type, kConvertableToFloatVectors, scalarTypeOf } from '../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + ConstantOrOverrideValueChecker, + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() only errors in cases +where a the calculations result in a non-representable value for the given type. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('c', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValidArgumentTypes[t.params.type]; + const scalarType = scalarTypeOf(kValidArgumentTypes[t.params.type]); + const vCheck = new ConstantOrOverrideValueChecker(t, scalarType); + + // Refract equation: + // let k = 1.0 - c * c * (1.0 - dot(b, a) * dot(b, a)) + // if (k < 0.0) { return vecN(0.0); } + // return c * a - (c * dot(b, a) + sqrt(k)) * b + // Should be invalid if the calculations result in intermediate values that + // exceed the maximum representable float value for the given type. + const a = Number(t.params.a); + const b = Number(t.params.b); + const c = Number(t.params.c); + + const b_dot_a = vCheck.checkedResult(b * a * type.width); + const b_dot_a_2 = vCheck.checkedResult(b_dot_a * b_dot_a); + const one_minus_b_dot_a_2 = vCheck.checkedResult(1.0 - b_dot_a_2); + const c2 = vCheck.checkedResult(c * c); + const c2_one_minus_b_dot_a_2 = vCheck.checkedResult(c2 * one_minus_b_dot_a_2); + const k = vCheck.checkedResult(1.0 - c2_one_minus_b_dot_a_2); + + if (k >= 0) { + // If the k is near zero it may fail on some implementations which implement sqrt as + // 1/inversesqrt, so skip the test. + if (vCheck.isNearZero(k)) { + t.skip(`K value, ${k}, is at or near 0.`); + } + + const ca = vCheck.checkedResult(c * a); + const cbda = vCheck.checkedResult(c * b_dot_a); + const sqrt_k = vCheck.checkedResult(Math.sqrt(k)); + const cdba_sqrt_k = vCheck.checkedResult(cbda + sqrt_k); + const cdba_sqrt_k_b = vCheck.checkedResult(cdba_sqrt_k * b); + vCheck.checkedResult(ca - cdba_sqrt_k_b); + } + + // Validates refract(vecN(a), vecN(b), c); + validateConstOrOverrideBuiltinEval( + t, + builtin, + vCheck.allChecksPassed(), + [type.create(t.params.a), type.create(t.params.b), scalarType.create(t.params.c)], + t.params.stage + ); +}); + +const kValidArgs = { + vec2f: '(vec2(0), vec2(1), 2.0)', + vec3f: '(vec3(0), vec3(1), 2.0)', + vec4f: '(vec4(0), vec4(1), 2.0)' +}; + +const kArgCases = { + ...kValidArgs, + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(vec3(0))', + bad_2arg: '(vec3(0), vec3(1))', + bad_3arg: '(vec3(0), vec3(1), 2.0, vec3(3))', + // Mismatched vec sizes + bad_vec2_vec3: '(vec2(0), vec3(1), 2.0)', + bad_vec3_vec4: '(vec3(0), vec4(1), 2.0)', + bad_vec4_vec2: '(vec4(0), vec2(1), 2.0)', + // Bad value for arg 0 + bad_0bool: '(false, vec3(1), 2.0)', + bad_0array: '(array(1.1,2.2), vec3(1), 2.0)', + bad_0struct: '(modf(2.2), vec3(1), 2.0)', + bad_0int: '(0i, vec3(1), 2.0)', + bad_0uint: '(0u, vec3(1), 2.0)', + bad_0f32: '(0.0, vec3(1), 2.0)', + bad_0f16: '(0.0h, vec3(1), 2.0)', + bad_0veci: '(vec3i(0), vec3(1), 2.0)', + bad_0vecu: '(vec3u(0), vec3(1), 2.0)', + // Bad value type for arg 1 + bad_1bool: '(vec3(0), true, 2.0)', + bad_1array: '(vec3(0), array(1.1,2.2), 2.0)', + bad_1struct: '(vec3(0), modf(2.2), 2.0)', + bad_1int: '(vec3(0), 1i, 2.0)', + bad_1uint: '(vec3(0), 1u, 2.0)', + bad_1f32: '(vec3(0), 1.0, 2.0)', + bad_1f16: '(vec3(0), 1.0h, 2.0)', + bad_1veci: '(vec3(0), vec3i(1), 2.0)', + bad_1vecu: '(vec3(0), vec3u(1), 2.0)', + // Bad value type for arg 2 + bad_2bool: '(vec3(0), vec3(1), true)', + bad_2array: '(vec3(0), vec3(1), array(1.1,2.2))', + bad_2struct: '(vec3(0), vec3(1), modf(2.2))', + bad_2int: '(vec3(0), vec3(1), 2i)', + bad_2uint: '(vec3(0), vec3(1), 2u)', + bad_2veci: '(vec3(0), vec3(1), vec3i(2))', + bad_2vecu: '(vec3(0), vec3(1), vec3u(2))', + bad_2vecf: '(vec3(0), vec3(1), vec3f(2))', + bad_2vech: '(vec3(0), vec3(1), vec3h(2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg in kValidArgs, + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('return'). +desc(`Test ${builtin} return value type`). +params((u) => +u. +combine('arg', keysOf(kValidArgs)). +combine('returnType', [...keysOf(kValidArgs), 'vec3u', 'vec3i', 'u32', 'i32', 'f32', 'bool']) +). +fn((t) => { + t.expectCompileResult( + t.params.returnType === t.params.arg, + `const c: ${t.params.returnType} = ${builtin}${kValidArgs[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('arg', keysOf(kValidArgs)).combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult( + t.params.use, + `fn f() { ${use_it}${builtin}${kValidArgs[t.params.arg]}; }` + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reverseBits.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reverseBits.spec.js new file mode 100644 index 00000000000..f1560d6d06a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/reverseBits.spec.js @@ -0,0 +1,198 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'reverseBits';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConcreteIntegerScalarsAndVectors, + kFloatScalarsAndVectors } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConcreteIntegerScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() never errors +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +fn((t) => { + const expectedResult = true; // reverseBits() should never error + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [kValuesTypes[t.params.type].create(t.params.value)], + t.params.stage + ); +}); + +// u32 is included here to confirm that validation is failing due to a type issue and not something else. +const kFloatTypes = objectsToRecord([Type.u32, ...kFloatScalarsAndVectors]); + +g.test('float_argument'). +desc( + ` +Validates that float arguments are rejected by ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kFloatTypes))). +fn((t) => { + const type = kFloatTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.u32, + [type.create(0)], + 'constant' + ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1u)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1u,2u)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(u32_alias(1))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1,1,1,1))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1u; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias u32_alias = u32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: u32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/round.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/round.spec.js index a90c17e10c9..2e9d63cb17a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/round.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/round.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { fpTraitsFor } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -25,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,15 +39,19 @@ combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). expand('value', (u) => { - const constants = fpTraitsFor(elementType(kValuesTypes[u.type])).constants(); - return unique(fullRangeForType(kValuesTypes[u.type]), [ - constants.negative.min + 0.1, - constants.positive.max - 0.1] - ); + if (scalarTypeOf(kValuesTypes[u.type]).kind === 'abstract-int') { + return fullRangeForType(kValuesTypes[u.type]); + } else { + const constants = fpTraitsFor(scalarTypeOf(kValuesTypes[u.type])).constants(); + return unique(fullRangeForType(kValuesTypes[u.type]), [ + constants.negative.min + 0.1, + constants.positive.max - 0.1] + ); + } }) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -63,7 +66,8 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -77,8 +81,136 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1.0f)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1.f,2.f)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(f32_alias(1.f))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1.f,1.f,1.f,1.f))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: f32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1.0f); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/saturate.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/saturate.spec.js index acf8bb059fe..b5a10b986cf 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/saturate.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/saturate.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,7 +39,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,7 +54,8 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +// f32 is included here to confirm that validation is failing due to a type issue and not something else. +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -69,8 +69,136 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kTests = + + + + + + + + +{ + valid: { + args: '(1.0f)', + pass: true + }, + // Number of arguments. + no_parens: { + args: '', + pass: false + }, + too_few_args: { + args: '()', + pass: false + }, + too_many_args: { + args: '(1.f,2.f)', + pass: false + }, + // Arguments types (only 1 argument for this builtin). + alias: { + args: '(f32_alias(1.f))', + pass: true + }, + bool: { + args: '(false)', + pass: false + }, + vec_bool: { + args: '(vec2(false,true))', + pass: false + }, + matrix: { + args: '(mat2x2(1.f,1.f,1.f,1.f))', + pass: false + }, + atomic: { + args: '(a)', + pass: false + }, + array: { + preamble: 'var arry: array;', + args: '(arry)', + pass: false + }, + array_runtime: { + args: '(k.arry)', + pass: false + }, + struct: { + preamble: 'var x: A;', + args: '(x)', + pass: false + }, + enumerant: { + args: '(read_write)', + pass: false + }, + ptr: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(p)', + pass: false + }, + ptr_deref: { + preamble: `var f = 1.f; + let p: ptr = &f;`, + args: '(*p)', + pass: true + }, + sampler: { + args: '(s)', + pass: false + }, + texture: { + args: '(t)', + pass: false + } +}; + +g.test('arguments'). +desc(`Test compilation validation of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const test = kTests[t.params.test]; + t.expectCompileResult( + test.pass, + `alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: f32, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + + @vertex + fn main() -> @builtin(position) vec4 { + ${test.preamble ? test.preamble : ''} + _ = ${builtin}${test.args}; + return vec4(.4, .2, .3, .1); + }` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1.0f); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/select.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/select.spec.js new file mode 100644 index 00000000000..7d3d56c2d50 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/select.spec.js @@ -0,0 +1,250 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'select';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + concreteTypeOf, + isConvertible, + kAllScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { validateConstOrOverrideBuiltinEval } from './const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kArgumentTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('argument_types_1_and_2'). +desc( + ` +Validates that scalar and vector arguments are not rejected by ${builtin}() for args 1 and 2 +` +). +params((u) => u.combine('type1', keysOf(kArgumentTypes)).combine('type2', keysOf(kArgumentTypes))). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(kArgumentTypes[t.params.type1]) === Type.f16 || + scalarTypeOf(kArgumentTypes[t.params.type2]) === Type.f16) + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type1 = kArgumentTypes[t.params.type1]; + const type2 = kArgumentTypes[t.params.type2]; + // First and second arg must be the same or one convertible to the other. + // Note that we specify a concrete return type even if both args are abstract. + const returnType = isConvertible(type1, type2) ? + concreteTypeOf(type2) : + isConvertible(type2, type1) ? + concreteTypeOf(type1) : + undefined; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */returnType !== undefined, + [type1.create(0), type2.create(0), Type.bool.create(0)], + 'constant', + returnType + ); +}); + +g.test('argument_types_3'). +desc( + ` +Validates that third argument must be bool for ${builtin}() +` +). +params((u) => u.combine('type', keysOf(kArgumentTypes))). +beforeAllSubcases((t) => { + if (scalarTypeOf(kArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */type === Type.bool, + [Type.i32.create(0), Type.i32.create(0), type.create(0)], + 'constant', + /*return_type*/Type.i32 + ); +}); + +const kTests = { + valid: { + src: `_ = ${builtin}(1, 2, true);`, + pass: true + }, + alias: { + src: `_ = ${builtin}(i32_alias(1), i32_alias(2), bool_alias(true));`, + pass: true + }, + bool: { + src: `_ = ${builtin}(false, false, true);`, + pass: true + }, + i32: { + src: `_ = ${builtin}(1i, 1i, true);`, + pass: true + }, + u32: { + src: `_ = ${builtin}(1u, 1u, true);`, + pass: true + }, + f32: { + src: `_ = ${builtin}(1.0f, 1.0f, true);`, + pass: true + }, + f16: { + src: `_ = ${builtin}(1.0h, 1.0h, true);`, + pass: true + }, + mixed_aint_afloat: { + src: `_ = ${builtin}(1, 1.0, true);`, + pass: true + }, + mixed_i32_u32: { + src: `_ = ${builtin}(1i, 1u, true);`, + pass: false + }, + vec_bool: { + src: `_ = ${builtin}(vec2(false, true), vec2(false, true), true);`, + pass: true + }, + vec2_bool_implicit: { + src: `_ = ${builtin}(vec2(false, true), vec2(false, true), true);`, + pass: true + }, + vec3_bool_implicit: { + src: `_ = ${builtin}(vec3(false), vec3(true), true);`, + pass: true + }, + vec_i32: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), true);`, + pass: true + }, + vec_u32: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), true);`, + pass: true + }, + vec_f32: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), true);`, + pass: true + }, + vec_f16: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), true);`, + pass: true + }, + matrix: { + src: `_ = ${builtin}(mat2x2(1, 1, 1, 1), mat2x2(1, 1, 1, 1), true);`, + pass: false + }, + atomic: { + src: ` _ = ${builtin}(a, a, true);`, + pass: false + }, + array: { + src: `var a: array; + _ = ${builtin}(a, a, true);`, + pass: false + }, + array_runtime: { + src: `_ = ${builtin}(k.arry, k.arry, true);`, + pass: false + }, + struct: { + src: `var a: A; + _ = ${builtin}(a, a, true);`, + pass: false + }, + enumerant: { + src: `_ = ${builtin}(read_write, read_write, true);`, + pass: false + }, + ptr: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(p, p, true);`, + pass: false + }, + ptr_deref: { + src: `var a = true; + let p: ptr = &a; + _ = ${builtin}(*p, *p, true);`, + pass: true + }, + sampler: { + src: `_ = ${builtin}(s, s, true);`, + pass: false + }, + texture: { + src: `_ = ${builtin}(t, t, true);`, + pass: false + }, + no_args: { + src: `_ = ${builtin}();`, + pass: false + }, + too_few_args: { + src: `_ = ${builtin}(1, true);`, + pass: false + }, + too_many_args: { + src: `_ = ${builtin}(1, 1, 1, true);`, + pass: false + } +}; + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1, 2, true); }`); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +beforeAllSubcases((t) => { + if (t.params.test.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const src = kTests[t.params.test].src; + const enables = t.params.test.includes('f16') ? 'enable f16;' : ''; + const code = ` + ${enables} + alias bool_alias = bool; + alias i32_alias = i32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: bool, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + @vertex + fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); + }`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/shader_builtin_utils.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/shader_builtin_utils.js new file mode 100644 index 00000000000..899f56b1b38 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/shader_builtin_utils.js @@ -0,0 +1,163 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { keysOf } from '../../../../../../common/util/data_tables.js';import { assert } from '../../../../../../common/util/util.js';import { Type, scalarTypeOf } from '../../../../../util/conversion.js'; + +/** + * Use to test that certain WGSL builtins are only available in the fragment stage. + * Create WGSL that defines a function "foo" and its required variables that uses + * the builtin being tested. Append it to these code strings then compile. It should + * succeed or fail based on the value `expectSuccess`. + * + * See ./textureSample.spec.ts was one example + */ +export const kEntryPointsToValidateFragmentOnlyBuiltins = { + none: { + expectSuccess: true, + code: `` + }, + fragment: { + expectSuccess: true, + code: ` + @fragment + fn main() { + foo(); + } + ` + }, + vertex: { + expectSuccess: false, + code: ` + @vertex + fn main() -> @builtin(position) vec4f { + foo(); + return vec4f(); + } + ` + }, + compute: { + expectSuccess: false, + code: ` + @compute @workgroup_size(1) + fn main() { + foo(); + } + ` + }, + fragment_and_compute: { + expectSuccess: false, + code: ` + @fragment + fn main1() { + foo(); + } + + @compute @workgroup_size(1) + fn main2() { + foo(); + } + ` + }, + compute_without_call: { + expectSuccess: true, + code: ` + @compute @workgroup_size(1) + fn main() { + } + ` + } +}; + +const kCommonTexelTypes = [Type.vec4f, Type.vec4i, Type.vec4u]; +const kDepthTexelTypes = [Type.f32]; +const kExternalTexelTypes = [Type.vec4f]; + + + + + + + + +const kCommonTextureTypes = { + texture_1d: { texelTypes: kCommonTexelTypes }, + texture_2d: { texelTypes: kCommonTexelTypes }, + texture_2d_array: { texelTypes: kCommonTexelTypes }, + texture_3d: { texelTypes: kCommonTexelTypes }, + texture_cube: { texelTypes: kCommonTexelTypes }, + texture_cube_array: { texelTypes: kCommonTexelTypes }, + texture_multisampled_2d: { texelTypes: kCommonTexelTypes } +}; + +const kDepthTextureTypes = { + texture_depth_2d: { texelTypes: kDepthTexelTypes, noSuffix: true }, + texture_depth_2d_array: { texelTypes: kDepthTexelTypes, noSuffix: true }, + texture_depth_cube: { texelTypes: kDepthTexelTypes, noSuffix: true }, + texture_depth_cube_array: { texelTypes: kDepthTexelTypes, noSuffix: true }, + texture_depth_multisampled_2d: { texelTypes: kDepthTexelTypes, noSuffix: true } +}; + +export const kNonStorageTextureTypeInfo = { + ...kCommonTextureTypes, + ...kDepthTextureTypes, + texture_external: { texelTypes: kExternalTexelTypes, noSuffix: true } +}; + +export const kNonStorageTextureTypes = keysOf(kNonStorageTextureTypeInfo); + + +/** + * @returns the WGSL needed to define a texture based on a textureType (eg: 'texture_2d') + * and a texelType (eg: Type.vec4f) which would return `texture_2d` + */ +export function getNonStorageTextureTypeWGSL(textureType, texelType) { + const info = kNonStorageTextureTypeInfo[textureType]; + return info.noSuffix ? textureType : `${textureType}<${scalarTypeOf(texelType)}>`; +} + +export const kTestTextureTypes = [ +'texture_1d', +'texture_1d', +'texture_2d', +'texture_2d', +'texture_2d_array', +'texture_2d_array', +'texture_3d', +'texture_3d', +'texture_cube', +'texture_cube', +'texture_cube_array', +'texture_cube_array', +'texture_multisampled_2d', +'texture_multisampled_2d', +'texture_depth_multisampled_2d', +'texture_external', +'texture_storage_1d', +'texture_storage_1d', +'texture_storage_2d', +'texture_storage_2d', +'texture_storage_2d_array', +'texture_storage_2d_array', +'texture_storage_3d', +'texture_storage_3d', +'texture_depth_2d', +'texture_depth_2d_array', +'texture_depth_cube', +'texture_depth_cube_array']; + + +const kTextureTypeSuffixToType = { + f32: Type.vec4f, + u32: Type.vec4i, + 'rgba8unorm, read': Type.vec4f, + 'r32uint, read': Type.vec4u +}; + +/** @returns the base type and sample type for kTestTextureTypes */ +export function getSampleAndBaseTextureTypeForTextureType( +textureType) +{ + const match = /^(.*?)<(.*?)>/.exec(textureType); + const sampleType = match ? kTextureTypeSuffixToType[match[2]] : Type.vec4f; + assert(!!sampleType); + return [match ? match[1] : textureType, sampleType]; +} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sign.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sign.spec.js index 7a08bac5f93..1e458aa9d03 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sign.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sign.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatAndSignedIntegerScalarsAndVectors, - kAllUnsignedIntegerScalarsAndVectors } from + Type, + kFloatScalarsAndVectors, + kConcreteSignedIntegerScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -23,7 +22,10 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatAndSignedIntegerScalarsAndVectors); +const kValuesTypes = objectsToRecord([ +...kFloatScalarsAndVectors, +...kConcreteSignedIntegerScalarsAndVectors] +); g.test('values'). desc( @@ -40,7 +42,7 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -55,25 +57,36 @@ fn((t) => { ); }); -const kUnsignedIntegerArgumentTypes = objectsToRecord([ -TypeF32, -...kAllUnsignedIntegerScalarsAndVectors] -); +const kArgCases = { + good: '(1.0)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.0, 1.0)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0vec2u: '(vec2u(1))', + bad_0vec3u: '(vec3u(1))', + bad_0vec4u: '(vec4u(1))' +}; -g.test('unsigned_integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kUnsignedIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kUnsignedIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(1)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sin.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sin.spec.js index 716311f20ce..fd629bf7ed9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sin.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sin.spec.js @@ -6,18 +6,17 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinus3PiTo3Pi, + minusThreePiToThreePiRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -25,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -39,10 +38,15 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). @@ -56,7 +60,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -70,8 +74,42 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, + [type.create(0)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sinh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sinh.spec.js index c6541329608..e35fb84e722 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sinh.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sinh.spec.js @@ -6,11 +6,9 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -24,7 +22,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -41,13 +39,17 @@ beginSubcases(). expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const expectedResult = isRepresentable(Math.sinh(t.params.value), elementType(type)); + const expectedResult = isRepresentable( + Math.sinh(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -57,22 +59,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(0)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.js new file mode 100644 index 00000000000..dbddd881077 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.js @@ -0,0 +1,350 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'smoothstep';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + concreteTypeOf, + elementTypeOf, + isConvertibleToFloatType, + kAllScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf, + f32 } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); +const kArgumentTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() rejects invalid values +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value1', (u) => [-1000, -10, 0, 10, 1000]). +expand('value2', (u) => [-1000, -10, 0, 10, 1000]) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValuesTypes[t.params.type]; + + // We expect to fail if low >= high as it results in a DBZ + const expectedResult = t.params.value1 >= t.params.value2; + + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value1), type.create(t.params.value2), type.create(0)], + t.params.stage, + /* returnType */concreteTypeOf(type, [Type.f32]) + ); +}); + +const kStages = [...kConstantAndOverrideStages, 'runtime']; + +g.test('partial_eval_errors'). +desc('Validates that low < high'). +params((u) => +u. +combine('lowStage', kStages). +combine('highStage', kStages). +combine('type', keysOf(kValuesTypes)). +filter((t) => { + const type = kValuesTypes[t.type]; + const scalarTy = scalarTypeOf(type); + return scalarTy !== Type.abstractInt && scalarTy !== Type.abstractFloat; +}). +beginSubcases(). +expand('low', (u) => [0, 10]). +expand('high', (u) => [0, 10]) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValuesTypes[t.params.type]; + const scalarTy = scalarTypeOf(type); + const enable = `${type.requiresF16() ? 'enable f16;' : ''}`; + let lowArg = ''; + let highArg = ''; + switch (t.params.lowStage) { + case 'constant': + lowArg = `${type.create(t.params.low).wgsl()}`; + break; + case 'override': + lowArg = `${type.toString()}(o_low)`; + break; + case 'runtime': + lowArg = `v_low`; + break; + } + switch (t.params.highStage) { + case 'constant': + highArg = `${type.create(t.params.high).wgsl()}`; + break; + case 'override': + highArg = `${type.toString()}(o_high)`; + break; + case 'runtime': + highArg = `v_high`; + break; + } + const wgsl = ` +${enable} +override o_low : ${scalarTy.toString()}; +override o_high : ${scalarTy.toString()}; +fn foo() { + var x : ${type.toString()}; + var v_low : ${type.toString()}; + var v_high : ${type.toString()}; + let tmp = smoothstep(${lowArg}, ${highArg}, x); +}`; + + const error = t.params.low >= t.params.high; + const shader_error = + error && t.params.lowStage === 'constant' && t.params.highStage === 'constant'; + const pipeline_error = + error && t.params.lowStage !== 'runtime' && t.params.highStage !== 'runtime'; + t.expectCompileResult(!shader_error, wgsl); + if (!shader_error) { + const constants = {}; + constants['o_low'] = t.params.low; + constants['o_high'] = t.params.high; + t.expectPipelineResult({ + expectedResult: !pipeline_error, + code: wgsl, + constants, + reference: ['o_low', 'o_high'] + }); + } +}); + +g.test('argument_types'). +desc( + ` +Validates that scalar and vector arguments are rejected by ${builtin}() if not float type or vecN +` +). +params((u) => u.combine('type', keysOf(kArgumentTypes))). +beforeAllSubcases((t) => { + if (scalarTypeOf(kArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */isConvertibleToFloatType(elementTypeOf(type)), + [type.create(0), type.create(1), type.create(2)], + 'constant', + /* returnType */concreteTypeOf(type, [Type.f32]) + ); +}); + +const kTests = { + valid: { + src: `_ = ${builtin}(0.0, 42.0, 0.5);`, + pass: true + }, + alias: { + src: `_ = ${builtin}(f32_alias(0), f32_alias(42), f32_alias(0.5));`, + pass: true + }, + bool: { + src: `_ = ${builtin}(false, false, false);`, + pass: false + }, + i32: { + src: `_ = ${builtin}(1i, 2i, 1i);`, + pass: false + }, + u32: { + src: `_ = ${builtin}(1u, 2u, 1u);`, + pass: false + }, + f32: { + src: `_ = ${builtin}(1.0f, 2.0f, 1.0f);`, + pass: true + }, + f16: { + src: `_ = ${builtin}(1h, 2h, 1h);`, + pass: true + }, + mixed_aint_afloat: { + src: `_ = ${builtin}(1.0, 2, 1);`, + pass: true + }, + mixed_f32_afloat: { + src: `_ = ${builtin}(1.0f, 2.0, 1.0);`, + pass: true + }, + mixed_f16_afloat: { + src: `_ = ${builtin}(1.0h, 2.0, 1.0);`, + pass: true + }, + vec_bool: { + src: `_ = ${builtin}(vec2(false, true), vec2(false, true), vec2(false, true));`, + pass: false + }, + vec_i32: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), vec2(1, 1));`, + pass: false + }, + vec_u32: { + src: `_ = ${builtin}(vec2(1, 1), vec2(1, 1), vec2(1, 1));`, + pass: false + }, + vec_f32: { + src: `_ = ${builtin}(vec2(0, 0), vec2(1, 1), vec2(1, 1));`, + pass: true + }, + matrix: { + src: `_ = ${builtin}(mat2x2(1, 1, 1, 1), mat2x2(1, 1, 1, 1), mat2x2(1, 1, 1, 1));`, + pass: false + }, + atomic: { + src: ` _ = ${builtin}(a, a, a);`, + pass: false + }, + array: { + src: `var a: array; + _ = ${builtin}(a, a, a);`, + pass: false + }, + array_runtime: { + src: `_ = ${builtin}(k.arry, k.arry, k.arry);`, + pass: false + }, + struct: { + src: `var a: A; + _ = ${builtin}(a, a, a);`, + pass: false + }, + enumerant: { + src: `_ = ${builtin}(read_write, read_write, read_write);`, + pass: false + }, + ptr: { + src: `var a = 1.0; + let p: ptr = &a; + _ = ${builtin}(p, p, p);`, + pass: false + }, + ptr_deref: { + src: `var a = 1.0; + let p: ptr = &a; + _ = ${builtin}(*p, *p, *p);`, + pass: true + }, + sampler: { + src: `_ = ${builtin}(s, s, s);`, + pass: false + }, + texture: { + src: `_ = ${builtin}(t, t, t);`, + pass: false + }, + no_args: { + src: `_ = ${builtin}();`, + pass: false + }, + too_few_args: { + src: `_ = ${builtin}(1.0, 2.0);`, + pass: false + }, + too_many_args: { + src: `_ = ${builtin}(1.0, 2.0, 3.0, 4.0);`, + pass: false + }, + + must_use: { + src: `${builtin}(1.0,2.0,3.0);`, + pass: false + } +}; + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => u.combine('test', keysOf(kTests))). +beforeAllSubcases((t) => { + if (t.params.test.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const src = kTests[t.params.test].src; + const enables = t.params.test.includes('f16') ? 'enable f16;' : ''; + const code = ` + ${enables} + alias f32_alias = f32; + + @group(0) @binding(0) var s: sampler; + @group(0) @binding(1) var t: texture_2d; + + var a: atomic; + + struct A { + i: bool, + } + struct B { + arry: array, + } + @group(0) @binding(3) var k: B; + + @vertex + fn main() -> @builtin(position) vec4 { + ${src} + return vec4(.4, .2, .3, .1); + }`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); + +g.test('early_eval_errors'). +desc('Validates that high must be greater than low'). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +beginSubcases(). +combineWithParams([ +{ low: 1, high: 2 }, +{ low: 2, high: 1 }, +{ low: 1, high: 1 }] +) +). +fn((t) => { + validateConstOrOverrideBuiltinEval( + t, + builtin, + /* expectedResult */t.params.low < t.params.high, + [f32(0), f32(t.params.low), f32(t.params.high)], + t.params.stage + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sqrt.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sqrt.spec.js index 4a2f254fef5..acb432a539d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sqrt.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/sqrt.spec.js @@ -6,11 +6,10 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConcreteIntegerScalarsAndVectors, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { isRepresentable } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -18,7 +17,7 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinusTwoToTwo, + minusTwoToTwoRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -26,7 +25,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,17 +39,27 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinusTwoToTwo, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusTwoToTwoRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; const expectedResult = - t.params.value >= 0 && isRepresentable(Math.sqrt(t.params.value), elementType(type)); + t.params.value >= 0 && + isRepresentable( + Math.sqrt(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); validateConstOrOverrideBuiltinEval( t, builtin, @@ -60,7 +69,7 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kIntegerArgumentTypes = objectsToRecord([Type.f32, ...kConcreteIntegerScalarsAndVectors]); g.test('integer_argument'). desc( @@ -74,8 +83,41 @@ fn((t) => { validateConstOrOverrideBuiltinEval( t, builtin, - /* expectedResult */type === TypeF32, + /* expectedResult */type === Type.f32, [type.create(1)], 'constant' ); +}); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_too_few: '()', + bad_too_many: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/step.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/step.spec.js new file mode 100644 index 00000000000..6266a3628bc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/step.spec.js @@ -0,0 +1,108 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'step';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() error on invalid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('a', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)). +expand('b', (u) => fullRangeForType(kValidArgumentTypes[u.type], 5)) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = true; + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.a), type.create(t.params.b)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.2, 2.3)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_1arg: '(1.2)', + bad_3arg: '(1.2, 2.3, 4.5)', + // Bad value for arg 0 + bad_0bool: '(false, 2.3)', + bad_0array: '(array(1.1,2.2), 2.3)', + bad_0struct: '(modf(2.2), 2.3)', + bad_0uint: '(1u, 2.3)', + bad_0int: '(1i, 2.3)', + bad_0vec2i: '(vec2i(), 2.3)', + bad_0vec2u: '(vec2u(), 2.3)', + bad_0vec3i: '(vec3i(), 2.3)', + bad_0vec3u: '(vec3u(), 2.3)', + bad_0vec4i: '(vec4i(), 2.3)', + bad_0vec4u: '(vec4u(), 2.3)', + // Bad value for arg 1 + bad_1bool: '(1.2, false)', + bad_1array: '(1.2, array(1.1,2.2))', + bad_1struct: '(1.2, modf(2.2))', + bad_1uint: '(1.2, 1u)', + bad_1int: '(1.2, 1i)', + bad_1vec2i: '(1.2, vec2i())', + bad_1vec2u: '(1.2, vec2u())', + bad_1vec3i: '(1.2, vec3i())', + bad_1vec3u: '(1.2, vec3u())', + bad_1vec4i: '(1.2, vec4i())', + bad_1vec4u: '(1.2, vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tan.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tan.spec.js index 91cee003edc..a7504ccb18d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tan.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tan.spec.js @@ -6,11 +6,9 @@ Validation tests for the ${builtin}() builtin. import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; import { - TypeF16, - TypeF32, - elementType, - kAllFloatScalarsAndVectors, - kAllIntegerScalarsAndVectors } from + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from '../../../../../util/conversion.js'; import { fpTraitsFor } from '../../../../../util/floating_point.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; @@ -18,7 +16,7 @@ import { ShaderValidationTest } from '../../../shader_validation_test.js'; import { fullRangeForType, kConstantAndOverrideStages, - kMinus3PiTo3Pi, + minusThreePiToThreePiRangeForType, stageSupportsType, unique, validateConstOrOverrideBuiltinEval } from @@ -26,7 +24,7 @@ import { export const g = makeTestGroup(ShaderValidationTest); -const kValuesTypes = objectsToRecord(kAllFloatScalarsAndVectors); +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); g.test('values'). desc( @@ -40,18 +38,26 @@ combine('stage', kConstantAndOverrideStages). combine('type', keysOf(kValuesTypes)). filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). beginSubcases(). -expand('value', (u) => unique(kMinus3PiTo3Pi, fullRangeForType(kValuesTypes[u.type]))) +expand('value', (u) => +unique( + minusThreePiToThreePiRangeForType(kValuesTypes[u.type]), + fullRangeForType(kValuesTypes[u.type]) +) +) ). beforeAllSubcases((t) => { - if (elementType(kValuesTypes[t.params.type]) === TypeF16) { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { t.selectDeviceOrSkipTestCase('shader-f16'); } }). fn((t) => { const type = kValuesTypes[t.params.type]; - const fp = fpTraitsFor(elementType(type)); + const fp = fpTraitsFor( + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); const smallestPositive = fp.constants().positive.min; - const v = fp.quantize(t.params.value); + const v = fp.quantize(Number(t.params.value)); const expectedResult = Math.abs(Math.cos(v)) > smallestPositive; validateConstOrOverrideBuiltinEval( t, @@ -62,22 +68,40 @@ fn((t) => { ); }); -const kIntegerArgumentTypes = objectsToRecord([TypeF32, ...kAllIntegerScalarsAndVectors]); +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; -g.test('integer_argument'). -desc( - ` -Validates that scalar and vector integer arguments are rejected by ${builtin}() -` -). -params((u) => u.combine('type', keysOf(kIntegerArgumentTypes))). +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). fn((t) => { - const type = kIntegerArgumentTypes[t.params.type]; - validateConstOrOverrideBuiltinEval( - t, - builtin, - /* expectedResult */type === TypeF32, - [type.create(0)], - 'constant' + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tanh.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tanh.spec.js new file mode 100644 index 00000000000..653f92663e6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/tanh.spec.js @@ -0,0 +1,98 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'tanh';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { isRepresentable } from '../../../../../util/floating_point.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValuesTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() rejects invalid values +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValuesTypes)). +filter((u) => stageSupportsType(u.stage, kValuesTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValuesTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValuesTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kValuesTypes[t.params.type]; + const expectedResult = isRepresentable( + Math.tanh(Number(t.params.value)), + // AbstractInt is converted to AbstractFloat before calling into the builtin + scalarTypeOf(type).kind === 'abstract-int' ? Type.abstractFloat : scalarTypeOf(type) + ); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.js new file mode 100644 index 00000000000..420f52f1d10 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.js @@ -0,0 +1,283 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureDimension';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureDimension returns the correct type +* test textureDimension level parameter must be correct type +* test textureDimension doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kAllTextureFormats, kTextureFormatInfo } from '../../../../../format_info.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + isUnsignedType, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getNonStorageTextureTypeWGSL, + getSampleAndBaseTextureTypeForTextureType, + kNonStorageTextureTypeInfo, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + +const kValidTextureDimensionParameterTypesForNonStorageTextures = + +{ + texture_1d: { + returnType: Type.u32, + hasLevelArg: true + }, + texture_2d: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_2d_array: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_cube: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_cube_array: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_3d: { + returnType: Type.vec3u, + hasLevelArg: true + }, + texture_multisampled_2d: { + returnType: Type.vec2u + }, + texture_depth_2d: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_depth_2d_array: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_depth_cube: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_depth_cube_array: { + returnType: Type.vec2u, + hasLevelArg: true + }, + texture_depth_multisampled_2d: { + returnType: Type.vec2u + }, + texture_external: { returnType: Type.vec2u } +}; + +const kValidTextureDimensionParameterTypesForStorageTextures = + +{ + texture_storage_1d: { + returnType: Type.u32 + }, + texture_storage_2d: { + returnType: Type.vec2u + }, + texture_storage_2d_array: { + returnType: Type.vec2u + }, + texture_storage_3d: { + returnType: Type.vec3u + } +}; + +const kNonStorageTextureTypes = keysOf(kValidTextureDimensionParameterTypesForNonStorageTextures); +const kStorageTextureTypes = keysOf(kValidTextureDimensionParameterTypesForStorageTextures); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturedimensions'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kNonStorageTextureTypes). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +) +). +fn((t) => { + const { returnType, textureType, texelType } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { returnType: returnRequiredType, hasLevelArg } = + kValidTextureDimensionParameterTypesForNonStorageTextures[textureType]; + + const varWGSL = returnVarType.toString(); + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const levelWGSL = hasLevelArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureDimensions(t${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(returnRequiredType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('return_type,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturedimensions'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kStorageTextureTypes). +beginSubcases(). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage) +). +fn((t) => { + const { returnType, textureType, format } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format); + + const returnVarType = kValuesTypes[returnType]; + const { returnType: returnRequiredType, hasLevelArg } = + kValidTextureDimensionParameterTypesForStorageTextures[textureType]; + + const varWGSL = returnVarType.toString(); + const levelWGSL = hasLevelArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, read>; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureDimensions(t${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(returnRequiredType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('level_argument,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturedimensions'). +desc( + ` +Validates that only incorrect level arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kNonStorageTextureTypes) +// filter out types with no level +.filter( + (t) => !!kValidTextureDimensionParameterTypesForNonStorageTextures[t.textureType].hasLevelArg +). +combine('levelType', keysOf(kValuesTypes)). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.levelType]) || t.value >= 0) +). +fn((t) => { + const { textureType, levelType, texelType, value } = t.params; + const levelArgType = kValuesTypes[levelType]; + + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const levelWGSL = levelArgType.create(value).wgsl(); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureDimensions(t, ${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(levelArgType, Type.i32) || isConvertible(levelArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturedimensions'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', keysOf(kValidTextureDimensionParameterTypesForNonStorageTextures)). +expand('hasLevelArg', (t) => +kValidTextureDimensionParameterTypesForNonStorageTextures[t.textureType].hasLevelArg ? +[false, true] : +[false] +) +). +fn((t) => { + const { testTextureType, hasLevelArg } = t.params; + + const levelWGSL = hasLevelArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureDimensions(t${levelWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType] = getSampleAndBaseTextureTypeForTextureType(testTextureType); + + let expectSuccess = true; + const types = + kValidTextureDimensionParameterTypesForNonStorageTextures[baseTestTextureType] || + kValidTextureDimensionParameterTypesForStorageTextures[baseTestTextureType]; + if (types) { + const typesMatch = !hasLevelArg || !!types.hasLevelArg; + expectSuccess = typesMatch; + } + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureDimensions(t); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGather.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGather.spec.js new file mode 100644 index 00000000000..8673f0194e8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGather.spec.js @@ -0,0 +1,503 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureGather';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureGather component parameter must be correct type +* test textureGather component parameter must be between 0 and 3 inclusive +* test textureGather component parameter must be a const expression +* test textureGather coords parameter must be correct type +* test textureGather array_index parameter must be correct type +* test textureGather offset parameter must be correct type +* test textureGather offset parameter must be a const-expression +* test textureGather offset parameter must be between -8 and +7 inclusive +* test textureGather returns the correct type +* test textureGather doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType, + scalarTypeOf, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getSampleAndBaseTextureTypeForTextureType, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + +const kColorSampleTypes = [Type.vec4f, Type.vec4i, Type.vec4u]; +const kDepthSampleTypes = [Type.vec4f]; + + + + + + + + + +const kValidTextureGatherParameterTypes = { + texture_2d: { + sampleTypes: kColorSampleTypes, + hasComponentArg: true, + coordsArgType: Type.vec2f, + offsetArgType: Type.vec2i + }, + texture_2d_array: { + sampleTypes: kColorSampleTypes, + hasComponentArg: true, + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_cube: { + sampleTypes: kColorSampleTypes, + hasComponentArg: true, + coordsArgType: Type.vec3f + }, + texture_cube_array: { + sampleTypes: kColorSampleTypes, + hasComponentArg: true, + coordsArgType: Type.vec3f, + hasArrayIndexArg: true + }, + texture_depth_2d: { + sampleTypes: kDepthSampleTypes, + coordsArgType: Type.vec2f, + offsetArgType: Type.vec2i + }, + texture_depth_2d_array: { + sampleTypes: kDepthSampleTypes, + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { + sampleTypes: kDepthSampleTypes, + coordsArgType: Type.vec3f + }, + texture_depth_cube_array: { + sampleTypes: kDepthSampleTypes, + coordsArgType: Type.vec3f, + hasArrayIndexArg: true + } +}; + +const kTextureTypes = keysOf(kValidTextureGatherParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureGatherParameterTypes)). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +beginSubcases(). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { returnType, textureType, sampleType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const sampleVarType = stringToType(sampleType); + const { hasComponentArg, offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = hasComponentArg ? '0, ' : ''; + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureGather(${componentWGSL}t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(sampleVarType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('component_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only incorrect components arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureGatherParameterTypes)) +// filter out types with no component argument +.filter((t) => !!kValidTextureGatherParameterTypes[t.textureType].hasComponentArg). +combine('componentType', keysOf(kValuesTypes)). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +beginSubcases(). +combine('value', [-1, 0, 1, 2, 3, 4]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.componentType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, componentType, sampleType, offset, value } = t.params; + const sampleVarType = stringToType(sampleType); + const componentArgType = kValuesTypes[componentType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = componentArgType.create(value).wgsl(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGather(${componentWGSL}, t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + (isConvertible(componentArgType, Type.i32) || isConvertible(componentArgType, Type.u32)) && + value >= 0 && + value <= 3; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('component_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only non-const components arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureGatherParameterTypes)) +// filter out types with no component argument +.filter((t) => !!kValidTextureGatherParameterTypes[t.textureType].hasComponentArg). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +combine('varType', ['c', 'u', 'l']). +beginSubcases(). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, sampleType, varType, offset } = t.params; + const sampleVarType = stringToType(sampleType); + const componentArgType = Type.u32; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = `${componentArgType}(${varType})`; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@group(0) @binding(2) var u: ${componentArgType}; + +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = 1; + let v = textureGather(${componentWGSL}, t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureGatherParameterTypes)). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, sampleType, coordType, offset, value } = t.params; + const sampleVarType = stringToType(sampleType); + const coordArgType = kValuesTypes[coordType]; + const { + hasComponentArg, + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = hasComponentArg ? '0, ' : ''; + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGather(${componentWGSL}t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureGatherParameterTypes[t.textureType].hasArrayIndexArg). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, sampleType, arrayIndexType, value, offset } = t.params; + const sampleVarType = stringToType(sampleType); + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { hasComponentArg, coordsArgType, offsetArgType } = + kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = hasComponentArg ? '0, ' : ''; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGather(${componentWGSL}t, s, ${coordWGSL}, ${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureGatherParameterTypes[t.textureType].offsetArgType). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, sampleType, offsetType, value } = t.params; + const sampleVarType = stringToType(sampleType); + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + hasComponentArg, + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = hasComponentArg ? '0, ' : ''; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGather(${componentWGSL}t, s, ${coordWGSL}${arrayWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +expand('sampleType', (t) => +kValidTextureGatherParameterTypes[t.textureType].sampleTypes.map((v) => v.toString()) +). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureGatherParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, sampleType, varType } = t.params; + const sampleVarType = stringToType(sampleType); + const { hasComponentArg, coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureGatherParameterTypes[textureType]; + + const sampleTypeWGSL = textureType.includes('depth') ? '' : `<${scalarTypeOf(sampleVarType)}>`; + const componentWGSL = hasComponentArg ? '0, ' : ''; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}${sampleTypeWGSL}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureGather(${componentWGSL}t, s, ${coordWGSL}${arrayWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegather'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +combine('textureType', keysOf(kValidTextureGatherParameterTypes)). +expand('offset', (t) => +kValidTextureGatherParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { hasComponentArg, coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureGatherParameterTypes[textureType]; + + const componentWGSL = hasComponentArg ? '0, ' : ''; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGather(${componentWGSL}t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType] = getSampleAndBaseTextureTypeForTextureType(testTextureType); + + const types = kValidTextureGatherParameterTypes[baseTestTextureType]; + const typesMatch = types ? + types.hasComponentArg === hasComponentArg && + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureGather(0, t, s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.js new file mode 100644 index 00000000000..45cf1b9f90a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.js @@ -0,0 +1,373 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureGatherCompare';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureGatherCompare coords parameter must be correct type +* test textureGatherCompare array_index parameter must be correct type +* test textureGatherCompare depth_ref parameter must be correct type +* test textureGatherCompare offset parameter must be correct type +* test textureGatherCompare offset parameter must be a const-expression +* test textureGatherCompare offset parameter must be between -8 and +7 inclusive +* test textureGatherCompare returns the correct type +* test textureGatherCompare doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getSampleAndBaseTextureTypeForTextureType, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + + +const kValidTextureGatherCompareParameterTypes = { + texture_depth_2d: { coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + texture_depth_2d_array: { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { coordsArgType: Type.vec3f }, + texture_depth_cube_array: { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureGatherCompareParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureGatherCompareParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureGatherCompareParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.vec4f, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureGatherCompareParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureGatherCompareParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGatherCompare(t, s, ${coordWGSL}, ${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('depth_ref_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that only incorrect depth_ref arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureGatherCompareParameterTypes)). +combine('depthRefType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.depthRefType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, depthRefType, offset, value } = t.params; + const depthRefArgType = kValuesTypes[depthRefType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const depthRefWGSL = depthRefArgType.create(value).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, ${depthRefWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(depthRefArgType, Type.f32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturegathercompare'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +combine('textureType', keysOf(kValidTextureGatherCompareParameterTypes)). +expand('offset', (t) => +kValidTextureGatherCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureGatherCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureGatherCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType] = getSampleAndBaseTextureTypeForTextureType(testTextureType); + + const types = kValidTextureGatherCompareParameterTypes[baseTestTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureGatherCompare(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.js new file mode 100644 index 00000000000..6853e91ec88 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.js @@ -0,0 +1,551 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureLoad';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureLoad coords parameter must be correct type +* test textureLoad array_index parameter must be correct type +* test textureLoad level parameter must be correct type +* test textureLoad sample_index parameter must be correct type +* test textureLoad returns the correct type +* test textureLoad doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { assert } from '../../../../../../common/util/util.js'; +import { kAllTextureFormats, kTextureFormatInfo } from '../../../../../format_info.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getNonStorageTextureTypeWGSL, + getSampleAndBaseTextureTypeForTextureType, + kNonStorageTextureTypeInfo, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + + + +const kCoords1DTypes = [Type.i32, Type.u32]; +const kCoords2DTypes = [Type.vec2i, Type.vec2u]; +const kCoords3DTypes = [Type.vec3i, Type.vec3u]; + +const kValidTextureLoadParameterTypesForNonStorageTextures = +{ + texture_1d: { + coordsArgTypes: kCoords1DTypes, + hasLevelArg: true + }, + texture_2d: { + coordsArgTypes: kCoords2DTypes, + hasLevelArg: true + }, + texture_2d_array: { + coordsArgTypes: kCoords2DTypes, + hasArrayIndexArg: true, + hasLevelArg: true + }, + texture_3d: { + coordsArgTypes: kCoords3DTypes, + hasLevelArg: true + }, + texture_multisampled_2d: { + coordsArgTypes: kCoords2DTypes, + hasSampleIndexArg: true + }, + texture_depth_2d: { + coordsArgTypes: kCoords2DTypes, + hasLevelArg: true + }, + texture_depth_2d_array: { + coordsArgTypes: kCoords2DTypes, + hasArrayIndexArg: true, + hasLevelArg: true + }, + texture_depth_multisampled_2d: { + coordsArgTypes: kCoords2DTypes, + hasSampleIndexArg: true + }, + texture_external: { coordsArgTypes: kCoords2DTypes } +}; + +const kValidTextureLoadParameterTypesForStorageTextures = { + texture_storage_1d: { coordsArgTypes: [Type.i32, Type.u32] }, + texture_storage_2d: { coordsArgTypes: [Type.vec2i, Type.vec2u] }, + texture_storage_2d_array: { + coordsArgTypes: [Type.vec2i, Type.vec2u], + hasArrayIndexArg: true + }, + texture_storage_3d: { coordsArgTypes: [Type.vec3i, Type.vec3u] } +}; + +const kNonStorageTextureTypes = keysOf(kValidTextureLoadParameterTypesForNonStorageTextures); +const kStorageTextureTypes = keysOf(kValidTextureLoadParameterTypesForStorageTextures); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kNonStorageTextureTypes). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.textureType)). +fn((t) => { + const { returnType, textureType, texelType } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { coordsArgTypes, hasArrayIndexArg, hasLevelArg, hasSampleIndexArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + + const varWGSL = returnVarType.toString(); + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = hasLevelArg ? ', 0' : ''; + const sampleIndexWGSL = hasSampleIndexArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureLoad(t, ${coordWGSL}${arrayWGSL}${levelWGSL}${sampleIndexWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(texelArgType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kNonStorageTextureTypes). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.textureType)). +fn((t) => { + const { textureType, coordType, texelType, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { coordsArgTypes, hasArrayIndexArg, hasLevelArg, hasSampleIndexArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = hasLevelArg ? ', 0' : ''; + const sampleIndexWGSL = hasSampleIndexArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}${arrayWGSL}${levelWGSL}${sampleIndexWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(coordArgType, coordsArgTypes[0]) || + isConvertible(coordArgType, coordsArgTypes[1]); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kStorageTextureTypes). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0) +). +beforeAllSubcases((t) => +t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures') +). +fn((t) => { + const { textureType, coordType, format, value } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format); + + const coordArgType = kValuesTypes[coordType]; + const { coordsArgTypes, hasArrayIndexArg } = + kValidTextureLoadParameterTypesForStorageTextures[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, read>; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}${arrayWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(coordArgType, coordsArgTypes[0]) || + isConvertible(coordArgType, coordsArgTypes[1]); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kNonStorageTextureTypes) +// filter out types with no array_index +.filter( + (t) => !!kValidTextureLoadParameterTypesForNonStorageTextures[t.textureType].hasArrayIndexArg +). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.textureType)). +fn((t) => { + const { textureType, arrayIndexType, texelType, value } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgTypes, hasLevelArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const levelWGSL = hasLevelArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}, ${arrayWGSL}${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kStorageTextureTypes) +// filter out types with no array_index +.filter( + (t) => !!kValidTextureLoadParameterTypesForStorageTextures[t.textureType].hasArrayIndexArg +). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0) +). +beforeAllSubcases((t) => +t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures') +). +fn((t) => { + const { textureType, arrayIndexType, format, value } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format); + + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgTypes, hasLevelArg } = + kValidTextureLoadParameterTypesForStorageTextures[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const levelWGSL = hasLevelArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, read>; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}, ${arrayWGSL}${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('level_argument,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect level arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kNonStorageTextureTypes) +// filter out types with no level +.filter( + (t) => !!kValidTextureLoadParameterTypesForNonStorageTextures[t.textureType].hasLevelArg +). +combine('levelType', keysOf(kValuesTypes)). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.levelType]) || t.value >= 0) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.textureType)). +fn((t) => { + const { textureType, levelType, texelType, value } = t.params; + const levelArgType = kValuesTypes[levelType]; + const { coordsArgTypes, hasArrayIndexArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = levelArgType.create(value).wgsl(); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}${arrayWGSL}, ${levelWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(levelArgType, Type.i32) || isConvertible(levelArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('sample_index_argument,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that only incorrect sample_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kNonStorageTextureTypes) +// filter out types with no sample_index +.filter( + (t) => !!kValidTextureLoadParameterTypesForNonStorageTextures[t.textureType].hasSampleIndexArg +). +combine('sampleIndexType', keysOf(kValuesTypes)). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.sampleIndexType]) || t.value >= 0) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.textureType)). +fn((t) => { + const { textureType, sampleIndexType, texelType, value } = t.params; + const sampleIndexArgType = kValuesTypes[sampleIndexType]; + const { coordsArgTypes, hasArrayIndexArg, hasLevelArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + assert(!hasLevelArg); + + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const sampleIndexWGSL = sampleIndexArgType.create(value).wgsl(); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureLoad(t, ${coordWGSL}${arrayWGSL}, ${sampleIndexWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(sampleIndexArgType, Type.i32) || isConvertible(sampleIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', kNonStorageTextureTypes) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.testTextureType)). +fn((t) => { + const { testTextureType, textureType } = t.params; + const { coordsArgTypes, hasArrayIndexArg, hasLevelArg, hasSampleIndexArg } = + kValidTextureLoadParameterTypesForNonStorageTextures[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = hasLevelArg ? ', 0' : ''; + const sampleIndexWGSL = hasSampleIndexArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureLoad(t, ${coordWGSL}${arrayWGSL}${levelWGSL}${sampleIndexWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType] = getSampleAndBaseTextureTypeForTextureType(testTextureType); + + let expectSuccess = false; + const types = + kValidTextureLoadParameterTypesForNonStorageTextures[baseTestTextureType] || + kValidTextureLoadParameterTypesForStorageTextures[baseTestTextureType]; + if (types) { + const numTestNumberArgs = + (types.hasArrayIndexArg ? 1 : 0) + ( + types.hasLevelArg ? 1 : 0) + ( + types.hasSampleIndexArg ? 1 : 0); + const numExpectNumberArgs = + (hasArrayIndexArg ? 1 : 0) + (hasLevelArg ? 1 : 0) + (hasSampleIndexArg ? 1 : 0); + const typesMatch = types ? + types.coordsArgTypes[0] === coordsArgTypes[0] && numTestNumberArgs === numExpectNumberArgs : + false; + expectSuccess = typesMatch; + } + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#textureload'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', kStorageTextureTypes). +combine('format', kAllTextureFormats) +). +beforeAllSubcases((t) => t.skipIfTextureLoadNotSupportedForTextureType(t.params.testTextureType)). +fn((t) => { + const { testTextureType, textureType } = t.params; + const { coordsArgTypes, hasArrayIndexArg, hasLevelArg, hasSampleIndexArg } = + kValidTextureLoadParameterTypesForStorageTextures[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = hasLevelArg ? ', 0' : ''; + const sampleIndexWGSL = hasSampleIndexArg ? ', 0' : ''; + + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureLoad(t, ${coordWGSL}${arrayWGSL}${levelWGSL}${sampleIndexWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType] = getSampleAndBaseTextureTypeForTextureType(testTextureType); + + let expectSuccess = false; + const types = + kValidTextureLoadParameterTypesForNonStorageTextures[baseTestTextureType] || + kValidTextureLoadParameterTypesForStorageTextures[baseTestTextureType]; + if (types) { + const numTestNumberArgs = + (types.hasArrayIndexArg ? 1 : 0) + ( + types.hasLevelArg ? 1 : 0) + ( + types.hasSampleIndexArg ? 1 : 0); + const numExpectNumberArgs = + (hasArrayIndexArg ? 1 : 0) + (hasLevelArg ? 1 : 0) + (hasSampleIndexArg ? 1 : 0); + const typesMatch = types ? + types.coordsArgTypes[0] === coordsArgTypes[0] && numTestNumberArgs === numExpectNumberArgs : + false; + expectSuccess = typesMatch; + } + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureLoad(t, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.js new file mode 100644 index 00000000000..5db9a681f5a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.js @@ -0,0 +1,142 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureNumLayers';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureNumLayers returns the correct type +* test textureNumLayers doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kAllTextureFormats, kTextureFormatInfo } from '../../../../../format_info.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getNonStorageTextureTypeWGSL, + kNonStorageTextureTypeInfo, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + +const kTextureNumLayersTextureTypesForNonStorageTextures = [ +'texture_2d_array', +'texture_cube_array', +'texture_depth_2d_array', +'texture_depth_cube_array']; + + +const kTextureNumLayersTextureTypesForStorageTextures = ['texture_storage_2d_array']; + +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type,non_storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumlayers'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kTextureNumLayersTextureTypesForNonStorageTextures). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +) +). +fn((t) => { + const { returnType, textureType, texelType } = t.params; + const returnVarType = kValuesTypes[returnType]; + + const varWGSL = returnVarType.toString(); + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureNumLayers(t); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.u32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('return_type,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumlayers'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kTextureNumLayersTextureTypesForStorageTextures). +beginSubcases(). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage) +). +fn((t) => { + const { returnType, textureType, format } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format); + + const returnVarType = kValuesTypes[returnType]; + + const varWGSL = returnVarType.toString(); + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, read>; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureNumLayers(t); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.u32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumlayers'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => u.combine('testTextureType', kTestTextureTypes)). +fn((t) => { + const { testTextureType } = t.params; + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureNumLayers(t); + return vec4f(0); +} +`; + + const expectSuccess = testTextureType.includes('array'); + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d_array; + fn foo() { + ${t.params.use ? '_ =' : ''} textureNumLayers(t); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.js new file mode 100644 index 00000000000..7215da7f63c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.js @@ -0,0 +1,109 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureNumLevels';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureNumLevels returns the correct type +* test textureNumLevels doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getNonStorageTextureTypeWGSL, + kNonStorageTextureTypeInfo, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + +const kTextureNumLevelsTextureTypesForNonStorageTextures = [ +'texture_1d', +'texture_2d', +'texture_2d_array', +'texture_3d', +'texture_cube', +'texture_cube_array', +'texture_depth_2d', +'texture_depth_2d_array', +'texture_depth_cube', +'texture_depth_cube_array']; + + +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumlevels'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kTextureNumLevelsTextureTypesForNonStorageTextures). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +) +). +fn((t) => { + const { returnType, textureType, texelType } = t.params; + const returnVarType = kValuesTypes[returnType]; + + const varWGSL = returnVarType.toString(); + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureNumLevels(t); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.u32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumlevels'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => u.combine('testTextureType', kTestTextureTypes)). +fn((t) => { + const { testTextureType } = t.params; + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureNumLevels(t); + return vec4f(0); +} +`; + const expectSuccess = !/storage|multisampled|external/.test(testTextureType); + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureNumLevels(t); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.js new file mode 100644 index 00000000000..1e4d4e678ff --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.js @@ -0,0 +1,101 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureNumSamples';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureNumSamples returns the correct type +* test textureNumSamples doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + stringToType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getNonStorageTextureTypeWGSL, + kNonStorageTextureTypeInfo, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + +const kTextureNumSamplesTextureTypesForNonStorageTextures = [ +'texture_multisampled_2d', +'texture_depth_multisampled_2d']; + + +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumsamples'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kTextureNumSamplesTextureTypesForNonStorageTextures). +beginSubcases(). +expand('texelType', (t) => +kNonStorageTextureTypeInfo[t.textureType].texelTypes.map((v) => v.toString()) +) +). +fn((t) => { + const { returnType, textureType, texelType } = t.params; + const returnVarType = kValuesTypes[returnType]; + + const varWGSL = returnVarType.toString(); + const texelArgType = stringToType(texelType); + const textureWGSL = getNonStorageTextureTypeWGSL(textureType, texelArgType); + + const code = ` +@group(0) @binding(0) var t: ${textureWGSL}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureNumSamples(t); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.u32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturenumsamples'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => u.combine('testTextureType', kTestTextureTypes)). +fn((t) => { + const { testTextureType } = t.params; + const code = ` +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureNumSamples(t); + return vec4f(0); +} +`; + const expectSuccess = testTextureType.includes('multisample'); + + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_multisampled_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureDimensions(t); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSample.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSample.spec.js new file mode 100644 index 00000000000..9da3eabf87f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSample.spec.js @@ -0,0 +1,391 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSample';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSample coords parameter must be correct type +* test textureSample array_index parameter must be correct type +* test textureSample coords parameter must be correct type +* test textureSample offset parameter must be correct type +* test textureSample offset parameter must be a const-expression +* test textureSample offset parameter must be between -8 and +7 inclusive +* test textureSample not usable in a compute or vertex shader +* test textureSample returns the correct type +* test textureSample doesn't work with texture types it's not supposed to + +note: uniformity validation is covered in src/webgpu/shader/validation/uniformity/uniformity.spec.ts +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + kEntryPointsToValidateFragmentOnlyBuiltins, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + + + +const kValidTextureSampleParameterTypes = { + 'texture_1d': { returnType: Type.vec4f, coordsArgType: Type.f32 }, + 'texture_2d': { + returnType: Type.vec4f, + coordsArgType: Type.vec2f, + offsetArgType: Type.vec2i + }, + 'texture_2d_array': { + returnType: Type.vec4f, + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + 'texture_3d': { + returnType: Type.vec4f, + coordsArgType: Type.vec3f, + offsetArgType: Type.vec3i + }, + 'texture_cube': { returnType: Type.vec4f, coordsArgType: Type.vec3f }, + 'texture_cube_array': { + returnType: Type.vec4f, + coordsArgType: Type.vec3f, + hasArrayIndexArg: true + }, + texture_depth_2d: { returnType: Type.f32, coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + texture_depth_2d_array: { + returnType: Type.f32, + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { returnType: Type.f32, coordsArgType: Type.vec3f }, + texture_depth_cube_array: { + returnType: Type.f32, + coordsArgType: Type.vec3f, + hasArrayIndexArg: true + } +}; + +const kTextureTypes = keysOf(kValidTextureSampleParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { + returnType: returnExpectedType, + offsetArgType, + coordsArgType, + hasArrayIndexArg + } = kValidTextureSampleParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSample(t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(returnExpectedType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSample(t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSample(t, s, ${coordWGSL}, ${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSample(t, s, ${coordWGSL}${arrayWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureSample(t, s, ${coordWGSL}${arrayWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('only_in_fragment'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that ${builtin} must not be used in a compute or vertex shader. +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('entryPoint', keysOf(kEntryPointsToValidateFragmentOnlyBuiltins)). +expand('offset', (t) => +kValidTextureSampleParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, entryPoint, offset } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const config = kEntryPointsToValidateFragmentOnlyBuiltins[entryPoint]; + const code = ` +${config.code} +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; + +fn foo() { + _ = textureSample(t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); +}`; + t.expectCompileResult(config.expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +combine('textureType', keysOf(kValidTextureSampleParameterTypes)). +expand('offset', (t) => +kValidTextureSampleParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSample(t, s, ${coordWGSL}${arrayWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSample(t, s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.js new file mode 100644 index 00000000000..ed4081044e4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.js @@ -0,0 +1,124 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleBaseClampToEdge';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleBaseClampToEdge coords parameter must be correct type +* test textureSampleBaseClampToEdge returns the correct type +* test textureSampleBaseClampToEdge doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { kTestTextureTypes } from './shader_builtin_utils.js'; + +const kTextureSampleBaseClampToEdgeTextureTypes = ['texture_2d', 'texture_external']; +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebaseclamptoedge'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', kTextureSampleBaseClampToEdgeTextureTypes) +). +fn((t) => { + const { returnType, textureType } = t.params; + const returnVarType = kValuesTypes[returnType]; + + const varWGSL = returnVarType.toString(); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleBaseClampToEdge(t, s, vec2f(0)); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.vec4f, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebaseclamptoedge'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureSampleBaseClampToEdgeTextureTypes). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0) +). +fn((t) => { + const { textureType, coordType, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const coordWGSL = coordArgType.create(value).wgsl(); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBaseClampToEdge(t, s, ${coordWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, Type.vec2f); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebaseclamptoedge'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => u.combine('testTextureType', kTestTextureTypes)). +fn((t) => { + const { testTextureType } = t.params; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBaseClampToEdge(t, s, vec2f(0)); + return vec4f(0); +} +`; + const expectSuccess = kTextureSampleBaseClampToEdgeTextureTypes.includes(testTextureType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleBaseClampToEdge(t,s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.js new file mode 100644 index 00000000000..1f87bd8f564 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.js @@ -0,0 +1,411 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleBias';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleBias coords parameter must be correct type +* test textureSampleBias array_index parameter must be correct type +* test textureSampleBias bias parameter must be correct type +* test textureSampleBias bias parameter must be between -16.0 and 15.99 inclusive if it's a constant +* test textureSampleBias offset parameter must be correct type +* test textureSampleBias offset parameter must be a const-expression +* test textureSampleBias offset parameter must be between -8 and +7 inclusive +* test textureSampleBias returns the correct type +* test textureSampleBias doesn't work with texture types it's not supposed to + +note: uniformity validation is covered in src/webgpu/shader/validation/uniformity/uniformity.spec.ts +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType, + scalarTypeOf, + isFloatType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + kEntryPointsToValidateFragmentOnlyBuiltins, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + + +const kValidTextureSampleBiasParameterTypes = { + 'texture_2d': { coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + 'texture_2d_array': { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + 'texture_3d': { coordsArgType: Type.vec3f, offsetArgType: Type.vec3i }, + 'texture_cube': { coordsArgType: Type.vec3f }, + 'texture_cube_array': { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureSampleBiasParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleBiasParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureSampleBiasParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.vec4f, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleBiasParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleBiasParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBias(t, s, ${coordWGSL}, ${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('bias_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that only incorrect bias arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType). +combine('biasType', keysOf(kValuesTypes)). +beginSubcases() +// The spec mentions limits of > -16 and < 15.99 so pass some values around there +// No error is mentioned for out of range values so make sure no error is generated. +.combine('value', [-17, -16, -8, 0, 7, 15.99, 16]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.biasType]) || t.value >= 0) +// filter out non-integer values passed to integer types. +.filter((t) => Number.isInteger(t.value) || isFloatType(scalarTypeOf(kValuesTypes[t.biasType]))). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, biasType, value, offset } = t.params; + const biasArgType = kValuesTypes[biasType]; + const args = [biasArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const biasWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, ${biasWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(biasArgType, Type.f32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('only_in_fragment'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that ${builtin} must not be used in a compute or vertex shader. +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('entryPoint', keysOf(kEntryPointsToValidateFragmentOnlyBuiltins)). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, entryPoint, offset } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const config = kEntryPointsToValidateFragmentOnlyBuiltins[entryPoint]; + const code = ` +${config.code} +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; + +fn foo() { + _ = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); +}`; + t.expectCompileResult(config.expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplebias'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +combine('textureType', keysOf(kValidTextureSampleBiasParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleBiasParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleBiasParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleBias(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleBiasParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleBias(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.js new file mode 100644 index 00000000000..cb73edb24b6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.js @@ -0,0 +1,414 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleCompare';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleCompare coords parameter must be correct type +* test textureSampleCompare array_index parameter must be correct type +* test textureSampleCompare depth_ref parameter must be correct type +* test textureSampleCompare offset parameter must be correct type +* test textureSampleCompare offset parameter must be a const-expression +* test textureSampleCompare offset parameter must be between -8 and +7 inclusive +* test textureSampleCompare not usable in a compute or vertex shader +* test textureSampleCompare returns the correct type +* test textureSampleCompare doesn't work with texture types it's not supposed to + +note: uniformity validation is covered in src/webgpu/shader/validation/uniformity/uniformity.spec.ts +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + kEntryPointsToValidateFragmentOnlyBuiltins, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + + + + + + + +const kValidTextureSampleCompareParameterTypes = { + texture_depth_2d: { coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + texture_depth_2d_array: { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { coordsArgType: Type.vec3f }, + texture_depth_cube_array: { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureSampleCompareParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleCompareParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureSampleCompareParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.f32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleCompareParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleCompareParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureSampleCompare(t, s, ${coordWGSL}, ${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('depth_ref_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that only incorrect depth_ref arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('depthRefType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.depthRefType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, depthRefType, value, offset } = t.params; + const depthRefArgType = kValuesTypes[depthRefType]; + const args = [depthRefArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const depthRefWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, ${depthRefWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(depthRefArgType, Type.f32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + _ = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType?.create(0).wgsl()}; + _ = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('only_in_fragment'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesample'). +desc( + ` +Validates that ${builtin} must not be used in a compute or vertex shader. +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('entryPoint', keysOf(kEntryPointsToValidateFragmentOnlyBuiltins)). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, entryPoint, offset } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const config = kEntryPointsToValidateFragmentOnlyBuiltins[entryPoint]; + const code = ` +${config.code} +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; + +fn foo() { + _ = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); +}`; + t.expectCompileResult(config.expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecompare'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', keysOf(kValidTextureSampleCompareParameterTypes)). +expand('offset', (t) => +kValidTextureSampleCompareParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleCompareParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompare(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleCompareParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleCompare(t,s,vec2(0,0),0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.js new file mode 100644 index 00000000000..74b1b77a330 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.js @@ -0,0 +1,373 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleCompareLevel';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleCompareLevel coords parameter must be correct type +* test textureSampleCompareLevel array_index parameter must be correct type +* test textureSampleCompareLevel depth_ref parameter must be correct type +* test textureSampleCompareLevel offset parameter must be correct type +* test textureSampleCompareLevel offset parameter must be a const-expression +* test textureSampleCompareLevel offset parameter must be between -8 and +7 inclusive +* test textureSampleCompareLevel returns the correct type +* test textureSampleCompareLevel doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { kTestTextureTypes } from './shader_builtin_utils.js'; + + + + + + + +const kValidTextureSampleCompareLevelParameterTypes = + +{ + texture_depth_2d: { coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + texture_depth_2d_array: { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { coordsArgType: Type.vec3f }, + texture_depth_cube_array: { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureSampleCompareLevelParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleCompareLevelParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.f32, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleCompareLevelParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleCompareLevelParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = + kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompareLevel(t, s, ${coordWGSL}, ${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('depth_ref_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that only incorrect depth_ref arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('depthRefType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.depthRefType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, depthRefType, value, offset } = t.params; + const depthRefArgType = kValuesTypes[depthRefType]; + const args = [depthRefArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const depthRefWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, ${depthRefWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(depthRefArgType, Type.f32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType?.create(0).wgsl()}; + let v = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplecomparelevel'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', keysOf(kValidTextureSampleCompareLevelParameterTypes)). +expand('offset', (t) => +kValidTextureSampleCompareLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleCompareLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler_comparison; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleCompareLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleCompareLevelParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleCompareLevel(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.js new file mode 100644 index 00000000000..e6dd32378f1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.js @@ -0,0 +1,420 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleGrad';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleGrad coords parameter must be correct type +* test textureSampleGrad array_index parameter must be correct type +* test textureSampleGrad ddX parameter must be correct type +* test textureSampleGrad ddY parameter must be correct type +* test textureSampleGrad coords parameter must be correct type +* test textureSampleGrad offset parameter must be correct type +* test textureSampleGrad offset parameter must be a const-expression +* test textureSampleGrad offset parameter must be between -8 and +7 inclusive +* test textureSampleGrad returns the correct type +* test textureSampleGrad doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { kTestTextureTypes } from './shader_builtin_utils.js'; + +// Note: ddX and ddy parameter types match coords so we'll use coordsArgType for ddX and ddY. + + + + + + +const kValidTextureSampleGradParameterTypes = { + 'texture_2d': { + coordsArgType: Type.vec2f, + offsetArgType: Type.vec2i + }, + 'texture_2d_array': { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + 'texture_3d': { coordsArgType: Type.vec3f, offsetArgType: Type.vec3i }, + 'texture_cube': { coordsArgType: Type.vec3f }, + 'texture_cube_array': { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureSampleGradParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleGradParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureSampleGradParameterTypes[textureType]; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddWGSL}, ${ddWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(Type.vec4f, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleGradParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleGradParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddWGSL = coordsRequiredType.create(0).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddWGSL}, ${ddWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleGradParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureSampleGradParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const ddWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}, ${arrayWGSL}, ${ddWGSL}, ${ddWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('ddX_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only incorrect ddX arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('ddxType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.ddxType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, ddxType, value, offset } = t.params; + const ddxArgType = kValuesTypes[ddxType]; + const args = [ddxArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleGradParameterTypes[textureType]; + + const ddxRequiredType = coordsArgType; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddXWGSL = args.map((arg) => arg.wgsl()).join(', '); + const ddYWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddXWGSL}, ${ddYWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(ddxArgType, ddxRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('ddY_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only incorrect ddY arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('ddyType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.ddyType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { textureType, ddyType, value, offset } = t.params; + const ddyArgType = kValuesTypes[ddyType]; + const args = [ddyArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleGradParameterTypes[textureType]; + + const ddyRequiredType = coordsArgType; + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddXWGSL = coordsArgType.create(0).wgsl(); + const ddYWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddXWGSL}, ${ddYWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(ddyArgType, ddyRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleGradParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddWGSL}, ${ddWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleGradParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddWGSL}, ${ddWGSL}, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplegrad'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +combine('textureType', keysOf(kValidTextureSampleGradParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleGradParameterTypes[t.textureType].offsetArgType ? [false, true] : [false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleGradParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const ddWGSL = coordsArgType.create(0).wgsl(); + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleGrad(t, s, ${coordWGSL}${arrayWGSL}, ${ddWGSL}, ${ddWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleGradParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleGrad(t,s,vec2(0,0),vec2(0,0),vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.js new file mode 100644 index 00000000000..fd46b94569b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.js @@ -0,0 +1,388 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureSampleLevel';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureSampleLevel coords parameter must be correct type +* test textureSampleLevel array_index parameter must be correct type +* test textureSampleLevel level parameter must be correct type +* test textureSampleLevel offset parameter must be correct type +* test textureSampleLevel offset parameter must be a const-expression +* test textureSampleLevel offset parameter must be between -8 and +7 inclusive +* test textureSampleLevel returns the correct type +* test textureSampleLevel doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { kTestTextureTypes } from './shader_builtin_utils.js'; + + + + + + + + +const kValidTextureSampleLevelParameterTypes = { + 'texture_2d': { coordsArgType: Type.vec2f, levelIsF32: true, offsetArgType: Type.vec2i }, + 'texture_2d_array': { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + levelIsF32: true, + offsetArgType: Type.vec2i + }, + 'texture_3d': { coordsArgType: Type.vec3f, levelIsF32: true, offsetArgType: Type.vec3i }, + 'texture_cube': { coordsArgType: Type.vec3f, levelIsF32: true }, + 'texture_cube_array': { + coordsArgType: Type.vec3f, + hasArrayIndexArg: true, + levelIsF32: true + }, + texture_depth_2d: { coordsArgType: Type.vec2f, offsetArgType: Type.vec2i }, + texture_depth_2d_array: { + coordsArgType: Type.vec2f, + hasArrayIndexArg: true, + offsetArgType: Type.vec2i + }, + texture_depth_cube: { coordsArgType: Type.vec3f }, + texture_depth_cube_array: { coordsArgType: Type.vec3f, hasArrayIndexArg: true } +}; + +const kTextureTypes = keysOf(kValidTextureSampleLevelParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('return_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates the return type of ${builtin} is the expected type. +` +). +params((u) => +u. +combine('returnType', keysOf(kValuesTypes)). +combine('textureType', keysOf(kValidTextureSampleLevelParameterTypes)). +beginSubcases(). +expand('offset', (t) => +kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { returnType, textureType, offset } = t.params; + const returnVarType = kValuesTypes[returnType]; + const { offsetArgType, coordsArgType, hasArrayIndexArg } = + kValidTextureSampleLevelParameterTypes[textureType]; + const returnExpectedType = textureType.includes('depth') ? Type.f32 : Type.vec4f; + + const varWGSL = returnVarType.toString(); + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v: ${varWGSL} = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(returnExpectedType, returnVarType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureSampleLevelParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, coordType, offset, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { + offsetArgType, + coordsArgType: coordsRequiredType, + hasArrayIndexArg + } = kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = isConvertible(coordArgType, coordsRequiredType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureSampleLevelParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, arrayIndexType, value, offset } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgType, offsetArgType } = kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleLevel(t, s, ${coordWGSL}, ${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('level_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that only incorrect level arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('levelType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.levelType]) || t.value >= 0). +expand('offset', (t) => +kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { textureType, levelType, value, offset } = t.params; + const levelArgType = kValuesTypes[levelType]; + const args = [levelArgType.create(value)]; + const { coordsArgType, hasArrayIndexArg, offsetArgType, levelIsF32 } = + kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const levelWGSL = args.map((arg) => arg.wgsl()).join(', '); + const offsetWGSL = offset ? `, ${offsetArgType.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, ${levelWGSL}${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = levelIsF32 ? + isConvertible(levelArgType, Type.f32) : + isConvertible(levelArgType, Type.i32) || isConvertible(levelArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that only incorrect offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType). +combine('offsetType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.offsetType]) || t.value >= 0) +). +fn((t) => { + const { textureType, offsetType, value } = t.params; + const offsetArgType = kValuesTypes[offsetType]; + const args = [offsetArgType.create(value)]; + const { + coordsArgType, + hasArrayIndexArg, + offsetArgType: offsetRequiredType + } = kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(offsetArgType, offsetRequiredType) && value >= -8 && value <= 7; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('offset_argument,non_const'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that only non-const offset arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('varType', ['c', 'u', 'l']) +// filter out types with no offset +.filter((t) => !!kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType) +). +fn((t) => { + const { textureType, varType } = t.params; + const { coordsArgType, hasArrayIndexArg, offsetArgType } = + kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = `${offsetArgType}(${varType})`; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${textureType}; +@group(0) @binding(2) var u: ${offsetArgType}; +@fragment fn fs() -> @location(0) vec4f { + const c = 1; + let l = ${offsetArgType.create(0).wgsl()}; + let v = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, 0, ${offsetWGSL}); + return vec4f(0); +} +`; + const expectSuccess = varType === 'c'; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturesamplelevel'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', keysOf(kValidTextureSampleLevelParameterTypes)). +expand('offset', (t) => +kValidTextureSampleLevelParameterTypes[t.textureType].offsetArgType ? +[false, true] : +[false] +) +). +fn((t) => { + const { testTextureType, textureType, offset } = t.params; + const { coordsArgType, offsetArgType, hasArrayIndexArg } = + kValidTextureSampleLevelParameterTypes[textureType]; + + const coordWGSL = coordsArgType.create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const offsetWGSL = offset ? `, ${offsetArgType?.create(0).wgsl()}` : ''; + + const code = ` +@group(0) @binding(0) var s: sampler; +@group(0) @binding(1) var t: ${testTextureType}; +@fragment fn fs() -> @location(0) vec4f { + let v = textureSampleLevel(t, s, ${coordWGSL}${arrayWGSL}, 0${offsetWGSL}); + return vec4f(0); +} +`; + + const types = kValidTextureSampleLevelParameterTypes[testTextureType]; + const typesMatch = types ? + types.coordsArgType === coordsArgType && + types.hasArrayIndexArg === hasArrayIndexArg && ( + offset ? types.offsetArgType === offsetArgType : true) : + false; + + const expectSuccess = testTextureType === textureType || typesMatch; + t.expectCompileResult(expectSuccess, code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleLevel(t,s,vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureStore.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureStore.spec.js new file mode 100644 index 00000000000..06d16ba8181 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/textureStore.spec.js @@ -0,0 +1,227 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'textureStore';export const description = ` +Validation tests for the ${builtin}() builtin. + +* test textureStore coords parameter must be correct type +* test textureStore array_index parameter must be correct type +* test textureStore value parameter must be correct type +* test textureStore doesn't work with texture types it's not supposed to +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kAllTextureFormats, kTextureFormatInfo } from '../../../../../format_info.js'; +import { + Type, + kAllScalarsAndVectors, + isConvertible, + + + isUnsignedType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + getSampleAndBaseTextureTypeForTextureType, + kTestTextureTypes } from +'./shader_builtin_utils.js'; + +const kTextureColorTypeToType = { + sint: Type.vec4i, + uint: Type.vec4u, + float: Type.vec4f, + 'unfilterable-float': Type.vec4f +}; + + + + + + +const kValidTextureStoreParameterTypes = { + texture_storage_1d: { coordsArgTypes: [Type.i32, Type.u32] }, + texture_storage_2d: { coordsArgTypes: [Type.vec2i, Type.vec2u] }, + texture_storage_2d_array: { + coordsArgTypes: [Type.vec2i, Type.vec2u], + hasArrayIndexArg: true + }, + texture_storage_3d: { coordsArgTypes: [Type.vec3i, Type.vec3u] } +}; + +const kTextureTypes = keysOf(kValidTextureStoreParameterTypes); +const kValuesTypes = objectsToRecord(kAllScalarsAndVectors); + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('coords_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturestore'). +desc( + ` +Validates that only incorrect coords arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', keysOf(kValidTextureStoreParameterTypes)). +combine('coordType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-1, 0, 1]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.coordType]) || t.value >= 0) +). +fn((t) => { + const { textureType, coordType, value } = t.params; + const coordArgType = kValuesTypes[coordType]; + const { coordsArgTypes, hasArrayIndexArg } = kValidTextureStoreParameterTypes[textureType]; + + const coordWGSL = coordArgType.create(value).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const format = 'rgba8unorm'; + const valueWGSL = 'vec4f(0)'; + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format},write>; +@fragment fn fs() -> @location(0) vec4f { + textureStore(t, ${coordWGSL}${arrayWGSL}, ${valueWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(coordArgType, coordsArgTypes[0]) || + isConvertible(coordArgType, coordsArgTypes[1]); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('array_index_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturestore'). +desc( + ` +Validates that only incorrect array_index arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes) +// filter out types with no array_index +.filter((t) => !!kValidTextureStoreParameterTypes[t.textureType].hasArrayIndexArg). +combine('arrayIndexType', keysOf(kValuesTypes)). +beginSubcases(). +combine('value', [-9, -8, 0, 7, 8]) +// filter out unsigned types with negative values +.filter((t) => !isUnsignedType(kValuesTypes[t.arrayIndexType]) || t.value >= 0) +). +fn((t) => { + const { textureType, arrayIndexType, value } = t.params; + const arrayIndexArgType = kValuesTypes[arrayIndexType]; + const args = [arrayIndexArgType.create(value)]; + const { coordsArgTypes } = kValidTextureStoreParameterTypes[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = args.map((arg) => arg.wgsl()).join(', '); + const format = 'rgba8unorm'; + const valueWGSL = 'vec4f(0)'; + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, write>; +@fragment fn fs() -> @location(0) vec4f { + textureStore(t, ${coordWGSL}, ${arrayWGSL}, ${valueWGSL}); + return vec4f(0); +} +`; + const expectSuccess = + isConvertible(arrayIndexArgType, Type.i32) || isConvertible(arrayIndexArgType, Type.u32); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('value_argument'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturestore'). +desc( + ` +Validates that only incorrect value arguments are rejected by ${builtin} +` +). +params((u) => +u. +combine('textureType', kTextureTypes). +combine('valueType', keysOf(kValuesTypes)). +beginSubcases(). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage). +combine('value', [0, 1, 2]) +). +fn((t) => { + const { textureType, valueType, format, value } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format); + + const valueArgType = kValuesTypes[valueType]; + const args = [valueArgType.create(value)]; + const { coordsArgTypes, hasArrayIndexArg } = kValidTextureStoreParameterTypes[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const valueWGSL = args.map((arg) => arg.wgsl()).join(', '); + + const code = ` +@group(0) @binding(0) var t: ${textureType}<${format}, write>; +@fragment fn fs() -> @location(0) vec4f { + textureStore(t, ${coordWGSL}${arrayWGSL}, ${valueWGSL}); + return vec4f(0); +} +`; + const colorType = kTextureFormatInfo[format].color?.type; + const requiredValueType = kTextureColorTypeToType[colorType]; + const expectSuccess = isConvertible(valueArgType, requiredValueType); + t.expectCompileResult(expectSuccess, code); +}); + +g.test('texture_type,storage'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#texturestore'). +desc( + ` +Validates that incompatible texture types don't work with ${builtin} +` +). +params((u) => +u. +combine('testTextureType', kTestTextureTypes). +beginSubcases(). +combine('textureType', keysOf(kValidTextureStoreParameterTypes)). +combine('format', kAllTextureFormats) +// filter to only storage texture formats. +.filter((t) => !!kTextureFormatInfo[t.format].color?.storage) +). +fn((t) => { + const { testTextureType, textureType, format } = t.params; + const { coordsArgTypes, hasArrayIndexArg } = kValidTextureStoreParameterTypes[textureType]; + + const coordWGSL = coordsArgTypes[0].create(0).wgsl(); + const arrayWGSL = hasArrayIndexArg ? ', 0' : ''; + const colorType = kTextureFormatInfo[format].color?.type; + const valueType = kTextureColorTypeToType[colorType]; + const valueWGSL = valueType.create(0).wgsl(); + + const code = ` +@group(0) @binding(1) var t: ${testTextureType.replace(', read', ', write')}; +@fragment fn fs() -> @location(0) vec4f { + textureStore(t, ${coordWGSL}${arrayWGSL}, ${valueWGSL}); + return vec4f(0); +} +`; + + const [baseTestTextureType, sampleType] = + getSampleAndBaseTextureTypeForTextureType(testTextureType); + + let expectSuccess = false; + const types = kValidTextureStoreParameterTypes[baseTestTextureType]; + if (types) { + const typesMatch = types ? + types.coordsArgTypes[0] === coordsArgTypes[0] && + types.hasArrayIndexArg === hasArrayIndexArg && + isConvertible(valueType, sampleType) : + false; + expectSuccess = typesMatch; + } + + t.expectCompileResult(expectSuccess, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/transpose.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/transpose.spec.js new file mode 100644 index 00000000000..6897c6977dc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/transpose.spec.js @@ -0,0 +1,139 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'transpose';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + isConvertible, + kAllMatrices, + kConcreteFloatScalars, + kFloatScalars, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kAllMatrices); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() accept valid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = true; + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(mat2x2(0, 1, 2, 3))', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +const kValidArgumentScalarTypes = objectsToRecord(kFloatScalars); +const kValidReturnScalarTypes = objectsToRecord(kConcreteFloatScalars); + +g.test('return'). +desc(`Test compilation pass/failure of ${builtin} with variously shaped inputs and outputs`). +params((u) => +u. +combine('input_type', keysOf(kValidArgumentScalarTypes)). +combine('input_rows', [2, 3, 4]). +combine('input_cols', [2, 3, 4]). +combine('output_type', keysOf(kValidReturnScalarTypes)). +combine('output_rows', [2, 3, 4]). +combine('output_cols', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.input_type === 'f16' || t.params.output_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const input_type = t.params.input_type; + const input_cols = t.params.input_cols; + const input_rows = t.params.input_rows; + const input_values = Array(input_cols * input_rows). + fill(kValidArgumentScalarTypes[t.params.input_type].create(0).wgsl()). + join(', '); + const input_str = `mat${input_cols}x${input_rows}(${input_values})`; + + const output_type = t.params.output_type; + const output_cols = t.params.output_cols; + const output_rows = t.params.output_rows; + + const enables = input_type === 'f16' || output_type === 'f16' ? 'enable f16;' : ''; + + const expectedResult = + input_cols === output_rows && + input_rows === output_cols && + isConvertible(kValidArgumentScalarTypes[input_type], kValidReturnScalarTypes[output_type]); + t.expectCompileResult( + expectedResult, + `${enables}\nconst c: mat${output_cols}x${output_rows}<${output_type}> = ${builtin}(${input_str});` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/trunc.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/trunc.spec.js new file mode 100644 index 00000000000..a4ce758a7e1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/trunc.spec.js @@ -0,0 +1,94 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'trunc';export const description = ` +Validation tests for the ${builtin}() builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { + Type, + kConvertableToFloatScalarsAndVectors, + scalarTypeOf } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidArgumentTypes = objectsToRecord(kConvertableToFloatScalarsAndVectors); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin}() error on invalid inputs. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', keysOf(kValidArgumentTypes)). +filter((u) => stageSupportsType(u.stage, kValidArgumentTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kValidArgumentTypes[u.type])) +). +beforeAllSubcases((t) => { + if (scalarTypeOf(kValidArgumentTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = true; + + const type = kValidArgumentTypes[t.params.type]; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(t.params.value)], + t.params.stage + ); +}); + +const kArgCases = { + good: '(1.2)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2arg: '(1.2, 2.3)', + // Bad value for arg 0 + bad_0bool: '(false)', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', + bad_0uint: '(1u)', + bad_0int: '(1i)', + bad_0vec2i: '(vec2i())', + bad_0vec2u: '(vec2u())', + bad_0vec3i: '(vec3i())', + bad_0vec3u: '(vec3u())', + bad_0vec4i: '(vec4i())', + bad_0vec4u: '(vec4u())' +}; + +g.test('args'). +desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`). +params((u) => u.combine('arg', keysOf(kArgCases))). +fn((t) => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16float.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16float.spec.js new file mode 100644 index 00000000000..3c09eece050 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16float.spec.js @@ -0,0 +1,126 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'unpack2x16float';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kBit, kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec2'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] +}; + +// Return true if and only if the given value is of valid f16 bit pattern represented as uint16, and is not NaN nor Inf. +const isValidF16AsU16 = (f16AsU16) => { + return ( + Number.isInteger(f16AsU16) && ( + kBit.f16.positive.zero <= f16AsU16 && f16AsU16 < kBit.f16.positive.infinity || + kBit.f16.negative.zero <= f16AsU16 && f16AsU16 < kBit.f16.negative.infinity)); + +}; + +const isValidPacked2xF16 = (packed2xF16AsU32) => { + return ( + Number.isInteger(packed2xF16AsU32) && + packed2xF16AsU32 >= kValue.u32.min && + packed2xF16AsU32 <= kValue.u32.max && + isValidF16AsU16(packed2xF16AsU32 & 0xffff) && + isValidF16AsU16(packed2xF16AsU32 >>> 16)); + +}; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). +fn((t) => { + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = isValidPacked2xF16(Number(value)); + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16snorm.spec.js new file mode 100644 index 00000000000..ecbe4b2d1ea --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16snorm.spec.js @@ -0,0 +1,107 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'unpack2x16snorm';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec2'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] +}; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). +fn((t) => { + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16unorm.spec.js new file mode 100644 index 00000000000..e9dfacb65b3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack2x16unorm.spec.js @@ -0,0 +1,107 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'unpack2x16unorm';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec2'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] +}; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). +fn((t) => { + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8snorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8snorm.spec.js new file mode 100644 index 00000000000..a2b02f95ef9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8snorm.spec.js @@ -0,0 +1,107 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'unpack4x8snorm';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec4'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] +}; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). +fn((t) => { + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8unorm.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8unorm.spec.js new file mode 100644 index 00000000000..b3f9cbdd6ba --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4x8unorm.spec.js @@ -0,0 +1,107 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/const builtin = 'unpack4x8unorm';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec4'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] +}; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). +fn((t) => { + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); +}); + +g.test('must_use'). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xI8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xI8.spec.js index 35e51529a13..bacab89a45b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xI8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xI8.spec.js @@ -1,56 +1,128 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validate unpack4xI8`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../../../common/util/data_tables.js'; +**/const builtin = 'unpack4xI8';export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + const kFeature = 'packed_4x8_integer_dot_product'; -const kFn = 'unpack4xI8'; -const kGoodArgs = '(1u)'; -const kBadArgs = { - '0args': '()', - '2args': '(1u,2u)', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec2u': '(vec2u())', - '0vec3u': '(vec3u())', - '0vec4u': '(vec4u())' +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec4'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] }; export const g = makeTestGroup(ShaderValidationTest); g.test('unsupported'). -desc(`Test absence of ${kFn} when ${kFeature} is not supported.`). +desc(`Test absence of ${builtin} when ${kFeature} is not supported.`). params((u) => u.combine('requires', [false, true])). fn((t) => { t.skipIfLanguageFeatureSupported(kFeature); const preamble = t.params.requires ? `requires ${kFeature}; ` : ''; - const code = `${preamble}const c = ${kFn}${kGoodArgs};`; + const code = `${preamble}const c = ${builtin}(1u);`; t.expectCompileResult(false, code); }); g.test('supported'). -desc(`Test presence of ${kFn} when ${kFeature} is supported.`). +desc(`Test presence of ${builtin} when ${kFeature} is supported.`). params((u) => u.combine('requires', [false, true])). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); const preamble = t.params.requires ? `requires ${kFeature}; ` : ''; - const code = `${preamble}const c = ${kFn}${kGoodArgs};`; + const code = `${preamble}const c = ${builtin}(1u);`; t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); }); g.test('must_use'). -desc(`Result of ${kFn} must be used`). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xU8.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xU8.spec.js index 86c101fede7..aeef2e9a323 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xU8.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/unpack4xU8.spec.js @@ -1,56 +1,128 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validate unpack4xU8`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../../../common/util/data_tables.js'; +**/export const builtin = `unpack4xU8`;export const description = ` +Validation tests for the ${builtin} builtin. +`; +import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../../util/constants.js'; +import { + kAllScalarsAndVectors, + u32, + i32, + f32, + f16, + bool, + vec2, + vec3, + vec4, + array } from +'../../../../../util/conversion.js'; import { ShaderValidationTest } from '../../../shader_validation_test.js'; +import { + fullRangeForType, + kConstantAndOverrideStages, + stageSupportsType, + validateConstOrOverrideBuiltinEval } from +'./const_override_validation.js'; + const kFeature = 'packed_4x8_integer_dot_product'; -const kFn = 'unpack4xU8'; -const kGoodArgs = '(1u)'; -const kBadArgs = { - '0args': '()', - '2args': '(1u,2u)', - '0i32': '(1i)', - '0f32': '(1f)', - '0bool': '(false)', - '0vec2u': '(vec2u())', - '0vec3u': '(vec3u())', - '0vec4u': '(vec4u())' +const kAllValueTypes = objectsToRecord(kAllScalarsAndVectors); +const kValidArgumentTypes = ['u32', 'abstract-int']; +const kReturnType = 'vec4'; +const kArgCases = { + good: [u32(1)], + bad_no_args: [], + bad_more_args: [u32(1), u32(2)], + bad_i32: [i32(1)], + bad_f32: [f32(1)], + bad_f16: [f16(1)], + bad_bool: [bool(false)], + bad_vec2u: [vec2(u32(1), u32(2))], + bad_vec3u: [vec3(u32(1), u32(2), u32(3))], + bad_vec4u: [vec4(u32(1), u32(2), u32(3), u32(4))], + bad_array: [array(u32(1))] }; export const g = makeTestGroup(ShaderValidationTest); g.test('unsupported'). -desc(`Test absence of ${kFn} when ${kFeature} is not supported.`). +desc(`Test absence of ${builtin} when ${kFeature} is not supported.`). params((u) => u.combine('requires', [false, true])). fn((t) => { t.skipIfLanguageFeatureSupported(kFeature); const preamble = t.params.requires ? `requires ${kFeature}; ` : ''; - const code = `${preamble}const c = ${kFn}${kGoodArgs};`; + const code = `${preamble}const c = ${builtin}(1u);`; t.expectCompileResult(false, code); }); g.test('supported'). -desc(`Test presence of ${kFn} when ${kFeature} is supported.`). +desc(`Test presence of ${builtin} when ${kFeature} is supported.`). params((u) => u.combine('requires', [false, true])). fn((t) => { t.skipIfLanguageFeatureNotSupported(kFeature); const preamble = t.params.requires ? `requires ${kFeature}; ` : ''; - const code = `${preamble}const c = ${kFn}${kGoodArgs};`; + const code = `${preamble}const c = ${builtin}(1u);`; t.expectCompileResult(true, code); }); -g.test('bad_args'). -desc(`Test compilation failure of ${kFn} with bad arguments`). -params((u) => u.combine('arg', keysOf(kBadArgs))). +g.test('values'). +desc( + ` +Validates that constant evaluation and override evaluation of ${builtin} rejects invalid values. +` +). +params((u) => +u. +combine('stage', kConstantAndOverrideStages). +combine('type', kValidArgumentTypes). +filter((u) => stageSupportsType(u.stage, kAllValueTypes[u.type])). +beginSubcases(). +expand('value', (u) => fullRangeForType(kAllValueTypes[u.type])) +). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `const c = ${kFn}${kBadArgs[t.params.arg]};`); + const type = kAllValueTypes[t.params.type]; + const value = t.params.value; + const expectedResult = value >= kValue.u32.min && value <= kValue.u32.max; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + [type.create(value)], + t.params.stage + ); +}); + +g.test('arguments'). +desc(`Test that ${builtin} is validated correctly when called with different arguments.`). +params((u) => +u. +combine('args', keysOf(kArgCases)). +beginSubcases(). +expand('returnType', (u) => u.args.includes('good') ? keysOf(kAllValueTypes) : [kReturnType]) +). +beforeAllSubcases((t) => { + if (t.params.args.includes('f16') || t.params.returnType?.toString().includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const expectedResult = t.params.args.includes('good') && t.params.returnType === kReturnType; + validateConstOrOverrideBuiltinEval( + t, + builtin, + expectedResult, + kArgCases[t.params.args], + 'constant', + kAllValueTypes[t.params.returnType] + ); }); g.test('must_use'). -desc(`Result of ${kFn} must be used`). +desc(`Result of ${builtin} must be used`). +params((u) => u.combine('use', [true, false])). fn((t) => { - t.skipIfLanguageFeatureNotSupported(kFeature); - t.expectCompileResult(false, `fn f() { ${kFn}${kGoodArgs}; }`); + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}(1u); }`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.js new file mode 100644 index 00000000000..814fd57e071 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.js @@ -0,0 +1,801 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for constructor built-in functions. +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { + isAbstractType, + isConvertible, + isFloatType, + MatrixType, + ScalarType, + scalarTypeOf, + Type, + VectorType } from +'../../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kScalarTypes = ['bool', 'i32', 'u32', 'f32', 'f16']; + +g.test('scalar_zero_value'). +desc('Tests zero value scalar constructors'). +params((u) => u.combine('type', kScalarTypes)). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const enable = t.params.type === 'f16' ? 'enable f16;' : ''; + const code = `${enable} + const x : ${t.params.type} = ${t.params.type}(); + const_assert x == ${t.params.type}(0);`; + t.expectCompileResult(true, code); +}); + +g.test('scalar_value'). +desc('Tests scalar value constructors'). +params((u) => +u. +combine('type', kScalarTypes). +combine('value_type', [...kScalarTypes, 'vec2u', 'S', 'array']) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16' || t.params.value_type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const enable = t.params.type === 'f16' || t.params.value_type === 'f16' ? 'enable f16;' : ''; + const code = `${enable} + const x : ${t.params.type} = ${t.params.type}(${t.params.value_type}());`; + t.expectCompileResult(kScalarTypes.includes(t.params.value_type), code); +}); + +g.test('vector_zero_value'). +desc('Tests zero value vector constructors'). +params((u) => +u. +combine('type', [...kScalarTypes, 'abstract-int', 'abstract-float']). +beginSubcases(). +combine('size', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const abstract = t.params.type === 'abstract-int' || t.params.type === 'abstract-float'; + const param = abstract ? '' : `<${t.params.type}>`; + const decl = `vec${t.params.size}${param}`; + const enable = t.params.type === 'f16' ? 'enable f16;' : ''; + const comparison = abstract ? '0' : `${t.params.type}(0)`; + let code = `${enable} + const x ${abstract ? '' : `: ${decl}`} = ${decl}();\n`; + for (let i = 0; i < t.params.size; i++) { + code += `const_assert x[${i}] == ${comparison};\n`; + } + t.expectCompileResult(true, code); +}); + +g.test('vector_splat'). +desc('Test vector splat constructors'). +params((u) => +u. +combine('type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +combine('ele_type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float', +'mat2x2f', +'mat3x3h', +'vec2i', +'vec3f'] +). +beginSubcases(). +combine('size', [2, 3, 4]) +). +beforeAllSubcases((t) => { + const ty = Type[t.params.type]; + const eleTy = Type[t.params.ele_type]; + if (ty.requiresF16() || eleTy.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const eleTy = Type[t.params.ele_type]; + const abstract = t.params.type === 'abstract-int' || t.params.type === 'abstract-float'; + const param = abstract ? '' : `<${t.params.type}>`; + const decl = `vec${t.params.size}${param}`; + const enable = t.params.type === 'f16' || t.params.ele_type === 'f16' ? 'enable f16;' : ''; + const eleValue = eleTy.create(1).wgsl(); + const valueCall = decl; + const code = `${enable} + const x ${abstract ? '' : `: ${decl}`} = ${valueCall}(${eleValue});`; + const ty = Type[t.params.type]; + const expect = + eleTy instanceof ScalarType && (isConvertible(eleTy, ty) || isAbstractType(ty)) || + eleTy instanceof VectorType && eleTy.width === t.params.size; + t.expectCompileResult(expect, code); +}); + +g.test('vector_copy'). +desc('Test vector copy constructors'). +params((u) => +u. +combine('decl_type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +combine('value_type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +beginSubcases(). +combine('decl_size', [2, 3, 4]). +combine('value_size', [2, 3, 4]) +). +beforeAllSubcases((t) => { + const ty = Type[t.params.decl_type]; + const eleTy = Type[t.params.value_type]; + if (ty.requiresF16() || eleTy.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const declTy = Type[t.params.decl_type]; + const valueTy = Type[t.params.value_type]; + const valueVecTy = Type['vec'](t.params.value_size, valueTy); + const enable = declTy.requiresF16() || valueTy.requiresF16() ? 'enable f16;' : ''; + const decl = `vec${t.params.decl_size}<${t.params.decl_type}>`; + const ctor = `vec${t.params.decl_size}${ + isAbstractType(declTy) ? '' : `<${t.params.decl_type}>` + }`; + const code = `${enable} + const x ${isAbstractType(declTy) ? '' : `: ${decl}`} = ${ctor}(${valueVecTy. + create(1). + wgsl()});`; + + t.expectCompileResult(t.params.decl_size === t.params.value_size, code); +}); + +g.test('vector_elementwise'). +desc('Test element-wise vector constructors'). +params((u) => +u. +combine('type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +combine('ele_type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float', +'mat2x2f', +'mat3x3h', +'vec2i', +'vec3f'] +). +beginSubcases(). +combine('size', [2, 3, 4]). +combine('num_eles', [2, 3, 4, 5]). +combine('full_type', [true, false]) +). +beforeAllSubcases((t) => { + const ty = Type[t.params.type]; + const eleTy = Type[t.params.ele_type]; + if (ty.requiresF16() || eleTy.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const eleTy = Type[t.params.ele_type]; + const abstract = t.params.type === 'abstract-int' || t.params.type === 'abstract-float'; + const param = abstract ? '' : `<${t.params.type}>`; + const decl = `vec${t.params.size}${param}`; + const enable = t.params.type === 'f16' || t.params.ele_type === 'f16' ? 'enable f16;' : ''; + const eleValue = eleTy.create(1).wgsl(); + const valueCall = t.params.full_type ? decl : `vec${t.params.size}`; + let code = `${enable} + const x ${abstract ? '' : `: ${decl}`} = ${valueCall}(`; + for (let i = 0; i < t.params.num_eles; i++) { + code += `${eleValue},`; + } + code += `);`; + const ty = Type[t.params.type]; + // WGSL requires: + // * number of elements match + // * element types match (or auto convert, vector special case) + // * abstract decl works because it is untyped and inferred as a different type + const num_eles = + eleTy instanceof VectorType ? t.params.num_eles * eleTy.width : t.params.num_eles; + const expect = + !(eleTy instanceof MatrixType) && + t.params.size === num_eles && ( + isConvertible(scalarTypeOf(eleTy), ty) || + t.params.type === 'abstract-int' || + t.params.type === 'abstract-float'); + t.expectCompileResult(expect, code); +}); + +g.test('vector_mixed'). +desc('Test vector constructors with mixed elements and vectors'). +params((u) => +u. +combine('type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +combine('ele_type', [ +'bool', +'i32', +'u32', +'f32', +'f16', +'abstract-int', +'abstract-float'] +). +beginSubcases(). +combine('size', [3, 4]). +combine('num_eles', [3, 4, 5]). +combine('full_type', [true, false]) +). +beforeAllSubcases((t) => { + const ty = Type[t.params.type]; + const eleTy = Type[t.params.ele_type]; + if (ty.requiresF16() || eleTy.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const eleTy = Type[t.params.ele_type]; + const abstract = t.params.type === 'abstract-int' || t.params.type === 'abstract-float'; + const param = abstract ? '' : `<${t.params.type}>`; + const decl = `vec${t.params.size}${param}`; + const enable = t.params.type === 'f16' || t.params.ele_type === 'f16' ? 'enable f16;' : ''; + const v = eleTy.create(1).wgsl(); + const call = t.params.full_type ? decl : `vec${t.params.size}`; + let code = `${enable}\n`; + + switch (t.params.num_eles) { + case 3: + code += `const x1 ${abstract ? '' : `: ${decl}`} = ${call}(${v}, vec2(${v}, ${v}));\n`; + code += `const x2 ${abstract ? '' : `: ${decl}`} = ${call}(vec2(${v}, ${v}), ${v});\n`; + break; + case 4: + code += `const x1 ${ + abstract ? '' : `: ${decl}` + } = ${call}(${v}, vec2(${v}, ${v}), ${v});\n`; + code += `const x2 ${ + abstract ? '' : `: ${decl}` + } = ${call}(${v}, ${v}, vec2(${v}, ${v}));\n`; + code += `const x3 ${ + abstract ? '' : `: ${decl}` + } = ${call}(vec2(${v}, ${v}), ${v}, ${v});\n`; + code += `const x4 ${ + abstract ? '' : `: ${decl}` + } = ${call}(vec3(${v}, ${v}, ${v}), ${v});\n`; + code += `const x5 ${ + abstract ? '' : `: ${decl}` + } = ${call}(${v}, vec3(${v}, ${v}, ${v}));\n`; + break; + case 5: + // This case is always invalid so try a few only. + code += `const x1 ${ + abstract ? '' : `: ${decl}` + } = ${call}(${v}, vec3(${v}, ${v}), ${v});\n`; + code += `const x1 ${abstract ? '' : `: ${decl}`} = ${call}(${v}, vec4(${v}}), ${v});\n`; + break; + } + const ty = Type[t.params.type]; + // WGSL requires: + // * number of elements match (in total, not parameters) + // * element types match (or auto convert) + // * abstract decl works because it is untyped and inferred as a different type + const expect = + t.params.size === t.params.num_eles && ( + isConvertible(eleTy, ty) || + t.params.type === 'abstract-int' || + t.params.type === 'abstract-float'); + t.expectCompileResult(expect, code); +}); + +g.test('matrix_zero_value'). +desc('Tests zero value matrix constructors'). +params((u) => +u. +combine('type', ['f32', 'f16']). +beginSubcases(). +combine('rows', [2, 3, 4]). +combine('cols', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const decl = `mat${t.params.cols}x${t.params.rows}<${t.params.type}>`; + const enable = t.params.type === 'f16' ? 'enable f16;' : ''; + let code = `${enable} + const x : ${decl} = ${decl}();\n`; + for (let c = 0; c < t.params.cols; c++) { + for (let r = 0; r < t.params.rows; r++) { + code += `const_assert x[${c}][${r}] == ${t.params.type}(0);\n`; + } + } + t.expectCompileResult(true, code); +}); + +g.test('matrix_copy'). +desc('Test matrix copy constructors'). +params((u) => +u. +combine('type1', ['f16', 'f32', 'abstract-float']). +combine('type2', ['f16', 'f32', 'abstract-float']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('c2', [2, 3, 4]). +combine('r2', [2, 3, 4]) +). +beforeAllSubcases((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + if (t1.requiresF16() || t2.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + const m2 = Type['mat'](t.params.c2, t.params.r2, t2); + const enable = t1.requiresF16() || t2.requiresF16() ? 'enable f16;' : ''; + const decl = `mat${t.params.c1}x${t.params.r1}<${t.params.type1}>`; + const call = `mat${t.params.c1}x${t.params.r1}${ + isAbstractType(t1) ? '' : `<${t.params.type1}>` + }`; + const code = `${enable} + const m ${isAbstractType(t1) ? '' : `: ${decl}`} = ${call}(${m2.create(0).wgsl()});`; + t.expectCompileResult(t.params.c1 === t.params.c2 && t.params.r1 === t.params.r2, code); +}); + +g.test('matrix_column'). +desc('Test matrix column constructors'). +params((u) => +u. +combine('type1', ['f16', 'f32', 'abstract-float']). +combine('type2', ['f16', 'f32', 'abstract-float', 'i32', 'u32', 'bool']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('c2', [2, 3, 4]). +combine('r2', [2, 3, 4]) +). +beforeAllSubcases((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + if (t1.requiresF16() || t2.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + const enable = t1.requiresF16() || t2.requiresF16() ? 'enable f16;' : ''; + const vecTy2 = Type['vec'](t.params.r2, t2); + let values = ``; + for (let i = 0; i < t.params.c2; i++) { + values += `${vecTy2.create(1).wgsl()},`; + } + const decl = `mat${t.params.c1}x${t.params.r1}<${t.params.type1}>`; + const call = `mat${t.params.c1}x${t.params.r1}${ + isAbstractType(t1) ? '' : `<${t.params.type1}>` + }`; + const code = `${enable} + const m ${isAbstractType(t1) ? '' : `: ${decl}`} = ${call}(${values});`; + const expect = + isFloatType(t2) && + t.params.c1 === t.params.c2 && + t.params.r1 === t.params.r2 && ( + t1 === t2 || isAbstractType(t1) || isAbstractType(t2)); + t.expectCompileResult(expect, code); +}); + +g.test('matrix_elementwise'). +desc('Test matrix element-wise constructors'). +params((u) => +u. +combine('type1', ['f16', 'f32', 'abstract-float']). +combine('type2', ['f16', 'f32', 'abstract-float', 'i32', 'u32', 'bool']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('c2', [2, 3, 4]). +combine('r2', [2, 3, 4]) +). +beforeAllSubcases((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + if (t1.requiresF16() || t2.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const t1 = Type[t.params.type1]; + const t2 = Type[t.params.type2]; + const enable = t1.requiresF16() || t2.requiresF16() ? 'enable f16;' : ''; + let values = ``; + for (let i = 0; i < t.params.c2 * t.params.r2; i++) { + values += `${t2.create(1).wgsl()},`; + } + const decl = `mat${t.params.c1}x${t.params.r1}<${t.params.type1}>`; + const call = `mat${t.params.c1}x${t.params.r1}${ + isAbstractType(t1) ? '' : `<${t.params.type1}>` + }`; + const code = `${enable} + const m ${isAbstractType(t1) ? '' : `: ${decl}`} = ${call}(${values});`; + const expect = + isFloatType(t2) && + t.params.c1 * t.params.r1 === t.params.c2 * t.params.r2 && ( + t1 === t2 || isAbstractType(t1) || isAbstractType(t2)); + t.expectCompileResult(expect, code); +}); + + + + + + + + +const kArrayCases = { + i32: { + element: 'i32', + size: 4, + valid: true, + values: '1,2,3,4' + }, + f32: { + element: 'f32', + size: 1, + valid: true, + values: '0' + }, + u32: { + element: 'u32', + size: 2, + valid: true, + values: '2,4' + }, + valid_array: { + element: 'array', + size: 2, + valid: true, + values: 'array(0,1), array(2,3)' + }, + invalid_rta: { + element: 'u32', + size: '', + valid: false, + values: '0' + }, + invalid_override_array: { + element: 'u32', + size: 'o', + valid: false, + values: '1' + }, + valid_struct: { + element: 'valid_S', + size: 1, + valid: true, + values: 'valid_S(0)' + }, + invalid_struct: { + element: 'invalid_S', + size: 1, + valid: false, + values: 'array(0)' + }, + invalid_atomic: { + element: 'atomic', + size: 1, + valid: false, + values: '0' + } +}; + +g.test('array_zero_value'). +desc('Tests zero value array constructors'). +params((u) => u.combine('case', keysOf(kArrayCases))). +fn((t) => { + const testcase = kArrayCases[t.params.case]; + const decl = `array<${testcase.element}, ${testcase.size}>`; + const code = `override o : i32 = 1; + struct valid_S { + x : u32 + } + struct invalid_S { + x : array + } + const x : ${decl} = ${decl}();`; + t.expectCompileResult(testcase.valid, code); +}); + +g.test('array_value'). +desc('Tests array value constructor'). +params((u) => u.combine('case', keysOf(kArrayCases))). +fn((t) => { + const testcase = kArrayCases[t.params.case]; + const decl = `array<${testcase.element}, ${testcase.size}>`; + const code = `override o : i32 = 1; + struct valid_S { + x : u32 + } + struct invalid_S { + x : array + } + const x : ${decl} = ${decl}(${testcase.values});`; + t.expectCompileResult(testcase.valid, code); +}); + +const kStructCases = { + i32: { + name: 'S', + decls: `struct S { x : u32 }`, + valid: true, + values: '0' + }, + f32x2: { + name: 'S', + decls: `struct S { x : f32, y : f32 }`, + valid: true, + values: '0,1' + }, + vec3u: { + name: 'S', + decls: `struct S { x : vec3u }`, + valid: true, + values: 'vec3()' + }, + valid_array: { + name: 'S', + decls: `struct S { x : array }`, + valid: true, + values: 'array(1,2)' + }, + runtime_array: { + name: 'S', + decls: `struct S { x : array }`, + valid: false, + values: 'array(0)' + }, + atomic: { + name: 'S', + decls: `struct S { x : atomic }`, + valid: false, + values: '0' + }, + struct: { + name: 'S', + decls: `struct S { + x : T + } + struct T { + x : u32 + }`, + valid: true, + values: 'T(0)' + }, + many_members: { + name: 'S', + decls: `struct S { + a : bool, + b : u32, + c : i32, + d : vec4f, + }`, + valid: true, + values: 'false, 1u, 32i, vec4f(1.0f)' + } +}; + +g.test('struct_zero_value'). +desc('Tests zero value struct constructors'). +params((u) => u.combine('case', keysOf(kStructCases))). +fn((t) => { + const testcase = kStructCases[t.params.case]; + const code = ` + ${testcase.decls} + const x : ${testcase.name} = ${testcase.name}();`; + t.expectCompileResult(testcase.valid, code); +}); + +g.test('struct_value'). +desc('Tests struct value constructors'). +params((u) => u.combine('case', keysOf(kStructCases))). +fn((t) => { + const testcase = kStructCases[t.params.case]; + const code = ` + ${testcase.decls} + const x : ${testcase.name} = ${testcase.name}(${testcase.values});`; + t.expectCompileResult(testcase.valid, code); +}); + +const kConstructors = { + u32_0: 'u32()', + i32_0: 'i32()', + bool_0: 'bool()', + f32_0: 'f32()', + f16_0: 'f16()', + vec2_0: 'vec2()', + vec3_0: 'vec3()', + vec4_0: 'vec4()', + mat2x2_0: 'mat2x2f()', + mat2x3_0: 'mat2x3f()', + mat2x4_0: 'mat2x4f()', + mat3x2_0: 'mat3x2f()', + mat3x3_0: 'mat3x3f()', + mat3x4_0: 'mat3x4f()', + mat4x2_0_f16: 'mat4x2h()', + mat4x3_0_f16: 'mat4x3h()', + mat4x4_0_f16: 'mat4x4h()', + S_0: 'S()', + array_0: 'array()', + u32: 'u32(1)', + i32: 'i32(1)', + bool: 'bool(true)', + f32: 'f32(1)', + f16: 'f16(1)', + vec2f: 'vec2(1)', + vec3_f16: 'vec3(1)', + vec4: 'vec4(1)', + mat2x2: 'mat2x2f(1,1,1,1)', + mat2x3: 'mat2x3f(1,1,1,1,1,1)', + mat2x4: 'mat2x4f(1,1,1,1,1,1,1,1)', + mat3x2_f16: 'mat3x2(vec2h(),vec2h(),vec2h())', + mat3x3_f16: 'mat3x3(vec3h(),vec3h(),vec3h())', + mat3x4_f16: 'mat3x4(vec4h(),vec4h(),vec4h())', + mat4x2: 'mat4x2(vec2(),vec2(),vec2(),vec2())', + mat4x3: 'mat4x3(vec3(),vec3(),vec3(),vec3())', + mat4x4: 'mat4x4(vec4(),vec4(),vec4(),vec4())', + S: 'S(1,1)', + array_abs: 'array(1,2,3)', + array: 'array(1,2,3,4)' +}; + +g.test('must_use'). +desc('Tests that value constructors must be used'). +params((u) => u.combine('ctor', keysOf(kConstructors)).combine('use', [true, false])). +beforeAllSubcases((t) => { + if (t.params.ctor.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = ` + ${t.params.ctor.includes('f16') ? 'enable f16;' : ''} + struct S { + x : u32, + y : f32, + } + fn foo() { + ${t.params.use ? '_ =' : ''} ${kConstructors[t.params.ctor]}; + }`; + t.expectCompileResult(t.params.use, code); +}); + +g.test('partial_eval'). +desc('Tests that mixed runtime and early eval expressions catch errors'). +params((u) => +u. +combine('eleTy', ['i32', 'u32']). +combine('compTy', ['array', 'vec2', 'vec3', 'vec4', 'S']). +combine('stage', ['constant', 'runtime']). +beginSubcases(). +expandWithParams((t) => { + const cases = []; + switch (t.compTy) { + case 'array': + cases.push({ numEles: 2, index: 0 }); + cases.push({ numEles: 2, index: 1 }); + cases.push({ numEles: 3, index: 0 }); + cases.push({ numEles: 3, index: 1 }); + cases.push({ numEles: 3, index: 2 }); + break; + case 'vec2': + cases.push({ numEles: 2, index: 0 }); + cases.push({ numEles: 2, index: 1 }); + break; + case 'vec3': + cases.push({ numEles: 3, index: 0 }); + cases.push({ numEles: 3, index: 1 }); + cases.push({ numEles: 3, index: 2 }); + break; + case 'vec4': + cases.push({ numEles: 4, index: 0 }); + cases.push({ numEles: 4, index: 1 }); + cases.push({ numEles: 4, index: 2 }); + cases.push({ numEles: 4, index: 3 }); + break; + case 'S': + cases.push({ numEles: 2, index: 0 }); + cases.push({ numEles: 2, index: 1 }); + break; + } + return cases; +}) +). +fn((t) => { + const eleTy = Type['abstract-int']; + const value = t.params.eleTy === 'i32' ? 0xfffffffff : -1; + let compParams = ''; + for (let i = 0; i < t.params.numEles; i++) { + if (t.params.index === i) { + switch (t.params.stage) { + case 'constant': + compParams += `${eleTy.create(value).wgsl()}, `; + break; + case 'runtime': + compParams += `v, `; + break; + } + } else { + compParams += `v, `; + } + } + const wgsl = ` +struct S { + x : ${t.params.eleTy}, + y : ${t.params.eleTy}, +} + +fn foo() { + var v : ${t.params.eleTy}; + let tmp = ${t.params.compTy}(${compParams}); +}`; + + const shader_error = t.params.stage === 'constant'; + t.expectCompileResult(!shader_error, wgsl); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.js new file mode 100644 index 00000000000..90c84eaa784 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.js @@ -0,0 +1,134 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for the workgroupUniformLoad() builtin. +`;import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kEntryPoints = { + none: { supportsBarrier: true, code: `` }, + compute: { + supportsBarrier: true, + code: `@compute @workgroup_size(1) +fn main() { + foo(); +}` + }, + vertex: { + supportsBarrier: false, + code: `@vertex +fn main() -> @builtin(position) vec4f { + foo(); + return vec4f(); +}` + }, + fragment: { + supportsBarrier: false, + code: `@fragment +fn main() { + foo(); +}` + }, + compute_and_fragment: { + supportsBarrier: false, + code: `@compute @workgroup_size(1) +fn main1() { + foo(); +} + +@fragment +fn main2() { + foo(); +} +` + }, + fragment_without_call: { + supportsBarrier: true, + code: `@fragment +fn main() { +} +` + } +}; + +g.test('only_in_compute'). +specURL('https://www.w3.org/TR/WGSL/#sync-builtin-functions'). +desc( + ` +Synchronization functions must only be used in the compute shader stage. +` +). +params((u) => +u. +combine('entry_point', keysOf(kEntryPoints)). +combine('call', ['bar()', 'workgroupUniformLoad(&wgvar)']) +). +fn((t) => { + const config = kEntryPoints[t.params.entry_point]; + const code = ` +${config.code} + +var wgvar : u32; + +fn bar() -> u32 { + return 0; +} + +fn foo() { + _ = ${t.params.call}; +}`; + t.expectCompileResult(t.params.call === 'bar()' || config.supportsBarrier, code); +}); + +// A list of types that contains atomics, with a single control case. +const kAtomicTypes = [ +'bool', // control case +'atomic', +'atomic', +'array, 4>', +'AtomicStruct']; + + +g.test('no_atomics'). +desc( + ` +The argument passed to workgroupUniformLoad cannot contain any atomic types. + +NOTE: Various other valid types are tested via execution tests, so we only check for invalid types here. +` +). +params((u) => +u.combine('type', kAtomicTypes).combine('call', ['bar()', 'workgroupUniformLoad(&wgvar)']) +). +fn((t) => { + const code = ` +struct AtomicStruct { + a : atomic +} + +var wgvar : ${t.params.type}; + +fn bar() -> bool { + return true; +} + +fn foo() { + _ = ${t.params.call}; +}`; + t.expectCompileResult(t.params.type === 'bool' || t.params.call === 'bar()', code); +}); + +g.test('must_use'). +desc('Tests that the result must be used'). +params((u) => u.combine('use', [true, false])). +fn((t) => { + const code = ` + var v : u32; + fn foo() { + ${t.params.use ? '_ =' : ''} workgroupUniformLoad(&v); + }`; + t.expectCompileResult(t.params.use, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/early_evaluation.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/early_evaluation.spec.js new file mode 100644 index 00000000000..d74e7f17cfb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/early_evaluation.spec.js @@ -0,0 +1,140 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Tests specific validation for early evaluation expressions +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + +const kCompositeCases = { + const_scalar: { + code: `let tmp = const_1e30 * const_1e30;`, + stage: 'constant', + valid: false + }, + const_vector: { + code: `let tmp = vec4(const_1e30) * vec4(const_1e30);`, + stage: 'constant', + valid: false + }, + const_let_vector: { + code: `let tmp = vec4(const_1e30) * vec4(vec3(const_1e30), let_1e30);`, + stage: 'constant', + valid: true + }, + const_let_vector_comp: { + code: `let tmp = vec2(const_1e30)[0] * vec2(const_1e30, let_1e30)[0];`, + stage: 'constant', + valid: true + }, + const_let_array_comp: { + code: `let tmp = array(const_1e30, const_1e30)[0] * array(const_1e30, let_1e30)[0];`, + stage: 'constant', + valid: true + }, + const_let_struct_comp: { + code: `let tmp = S(const_1e30, const_1e30).x * S(const_1e30, let_1e30).x;`, + stage: 'constant', + valid: true + }, + const_let_matrix: { + code: `let tmp = mat2x2(vec2(const_1e30), vec2(const_1e30)) * mat2x2(vec2(const_1e30), vec2(let_1e30));`, + stage: 'constant', + valid: true + }, + const_let_matrix_vec: { + code: `let tmp = mat2x2(vec2(const_1e30), vec2(const_1e30))[0] * mat2x2(vec2(const_1e30), vec2(let_1e30))[0];`, + stage: 'constant', + valid: true + }, + const_let_matrix_comp: { + code: `let tmp = mat2x2(vec2(const_1e30), vec2(const_1e30))[0].x * mat2x2(vec2(const_1e30), vec2(let_1e30))[0].x;`, + stage: 'constant', + valid: true + }, + override_scalar: { + code: `let tmp = override_1e30 * override_1e30;`, + stage: 'override', + valid: false + }, + override_vector: { + code: `let tmp = vec4(override_1e30) * vec4(override_1e30);`, + stage: 'override', + valid: false + }, + override_let_vector: { + code: `let tmp = vec4(override_1e30) * vec4(vec3(override_1e30), let_1e30);`, + stage: 'override', + valid: true + }, + override_let_vector_comp: { + code: `let tmp = vec2(override_1e30)[0] * vec2(override_1e30, let_1e30)[0];`, + stage: 'override', + valid: true + }, + override_let_array_comp: { + code: `let tmp = array(override_1e30, override_1e30)[0] * array(override_1e30, let_1e30)[0];`, + stage: 'override', + valid: true + }, + override_let_struct_comp: { + code: `let tmp = S(override_1e30, override_1e30).x * S(override_1e30, let_1e30).x;`, + stage: 'override', + valid: true + }, + override_let_matrix: { + code: `let tmp = mat2x2(vec2(override_1e30), vec2(override_1e30)) * mat2x2(vec2(override_1e30), vec2(let_1e30));`, + stage: 'override', + valid: true + }, + override_let_matrix_vec: { + code: `let tmp = mat2x2(vec2(override_1e30), vec2(override_1e30))[0] * mat2x2(vec2(override_1e30), vec2(let_1e30))[0];`, + stage: 'override', + valid: true + }, + override_let_matrix_comp: { + code: `let tmp = mat2x2(vec2(override_1e30), vec2(override_1e30))[0].x * mat2x2(vec2(override_1e30), vec2(let_1e30))[0].x;`, + stage: 'override', + valid: true + } +}; + +g.test('composites'). +desc('Validates that composites are either wholly evaluated or not at all'). +params((u) => u.combine('case', keysOf(kCompositeCases))). +fn((t) => { + const { code, stage, valid } = kCompositeCases[t.params.case]; + const wgsl = ` +struct S { + x : f32, + y : f32, +} +const const_1e30 = f32(1e30); +override override_1e30 : f32; +fn foo() -> u32 { + let let_1e30 = f32(1e30); + ${code} + return 0; +}`; + + if (stage === 'constant') { + t.expectCompileResult(valid, wgsl); + } else { + const constants = {}; + constants['override_1e30'] = 1e30; + t.expectPipelineResult({ + expectedResult: valid, + code: wgsl, + constants, + reference: ['override_1e30', 'foo()'] + }); + } +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/add_sub.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/add_sub.spec.js new file mode 100644 index 00000000000..4760c3b9478 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/add_sub.spec.js @@ -0,0 +1,354 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix addition and subtraction expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../util/constants.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators +const kOperators = { + add: { op: '+' }, + sub: { op: '-' } +}; + + + + + + + + +const kTests = { + bool: { + src: 'false' + }, + vec: { + src: 'vec2()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + ai: { + src: '1' + }, + f32: { + src: '1f' + }, + f16: { + src: '1h', + is_f16: true + }, + af: { + src: '1.0' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_ai_matching: { + src: 'mat2x4(0, 0, 0, 0, 0, 0, 0, 0)' + }, + matf_ai_no_matching: { + src: 'mat2x2(0, 0, 0, 0)' + }, + matf_size_matching: { + src: 'mat2x3f()' + }, + matf_size_no_match: { + src: 'mat4x4f()' + }, + math_size_matching: { + src: 'mat2x3h()', + is_f16: true + }, + math_size_no_matching: { + src: 'mat4x4h()', + is_f16: true + } +}; + +g.test('invalid'). +desc(`Validates that add and subtract are valid if the matrix types match`). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('rhs', ['ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const lhs = kTests[t.params.test].src; + const rhs = t.params.rhs === 'ai' ? 'mat2x4(0, 0, 0, 0, 0, 0, 0, 0)' : t.params.rhs; + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kOperators[t.params.op].op} ${rhs}; +} +`; + + t.expectCompileResult(lhs === rhs, code); +}); + +g.test('with_abstract'). +desc(`Validates that add and subtract are valid if when done against an abstract`). +params((u) => +u. +combine('op', keysOf(kOperators)). +combine('rhs', ['mat2x3f()', 'mat2x3h()']). +combine('swap', [true, false]) +). +beforeAllSubcases((t) => { + if (t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let lhs = 'mat2x3(0, 0, 0, 0, 0, 0)'; + let rhs = t.params.rhs; + + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +${t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kOperators[t.params.op].op} ${rhs}; +} +`; + + t.expectCompileResult(true, code); +}); + +g.test('overflow_f32'). +desc(`Validates that f32 add overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + let rhs = `mat${t.params.c}x${t.params.r}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f32.positive.max / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} + ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('underflow_f32'). +desc(`Validates that f32 add underflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + let rhs = `mat${t.params.c}x${t.params.r}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f32.negative.min / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} - ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_f16'). +desc(`Validates that f16 add overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + let rhs = `mat${t.params.c}x${t.params.r}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f16.positive.max / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} + ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('underflow_f16'). +desc(`Validates that f16 add underflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + let rhs = `mat${t.params.c}x${t.params.r}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f32.negative.min / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} - ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_abstract'). +desc(`Validates that abstract add overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + let rhs = `mat${t.params.c}x${t.params.r}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f64.positive.max / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} + ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('underflow_abstract'). +desc(`Validates that abstract add underflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + let rhs = `mat${t.params.c}x${t.params.r}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f64.negative.min / 2},`; + rhs += `${t.params.rhs},`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} - ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/and_or_xor.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/and_or_xor.spec.js new file mode 100644 index 00000000000..35a4a8f5547 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/and_or_xor.spec.js @@ -0,0 +1,122 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix binary ops expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators +const kOperators = { + and: { op: '&' }, + or: { op: '|' }, + xor: { op: '^' } +}; + + + + + + + + +const kTests = { + bool: { + src: 'false' + }, + vec: { + src: 'vec2f()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + ai: { + src: '1' + }, + f32: { + src: '1f' + }, + f16: { + src: '1h', + is_f16: true + }, + af: { + src: '1.0' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_matching: { + src: 'mat2x3f()' + }, + matf_no_match: { + src: 'mat4x4f()' + }, + math: { + src: 'mat2x3h()', + is_f16: true + } +}; + +g.test('invalid'). +desc(`Validates that binary operator expressions are never accepted for matrix types.`). +params((u) => +u. +combine('op', keysOf(kOperators)) +// 1i is the control that the test passes +.combine('rhs', ['1i', 'ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)). +combine('swap', [true, false]) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let lhs = kTests[t.params.test].src; + let rhs = t.params.rhs === 'ai' ? 'mat2x3(0, 0, 0, 0, 0, 0)' : t.params.rhs; + + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kOperators[t.params.op].op} ${rhs}; +} +`; + + const pass = (lhs === '1i' || lhs === '1') && (rhs === '1i' || rhs === '1'); + t.expectCompileResult(pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/bitwise_shift.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/bitwise_shift.spec.js new file mode 100644 index 00000000000..efde94bf77d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/bitwise_shift.spec.js @@ -0,0 +1,121 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix bitwise shift expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of bitshift operators +const kBitshiftOperators = { + left: { op: '<<' }, + right: { op: '>>' } +}; + + + + + + + + +const kTests = { + bool: { + src: 'false' + }, + vec: { + src: 'vec2()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + ai: { + src: '1' + }, + f32: { + src: '1f' + }, + f16: { + src: '1h', + is_f16: true + }, + af: { + src: '1.0' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_matching: { + src: 'mat2x3f()' + }, + matf_no_match: { + src: 'mat4x4f()' + }, + math: { + src: 'mat2x3h()', + is_f16: true + } +}; + +g.test('invalid'). +desc(`Validates that bitshift expressions are never accepted for matrix types.`). +params((u) => +u. +combine('op', keysOf(kBitshiftOperators)) +// 1u is the control that the test passes +.combine('rhs', ['1u', 'ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)). +combine('swap', [true, false]) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let lhs = kTests[t.params.test].src; + let rhs = t.params.rhs === 'ai' ? 'mat2x3(0, 0, 0, 0, 0, 0)' : t.params.rhs; + + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kBitshiftOperators[t.params.op].op} ${rhs}; +} +`; + + const pass = (lhs === '1u' || lhs === '1i' || lhs === '1') && (rhs === '1u' || rhs === '1'); + t.expectCompileResult(pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/comparison.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/comparison.spec.js new file mode 100644 index 00000000000..77dbd65d44a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/comparison.spec.js @@ -0,0 +1,118 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix comparison expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of comparison operators +const kComparisonOperators = { + eq: { op: '==' }, + ne: { op: '!=' }, + gt: { op: '>' }, + ge: { op: '>=' }, + lt: { op: '<' }, + le: { op: '<=' } +}; + + + + + + + + +const kTests = { + bool: { + src: 'false' + }, + vec: { + src: 'vec2()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + ai: { + src: '1' + }, + f32: { + src: '1f' + }, + f16: { + src: '1h', + is_f16: true + }, + af: { + src: '1.0' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_matching: { + src: 'mat2x3f()' + }, + matf_no_match: { + src: 'mat4x4f()' + }, + math: { + src: 'mat2x3h()', + is_f16: true + } +}; + +g.test('invalid'). +desc(`Validates that comparison expressions are never accepted for matrix types.`). +params((u) => +u. +combine('op', keysOf(kComparisonOperators)) +// 1i is the control that the test passes +.combine('rhs', ['1i', 'ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const lhs = kTests[t.params.test].src; + const rhs = t.params.rhs === 'ai' ? 'mat2x3(0, 0, 0, 0, 0, 0)' : t.params.rhs; + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kComparisonOperators[t.params.op].op} ${rhs}; +} +`; + + const pass = (lhs === '1i' || lhs === '1') && rhs === '1i'; + t.expectCompileResult(pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/div_rem.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/div_rem.spec.js new file mode 100644 index 00000000000..7e85a89ed4e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/div_rem.spec.js @@ -0,0 +1,121 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix division and remainder expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of operators +const kOperators = { + div: { op: '/' }, + rem: { op: '%' } +}; + + + + + + + + +const kTests = { + bool: { + src: 'false' + }, + vec: { + src: 'vec2f()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + ai: { + src: '1' + }, + f32: { + src: '1f' + }, + f16: { + src: '1h', + is_f16: true + }, + af: { + src: '1.0' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_matching: { + src: 'mat2x3f()' + }, + matf_no_match: { + src: 'mat4x4f()' + }, + math: { + src: 'mat2x3h()', + is_f16: true + } +}; + +g.test('invalid'). +desc(`Validates that div and remainder expressions are never accepted for matrix types.`). +params((u) => +u. +combine('op', keysOf(kOperators)) +// 1i is the control that the test passes +.combine('rhs', ['1i', 'ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)). +combine('swap', [true, false]) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let lhs = kTests[t.params.test].src; + let rhs = t.params.rhs === 'ai' ? 'mat2x3(0, 0, 0, 0, 0, 0)' : t.params.rhs; + + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} ${kOperators[t.params.op].op} ${rhs}; +} +`; + + const pass = (lhs === '1i' || lhs === '1') && (rhs === '1i' || rhs === '1'); + t.expectCompileResult(pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/mul.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/mul.spec.js new file mode 100644 index 00000000000..d8ef4f2e752 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/matrix/mul.spec.js @@ -0,0 +1,810 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix multiplication expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { kValue } from '../../../../util/constants.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + + +const kTests = { + match: { + src: 'mat3x2f()' + }, + bool: { + src: 'false' + }, + vec: { + src: 'vec4f()' + }, + i32: { + src: '1i' + }, + u32: { + src: '1u' + }, + texture: { + src: 't' + }, + sampler: { + src: 's' + }, + atomic: { + src: 'a' + }, + struct: { + src: 'str' + }, + array: { + src: 'arr' + }, + matf_no_match: { + src: 'mat4x4f()' + } +}; + +g.test('invalid'). +desc(`Validates types for matrix multiplication`). +params((u) => +u. +combine('rhs', ['ai', 'mat2x3f()', 'mat2x3h()']). +combine('test', keysOf(kTests)). +combine('swap', [true, false]) +). +beforeAllSubcases((t) => { + if (kTests[t.params.test].is_f16 === true || t.params.rhs.startsWith('mat2x3h(')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + let lhs = kTests[t.params.test].src; + let rhs = t.params.rhs === 'ai' ? 'mat3x2(0, 0, 0, 0, 0, 0)' : t.params.rhs; + + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} * ${rhs}; +} +`; + + const pass = kTests[t.params.test].src === 'mat3x2f()' && t.params.rhs === 'mat2x3f()'; + t.expectCompileResult(pass, code); +}); + +g.test('f16_and_f32_matrix'). +desc(`Validates that f16 multiplied by an f32 matrix is an error.`). +params((u) => u.combine('rhs', ['mat2x3f()', 'mat2x3h()']).combine('swap', [true, false])). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = '1h'; + let rhs = t.params.rhs; + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +enable f16; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} * ${rhs}; +} +`; + + const pass = t.params.rhs === 'mat2x3h()'; + t.expectCompileResult(pass, code); +}); + +g.test('f32_and_f16_matrix'). +desc(`Validates that f32 multiplied by an f16 matrix is an error`). +params((u) => u.combine('rhs', ['mat2x3f()', 'mat2x3h()']).combine('swap', [true, false])). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = '1f'; + let rhs = t.params.rhs; + if (t.params.swap) { + const a = lhs; + lhs = rhs; + rhs = a; + } + + const code = ` +enable f16; + +@compute @workgroup_size(1) +fn main() { + let foo = ${lhs} * ${rhs}; +} +`; + + const pass = t.params.rhs === 'mat2x3f()'; + t.expectCompileResult(pass, code); +}); + +g.test('mat_by_mat'). +desc(`Validates that mat * mat is only valid for kxR * Cxk.`). +params((u) => +u. +combine('ty1', ['f', 'h', '']). +combine('ty2', ['f', 'h', '']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('c2', [2, 3, 4]). +combine('r2', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.ty1 === 'h' || t.params.ty2 === 'h') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const c1 = t.params.c1; + const c2 = t.params.c2; + const r1 = t.params.r1; + const r2 = t.params.r2; + + let t1_val = ''; + if (t.params.ty1 === '') { + [...Array(c1)].map((_, i) => { + [...Array(r1)].map((_, k) => { + t1_val += '0,'; + }); + }); + } + + let t2_val = ''; + if (t.params.ty2 === '') { + [...Array(c2)].map((_, i) => { + [...Array(r2)].map((_, k) => { + t2_val += '0,'; + }); + }); + } + + const code = ` +${t.params.ty1 === 'h' || t.params.ty2 === 'h' ? 'enable f16;' : ''} +@compute @workgroup_size(1) +fn main() { + let foo = mat${c1}x${r1}${t.params.ty1}(${t1_val}) * mat${c2}x${r2}${t.params.ty2}(${t2_val}); +} +`; + + const pass = + c1 === r2 && (t.params.ty1 === t.params.ty2 || t.params.ty1 === '' || t.params.ty2 === ''); + t.expectCompileResult(pass, code); +}); + +g.test('mat_by_vec'). +desc(`Validates that mat * vec is only valid for CxR * C.`). +params((u) => +u. +combine('ty1', ['f', 'h', '']). +combine('ty2', ['f', 'h', '']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('v1', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.ty1 === 'h' || t.params.ty2 === 'h') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const c1 = t.params.c1; + const r1 = t.params.r1; + const v1 = t.params.v1; + + let t1_val = ''; + if (t.params.ty1 === '') { + [...Array(c1)].map((_, i) => { + [...Array(r1)].map((_, k) => { + t1_val += '0,'; + }); + }); + } + + let t2_val = ''; + if (t.params.ty2 === '') { + [...Array(v1)].map((_, i) => { + t2_val += '0,'; + }); + } + + const code = ` +${t.params.ty1 === 'h' || t.params.ty2 === 'h' ? 'enable f16;' : ''} +@compute @workgroup_size(1) +fn main() { + let foo = mat${c1}x${r1}${t.params.ty1}(${t1_val}) * vec${v1}${t.params.ty2}(${t2_val}); +} +`; + + const pass = + c1 === v1 && (t.params.ty1 === t.params.ty2 || t.params.ty1 === '' || t.params.ty2 === ''); + t.expectCompileResult(pass, code); +}); + +g.test('vec_by_mat'). +desc(`Validates that vec * mat is only valid for R * CxR.`). +params((u) => +u. +combine('ty1', ['f', 'h', '']). +combine('ty2', ['f', 'h', '']). +beginSubcases(). +combine('c1', [2, 3, 4]). +combine('r1', [2, 3, 4]). +combine('v1', [2, 3, 4]) +). +beforeAllSubcases((t) => { + if (t.params.ty1 === 'h' || t.params.ty2 === 'h') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const c1 = t.params.c1; + const r1 = t.params.r1; + const v1 = t.params.v1; + + let t1_val = ''; + if (t.params.ty1 === '') { + [...Array(c1)].map((_, i) => { + [...Array(r1)].map((_, k) => { + t1_val += '0,'; + }); + }); + } + + let t2_val = ''; + if (t.params.ty2 === '') { + [...Array(v1)].map((_, i) => { + t2_val += '0,'; + }); + } + + const code = ` +${t.params.ty1 === 'h' || t.params.ty2 === 'h' ? 'enable f16;' : ''} +@compute @workgroup_size(1) +fn main() { + let foo = vec${v1}${t.params.ty2}(${t2_val}) * mat${c1}x${r1}${t.params.ty1}(${t1_val}); +} +`; + + const pass = + r1 === v1 && (t.params.ty1 === t.params.ty2 || t.params.ty1 === '' || t.params.ty2 === ''); + t.expectCompileResult(pass, code); +}); + +g.test('overflow_scalar_f32'). +desc(`Validates that f32 scalar multiplication overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f32.positive.max},`; + } + } + lhs += ')'; + const rhs = t.params.rhs; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_vec_f32'). +desc( + `Validates that f32 vector multiplication overflows in shader creation. The overflow happens when multiplying the values.` +). +params((u) => +u. +combine('rhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f32.positive.max},`; + } else { + lhs += `0,`; + } + } + } + lhs += ')'; + const rhs = `vec${t.params.c}f(${t.params.rhs})`; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_vec_f32_internal'). +desc( + `Validates that f32 vector multiplication overflows in shader creation. The overflow happens while summing the values.` +). +params((u) => +u. +combine('lhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + } + } + lhs += ')'; + const rhs = `vec${t.params.c}f(1)`; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); + +g.test('overflow_mat_f32'). +desc( + `Validates that f32 matrix multiplication overflows in shader creation. Overflows when multiplying the values` +). +params((u) => +u. +combine('rhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + let rhs = `mat${t.params.r}x${t.params.c}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f32.positive.max},`; + rhs += `${t.params.rhs},`; + } else { + lhs += `0,`; + rhs += `0,`; + } + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_mat_f32_internal'). +desc( + `Validates that f32 matrix multiplication overflows in shader creation. Overflows when summing the values` +). +params((u) => +u. +combine('lhs', [kValue.f32.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}f(`; + let rhs = `mat${t.params.r}x${t.params.c}f(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + rhs += `1,`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); + +g.test('overflow_scalar_f16'). +desc(`Validates that f16 scalar multiplication overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f16.positive.max},`; + } else { + lhs += `0,`; + } + } + } + lhs += ')'; + const rhs = t.params.rhs; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_vec_f16'). +desc( + `Validates that f16 vector multiplication overflows in shader creation. Overflow occurs when multiplying.` +). +params((u) => +u. +combine('rhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f16.positive.max},`; + } + } + lhs += ')'; + const rhs = `vec${t.params.c}h(${t.params.rhs}/${t.params.c})`; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs !== kValue.f16.positive.max, code); +}); + +g.test('overflow_vec_f16_internal'). +desc( + `Validates that f16 vector multiplication overflows in shader creation. Overflow occurs when summing` +). +params((u) => +u. +combine('lhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + } + } + lhs += ')'; + const rhs = `vec${t.params.c}h(1)`; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); + +g.test('overflow_mat_f16'). +desc( + `Validates that f16 matrix multiplication overflows in shader creation. Overflow occurs when multiplying` +). +params((u) => +u. +combine('rhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + let rhs = `mat${t.params.r}x${t.params.c}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f16.positive.max},`; + rhs += `${t.params.rhs},`; + } else { + lhs += `0,`; + rhs += `0,`; + } + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_mat_f16_internal'). +desc( + `Validates that f16 matrix multiplication overflows in shader creation. Overflow occurs when summing` +). +params((u) => +u. +combine('lhs', [kValue.f16.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase('shader-f16'); +}). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}h(`; + let rhs = `mat${t.params.r}x${t.params.c}h(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + rhs += `1`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +enable f16; +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); + +g.test('overflow_scalar_abstract'). +desc(`Validates that abstract scalar multiplication overflows in shader creation`). +params((u) => +u. +combine('rhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${kValue.f64.positive.max},`; + } + } + lhs += ')'; + const rhs = t.params.rhs; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_vec_abstract'). +desc( + `Validates that abstract vector multiplication overflows in shader creation. Overflow occurs when multiplying.` +). +params((u) => +u. +combine('rhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f64.positive.max},`; + } else { + lhs += `0,`; + } + } + } + lhs += ')'; + const rhs = `vec${t.params.c}(${t.params.rhs})`; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_vec_abstract_internal'). +desc( + `Validates that abstract vector multiplication overflows in shader creation. Overflow occurs when summing.` +). +params((u) => +u. +combine('lhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + } + } + lhs += ')'; + const rhs = `vec${t.params.c}(1)`; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); + +g.test('overflow_mat_abstract'). +desc( + `Validates that abstract matrix multiplication overflows in shader creation. Overflow occurs when multiplying.` +). +params((u) => +u. +combine('rhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + let rhs = `mat${t.params.r}x${t.params.c}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + if (i === 0) { + lhs += `${kValue.f64.positive.max},`; + rhs += `${t.params.rhs},`; + } else { + lhs += `0,`; + rhs += `0,`; + } + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.rhs === 1, code); +}); + +g.test('overflow_mat_abstract_internal'). +desc( + `Validates that abstract matrix multiplication overflows in shader creation. Overflow occurs when summing.` +). +params((u) => +u. +combine('lhs', [kValue.f64.positive.max, 1]). +combine('c', [2, 3, 4]). +combine('r', [2, 3, 4]) +). +fn((t) => { + let lhs = `mat${t.params.c}x${t.params.r}(`; + let rhs = `mat${t.params.r}x${t.params.c}(`; + for (let i = 0; i < t.params.c; i++) { + for (let k = 0; k < t.params.r; k++) { + lhs += `${t.params.lhs},`; + rhs += `1,`; + } + } + rhs += ')'; + lhs += ')'; + + const code = ` +@compute @workgroup_size(1) +fn main() { + const foo = ${lhs} * ${rhs}; +} +`; + + t.expectCompileResult(t.params.lhs === 1, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/overload_resolution.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/overload_resolution.spec.js new file mode 100644 index 00000000000..9520d2b2512 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/overload_resolution.spec.js @@ -0,0 +1,268 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for implicit conversions and overload resolution`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../common/util/data_tables.js'; +import { + kAllNumericScalarsAndVectors, + isConvertible, + VectorType } from +'../../../util/conversion.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + +const kImplicitConversionCases = { + absint_to_bool: { + expr: `any(1)`, + valid: false + }, + absint_to_u32: { + expr: `1 == 1u`, + valid: true + }, + absint_to_i32: { + expr: `1 == 1i`, + valid: true + }, + absint_to_f32: { + expr: `1 == 1f`, + valid: true + }, + absint_to_f16: { + expr: `1 == 1h`, + valid: true, + f16: true + }, + absfloat_to_bool: { + expr: `any(1.0)`, + valid: false + }, + absfloat_to_u32: { + expr: `1.0 == 1u`, + valid: false + }, + absfloat_to_i32: { + expr: `1.0 == 1i`, + valid: false + }, + absfloat_to_f32: { + expr: `1.0 == 1f`, + valid: true + }, + absfloat_to_f16: { + expr: `1.0 == 1h`, + valid: true, + f16: true + }, + vector_absint_to_bool: { + expr: `any(vec2(1))`, + valid: false + }, + vector_absint_to_u32: { + expr: `all(vec2(1) == vec2u(1u))`, + valid: true + }, + vector_absint_to_i32: { + expr: `all(vec3(1) == vec3i(1i))`, + valid: true + }, + vector_absint_to_f32: { + expr: `all(vec4(1) == vec4f(1f))`, + valid: true + }, + vector_absint_to_f16: { + expr: `all(vec2(1) == vec2h(1h))`, + valid: true, + f16: true + }, + vector_absfloat_to_bool: { + expr: `any(vec2(1.0))`, + valid: false + }, + vector_absfloat_to_u32: { + expr: `all(vec2(1.0) == vec2u(1u))`, + valid: false + }, + vector_absfloat_to_i32: { + expr: `all(vec3(1.0) == vec2i(1i))`, + valid: false + }, + vector_absfloat_to_f32: { + expr: `all(vec4(1.0) == vec4f(1f))`, + valid: true + }, + vector_absfloat_to_f16: { + expr: `all(vec2(1.0) == vec2h(1h))`, + valid: true, + f16: true + }, + vector_swizzle_integer: { + expr: `vec2(1).x == 1i`, + valid: true + }, + vector_swizzle_float: { + expr: `vec2(1).y == 1f`, + valid: true + }, + vector_default_ctor_integer: { + expr: `all(vec3().xy == vec2i())`, + valid: true + }, + vector_default_ctor_abstract: { + expr: `all(vec3().xy == vec2())`, + valid: true + }, + vector_swizzle_abstract: { + expr: `vec4(1f).x == 1`, + valid: true + }, + vector_abstract_to_integer: { + expr: `all(vec4(1) == vec4i(1))`, + valid: true + }, + vector_wrong_result_i32: { + expr: `vec2(1,2f).x == 1i`, + valid: false + }, + vector_wrong_result_f32: { + expr: `vec2(1,2i).y == 2f`, + valid: false + }, + vector_wrong_result_splat: { + expr: `vec2(1.0).x == 1i`, + valid: false + }, + array_absint_to_bool: { + expr: `any(array(1)[0])`, + valid: false + }, + array_absint_to_u32: { + expr: `array(1)[0] == array(1u)[0]`, + valid: true + }, + array_absint_to_i32: { + expr: `array(1)[0] == array(1i)[0]`, + valid: true + }, + array_absint_to_f32: { + expr: `array(1)[0] == array(1f)[0]`, + valid: true + }, + array_absint_to_f16: { + expr: `array(1)[0] == array(1h)[0]`, + valid: true, + f16: true + }, + array_absfloat_to_bool: { + expr: `any(array(1.0)[0])`, + valid: false + }, + array_absfloat_to_u32: { + expr: `array(1.0)[0] == array(1u)[0]`, + valid: false + }, + array_absfloat_to_i32: { + expr: `array(1.0)[0] == array(1i)[0]`, + valid: false + }, + array_absfloat_to_f32: { + expr: `array(1.0)[0] == array(1f)[0]`, + valid: true + }, + array_absfloat_to_f16: { + expr: `array(1.0)[0] == array(1h)[0]`, + valid: true, + f16: true + }, + mat2x2_index_absint: { + expr: `all(mat2x2(1,2,3,4)[0] == vec2(1,2))`, + valid: true + }, + mat2x2_index_absfloat: { + expr: `all(mat2x2(1,2,3,4)[1] == vec2(3.0,4.0))`, + valid: true + }, + mat2x2_index_float: { + expr: `all(mat2x2(0,0,0,0)[1] == vec2f())`, + valid: true + }, + mat2x2_wrong_result: { + expr: `all(mat2x2(0f,0,0,0)[0] == vec2h())`, + valid: false, + f16: true + } +}; + +g.test('implicit_conversions'). +desc('Test implicit conversions'). +params((u) => u.combine('case', keysOf(kImplicitConversionCases))). +beforeAllSubcases((t) => { + if (kImplicitConversionCases[t.params.case].f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kImplicitConversionCases[t.params.case]; + const code = `${testcase.f16 ? 'enable f16;' : ''} + const_assert ${testcase.expr};`; + t.expectCompileResult(testcase.valid, code); +}); + +const kTypes = objectsToRecord(kAllNumericScalarsAndVectors); +const kTypeKeys = keysOf(kTypes); + +g.test('overload_resolution'). +desc('Test overload resolution'). +params((u) => +u. +combine('arg1', kTypeKeys). +combine('arg2', kTypeKeys). +beginSubcases(). +combine('op', ['min', 'max']). +filter((t) => { + if (t.arg1 === t.arg2) { + return false; + } + const t1 = kTypes[t.arg1]; + const t2 = kTypes[t.arg2]; + const t1IsVector = t1 instanceof VectorType; + const t2IsVector = t2 instanceof VectorType; + if (t1IsVector !== t2IsVector) { + return false; + } + if (t1IsVector && t2IsVector && t1.size !== t2.size) { + return false; + } + return true; +}) +). +beforeAllSubcases((t) => { + const t1 = kTypes[t.params.arg1]; + const t2 = kTypes[t.params.arg2]; + if (t1.requiresF16() || t2.requiresF16()) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const t1 = kTypes[t.params.arg1]; + const t2 = kTypes[t.params.arg2]; + const resTy = isConvertible(t1, t2) ? t2 : t1; + const enable = `${t1.requiresF16() || t2.requiresF16() ? 'enable f16;' : ''}`; + const min = 50; + const max = 100; + const res = t.params.op === 'min' ? min : max; + const v1 = t1.create(min).wgsl(); + const v2 = t2.create(max).wgsl(); + const resV = resTy.create(res).wgsl(); + const expr = `${t.params.op}(${v1}, ${v2}) == ${resV}`; + const assertExpr = t1 instanceof VectorType ? `all(${expr})` : expr; + const code = `${enable} + const_assert ${assertExpr};`; + t.expectCompileResult(isConvertible(t1, t2) || isConvertible(t2, t1), code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/precedence.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/precedence.spec.js new file mode 100644 index 00000000000..f0dca1291e4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/precedence.spec.js @@ -0,0 +1,219 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for operator precedence. +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// Bit set for the binary operator groups. +const kMultiplicative = 1 << 0; +const kAdditive = 1 << 1; +const kShift = 1 << 2; +const kRelational = 1 << 3; +const kBinaryAnd = 1 << 4; +const kBinaryXor = 1 << 5; +const kBinaryOr = 1 << 6; +const kLogical = 1 << 7; + +// Set of other operators that each operator can precede without any parentheses. +const kCanPrecedeWithoutParens = {}; +kCanPrecedeWithoutParens[kMultiplicative] = kMultiplicative | kAdditive | kRelational; +kCanPrecedeWithoutParens[kAdditive] = kMultiplicative | kAdditive | kRelational; +kCanPrecedeWithoutParens[kShift] = kRelational | kLogical; +kCanPrecedeWithoutParens[kRelational] = kMultiplicative | kAdditive | kShift | kLogical; +kCanPrecedeWithoutParens[kBinaryAnd] = kBinaryAnd; +kCanPrecedeWithoutParens[kBinaryXor] = kBinaryXor; +kCanPrecedeWithoutParens[kBinaryOr] = kBinaryOr; +kCanPrecedeWithoutParens[kLogical] = kRelational; + +// The list of binary operators. + + + + +const kBinaryOperators = { + mul: { op: '*', group: kMultiplicative }, + div: { op: '/', group: kMultiplicative }, + mod: { op: '%', group: kMultiplicative }, + + add: { op: '+', group: kAdditive }, + sub: { op: '-', group: kAdditive }, + + shl: { op: '<<', group: kShift }, + shr: { op: '>>', group: kShift }, + + lt: { op: '<', group: kRelational }, + gt: { op: '>', group: kRelational }, + le: { op: '<=', group: kRelational }, + ge: { op: '>=', group: kRelational }, + eq: { op: '==', group: kRelational }, + ne: { op: '!=', group: kRelational }, + + bin_and: { op: '&', group: kBinaryAnd }, + bin_xor: { op: '^', group: kBinaryXor }, + bin_or: { op: '|', group: kBinaryOr }, + + log_and: { op: '&&', group: kLogical }, + log_or: { op: '||', group: kLogical } +}; + +g.test('binary_requires_parentheses'). +desc( + ` + Validates that certain binary operators require parentheses to bind correctly. + ` +). +params((u) => +u. +combine('op1', keysOf(kBinaryOperators)). +combine('op2', keysOf(kBinaryOperators)). +filter((p) => { + // Skip expressions that would parse as template lists. + if (p.op1 === 'lt' && ['gt', 'ge', 'shr'].includes(p.op2)) { + return false; + } + // Only combine logical operators with relational operators. + if (kBinaryOperators[p.op1].group === kLogical) { + return kBinaryOperators[p.op2].group === kRelational; + } + if (kBinaryOperators[p.op2].group === kLogical) { + return kBinaryOperators[p.op1].group === kRelational; + } + return true; +}) +). +fn((t) => { + const op1 = kBinaryOperators[t.params.op1]; + const op2 = kBinaryOperators[t.params.op2]; + const code = ` +var a : ${op1.group === kLogical ? 'bool' : 'u32'}; +var b : u32; +var c : ${op2.group === kLogical ? 'bool' : 'u32'}; +fn foo() { + let foo = a ${op1.op} b ${op2.op} c; +} +`; + + const valid = (kCanPrecedeWithoutParens[op1.group] & op2.group) !== 0; + t.expectCompileResult(valid, code); +}); + +g.test('mixed_logical_requires_parentheses'). +desc( + ` + Validates that mixed logical operators require parentheses to bind correctly. + ` +). +params((u) => +u. +combine('op1', keysOf(kBinaryOperators)). +combine('op2', keysOf(kBinaryOperators)). +combine('parens', ['none', 'left', 'right']). +filter((p) => { + const group1 = kBinaryOperators[p.op1].group; + const group2 = kBinaryOperators[p.op2].group; + return group1 === kLogical && group2 === kLogical; +}) +). +fn((t) => { + const op1 = kBinaryOperators[t.params.op1]; + const op2 = kBinaryOperators[t.params.op2]; + let expr = `a ${op1.op} b ${op2.op} c;`; + if (t.params.parens === 'left') { + expr = `(a ${op1.op} b) ${op2.op} c;`; + } else if (t.params.parens === 'right') { + expr = `a ${op1.op} (b ${op2.op} c);`; + } + const code = ` +var a : bool; +var b : bool; +var c : bool; +fn foo() { + let bar = ${expr}; +} +`; + const valid = t.params.parens !== 'none' || t.params.op1 === t.params.op2; + t.expectCompileResult(valid, code); +}); + +// The list of miscellaneous other test cases. + + + + +const kExpressions = { + neg_member: { expr: '- str . a', result: true }, + comp_member: { expr: '~ str . a', result: true }, + addr_member: { expr: '& str . a', result: true }, + log_and_member: { expr: 'false && str . b', result: true }, + log_or_member: { expr: 'false || str . b', result: true }, + and_addr: { expr: ' v & &str .a', result: false }, + and_addr_paren: { expr: 'v & (&str).a', result: true }, + deref_member: { expr: ' * ptr_str . a', result: false }, + deref_member_paren: { expr: '(* ptr_str) . a', result: true }, + deref_idx: { expr: ' * ptr_vec [0]', result: false }, + deref_idx_paren: { expr: '(* ptr_vec) [1]', result: true } +}; + +g.test('other'). +desc( + ` + Test that other operator precedence rules are correctly implemented. + ` +). +params((u) => u.combine('expr', keysOf(kExpressions))). +fn((t) => { + const expr = kExpressions[t.params.expr]; + const wgsl = ` + struct S { + a: i32, + b: bool, + } + + fn main() { + var v = 42; + var vec = vec4(); + var str = S(42, false); + let ptr_vec = &vec; + let ptr_str = &str; + + let foo = ${expr.expr}; + } + `; + + t.expectCompileResult(expr.result, wgsl); +}); + +const kLHSExpressions = { + deref_invalid1: { expr: `*p.b`, result: false }, + deref_invalid2: { expr: `*p.a[0]`, result: false }, + deref_valid1: { expr: `(*p).b`, result: true }, + deref_valid2: { expr: `(*p).a[2]`, result: true }, + addr_valid1: { expr: `*&v.b`, result: true }, + addr_valid2: { expr: `(*&v).b`, result: true }, + addr_valid3: { expr: `*&(v.b)`, result: true } +}; + +g.test('other_lhs'). +desc('Test precedence of * and [] in LHS'). +params((u) => u.combine('expr', keysOf(kLHSExpressions))). +fn((t) => { + const expr = kLHSExpressions[t.params.expr]; + const code = ` + struct S { + a : array, + b : i32, + } + fn main() { + var v : S; + let p = &v; + let q = &v.a; + + ${expr.expr} = 1i; + }`; + + t.expectCompileResult(expr.result, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/address_of_and_indirection.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/address_of_and_indirection.spec.js new file mode 100644 index 00000000000..b783220b308 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/address_of_and_indirection.spec.js @@ -0,0 +1,243 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for unary address-of and indirection (dereference) +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kAddressSpaces = ['function', 'private', 'workgroup', 'uniform', 'storage']; +const kAccessModes = ['read', 'read_write']; +const kStorageTypes = ['bool', 'u32', 'i32', 'f32', 'f16']; +const kCompositeTypes = ['array', 'struct', 'vec', 'mat']; +const kDerefTypes = { + deref_address_of_identifier: { + wgsl: `(*(&a))`, + requires_pointer_composite_access: false + }, + deref_pointer: { + wgsl: `(*p)`, + requires_pointer_composite_access: false + }, + address_of_identifier: { + wgsl: `(&a)`, + requires_pointer_composite_access: true + }, + pointer: { + wgsl: `p`, + requires_pointer_composite_access: true + } +}; + +g.test('basic'). +desc( + `Validates address-of (&) every supported variable type, ensuring the type is correct by + assigning to an explicitly typed pointer. Also validates dereferencing the reference, + ensuring the type is correct by assigning to an explicitly typed variable.` +). +params((u) => +u. +combine('addressSpace', kAddressSpaces). +combine('accessMode', kAccessModes). +combine('storageType', kStorageTypes). +combine('derefType', keysOf(kDerefTypes)). +filter((t) => { + if (t.storageType === 'bool') { + return t.addressSpace === 'function' || t.addressSpace === 'private'; + } + return true; +}). +filter((t) => { + // This test does not test composite access + return !kDerefTypes[t.derefType].requires_pointer_composite_access; +}) +). +beforeAllSubcases((t) => { + if (t.params.storageType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } +}). +fn((t) => { + const isLocal = t.params.addressSpace === 'function'; + const deref = kDerefTypes[t.params.derefType]; + // Only specify access mode for storage buffers + const commaAccessMode = t.params.addressSpace === 'storage' ? `, ${t.params.accessMode}` : ''; + + let varDecl = ''; + if (t.params.addressSpace === 'uniform' || t.params.addressSpace === 'storage') { + varDecl += '@group(0) @binding(0) '; + } + varDecl += `var<${t.params.addressSpace}${commaAccessMode}> a : VarType;`; + + const wgsl = ` + ${t.params.storageType === 'f16' ? 'enable f16;' : ''} + + alias VarType = ${t.params.storageType}; + alias PtrType = ptr<${t.params.addressSpace}, VarType ${commaAccessMode}>; + + ${isLocal ? '' : varDecl} + + fn foo() { + ${isLocal ? varDecl : ''} + let p : PtrType = &a; + var deref : VarType = ${deref.wgsl}; + } + `; + + t.expectCompileResult(true, wgsl); +}); + +g.test('composite'). +desc( + `Validates address-of (&) every supported variable type for composite types, ensuring the type + is correct by assigning to an explicitly typed pointer. Also validates dereferencing the + reference followed by member/index access, ensuring the type is correct by assigning to an + explicitly typed variable.` +). +params((u) => +u. +combine('addressSpace', kAddressSpaces). +combine('compositeType', kCompositeTypes). +combine('storageType', kStorageTypes). +beginSubcases(). +combine('derefType', keysOf(kDerefTypes)). +combine('accessMode', kAccessModes). +filter((t) => { + if (t.storageType === 'bool') { + return t.addressSpace === 'function' || t.addressSpace === 'private'; + } + return true; +}). +filter((t) => { + if (t.compositeType === 'mat') { + return t.storageType === 'f32' || t.storageType === 'f16'; + } + return true; +}) +). +beforeAllSubcases((t) => { + if (t.params.storageType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } +}). +fn((t) => { + const isLocal = t.params.addressSpace === 'function'; + const deref = kDerefTypes[t.params.derefType]; + // Only specify access mode for storage buffers + const commaAccessMode = t.params.addressSpace === 'storage' ? `, ${t.params.accessMode}` : ''; + + let varDecl = ''; + if (t.params.addressSpace === 'uniform' || t.params.addressSpace === 'storage') { + varDecl += '@group(0) @binding(0) '; + } + varDecl += `var<${t.params.addressSpace}${commaAccessMode}> a : VarType;`; + + let wgsl = ` + ${t.params.storageType === 'f16' ? 'enable f16;' : ''}`; + + switch (t.params.compositeType) { + case 'array': + wgsl += ` + struct S { @align(16) member : ${t.params.storageType} } + alias VarType = array; + alias PtrType = ptr<${t.params.addressSpace}, VarType ${commaAccessMode}>; + ${isLocal ? '' : varDecl} + + fn foo() { + ${isLocal ? varDecl : ''} + let p : PtrType = &a; + var deref : ${t.params.storageType} = ${deref.wgsl}[0].member; + }`; + break; + case 'struct': + wgsl += ` + struct S { member : ${t.params.storageType} } + alias VarType = S; + alias PtrType = ptr<${t.params.addressSpace}, VarType ${commaAccessMode}>; + ${isLocal ? '' : varDecl} + + fn foo() { + ${isLocal ? varDecl : ''} + let p : PtrType = &a; + var deref : ${t.params.storageType} = ${deref.wgsl}.member; + }`; + break; + case 'vec': + wgsl += ` + alias VarType = vec3<${t.params.storageType}>; + alias PtrType = ptr<${t.params.addressSpace}, VarType ${commaAccessMode}>; + ${isLocal ? '' : varDecl} + + fn foo() { + ${isLocal ? varDecl : ''} + let p : PtrType = &a; + var deref_member : ${t.params.storageType} = ${deref.wgsl}.x; + var deref_index : ${t.params.storageType} = ${deref.wgsl}[0]; + }`; + break; + case 'mat': + wgsl += ` + alias VarType = mat2x3<${t.params.storageType}>; + alias PtrType = ptr<${t.params.addressSpace}, VarType ${commaAccessMode}>; + ${isLocal ? '' : varDecl} + + fn foo() { + ${isLocal ? varDecl : ''} + let p : PtrType = &a; + var deref_vec : vec3<${t.params.storageType}> = ${deref.wgsl}[0]; + var deref_elem : ${t.params.storageType} = ${deref.wgsl}[0][0]; + }`; + break; + } + + let shouldPass = true; + if ( + kDerefTypes[t.params.derefType].requires_pointer_composite_access && + !t.hasLanguageFeature('pointer_composite_access')) + { + shouldPass = false; + } + + t.expectCompileResult(shouldPass, wgsl); +}); + +const kInvalidCases = { + address_of_let: ` + let a = 1; + let p = &a;`, + address_of_texture: ` + let p = &t;`, + address_of_sampler: ` + let p = &s;`, + address_of_function: ` + let p = &func;`, + address_of_vector_elem_via_member: ` + var a : vec3(); + let p = &a.x;`, + address_of_vector_elem_via_index: ` + var a : vec3(); + let p = &a[0];`, + address_of_matrix_elem: ` + var a : mat2x3(); + let p = &a[0][0];`, + deref_non_pointer: ` + var a = 1; + let p = *a; + ` +}; +g.test('invalid'). +desc('Test invalid cases of unary address-of and dereference'). +params((u) => u.combine('case', keysOf(kInvalidCases))). +fn((t) => { + const wgsl = ` + @group(0) @binding(0) var s : sampler; + @group(0) @binding(1) var t : texture_2d; + fn func() {} + fn main() { + ${kInvalidCases[t.params.case]} + } + `; + t.expectCompileResult(false, wgsl); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/arithmetic_negation.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/arithmetic_negation.spec.js new file mode 100644 index 00000000000..7d323f7bae8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/arithmetic_negation.spec.js @@ -0,0 +1,114 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for arithmetic negation expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { kAllScalarsAndVectors, scalarTypeOf, Type } from '../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector numeric negation expressions are accepted for numerical types that are signed. + ` +). +params((u) => u.combine('type', keysOf(kScalarAndVectorTypes)).beginSubcases()). +beforeAllSubcases((t) => { + if (scalarTypeOf(kScalarAndVectorTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kScalarAndVectorTypes[t.params.type]; + const elementTy = scalarTypeOf(type); + const hasF16 = elementTy === Type.f16; + const code = ` +${hasF16 ? 'enable f16;' : ''} +const rhs = ${type.create(0).wgsl()}; +const foo = -rhs; +`; + + t.expectCompileResult(elementTy.signed, code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `${e}[0][0]` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&b)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `textureLoad(${e}, vec2(), 0).x` + }, + + sampler: { + expr: 's', + control: (e) => `textureSampleLevel(t, ${e}, vec2(), 0).x` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.b` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that arithmetic negation expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u.combine('type', keysOf(kInvalidTypes)).combine('control', [true, false]).beginSubcases() +). +fn((t) => { + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { b : i32 } + +var b : i32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = -${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/bitwise_complement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/bitwise_complement.spec.js new file mode 100644 index 00000000000..5dcc9a42f2a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/bitwise_complement.spec.js @@ -0,0 +1,114 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for bitwise complement expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { kAllScalarsAndVectors, scalarTypeOf, Type } from '../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector bitwise complement expressions are only accepted for integers. + ` +). +params((u) => u.combine('type', keysOf(kScalarAndVectorTypes)).beginSubcases()). +beforeAllSubcases((t) => { + if (scalarTypeOf(kScalarAndVectorTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kScalarAndVectorTypes[t.params.type]; + const elementTy = scalarTypeOf(type); + const hasF16 = elementTy === Type.f16; + const code = ` +${hasF16 ? 'enable f16;' : ''} +const rhs = ${type.create(0).wgsl()}; +const foo = ~rhs; +`; + + t.expectCompileResult([Type.abstractInt, Type.i32, Type.u32].includes(elementTy), code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `i32(${e}[0][0])` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&u)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `atomicLoad(&${e})` + }, + + texture: { + expr: 't', + control: (e) => `i32(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `i32(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.u` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that bitwise complement expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u.combine('type', keysOf(kInvalidTypes)).combine('control', [true, false]).beginSubcases() +). +fn((t) => { + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { u : u32 } + +var u : u32; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = ~${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/logical_negation.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/logical_negation.spec.js new file mode 100644 index 00000000000..51820d4c79b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/expression/unary/logical_negation.spec.js @@ -0,0 +1,155 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for logical negation expressions. +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf, objectsToRecord } from '../../../../../common/util/data_tables.js'; +import { kAllScalarsAndVectors, scalarTypeOf, Type } from '../../../../util/conversion.js'; +import { ShaderValidationTest } from '../../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// A list of scalar and vector types. +const kScalarAndVectorTypes = objectsToRecord(kAllScalarsAndVectors); + +g.test('scalar_vector'). +desc( + ` + Validates that scalar and vector logical negation expressions are only accepted for bool types. + ` +). +params((u) => u.combine('type', keysOf(kScalarAndVectorTypes)).beginSubcases()). +beforeAllSubcases((t) => { + if (scalarTypeOf(kScalarAndVectorTypes[t.params.type]) === Type.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kScalarAndVectorTypes[t.params.type]; + const elementTy = scalarTypeOf(type); + const hasF16 = elementTy === Type.f16; + const code = ` +${hasF16 ? 'enable f16;' : ''} +const rhs = ${type.create(0).wgsl()}; +const foo = !rhs; +`; + + t.expectCompileResult(elementTy === Type.bool, code); +}); + + + + + + + +const kInvalidTypes = { + mat2x2f: { + expr: 'm', + control: (e) => `bool(${e}[0][0])` + }, + + array: { + expr: 'arr', + control: (e) => `${e}[0]` + }, + + ptr: { + expr: '(&b)', + control: (e) => `*${e}` + }, + + atomic: { + expr: 'a', + control: (e) => `bool(atomicLoad(&${e}))` + }, + + texture: { + expr: 't', + control: (e) => `bool(textureLoad(${e}, vec2(), 0).x)` + }, + + sampler: { + expr: 's', + control: (e) => `bool(textureSampleLevel(t, ${e}, vec2(), 0).x)` + }, + + struct: { + expr: 'str', + control: (e) => `${e}.b` + } +}; + +g.test('invalid_types'). +desc( + ` + Validates that logical negation expressions are never accepted for non-scalar and non-vector types. + ` +). +params((u) => +u.combine('type', keysOf(kInvalidTypes)).combine('control', [true, false]).beginSubcases() +). +fn((t) => { + const type = kInvalidTypes[t.params.type]; + const expr = t.params.control ? type.control(type.expr) : type.expr; + const code = ` +@group(0) @binding(0) var t : texture_2d; +@group(0) @binding(1) var s : sampler; +@group(0) @binding(2) var a : atomic; + +struct S { b : bool } + +var b : bool; +var m : mat2x2f; +var arr : array; +var str : S; + +@compute @workgroup_size(1) +fn main() { + let foo = !${expr}; +} +`; + + t.expectCompileResult(t.params.control, code); +}); + +const kTests = { + not_bool_literal: { + src: 'let a = !true;', + pass: true + }, + not_bool_expr: { + src: `let a = !(1 == 2);`, + pass: true + }, + not_not_bool_literal: { + src: 'let a = !!true;', + pass: true + }, + not_not_bool_expr: { + src: `let a = !!(1 == 2);`, + pass: true + }, + not_int_literal: { + src: `let a = !42;`, + pass: false + }, + not_int_expr: { + src: `let a = !(40 + 2);`, + pass: false + } +}; + +g.test('parse'). +desc('Test that unary operators are parsed correctly'). +params((u) => u.combine('stmt', keysOf(kTests))). +fn((t) => { + const code = ` +@vertex +fn vtx() -> @builtin(position) vec4f { + ${kTests[t.params.stmt].src} + return vec4f(1); +} + `; + t.expectCompileResult(kTests[t.params.stmt].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/dual_source_blending.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/dual_source_blending.spec.js new file mode 100644 index 00000000000..c5ce9153d4b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/dual_source_blending.spec.js @@ -0,0 +1,623 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for the dual_source_blending extension +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('use_blend_src_requires_extension_enabled'). +desc( + `Checks that the blend_src attribute is only allowed with the WGSL extension + dual_source_blending enabled in shader and the WebGPU extension dual-source-blending supported + on the device.` +). +params((u) => +u.combine('requireExtension', [true, false]).combine('enableExtension', [true, false]) +). +beforeAllSubcases((t) => { + if (t.params.requireExtension) { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['dual-source-blending'] }); + } +}). +fn((t) => { + const { requireExtension, enableExtension } = t.params; + + t.expectCompileResult( + requireExtension && enableExtension, + ` + ${enableExtension ? 'enable dual_source_blending;' : ''} + struct FragOut { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + @fragment fn main() -> FragOut { + var output : FragOut; + output.color = vec4f(1.0, 0.0, 0.0, 1.0); + output.blend = vec4f(0.0, 1.0, 0.0, 1.0); + return output; + } + ` + ); +}); + +const kSyntaxValidationTests = { + zero: { + src: `@blend_src(0)`, + add_blend_src_0: false, + add_blend_src_1: true, + pass: true + }, + one: { + src: `@blend_src(1)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + invalid: { + src: `@blend_src(2)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + extra_comma: { + src: `@blend_src(1,)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + i32: { + src: `@blend_src(1i)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + u32: { + src: `@blend_src(1u)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + hex: { + src: `@blend_src(0x1)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + valid_const_expr: { + src: `@blend_src(a + b)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + invalid_const_expr: { + src: `@blend_src(b + c)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + max: { + src: `@blend_src(2147483647)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + newline: { + src: '@\nblend_src(1)', + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + comment: { + src: `@/* comment */blend_src(1)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: true + }, + misspelling: { + src: `@mblend_src(1)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + no_parens: { + src: `@blend_src`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + no_parens_no_blend_src_0: { + src: `@blend_src`, + add_blend_src_0: false, + add_blend_src_1: true, + pass: false + }, + empty_params: { + src: `@blend_src()`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + empty_params_no_blend_src_0: { + src: `@blend_src()`, + add_blend_src_0: false, + add_blend_src_1: true, + pass: false + }, + missing_left_paren: { + src: `@blend_src 1)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + }, + missing_right_paren: { + src: `@blend_src(1`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + }, + extra_params: { + src: `@blend_src(1, 2)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + f32: { + src: `@blend_src(1f)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + }, + f32_literal: { + src: `@blend_src(1.0)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + }, + negative: { + src: `@blend_src(-1)`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + override_expr: { + src: `@blend_src(z + y)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + }, + vec: { + src: `@blend_src(vec2(1,1))`, + add_blend_src_0: true, + add_blend_src_1: true, + pass: false + }, + duplicate: { + src: `@blend_src(1) @blend_src(1)`, + add_blend_src_0: true, + add_blend_src_1: false, + pass: false + } +}; + +g.test('blend_src_syntax_validation'). +desc(`Syntax validation tests of blend_src.`). +params((u) => u.combine('attr', keysOf(kSyntaxValidationTests))). +beforeAllSubcases((t) => +t.selectDeviceOrSkipTestCase({ requiredFeatures: ['dual-source-blending'] }) +). +fn((t) => { + const code = ` +enable dual_source_blending; + +const a = 0; +const b = 1; +const c = 1; +override z = 0; +override y = 1; + +struct FragOut { + @location(0) ${kSyntaxValidationTests[t.params.attr].src} blend : vec4f, + ${ + kSyntaxValidationTests[t.params.attr].add_blend_src_0 ? + '@location(0) @blend_src(0) color0 : vec4f,' : + '' + } + ${ + kSyntaxValidationTests[t.params.attr].add_blend_src_1 ? + '@location(0) @blend_src(1) color1 : vec4f,' : + '' + } +} + +@fragment fn main() -> FragOut { + var output : FragOut; + output.blend = vec4f(1.0, 0.0, 0.0, 1.0); + ${kSyntaxValidationTests[t.params.attr].add_blend_src_0 ? 'output.color0 = output.blend;' : ''} + ${kSyntaxValidationTests[t.params.attr].add_blend_src_1 ? 'output.color1 = output.blend;' : ''} + return output; +}`; + t.expectCompileResult(kSyntaxValidationTests[t.params.attr].pass, code); +}); + +const kStageIOValidationTests = { + vertex_input: { + shader: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + @vertex fn main(vertexInput : BlendSrcStruct) -> @builtin(position) vec4f { + return vertexInput.color + vertexInput.blend; + } + `, + pass: false + }, + vertex_output: { + shader: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + @builtin(position) myPosition: vec4f, + } + @vertex fn main() -> BlendSrcStruct { + var vertexOutput : BlendSrcStruct; + vertexOutput.myPosition = vec4f(0.0, 0.0, 0.0, 1.0); + return vertexOutput; + } + `, + pass: false + }, + fragment_input: { + shader: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + @fragment fn main(fragmentInput : BlendSrcStruct) -> @location(0) vec4f { + return fragmentInput.color + fragmentInput.blend; + } + `, + pass: false + }, + fragment_output: { + shader: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + @fragment fn main() -> BlendSrcStruct { + var fragmentOutput : BlendSrcStruct; + fragmentOutput.color = vec4f(0.0, 1.0, 0.0, 1.0); + fragmentOutput.blend = fragmentOutput.color; + return fragmentOutput; + } + `, + pass: true + } +}; + +g.test('blend_src_stage_input_output'). +desc( + `Test that the struct with blend_src cannot be used in the input of the fragment stage, the + input of the vertex stage, or the output of the vertex stage. blend_src can be used as a part of + the output of the fragment stage.` +). +params((u) => u.combine('attr', keysOf(kStageIOValidationTests))). +beforeAllSubcases((t) => +t.selectDeviceOrSkipTestCase({ requiredFeatures: ['dual-source-blending'] }) +). +fn((t) => { + const code = ` +enable dual_source_blending; + +${kStageIOValidationTests[t.params.attr].shader} +`; + t.expectCompileResult(kStageIOValidationTests[t.params.attr].pass, code); +}); + +const kUsageValidationTests = { + const: { + code: `@blend_src(0) const color = 1.2;`, + pass: false, + use_default_main_function: true + }, + override: { + code: `@blend_src(0) @id(0) override color : f32;`, + pass: false, + use_default_main_function: true + }, + let: { + code: ` + @fragment fn main() -> vec4f { + let @blend_src(0) color = vec4f(); + return color; + } + `, + pass: false, + use_default_main_function: false + }, + var_private: { + code: `@blend_src(0) var color : vec4f;`, + pass: false, + use_default_main_function: true + }, + var_function: { + code: ` + @fragment fn main() -> vec4f { + var @blend_src(0) color : vec4f; + color = vec4f(); + return color; + } + `, + pass: false, + use_default_main_function: false + }, + function_declaration: { + code: ` + @blend_src(0) fn fun() {} + `, + pass: false, + use_default_main_function: true + }, + non_entrypoint_function_input_non_struct: { + code: ` + fn fun(@blend_src(0) color : vec4f) -> vec4f { + return color; + } + `, + pass: false, + use_default_main_function: true + }, + non_entrypoint_function_output_non_struct: { + code: ` + fn fun() -> @blend_src(0) vec4f { + return vec4f(); + } + `, + pass: false, + use_default_main_function: true + }, + entrypoint_input_non_struct: { + code: ` + @fragment fn main(@location(0) @blend_src(0) color : vec4f) -> @location(0) vec4f { + return color; + } + `, + pass: false, + use_default_main_function: false + }, + entrypoint_output_non_struct: { + code: ` + @fragment fn main() -> @location(0) @blend_src(0) vec4f { + return vec4f(); + } + `, + pass: false, + use_default_main_function: false + }, + struct_member_only_blend_src_0: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_only_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_no_location_blend_src_0: { + code: ` + struct BlendSrcStruct { + @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_no_location_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_duplicate_blend_src_0: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(0) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_duplicate_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(1) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_has_non_zero_location_blend_src_0: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color1 : vec4f, + @location(1) @blend_src(0) color2 : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_has_non_zero_location_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend1 : vec4f, + @location(1) @blend_src(1) blend2 : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_non_zero_location_blend_src_0_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(1) @blend_src(0) color : vec4f, + @location(1) @blend_src(1) blend : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_has_non_zero_location_no_blend_src: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + @location(1) color2 : vec4f, + } + `, + pass: false, + use_default_main_function: true + }, + struct_member_no_location_no_blend_src: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + depth : f32, + } + `, + pass: true, + use_default_main_function: true + }, + struct_member_blend_src_and_builtin: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + @builtin(frag_depth) depth : f32, + } + `, + pass: true, + use_default_main_function: true + }, + struct_member_location_0_blend_src_0_blend_src_1: { + code: ` + struct BlendSrcStruct { + @location(0) @blend_src(0) color : vec4f, + @location(0) @blend_src(1) blend : vec4f, + } + `, + pass: true, + use_default_main_function: true + } +}; + +g.test('blend_src_usage'). +desc( + `Test that blend_src can only be used on a member of a structure, and must be used together with + the location attribute. In addition, if blend_src is used on a member of a structure, there must + be exactly 2 members that have location attribute in the structure: one is @location(0) + @blend_src(0) and another is @location(0) @blend_src(1).` +). +params((u) => u.combine('attr', keysOf(kUsageValidationTests))). +beforeAllSubcases((t) => +t.selectDeviceOrSkipTestCase({ requiredFeatures: ['dual-source-blending'] }) +). +fn((t) => { + const code = ` +enable dual_source_blending; + +${kUsageValidationTests[t.params.attr].code} + +${ + kUsageValidationTests[t.params.attr].use_default_main_function ? + `@fragment fn main() -> @location(0) vec4f { + return vec4f(); +}` : + '' + } +`; + t.expectCompileResult(kUsageValidationTests[t.params.attr].pass, code); +}); + +const kValidLocationTypes = [ +'f16', +'f32', +'i32', +'u32', +'vec2h', +'vec2f', +'vec2i', +'vec2u', +'vec3h', +'vec3f', +'vec3i', +'vec3u', +'vec4h', +'vec4f', +'vec4i', +'vec4u']; + + +const kF16TypesSet = new Set(['f16', 'vec2h', 'vec3h', 'vec4h']); + +g.test('blend_src_same_type'). +desc(`Test that the struct member with @blend_src(0) and @blend_src(1) must have same type.`). +params((u) => +u.combine('blendSrc0Type', kValidLocationTypes).combine('blendSrc1Type', kValidLocationTypes) +). +beforeAllSubcases((t) => { + const requiredFeatures = ['dual-source-blending']; + const needF16Extension = + kF16TypesSet.has(t.params.blendSrc0Type) || kF16TypesSet.has(t.params.blendSrc1Type); + if (needF16Extension) { + requiredFeatures.push('shader-f16'); + } + t.selectDeviceOrSkipTestCase({ requiredFeatures }); +}). +fn((t) => { + const { blendSrc0Type, blendSrc1Type } = t.params; + + const needF16Extension = kF16TypesSet.has(blendSrc0Type) || kF16TypesSet.has(blendSrc1Type); + const code = ` +enable dual_source_blending; + +${needF16Extension ? 'enable f16;' : ''} + +struct BlendSrcOutput { + @location(0) @blend_src(0) color : ${blendSrc0Type}, + @location(0) @blend_src(1) blend : ${blendSrc1Type}, +} + +@fragment fn main() -> BlendSrcOutput { + var output : BlendSrcOutput; + output.color = ${blendSrc0Type}(); + output.blend = ${blendSrc1Type}(); + return output; +} +`; + + const success = blendSrc0Type === blendSrc1Type; + t.expectCompileResult(success, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/pointer_composite_access.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/pointer_composite_access.spec.js index 60cc7e35c20..50b0696a3ae 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/pointer_composite_access.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/pointer_composite_access.spec.js @@ -23,8 +23,8 @@ const kCases = { array_index_access_via_identifier: { module: '', init_expr: 'array()', - via_deref: '(*(&a))[0];', - via_pointer: '(&a)[0];' + via_deref: '(*(&a))[0]', + via_pointer: '(&a)[0]' }, vector_index_access_via_identifier: { module: '', @@ -35,8 +35,8 @@ const kCases = { vector_member_access_via_identifier: { module: '', init_expr: 'vec3()', - via_deref: '(*(&a)).x;', - via_pointer: '(&a).x;' + via_deref: '(*(&a)).x', + via_pointer: '(&a).x' }, matrix_index_access_via_identifier: { module: '', @@ -47,8 +47,8 @@ const kCases = { struct_member_access_via_identifier: { module: 'struct S { a : i32, }', init_expr: 'S()', - via_deref: '(*(&a)).a;', - via_pointer: '(&a).a;' + via_deref: '(*(&a)).a', + via_pointer: '(&a).a' }, builtin_struct_modf_via_identifier: { module: '', @@ -67,8 +67,8 @@ const kCases = { array_index_access_via_pointer: { module: '', init_expr: 'array()', - via_deref: '(*p)[0];', - via_pointer: 'p[0];' + via_deref: '(*p)[0]', + via_pointer: 'p[0]' }, vector_index_access_via_pointer: { module: '', @@ -79,8 +79,8 @@ const kCases = { vector_member_access_via_pointer: { module: '', init_expr: 'vec3()', - via_deref: '(*p).x;', - via_pointer: 'p.x;' + via_deref: '(*p).x', + via_pointer: 'p.x' }, matrix_index_access_via_pointer: { module: '', @@ -91,8 +91,8 @@ const kCases = { struct_member_access_via_pointer: { module: 'struct S { a : i32, }', init_expr: 'S()', - via_deref: '(*p).a;', - via_pointer: 'p.a;' + via_deref: '(*p).a', + via_pointer: 'p.a' }, builtin_struct_modf_via_pointer: { module: '', diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/readonly_and_readwrite_storage_textures.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/readonly_and_readwrite_storage_textures.spec.js new file mode 100644 index 00000000000..7d983e97507 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/extension/readonly_and_readwrite_storage_textures.spec.js @@ -0,0 +1,50 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for the readonly_and_readwrite_storage_textures language feature +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { TexelFormats } from '../../types.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kFeatureName = 'readonly_and_readwrite_storage_textures'; + +g.test('var_decl'). +desc( + `Checks that the read and read_write access modes are only allowed with the language feature present` +). +paramsSubcasesOnly((u) => +u. +combine('type', [ +'texture_storage_1d', +'texture_storage_2d', +'texture_storage_2d_array', +'texture_storage_3d'] +). +combine('format', TexelFormats). +combine('access', ['read', 'write', 'read_write']) +). +fn((t) => { + const { type, format, access } = t.params; + t.skipIfTextureFormatNotUsableAsStorageTexture(format.format); + + const source = `@group(0) @binding(0) var t : ${type}<${format.format}, ${access}>;`; + const requiresFeature = access !== 'write'; + t.expectCompileResult(t.hasLanguageFeature(kFeatureName) || !requiresFeature, source); +}); + +g.test('textureBarrier'). +desc( + `Checks that the textureBarrier() builtin is only allowed with the language feature present` +). +fn((t) => { + t.expectCompileResult( + t.hasLanguageFeature(kFeatureName), + ` + @workgroup_size(1) @compute fn main() { + textureBarrier(); + } + ` + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/functions/restrictions.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/functions/restrictions.spec.js index eb6a788ab74..070b4203c63 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/functions/restrictions.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/functions/restrictions.spec.js @@ -291,7 +291,8 @@ const kFunctionParamTypeCases = { invalid_ptr4: { name: `ptr`, valid: false }, // Can't specify access mode invalid_ptr5: { name: `ptr`, valid: false }, // Can't specify access mode invalid_ptr6: { name: `ptr`, valid: false }, // Can't specify access mode - invalid_ptr7: { name: `ptr`, valid: false } // Invalid store type + invalid_ptr7: { name: `ptr`, valid: false }, // Invalid store type + invalid_ptr8: { name: `ptr`, valid: false } // non-constructible pointer type }; g.test('function_parameter_types'). @@ -450,6 +451,12 @@ const kFunctionParamValueCases = { ptr3: { value: `&g_u32`, matches: ['ptr3'] }, ptr4: { value: `&g_constructible`, matches: ['ptr4'] }, + ptr_let1: { value: `ptr_f_u32`, matches: ['ptr1'] }, + ptr_let2: { value: `ptr_f_constructible`, matches: ['ptr2'] }, + ptr_let3: { value: `ptr_g_u32`, matches: ['ptr3'] }, + ptr_let4: { value: `ptr_g_constructible`, matches: ['ptr4'] }, + ptr_let5: { value: `let_let_f_u32`, matches: ['ptr1'] }, + // Requires 'unrestricted_pointer_parameters' WGSL feature ptr5: { value: `&f_constructible.b`, @@ -601,6 +608,11 @@ fn foo() { var f_array5 : array; var f_constructible : constructible; var f_struct_with_array : struct_with_array; + let ptr_f_u32 = &f_u32; + let ptr_f_constructible = &f_constructible; + let ptr_g_u32 = &g_u32; + let ptr_g_constructible = &g_constructible; + let let_let_f_u32 = ptr_f_u32; bar(${arg.value}); } @@ -810,4 +822,378 @@ fn foo() { checkArgTypeMatch(t.params.p2_type, kArgValues[t.params.arg2_value].matches) && checkArgTypeMatch(t.params.p3_type, kArgValues[t.params.arg3_value].matches); t.expectCompileResult(res, code); +}); + +g.test('param_name_can_shadow_function_name'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that a function parameter can shadow the function name`). +fn((t) => { + const code = ` +fn foo(foo: i32) -> i32 { + return foo; +} +`; + t.expectCompileResult(true, code); +}); + +g.test('param_name_can_shadow_alias'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that a function parameter can shadow an alias`). +fn((t) => { + const code = ` +alias foo = f32; +fn test(foo: i32) -> i32 { + return foo; +} +`; + t.expectCompileResult(true, code); +}); + +g.test('param_name_can_shadow_global'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that a function parameter can shadow a global`). +fn((t) => { + const code = ` +const foo: f32 = 1.2f; + +fn test(foo: i32) -> i32 { + return foo; +} +`; + t.expectCompileResult(true, code); +}); + +g.test('param_comma_placement'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests validation of commas in function parameter lists`). +params((u) => +u. +combine('param_1', [true, false]). +combine('param_2', [true, false]). +combine('comma', [true, false]) +). +fn((t) => { + const has_p1 = t.params.param_1; + const has_p2 = t.params.param_2; + const has_c = t.params.comma; + + const p1 = has_p1 ? 'foo: i32' : ''; + const p2 = has_p2 ? 'bar: f32' : ''; + const comma = has_c ? ', ' : ' '; + + const code = ` +fn test(${p1}${comma}${p2}) { +} +`; + + const success = + !has_p1 && !has_p2 && !has_c || // no params + has_p1 && !has_p2 || // only p1, which can have a trailing comma or not + !has_p1 && has_p2 && !has_c || // just p2 + has_p1 && has_p2 && has_c; // both params comma separated + t.expectCompileResult(success, code); +}); + +g.test('param_type_can_be_alias'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that a function parameter type can be an alias`). +fn((t) => { + const code = ` +alias foo = f32; +fn test(foo: foo) -> foo { + return foo; +} +`; + t.expectCompileResult(true, code); +}); + +g.test('function_name_required'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests the function name is required`). +params((u) => u.combine('name', [true, false])). +fn((t) => { + const has_name = t.params.name; + const name = has_name ? 'name' : ''; + const code = ` +fn ${name}() -> i32 { + return 1; +} +`; + t.expectCompileResult(has_name, code); +}); + +g.test('param_type_required'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests the parameter type is required`). +params((u) => u.combine('ty', [true, false]).combine('colon', [true, false])). +fn((t) => { + const has_ty = t.params.ty; + const has_colon = t.params.colon; + const ty = has_ty ? 'i32' : ''; + const colon = has_colon ? ':' : ' '; + const code = ` +fn f(foo${colon}${ty}) -> i32 { + return 1; +} +`; + t.expectCompileResult(has_ty && has_colon, code); +}); + +g.test('body_required'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests the function body is required`). +params((u) => u.combine('body', ['braces', 'semi', ''])). +fn((t) => { + const body = t.params.body === 'braces' ? '{}' : t.params.body === 'semi' ? ';' : ''; + + const code = ` +fn f() ${body} + +fn other() {} +`; + t.expectCompileResult(body === '{}', code); +}); + +g.test('parens_required'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that the parens for a function are required`). +params((u) => u.combine('parens', [true, false]).combine('param', [true, false])). +fn((t) => { + const has_parens = t.params.parens; + const has_param = t.params.param; + + let args = ''; + if (has_parens) { + args += '('; + } + if (has_param) { + args += 'foo: i32'; + } + + if (has_parens) { + args += ')'; + } + + const code = ` +fn f ${args} {} +`; + t.expectCompileResult(has_parens, code); +}); + +g.test('non_module_scoped_function'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that a non-module-scope function is rejected`). +params((u) => u.combine('loc', ['inner', 'outer'])). +fn((t) => { + const o = `fn a() -> i32 { return 1; }`; + + let inner = ''; + let outer = ''; + + if (t.params.loc === 'inner') { + inner = o; + } else { + outer = o; + } + + const code = ` +${outer} +fn b() { + ${inner} +} +`; + t.expectCompileResult(t.params.loc === 'outer', code); +}); + +const kAttributes = { + align: { + attr: '@align(5)', + pass: { + func: false, + param: false, + ret: false + } + }, + binding: { + attr: '@binding(5)', + pass: { + func: false, + param: false, + ret: false + } + }, + builtin: { + attr: '@builtin(position)', + pass: { + func: false, + param: false, + ret: false + } + }, + compute: { + attr: `@compute`, + pass: { + func: false, + param: false, + ret: false + } + }, + const: { + attr: '@const', + pass: { + func: false, + param: false, + ret: false + } + }, + diagnostic: { + attr: `@diagnostic(off, derivative_uniformity)`, + pass: { + func: true, + param: false, + ret: false + } + }, + fragment: { + attr: `@fragment`, + pass: { + func: false, + param: false, + ret: false + } + }, + group: { + attr: `@group(1)`, + pass: { + func: false, + param: false, + ret: false + } + }, + id: { + attr: `@id(1)`, + pass: { + func: false, + param: false, + ret: false + } + }, + interpolate: { + attr: `@interpolate(linear, center)`, + pass: { + func: false, + param: false, + ret: false + } + }, + invariant: { + attr: `@invariant`, + pass: { + func: false, + param: false, + ret: false + } + }, + location: { + attr: `@location(0)`, + pass: { + func: false, + param: false, + ret: false + } + }, + must_use: { + attr: `@must_use`, + pass: { + func: true, + param: false, + ret: false + } + }, + size: { + attr: `@size(10)`, + pass: { + func: false, + param: false, + ret: false + } + }, + vertex: { + attr: `@vertex`, + pass: { + func: false, + param: false, + ret: false + } + }, + workgroup_size: { + attr: `@workgroup_size(1)`, + pass: { + func: false, + param: false, + ret: false + } + } +}; + +g.test('function_attributes'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests the attributes for a function`). +params((u) => +u.combine('case', keysOf(kAttributes)).combine('placement', ['func', 'param', 'ret']) +). +fn((t) => { + const d = kAttributes[t.params.case]; + const func = t.params.placement === 'func'; + const param = t.params.placement === 'param'; + const ret = t.params.placement === 'ret'; + + const code = ` +${func ? d.attr : ''} +fn b(${param ? d.attr : ''} foo: i32) -> ${ret ? d.attr : ''} i32{ + return 1; +} +`; + const succeed = + t.params.placement === 'func' ? + d.pass.func : + t.params.placement === 'params' ? + d.pass.param : + d.pass.ret; + t.expectCompileResult(succeed, code); +}); + +g.test('must_use_requires_return'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests the must_use attribute requires a return`). +params((u) => u.combine('ret', [true, false])). +fn((t) => { + let ret = ''; + let ret_stmt = ''; + + if (t.params.ret) { + ret = '-> i32'; + ret_stmt = 'return 1;'; + } + + const code = ` +@must_use +fn b() ${ret} { + ${ret_stmt} +} +`; + t.expectCompileResult(t.params.ret, code); +}); + +g.test('overload'). +specURL('https://www.w3.org/TR/WGSL/#function-declaration-sec'). +desc(`Tests that user functions can not overload `). +params((u) => u.combine('overload', [true, false])). +fn((t) => { + let code = 'fn a(f: i32) {}\n'; + + if (t.params.overload) { + code += 'fn a(f: u32) {}'; + } + t.expectCompileResult(t.params.overload === false, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/builtin.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/builtin.spec.js deleted file mode 100644 index 4d6dc7652b9..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/builtin.spec.js +++ /dev/null @@ -1,144 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validation tests for @builtin`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../common/util/data_tables.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - -export const g = makeTestGroup(ShaderValidationTest); - -const kTests = { - pos: { - src: `@builtin(position)`, - pass: true - }, - trailing_comma: { - src: `@builtin(position,)`, - pass: true - }, - newline_in_attr: { - src: `@ \n builtin(position)`, - pass: true - }, - whitespace_in_attr: { - src: `@/* comment */builtin/* comment */\n\n(\t/*comment*/position/*comment*/)`, - pass: true - }, - invalid_name: { - src: `@abuiltin(position)`, - pass: false - }, - no_params: { - src: `@builtin`, - pass: false - }, - missing_param: { - src: `@builtin()`, - pass: false - }, - missing_parens: { - src: `@builtin position`, - pass: false - }, - missing_lparen: { - src: `@builtin position)`, - pass: false - }, - missing_rparen: { - src: `@builtin(position`, - pass: false - }, - multiple_params: { - src: `@builtin(position, frag_depth)`, - pass: false - }, - ident_param: { - src: `@builtin(identifier)`, - pass: false - }, - number_param: { - src: `@builtin(2)`, - pass: false - } -}; - -g.test('parse'). -desc(`Test that @builtin is parsed correctly.`). -params((u) => u.combine('builtin', keysOf(kTests))). -fn((t) => { - const src = kTests[t.params.builtin].src; - const code = ` -@vertex -fn main() -> ${src} vec4 { - return vec4(.4, .2, .3, .1); -}`; - t.expectCompileResult(kTests[t.params.builtin].pass, code); -}); - -g.test('placement'). -desc('Tests the locations @builtin is allowed to appear'). -params((u) => -u. -combine('scope', [ -// The fn-param and fn-ret are part of the shader_io/builtins tests -'private-var', -'storage-var', -'struct-member', -'non-ep-param', -'non-ep-ret', -'fn-decl', -'fn-var', -'while-stmt', -undefined] -). -combine('attribute', [ -{ - 'private-var': false, - 'storage-var': false, - 'struct-member': true, - 'non-ep-param': false, - 'non-ep-ret': false, - 'fn-decl': false, - 'fn-var': false, - 'fn-return': false, - 'while-stmt': false -}] -). -beginSubcases() -). -fn((t) => { - const scope = t.params.scope; - - const attr = '@builtin(vertex_index)'; - const code = ` - ${scope === 'private-var' ? attr : ''} - var priv_var : u32; - - ${scope === 'storage-var' ? attr : ''} - @group(0) @binding(0) - var stor_var : u32; - - struct A { - ${scope === 'struct-member' ? attr : ''} - a : u32, - } - - fn v(${scope === 'non-ep-param' ? attr : ''} i : u32) -> - ${scope === 'non-ep-ret' ? attr : ''} u32 { return 1; } - - @vertex - ${scope === 'fn-decl' ? attr : ''} - fn f( - @location(0) b : u32, - ) -> @builtin(position) vec4f { - ${scope === 'fn-var' ? attr : ''} - var func_v : u32; - - ${scope === 'while-stmt' ? attr : ''} - while false {} - - return vec4(1, 1, 1, 1); - } - `; - - t.expectCompileResult(scope === undefined || t.params.attribute[scope], code); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const.spec.js deleted file mode 100644 index fcc431a82a7..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const.spec.js +++ /dev/null @@ -1,57 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validation tests for @const`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - -export const g = makeTestGroup(ShaderValidationTest); - -g.test('placement'). -desc('Tests @const is not allowed to appear'). -params((u) => -u.combine('scope', [ -'private-var', -'storage-var', -'struct-member', -'fn-decl', -'fn-param', -'fn-var', -'fn-return', -'while-stmt', -undefined] -) -). -fn((t) => { - const scope = t.params.scope; - - const attr = '@const'; - const code = ` - ${scope === 'private-var' ? attr : ''} - var priv_var : i32; - - ${scope === 'storage-var' ? attr : ''} - @group(0) @binding(0) - var stor_var : i32; - - struct A { - ${scope === 'struct-member' ? attr : ''} - a : i32, - } - - @vertex - ${scope === 'fn-decl' ? attr : ''} - fn f( - ${scope === 'fn-param' ? attr : ''} - @location(0) b : i32, - ) -> ${scope === 'fn-return' ? attr : ''} @builtin(position) vec4f { - ${scope === 'fn-var' ? attr : ''} - var func_v : i32; - - ${scope === 'while-stmt' ? attr : ''} - while false {} - - return vec4(1, 1, 1, 1); - } - `; - - t.expectCompileResult(scope === undefined, code); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/diagnostic.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/diagnostic.spec.js index 7b56bde7ac9..addf21336e0 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/diagnostic.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/diagnostic.spec.js @@ -161,12 +161,14 @@ fn((t) => { t.expectCompileResult(t.params.s1 === t.params.s2, code); }); -g.test('conflicting_attribute_same_location'). +g.test('duplicate_attribute_same_location'). specURL('https://gpuweb.github.io/gpuweb/wgsl/#diagnostics'). -desc(`Tests conflicts between attributes`). +desc(`Tests duplicate diagnostics at the same location must be on different rules`). params((u) => u. combine('loc', keysOf(kValidLocations)). +combine('same_rule', [true, false]). +beginSubcases(). combine('s1', kSpecDiagnosticSeverities). combine('s2', kSpecDiagnosticSeverities). filter((u) => { @@ -174,11 +176,12 @@ filter((u) => { }) ). fn((t) => { - const d1 = generateDiagnostic('attribute', t.params.s1, 'derivative_uniformity'); - const d2 = generateDiagnostic('attribute', t.params.s2, 'derivative_uniformity'); - const diag = d1 + ' ' + d2; - const code = `${kValidLocations[t.params.loc](diag)}`; - t.expectCompileResult(t.params.s1 === t.params.s2, code); + const rule1 = 'derivative_uniformity'; + const rule2 = 'another_diagnostic_rule'; + const d1 = generateDiagnostic('attribute', t.params.s1, rule1); + const d2 = generateDiagnostic('attribute', t.params.s2, t.params.same_rule ? rule1 : rule2); + const code = `${kValidLocations[t.params.loc](`${d1} ${d2}`)}`; + t.expectCompileResult(!t.params.same_rule, code); }); g.test('conflicting_attribute_different_location'). @@ -219,4 +222,243 @@ fn((t) => { let code = `${t.params.directive};`; code += generateDiagnostic('directive', 'info', 'derivative_uniformity') + ';'; t.expectCompileResult(true, code); +}); + + + + + + +function scopeCode(body) { + return ` +@group(0) @binding(0) var t : texture_1d; +@group(0) @binding(1) var s : sampler; +var non_uniform_cond : bool; +var non_uniform_coord : f32; +var non_uniform_val : u32; +@fragment fn main() { + ${body} +} +`; +} + +const kScopeCases = { + override_global_off: { + code: ` + ${generateDiagnostic('directive', 'error', 'derivative_uniformity')}; + ${scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + }`)}; + `, + result: true + }, + override_global_on: { + code: ` + ${generateDiagnostic('directive', 'off', 'derivative_uniformity')}; + ${scopeCode(` + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + }`)} + `, + result: false + }, + override_global_warn: { + code: ` + ${generateDiagnostic('directive', 'error', 'derivative_uniformity')}; + ${scopeCode(` + ${generateDiagnostic('', 'warning', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + }`)} + `, + result: 'warn' + }, + global_if_nothing_else_warn: { + code: ` + ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')}; + ${scopeCode(` + if non_uniform_cond { + _ = textureSample(t,s,0.0); + }`)} + `, + result: 'warn' + }, + deepest_nesting_warn: { + code: scopeCode(` + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if non_uniform_cond { + ${generateDiagnostic('', 'warning', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + } + }`), + result: 'warn' + }, + deepest_nesting_off: { + code: scopeCode(` + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if non_uniform_cond { + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + } + }`), + result: true + }, + deepest_nesting_error: { + code: scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + } + }`), + result: false + }, + other_nest_unaffected: { + code: ` + ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')}; + ${scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + _ = textureSample(t,s,0.0); + } + if non_uniform_cond { + _ = textureSample(t,s,0.0); + }`)} + `, + result: 'warn' + }, + deeper_nest_no_effect: { + code: ` + ${generateDiagnostic('directive', 'error', 'derivative_uniformity')}; + ${scopeCode(` + if non_uniform_cond { + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + } + _ = textureSample(t,s,0.0); + }`)} + `, + result: false + }, + call_unaffected_error: { + code: ` + ${generateDiagnostic('directive', 'error', 'derivative_uniformity')}; + fn foo() { _ = textureSample(t,s,0.0); } + ${scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + foo(); + }`)} + `, + result: false + }, + call_unaffected_warn: { + code: ` + ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')}; + fn foo() { _ = textureSample(t,s,0.0); } + ${scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if non_uniform_cond { + foo(); + }`)} + `, + result: 'warn' + }, + call_unaffected_off: { + code: ` + ${generateDiagnostic('directive', 'off', 'derivative_uniformity')}; + fn foo() { _ = textureSample(t,s,0.0); } + ${scopeCode(` + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if non_uniform_cond { + foo(); + }`)} + `, + result: true + }, + if_condition_error: { + code: scopeCode(` + if (non_uniform_cond) { + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + if textureSample(t,s,non_uniform_coord).x > 0.0 + ${generateDiagnostic('', 'off', 'derivative_uniformity')} { + } + }`), + result: false + }, + if_condition_warn: { + code: scopeCode(` + if non_uniform_cond { + ${generateDiagnostic('', 'warning', 'derivative_uniformity')} + if textureSample(t,s,non_uniform_coord).x > 0.0 + ${generateDiagnostic('', 'error', 'derivative_uniformity')} { + } + }`), + result: 'warn' + }, + if_condition_off: { + code: scopeCode(` + if non_uniform_cond { + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + if textureSample(t,s,non_uniform_coord).x > 0.0 + ${generateDiagnostic('', 'error', 'derivative_uniformity')} { + } + }`), + result: true + }, + switch_error: { + code: scopeCode(` + ${generateDiagnostic('', 'error', 'derivative_uniformity')} + switch non_uniform_val { + case 0 ${generateDiagnostic('', 'off', 'derivative_uniformity')} { + } + default { + _ = textureSample(t,s,0.0); + } + }`), + result: false + }, + switch_warn: { + code: scopeCode(` + ${generateDiagnostic('', 'warning', 'derivative_uniformity')} + switch non_uniform_val { + case 0 ${generateDiagnostic('', 'off', 'derivative_uniformity')} { + } + default { + _ = textureSample(t,s,0.0); + } + }`), + result: 'warn' + }, + switch_off: { + code: scopeCode(` + ${generateDiagnostic('', 'off', 'derivative_uniformity')} + switch non_uniform_val { + case 0 ${generateDiagnostic('', 'error', 'derivative_uniformity')}{ + } + default { + _ = textureSample(t,s,0.0); + } + }`), + result: true + } +}; + +g.test('diagnostic_scoping'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#diagnostics'). +desc('Tests that innermost scope controls the diagnostic'). +params((u) => u.combine('case', keysOf(kScopeCases))). +fn((t) => { + const testcase = kScopeCases[t.params.case]; + if (testcase.result === 'warn') { + t.expectCompileWarning(true, testcase.code); + } else { + t.expectCompileResult(testcase.result, testcase.code); + } }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/must_use.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/must_use.spec.js index 5c96cba5b96..2f4e31efebe 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/must_use.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/must_use.spec.js @@ -45,6 +45,10 @@ const kMustUseDeclarations = { parameter: { code: `@must_use(0) fn foo() -> u32 { return 0; }`, valid: false + }, + duplicate: { + code: `@must_use @must_use fn foo() -> u32 { return 0; }`, + valid: false } }; @@ -125,192 +129,4 @@ fn((t) => { `; t.expectCompileResult(true, wgsl); -}); - -const kMustUseBuiltinCalls = { - // Type constructors - u32: `u32()`, - i32: `i32(0)`, - struct: `S()`, - // Reinterpretation - bitcast: `bitcast(8u)`, - // Logical - all: `all(vec2(true))`, - any: `any(vec2(true))`, - select: `select(0i, 1i, true)`, - // Array - arrayLength: `arrayLength(&storage_var)`, - // Numeric - abs: `abs(0.5)`, - acos: `acos(0.5)`, - acosh: `acosh(1.0)`, - asin: `asin(0.5)`, - asinh: `asinh(0.5)`, - atan: `atan(0.5)`, - atanh: `atanh(0.5)`, - atan2: `atan2(0.5, 0.5)`, - ceil: `ceil(0.5)`, - clamp: `clamp(0.5, 0.1, 1.0)`, - cos: `cos(0.5)`, - cosh: `cosh(0.5)`, - countLeadingZeros: `countLeadingZeros(0)`, - countOneBits: `countOneBits(0)`, - countTrailingZeros: `countTrailingZeros(0)`, - cross: `cross(vec3f(), vec3f())`, - degrees: `degrees(0.5)`, - determinant: `determinant(mat2x2f())`, - distance: `distance(0.5, 0.5)`, - dot: `dot(vec2f(0.5, 0.5), vec2f(0.5, 0.5))`, - exp: `exp(0.5)`, - exp2: `exp2(0.5)`, - extractBits: `extractBits(0, 0, 1)`, - faceForward: `faceForward(vec2f(), vec2f(), vec2f())`, - firstLeadingBit: `firstLeadingBit(0)`, - firstTrailingBit: `firstTrailingBit(0)`, - floor: `floor(0.5)`, - fma: `fma(0.5, 0.5, 0.5)`, - fract: `fract(0.5)`, - frexp: `frexp(0.5)`, - insertBits: `insertBits(0, 0, 0, 1)`, - inverseSqrt: `inverseSqrt(0.5)`, - ldexp: `ldexp(0.5, 1)`, - length: `length(0.5)`, - log: `log(0.5)`, - log2: `log2(0.5)`, - max: `max(0, 0)`, - min: `min(0, 0)`, - mix: `mix(0.5, 0.5, 0.5)`, - modf: `modf(0.5)`, - normalize: `normalize(vec2f(0.5, 0.5))`, - pow: `pow(0.5, 0.5)`, - quantizeToF16: `quantizeToF16(0.5)`, - radians: `radians(0.5)`, - reflect: `reflect(vec2f(0.5, 0.5), vec2f(0.5, 0.5))`, - refract: `refract(vec2f(0.5, 0.5), vec2f(0.5, 0.5), 0.5)`, - reverseBits: `reverseBits(0)`, - round: `round(0.5)`, - saturate: `saturate(0.5)`, - sign: `sign(0.5)`, - sin: `sin(0.5)`, - sinh: `sinh(0.5)`, - smoothstep: `smoothstep(0.1, 1.0, 0.5)`, - sqrt: `sqrt(0.5)`, - step: `step(0.1, 0.5)`, - tan: `tan(0.5)`, - tanh: `tanh(0.5)`, - transpose: `transpose(mat2x2f())`, - trunc: `trunc(0.5)`, - // Derivative - dpdx: `dpdx(0.5)`, - dpdxCoarse: `dpdxCoarse(0.5)`, - dpdxFine: `dpdxFine(0.5)`, - dpdy: `dpdy(0.5)`, - dpdyCoarse: `dpdyCoarse(0.5)`, - dpdyFine: `dpdyFine(0.5)`, - fwidth: `fwidth(0.5)`, - fwidthCoarse: `fwidthCoarse(0.5)`, - fwidthFine: `fwidthFine(0.5)`, - // Texture - textureDimensions: `textureDimensions(tex_2d)`, - textureGather: `textureGather(0, tex_2d, s, vec2f(0,0))`, - textureGatherCompare: `textureGatherCompare(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureLoad: `textureLoad(tex_2d, vec2i(0,0), 0)`, - textureNumLayers: `textureNumLayers(tex_array_2d)`, - textureNumLevels: `textureNumLevels(tex_2d)`, - textureNumSamples: `textureNumSamples(tex_multi_2d)`, - textureSample: `textureSample(tex_2d, s, vec2f(0,0))`, - textureSampleBias: `textureSampleBias(tex_2d, s, vec2f(0,0), 0)`, - textureSampleCompare: `textureSampleCompare(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureSampleCompareLevel: `textureSampleCompareLevel(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureSampleGrad: `textureSampleGrad(tex_2d, s, vec2f(0,0), vec2f(0,0), vec2f(0,0))`, - textureSampleLevel: `textureSampleLevel(tex_2d, s, vec2f(0,0), 0)`, - textureSampleBaseClampToEdge: `textureSampleBaseClampToEdge(tex_2d, s, vec2f(0,0))`, - // Data Packing - pack4x8snorm: `pack4x8snorm(vec4f())`, - pack4x8unorm: `pack4x8unorm(vec4f())`, - pack2x16snorm: `pack2x16snorm(vec2f())`, - pack2x16unorm: `pack2x16unorm(vec2f())`, - pack2x16float: `pack2x16float(vec2f())`, - // Data Unpacking - unpack4x8snorm: `unpack4x8snorm(0)`, - unpack4x8unorm: `unpack4x8unorm(0)`, - unpack2x16snorm: `unpack2x16snorm(0)`, - unpack2x16unorm: `unpack2x16unorm(0)`, - unpack2x16float: `unpack2x16float(0)`, - // Synchronization - workgroupUniformLoad: `workgroupUniformLoad(&wg_var)` -}; - -g.test('builtin_must_use'). -desc(`Validate must_use built-in functions`). -params((u) => -u.combine('call', keysOf(kMustUseBuiltinCalls)).combine('use', [true, false]) -). -fn((t) => { - let call = kMustUseBuiltinCalls[t.params.call]; - if (t.params.use) { - call = `_ = ${call}`; - } - const code = ` -struct S { - x : u32 -} - -@group(0) @binding(0) -var storage_var : array; -@group(0) @binding(1) -var tex_2d : texture_2d; -@group(0) @binding(2) -var s : sampler; -@group(0) @binding(3) -var tex_depth_2d : texture_depth_2d; -@group(0) @binding(4) -var s_comp : sampler_comparison; -@group(0) @binding(5) -var tex_storage_2d : texture_storage_2d; -@group(0) @binding(6) -var tex_multi_2d : texture_multisampled_2d; -@group(0) @binding(7) -var tex_array_2d : texture_2d_array; - -var wg_var : u32; - -fn foo() { - ${call}; -}`; - - t.expectCompileResult(t.params.use, code); -}); - -const kNoMustUseBuiltinCalls = { - atomicLoad: `atomicLoad(&a)`, - atomicAdd: `atomicAdd(&a, 0)`, - atomicSub: `atomicSub(&a, 0)`, - atomicMax: `atomicMax(&a, 0)`, - atomicMin: `atomicMin(&a, 0)`, - atomicAnd: `atomicAnd(&a, 0)`, - atomicOr: `atomicOr(&a, 0)`, - atomicXor: `atomicXor(&a, 0)`, - atomicExchange: `atomicExchange(&a, 0)`, - atomicCompareExchangeWeak: `atomicCompareExchangeWeak(&a, 0, 0)` -}; - -g.test('builtin_no_must_use'). -desc(`Validate built-in functions without must_use`). -params((u) => -u.combine('call', keysOf(kNoMustUseBuiltinCalls)).combine('use', [true, false]) -). -fn((t) => { - let call = kNoMustUseBuiltinCalls[t.params.call]; - if (t.params.use) { - call = `_ = ${call}`; - } - const code = ` -var a : atomic; - -fn foo() { - ${call}; -}`; - - t.expectCompileResult(true, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/requires.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/requires.spec.js index a4fb9b6675b..050feef2af9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/requires.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/requires.spec.js @@ -98,8 +98,6 @@ g.test('wgsl_matches_api'). desc(`Tests that language features are accepted iff the API reports support for them.`). params((u) => u.combine('feature', kKnownWGSLLanguageFeatures)). fn((t) => { - t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures'); - const code = `requires ${t.params.feature};`; t.expectCompileResult(t.hasLanguageFeature(t.params.feature), code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/shadow_builtins.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/shadow_builtins.spec.js new file mode 100644 index 00000000000..a80ba712a33 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/shadow_builtins.spec.js @@ -0,0 +1,995 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for identifiers`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('function_param'). +desc( + `Test that a function param can shadow a builtin, but the builtin is available for other params.` +). +fn((t) => { + const code = ` +fn f(f: i32, i32: i32, t: i32) -> i32 { return i32; } + `; + t.expectCompileResult(true, code); +}); + +const kTests = { + abs: { + keyword: `abs`, + src: `_ = abs(1);` + }, + acos: { + keyword: `acos`, + src: `_ = acos(.2);` + }, + acosh: { + keyword: `acosh`, + src: `_ = acosh(1.2);` + }, + all: { + keyword: `all`, + src: `_ = all(true);` + }, + any: { + keyword: `any`, + src: `_ = any(true);` + }, + array_templated: { + keyword: `array`, + src: `_ = array(1, 2);` + }, + array: { + keyword: `array`, + src: `_ = array(1, 2);` + }, + array_length: { + keyword: `arrayLength`, + src: `_ = arrayLength(&placeholder.rt_arr);` + }, + asin: { + keyword: `asin`, + src: `_ = asin(.2);` + }, + asinh: { + keyword: `asinh`, + src: `_ = asinh(1.2);` + }, + atan: { + keyword: `atan`, + src: `_ = atan(1.2);` + }, + atanh: { + keyword: `atanh`, + src: `_ = atanh(.2);` + }, + atan2: { + keyword: `atan2`, + src: `_ = atan2(1.2, 2.3);` + }, + bool: { + keyword: `bool`, + src: `_ = bool(1);` + }, + bitcast: { + keyword: `bitcast`, + src: `_ = bitcast(1i);` + }, + ceil: { + keyword: `ceil`, + src: `_ = ceil(1.23);` + }, + clamp: { + keyword: `clamp`, + src: `_ = clamp(1, 2, 3);` + }, + cos: { + keyword: `cos`, + src: `_ = cos(2);` + }, + cosh: { + keyword: `cosh`, + src: `_ = cosh(2.2);` + }, + countLeadingZeros: { + keyword: `countLeadingZeros`, + src: `_ = countLeadingZeros(1);` + }, + countOneBits: { + keyword: `countOneBits`, + src: `_ = countOneBits(1);` + }, + countTrailingZeros: { + keyword: `countTrailingZeros`, + src: `_ = countTrailingZeros(1);` + }, + cross: { + keyword: `cross`, + src: `_ = cross(vec3(1, 2, 3), vec3(4, 5, 6));` + }, + degrees: { + keyword: `degrees`, + src: `_ = degrees(1);` + }, + determinant: { + keyword: `determinant`, + src: `_ = determinant(mat2x2(1, 2, 3, 4));` + }, + distance: { + keyword: `distance`, + src: `_ = distance(1, 2);` + }, + dot: { + keyword: `dot`, + src: `_ = dot(vec2(1, 2,), vec2(2, 3));` + }, + dot4U8Packed: { + keyword: `dot4U8Packed`, + src: `_ = dot4U8Packed(1, 2);` + }, + dot4I8Packed: { + keyword: `dot4I8Packed`, + src: `_ = dot4I8Packed(1, 2);` + }, + dpdx: { + keyword: `dpdx`, + src: `_ = dpdx(2);` + }, + dpdxCoarse: { + keyword: `dpdxCoarse`, + src: `_ = dpdxCoarse(2);` + }, + dpdxFine: { + keyword: `dpdxFine`, + src: `_ = dpdxFine(2);` + }, + dpdy: { + keyword: `dpdy`, + src: `_ = dpdy(2);` + }, + dpdyCoarse: { + keyword: `dpdyCoarse`, + src: `_ = dpdyCoarse(2);` + }, + dpdyFine: { + keyword: `dpdyFine`, + src: `_ = dpdyFine(2);` + }, + exp: { + keyword: `exp`, + src: `_ = exp(1);` + }, + exp2: { + keyword: `exp2`, + src: `_ = exp2(2);` + }, + extractBits: { + keyword: `extractBits`, + src: `_ = extractBits(1, 2, 3);` + }, + f32: { + keyword: `f32`, + src: `_ = f32(1i);` + }, + faceForward: { + keyword: `faceForward`, + src: `_ = faceForward(vec2(1, 2), vec2(3, 4), vec2(5, 6));` + }, + firstLeadingBit: { + keyword: `firstLeadingBit`, + src: `_ = firstLeadingBit(1);` + }, + firstTrailingBit: { + keyword: `firstTrailingBit`, + src: `_ = firstTrailingBit(1);` + }, + floor: { + keyword: `floor`, + src: `_ = floor(1.2);` + }, + fma: { + keyword: `fma`, + src: `_ = fma(1, 2, 3);` + }, + fract: { + keyword: `fract`, + src: `_ = fract(1);` + }, + frexp: { + keyword: `frexp`, + src: `_ = frexp(1);` + }, + fwidth: { + keyword: `fwidth`, + src: `_ = fwidth(2);` + }, + fwidthCoarse: { + keyword: `fwidthCoarse`, + src: `_ = fwidthCoarse(2);` + }, + fwidthFine: { + keyword: `fwidthFine`, + src: `_ = fwidthFine(2);` + }, + i32: { + keyword: `i32`, + src: `_ = i32(2u);` + }, + insertBits: { + keyword: `insertBits`, + src: `_ = insertBits(1, 2, 3, 4);` + }, + inverseSqrt: { + keyword: `inverseSqrt`, + src: `_ = inverseSqrt(1);` + }, + ldexp: { + keyword: `ldexp`, + src: `_ = ldexp(1, 2);` + }, + length: { + keyword: `length`, + src: `_ = length(1);` + }, + log: { + keyword: `log`, + src: `_ = log(2);` + }, + log2: { + keyword: `log2`, + src: `_ = log2(2);` + }, + mat2x2_templated: { + keyword: `mat2x2`, + src: `_ = mat2x2(1, 2, 3, 4);` + }, + mat2x2: { + keyword: `mat2x2`, + src: `_ = mat2x2(1, 2, 3, 4);` + }, + mat2x3_templated: { + keyword: `mat2x3`, + src: `_ = mat2x3(1, 2, 3, 4, 5, 6);` + }, + mat2x3: { + keyword: `mat2x3`, + src: `_ = mat2x3(1, 2, 3, 4, 5, 6);` + }, + mat2x4_templated: { + keyword: `mat2x4`, + src: `_ = mat2x4(1, 2, 3, 4, 5, 6, 7, 8);` + }, + mat2x4: { + keyword: `mat2x4`, + src: `_ = mat2x4(1, 2, 3, 4, 5, 6, 7, 8);` + }, + mat3x2_templated: { + keyword: `mat3x2`, + src: `_ = mat3x2(1, 2, 3, 4, 5, 6);` + }, + mat3x2: { + keyword: `mat3x2`, + src: `_ = mat3x2(1, 2, 3, 4, 5, 6);` + }, + mat3x3_templated: { + keyword: `mat3x3`, + src: `_ = mat3x3(1, 2, 3, 4, 5, 6, 7, 8, 9);` + }, + mat3x3: { + keyword: `mat3x3`, + src: `_ = mat3x3(1, 2, 3, 4, 5, 6, 7, 8, 9);` + }, + mat3x4_templated: { + keyword: `mat3x4`, + src: `_ = mat3x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);` + }, + mat3x4: { + keyword: `mat3x4`, + src: `_ = mat3x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);` + }, + mat4x2_templated: { + keyword: `mat4x2`, + src: `_ = mat4x2(1, 2, 3, 4, 5, 6, 7, 8);` + }, + mat4x2: { + keyword: `mat4x2`, + src: `_ = mat4x2(1, 2, 3, 4, 5, 6, 7, 8);` + }, + mat4x3_templated: { + keyword: `mat4x3`, + src: `_ = mat4x3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);` + }, + mat4x3: { + keyword: `mat4x3`, + src: `_ = mat4x3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);` + }, + mat4x4_templated: { + keyword: `mat4x4`, + src: `_ = mat4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);` + }, + mat4x4: { + keyword: `mat4x4`, + src: `_ = mat4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);` + }, + max: { + keyword: `max`, + src: `_ = max(1, 2);` + }, + min: { + keyword: `min`, + src: `_ = min(1, 2);` + }, + mix: { + keyword: `mix`, + src: `_ = mix(1, 2, 3);` + }, + modf: { + keyword: `modf`, + src: `_ = modf(1.2);` + }, + normalize: { + keyword: `normalize`, + src: `_ = normalize(vec2(1, 2));` + }, + pack2x16snorm: { + keyword: `pack2x16snorm`, + src: `_ = pack2x16snorm(vec2(1, 2));` + }, + pack2x16unorm: { + keyword: `pack2x16unorm`, + src: `_ = pack2x16unorm(vec2(1, 2));` + }, + pack2x16float: { + keyword: `pack2x16float`, + src: `_ = pack2x16float(vec2(1, 2));` + }, + pack4x8snorm: { + keyword: `pack4x8snorm`, + src: `_ = pack4x8snorm(vec4(1, 2, 3, 4));` + }, + pack4x8unorm: { + keyword: `pack4x8unorm`, + src: `_ = pack4x8unorm(vec4(1, 2, 3, 4));` + }, + pack4xI8: { + keyword: `pack4xI8`, + src: `_ = pack4xI8(vec4(1, 2, 3, 4));` + }, + pack4xU8: { + keyword: `pack4xU8`, + src: `_ = pack4xU8(vec4(1, 2, 3, 4));` + }, + pack4xI8Clamp: { + keyword: `pack4xI8Clamp`, + src: `_ = pack4xI8Clamp(vec4(1, 2, 3, 4));` + }, + pack4xU8Clamp: { + keyword: `pack4xU8Clamp`, + src: `_ = pack4xU8Clamp(vec4(1, 2, 3, 4));` + }, + pow: { + keyword: `pow`, + src: `_ = pow(1, 2);` + }, + quantizeToF16: { + keyword: `quantizeToF16`, + src: `_ = quantizeToF16(1.2);` + }, + radians: { + keyword: `radians`, + src: `_ = radians(1.2);` + }, + reflect: { + keyword: `reflect`, + src: `_ = reflect(vec2(1, 2), vec2(3, 4));` + }, + refract: { + keyword: `refract`, + src: `_ = refract(vec2(1, 1), vec2(2, 2), 3);` + }, + reverseBits: { + keyword: `reverseBits`, + src: `_ = reverseBits(1);` + }, + round: { + keyword: `round`, + src: `_ = round(1.2);` + }, + saturate: { + keyword: `saturate`, + src: `_ = saturate(1);` + }, + select: { + keyword: `select`, + src: `_ = select(1, 2, false);` + }, + sign: { + keyword: `sign`, + src: `_ = sign(1);` + }, + sin: { + keyword: `sin`, + src: `_ = sin(2);` + }, + sinh: { + keyword: `sinh`, + src: `_ = sinh(3);` + }, + smoothstep: { + keyword: `smoothstep`, + src: `_ = smoothstep(1, 2, 3);` + }, + sqrt: { + keyword: `sqrt`, + src: `_ = sqrt(24);` + }, + step: { + keyword: `step`, + src: `_ = step(4, 5);` + }, + tan: { + keyword: `tan`, + src: `_ = tan(2);` + }, + tanh: { + keyword: `tanh`, + src: `_ = tanh(2);` + }, + transpose: { + keyword: `transpose`, + src: `_ = transpose(mat2x2(1, 2, 3, 4));` + }, + trunc: { + keyword: `trunc`, + src: `_ = trunc(2);` + }, + u32: { + keyword: `u32`, + src: `_ = u32(1i);` + }, + unpack2x16snorm: { + keyword: `unpack2x16snorm`, + src: `_ = unpack2x16snorm(2);` + }, + unpack2x16unorm: { + keyword: `unpack2x16unorm`, + src: `_ = unpack2x16unorm(2);` + }, + unpack2x16float: { + keyword: `unpack2x16float`, + src: `_ = unpack2x16float(2);` + }, + unpack4x8snorm: { + keyword: `unpack4x8snorm`, + src: `_ = unpack4x8snorm(4);` + }, + unpack4x8unorm: { + keyword: `unpack4x8unorm`, + src: `_ = unpack4x8unorm(4);` + }, + unpack4xI8: { + keyword: `unpack4xI8`, + src: `_ = unpack4xI8(4);` + }, + unpack4xU8: { + keyword: `unpack4xU8`, + src: `_ = unpack4xU8(4);` + }, + vec2_templated: { + keyword: `vec2`, + src: `_ = vec2(1, 2);` + }, + vec2: { + keyword: `vec2`, + src: `_ = vec2(1, 2);` + }, + vec3_templated: { + keyword: `vec3`, + src: `_ = vec3(1, 2, 3);` + }, + vec3: { + keyword: `vec3`, + src: `_ = vec3(1, 2, 3);` + }, + vec4_templated: { + keyword: `vec4`, + src: `_ = vec4(1, 2, 3, 4);` + }, + vec4: { + keyword: `vec4`, + src: `_ = vec4(1, 2, 3, 4);` + } +}; + +g.test('shadow_hides_builtin'). +desc(`Test that shadows hide builtins.`). +params((u) => +u. +combine('inject', ['none', 'function', 'sibling', 'module']). +beginSubcases(). +combine('builtin', keysOf(kTests)) +). +fn((t) => { + const data = kTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : i32;` : ``; + const sibling_func = t.params.inject === 'sibling' ? local : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +struct Data { + rt_arr: array, +} +@group(0) @binding(0) var placeholder: Data; + +${module_shadow} + +fn sibling() { + ${sibling_func} +} + +@fragment +fn main() -> @location(0) vec4f { + ${func} + ${data.src} + return vec4f(1); +} + `; + + const pass = t.params.inject === 'none' || t.params.inject === 'sibling'; + t.expectCompileResult(pass, code); +}); + +const kFloat16Tests = { + f16: { + keyword: `f16`, + src: `_ = f16(2);` + } +}; + +g.test('shadow_hides_builtin_f16'). +desc(`Test that shadows hide builtins when shader-f16 is enabled.`). +params((u) => +u. +combine('inject', ['none', 'function', 'sibling', 'module']). +beginSubcases(). +combine('builtin', keysOf(kFloat16Tests)) +). +beforeAllSubcases((t) => { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); +}). +fn((t) => { + const data = kFloat16Tests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : f16;` : ``; + const sibling_func = t.params.inject === 'sibling' ? local : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +enable f16; + +${module_shadow} + +fn sibling() { + ${sibling_func} +} + +@vertex +fn vtx() -> @builtin(position) vec4f { + ${func} + ${data.src} + return vec4f(1); +} + `; + const pass = t.params.inject === 'none' || t.params.inject === 'sibling'; + t.expectCompileResult(pass, code); +}); + +const kTextureTypeTests = { + texture_1d: { + keyword: `texture_1d`, + src: `var t: texture_1d;` + }, + texture_2d: { + keyword: `texture_2d`, + src: `var t: texture_2d;` + }, + texture_2d_array: { + keyword: `texture_2d_array`, + src: `var t: texture_2d_array;` + }, + texture_3d: { + keyword: `texture_3d`, + src: `var t: texture_3d;` + }, + texture_cube: { + keyword: `texture_cube`, + src: `var t: texture_cube;` + }, + texture_cube_array: { + keyword: `texture_cube_array`, + src: `var t: texture_cube_array;` + }, + texture_multisampled_2d: { + keyword: `texture_multisampled_2d`, + src: `var t: texture_multisampled_2d;` + }, + texture_depth_multisampled_2d: { + keyword: `texture_depth_multisampled_2d`, + src: `var t: texture_depth_multisampled_2d;` + }, + texture_external: { + keyword: `texture_external`, + src: `var t: texture_external;` + }, + texture_storage_1d: { + keyword: `texture_storage_1d`, + src: `var t: texture_storage_1d;` + }, + texture_storage_2d: { + keyword: `texture_storage_2d`, + src: `var t: texture_storage_2d;` + }, + texture_storage_2d_array: { + keyword: `texture_storage_2d_array`, + src: `var t: texture_storage_2d_array;` + }, + texture_storage_3d: { + keyword: `texture_storage_3d`, + src: `var t: texture_storage_3d;` + }, + texture_depth_2d: { + keyword: `texture_depth_2d`, + src: `var t: texture_depth_2d;` + }, + texture_depth_2d_array: { + keyword: `texture_depth_2d_array`, + src: `var t: texture_depth_2d_array;` + }, + texture_depth_cube: { + keyword: `texture_depth_cube`, + src: `var t: texture_depth_cube;` + }, + texture_depth_cube_array: { + keyword: `texture_depth_cube_array`, + src: `var t: texture_depth_cube_array;` + }, + sampler: { + keyword: `sampler`, + src: `var s: sampler;` + }, + sampler_comparison: { + keyword: `sampler_comparison`, + src: `var s: sampler_comparison;` + } +}; + +g.test('shadow_hides_builtin_handle_type'). +desc(`Test that shadows hide builtins when handle address space types are used.`). +params((u) => +u. +combine('inject', ['none', 'function', 'module']). +beginSubcases(). +combine('builtin', keysOf(kTextureTypeTests)) +). +fn((t) => { + const data = kTextureTypeTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : f32;` : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +${module_shadow} +@group(0) @binding(0) ${data.src} + +fn func() { + ${func} +} + `; + const pass = t.params.inject === 'none' || t.params.inject === 'function'; + t.expectCompileResult(pass, code); +}); + +const kTextureTests = { + textureDimensions: { + keyword: `textureDimensions`, + src: `_ = textureDimensions(t_2d);` + }, + textureGather: { + keyword: `textureGather`, + src: `_ = textureGather(1, t_2d, s, vec2(1, 2));` + }, + textureGatherCompare: { + keyword: `textureGatherCompare`, + src: `_ = textureGatherCompare(t_2d_depth, sc, vec2(1, 2), 3);` + }, + textureLoad: { + keyword: `textureLoad`, + src: `_ = textureLoad(t_2d, vec2(1, 2), 1);` + }, + textureNumLayers: { + keyword: `textureNumLayers`, + src: `_ = textureNumLayers(t_2d_array);` + }, + textureNumLevels: { + keyword: `textureNumLevels`, + src: `_ = textureNumLevels(t_2d);` + }, + textureNumSamples: { + keyword: `textureNumSamples`, + src: `_ = textureNumSamples(t_2d_ms);` + }, + textureSample: { + keyword: `textureSample`, + src: `_ = textureSample(t_2d, s, vec2(1, 2));` + }, + textureSampleBias: { + keyword: `textureSampleBias`, + src: `_ = textureSampleBias(t_2d, s, vec2(1, 2), 2);` + }, + textureSampleCompare: { + keyword: `textureSampleCompare`, + src: `_ = textureSampleCompare(t_2d_depth, sc, vec2(1, 2), 2);` + }, + textureSampleCompareLevel: { + keyword: `textureSampleCompareLevel`, + src: `_ = textureSampleCompareLevel(t_2d_depth, sc, vec2(1, 2), 3, vec2(1, 2));` + }, + textureSampleGrad: { + keyword: `textureSampleGrad`, + src: `_ = textureSampleGrad(t_2d, s, vec2(1, 2), vec2(1, 2), vec2(1, 2));` + }, + textureSampleLevel: { + keyword: `textureSampleLevel`, + src: `_ = textureSampleLevel(t_2d, s, vec2(1, 2), 3);` + }, + textureSampleBaseClampToEdge: { + keyword: `textureSampleBaseClampToEdge`, + src: `_ = textureSampleBaseClampToEdge(t_2d, s, vec2(1, 2));` + } +}; + +g.test('shadow_hides_builtin_texture'). +desc(`Test that shadows hide texture builtins.`). +params((u) => +u. +combine('inject', ['none', 'function', 'sibling', 'module']). +beginSubcases(). +combine('builtin', keysOf(kTextureTests)) +). +fn((t) => { + const data = kTextureTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : i32;` : ``; + const sibling_func = t.params.inject === 'sibling' ? local : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +@group(0) @binding(0) var t_2d: texture_2d; +@group(0) @binding(1) var t_2d_depth: texture_depth_2d; +@group(0) @binding(2) var t_2d_array: texture_2d_array; +@group(0) @binding(3) var t_2d_ms: texture_multisampled_2d; + +@group(1) @binding(0) var s: sampler; +@group(1) @binding(1) var sc: sampler_comparison; + +${module_shadow} + +fn sibling() { + ${sibling_func} +} + +@fragment +fn main() -> @location(0) vec4f { + ${func} + ${data.src} + return vec4f(1); +} + `; + + const pass = t.params.inject === 'none' || t.params.inject === 'sibling'; + t.expectCompileResult(pass, code); +}); + +g.test('shadow_hides_builtin_atomic_type'). +desc(`Test that shadows hide builtins when atomic types are used.`). +params((u) => u.combine('inject', ['none', 'function', 'module']).beginSubcases()). +fn((t) => { + const local = `let atomic = 4;`; + const module_shadow = t.params.inject === 'module' ? `var atomic: i32;` : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +${module_shadow} + +var val: atomic; + +fn func() { + ${func} +} + `; + const pass = t.params.inject === 'none' || t.params.inject === 'function'; + t.expectCompileResult(pass, code); +}); + +const kAtomicTests = { + atomicLoad: { + keyword: `atomicLoad`, + src: `_ = atomicLoad(&a);` + }, + atomicStore: { + keyword: `atomicStore`, + src: `atomicStore(&a, 1);` + }, + atomicAdd: { + keyword: `atomicAdd`, + src: `_ = atomicAdd(&a, 1);` + }, + atomicSub: { + keyword: `atomicSub`, + src: `_ = atomicSub(&a, 1);` + }, + atomicMax: { + keyword: `atomicMax`, + src: `_ = atomicMax(&a, 1);` + }, + atomicMin: { + keyword: `atomicMin`, + src: `_ = atomicMin(&a, 1);` + }, + atomicAnd: { + keyword: `atomicAnd`, + src: `_ = atomicAnd(&a, 1);` + }, + atomicOr: { + keyword: `atomicOr`, + src: `_ = atomicOr(&a, 1);` + }, + atomicXor: { + keyword: `atomicXor`, + src: `_ = atomicXor(&a, 1);` + } +}; + +g.test('shadow_hides_builtin_atomic'). +desc(`Test that shadows hide builtin atomic methods.`). +params((u) => +u. +combine('inject', ['none', 'function', 'sibling', 'module']). +beginSubcases(). +combine('builtin', keysOf(kAtomicTests)) +). +fn((t) => { + const data = kAtomicTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : i32;` : ``; + const sibling_func = t.params.inject === 'sibling' ? local : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +var a: atomic; + +${module_shadow} + +fn sibling() { + ${sibling_func} +} + +@compute @workgroup_size(1) +fn main() { + ${func} + ${data.src} +} + `; + + const pass = t.params.inject === 'none' || t.params.inject === 'sibling'; + t.expectCompileResult(pass, code); +}); + +const kBarrierTests = { + storageBarrier: { + keyword: `storageBarrier`, + src: `storageBarrier();` + }, + textureBarrier: { + keyword: `textureBarrier`, + src: `textureBarrier();` + }, + workgroupBarrier: { + keyword: `workgroupBarrier`, + src: `workgroupBarrier();` + }, + workgroupUniformLoad: { + keyword: `workgroupUniformLoad`, + src: `_ = workgroupUniformLoad(&u);` + } +}; + +g.test('shadow_hides_builtin_barriers'). +desc(`Test that shadows hide builtin barrier methods.`). +params((u) => +u. +combine('inject', ['none', 'function', 'sibling', 'module']). +beginSubcases(). +combine('builtin', keysOf(kBarrierTests)) +). +fn((t) => { + const data = kBarrierTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : i32;` : ``; + const sibling_func = t.params.inject === 'sibling' ? local : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +var u: u32; + +${module_shadow} + +fn sibling() { + ${sibling_func} +} + +@compute @workgroup_size(1) +fn main() { + ${func} + ${data.src} +} + `; + + const pass = t.params.inject === 'none' || t.params.inject === 'sibling'; + t.expectCompileResult(pass, code); +}); + +const kAccessModeTests = { + read: { + keyword: `read`, + src: `var a: i32;` + }, + read_write: { + keyword: `read_write`, + src: `var a: i32;` + }, + write: { + keyword: `write`, + src: `var t: texture_storage_1d;` + } +}; + +g.test('shadow_hides_access_mode'). +desc(`Test that shadows hide access modes.`). +params((u) => +u. +combine('inject', ['none', 'function', 'module']). +beginSubcases(). +combine('builtin', keysOf(kAccessModeTests)) +). +fn((t) => { + const data = kAccessModeTests[t.params.builtin]; + const local = `let ${data.keyword} = 4;`; + + const module_shadow = t.params.inject === 'module' ? `var ${data.keyword} : i32;` : ``; + const func = t.params.inject === 'function' ? local : ``; + + const code = ` +${module_shadow} + +@group(0) @binding(0) ${data.src} + +@compute @workgroup_size(1) +fn main() { + ${func} +} + `; + + const pass = t.params.inject === 'none' || t.params.inject === 'function'; + t.expectCompileResult(pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/unary_ops.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/unary_ops.spec.js deleted file mode 100644 index 952cb9a8ed2..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/unary_ops.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validation tests for unary ops`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { keysOf } from '../../../../common/util/data_tables.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - -export const g = makeTestGroup(ShaderValidationTest); - -const kTests = { - not_bool_literal: { - src: 'let a = !true;', - pass: true - }, - not_bool_expr: { - src: `let a = !(1 == 2);`, - pass: true - }, - not_not_bool_literal: { - src: 'let a = !!true;', - pass: true - }, - not_not_bool_expr: { - src: `let a = !!(1 == 2);`, - pass: true - }, - not_int_literal: { - src: `let a = !42;`, - pass: false - }, - not_int_expr: { - src: `let a = !(40 + 2);`, - pass: false - } -}; - -g.test('all'). -desc('Test that unary operators are validated correctly'). -params((u) => u.combine('stmt', keysOf(kTests))). -fn((t) => { - const code = ` -@vertex -fn vtx() -> @builtin(position) vec4f { - ${kTests[t.params.stmt].src} - return vec4f(1); -} - `; - t.expectCompileResult(kTests[t.params.stmt].pass, code); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/var_and_let.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/var_and_let.spec.js deleted file mode 100644 index 75bf64e7eb1..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/var_and_let.spec.js +++ /dev/null @@ -1,106 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = ` -Positive and negative validation tests for variable and const. - -TODO: Find a better way to test arrays than using a single arbitrary size. [1] -`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - -export const g = makeTestGroup(ShaderValidationTest); - -const kTestTypes = [ -'f32', -'i32', -'u32', -'bool', -'vec2', -'vec2', -'vec2', -'vec2', -'vec3', -'vec3', -'vec3', -'vec3', -'vec4', -'vec4', -'vec4', -'vec4', -'mat2x2', -'mat2x3', -'mat2x4', -'mat3x2', -'mat3x3', -'mat3x4', -'mat4x2', -'mat4x3', -'mat4x4', -// [1]: 12 is a random number here. find a solution to replace it. -'array', -'array', -'array', -'array']; - - -g.test('initializer_type'). -desc( - ` - If present, the initializer's type must match the store type of the variable. - Testing scalars, vectors, and matrices of every dimension and type. - TODO: add test for: structs - arrays of vectors and matrices - arrays of different length -` -). -params((u) => -u. -combine('variableOrConstant', ['var', 'let']). -beginSubcases(). -combine('lhsType', kTestTypes). -combine('rhsType', kTestTypes) -). -fn((t) => { - const { variableOrConstant, lhsType, rhsType } = t.params; - - const code = ` - @fragment - fn main() { - ${variableOrConstant} a : ${lhsType} = ${rhsType}(); - } - `; - - const expectation = lhsType === rhsType; - t.expectCompileResult(expectation, code); -}); - -g.test('var_access_mode_bad_other_template_contents'). -desc( - 'A variable declaration with explicit access mode with varying other template list contents' -). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params((u) => -u. -combine('accessMode', ['read', 'read_write']). -combine('prefix', ['storage,', '', ',']). -combine('suffix', [',storage', ',read', ',', '']) -). -fn((t) => { - const prog = `@group(0) @binding(0) - var<${t.params.prefix}${t.params.accessMode}${t.params.suffix}> x: i32;`; - const ok = t.params.prefix === 'storage,' && t.params.suffix === ''; - t.expectCompileResult(ok, prog); -}); - -g.test('var_access_mode_bad_template_delim'). -desc('A variable declaration has explicit access mode with varying template list delimiters'). -specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls'). -params((u) => -u. -combine('accessMode', ['read', 'read_write']). -combine('prefix', ['', '<', '>', ',']). -combine('suffix', ['', '<', '>', ',']) -). -fn((t) => { - const prog = `@group(0) @binding(0) - var ${t.params.prefix}storage,${t.params.accessMode}${t.params.suffix} x: i32;`; - const ok = t.params.prefix === '<' && t.params.suffix === '>'; - t.expectCompileResult(ok, prog); -}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/align.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/align.spec.js similarity index 99% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/align.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/align.spec.js index e0fae5a6930..f405b14ef77 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/align.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/align.spec.js @@ -118,6 +118,10 @@ const kTests = { larger_than_max_i32: { src: '@align(2147483648)', pass: false + }, + duplicate: { + src: '@align(4) @align(4)', + pass: false } }; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/builtins.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/builtins.spec.js index 9aa013aa610..57d56e175d4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/builtins.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/builtins.spec.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = `Validation tests for entry point built-in variables`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; import { generateShader } from './util.js'; @@ -75,6 +76,12 @@ combine('target_stage', ['', 'vertex', 'fragment', 'compute']). combine('target_io', ['in', 'out']). beginSubcases() ). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && ['sample_index', 'sample_mask'].includes(t.params.name), + 'compatibility mode does not support sample_index or sample_mask' + ); +}). fn((t) => { const code = generateShader({ attribute: `@builtin(${t.params.name})`, @@ -107,6 +114,12 @@ beginSubcases(). combine('target_type', kTestTypes). combine('use_struct', [true, false]) ). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && ['sample_index', 'sample_mask'].includes(t.params.name), + 'compatibility mode does not support sample_index or sample_mask' + ); +}). fn((t) => { let code = ''; @@ -145,10 +158,10 @@ combine('target_io', ['in', 'out']). beginSubcases() ). fn((t) => { - // Generate a struct that contains a sample_mask builtin, nested inside another struct. + // Generate a struct that contains a frag_depth builtin, nested inside another struct. let code = ` struct Inner { - @builtin(sample_mask) value : u32 + @builtin(frag_depth) value : f32 }; struct Outer { inner : Inner @@ -181,23 +194,38 @@ u combine('second', ['p2', 's1b', 's2b', 'rb']). beginSubcases() ). +beforeAllSubcases((t) => { + t.skipIf(t.isCompatibility, 'compatibility mode does not support sample_mask'); +}). fn((t) => { const p1 = - t.params.first === 'p1' ? '@builtin(sample_mask)' : '@location(1) @interpolate(flat)'; + t.params.first === 'p1' ? '@builtin(sample_mask)' : '@location(1) @interpolate(flat, either)'; const p2 = - t.params.second === 'p2' ? '@builtin(sample_mask)' : '@location(2) @interpolate(flat)'; + t.params.second === 'p2' ? + '@builtin(sample_mask)' : + '@location(2) @interpolate(flat, either)'; const s1a = - t.params.first === 's1a' ? '@builtin(sample_mask)' : '@location(3) @interpolate(flat)'; + t.params.first === 's1a' ? + '@builtin(sample_mask)' : + '@location(3) @interpolate(flat, either)'; const s1b = - t.params.second === 's1b' ? '@builtin(sample_mask)' : '@location(4) @interpolate(flat)'; + t.params.second === 's1b' ? + '@builtin(sample_mask)' : + '@location(4) @interpolate(flat, either)'; const s2a = - t.params.first === 's2a' ? '@builtin(sample_mask)' : '@location(5) @interpolate(flat)'; + t.params.first === 's2a' ? + '@builtin(sample_mask)' : + '@location(5) @interpolate(flat, either)'; const s2b = - t.params.second === 's2b' ? '@builtin(sample_mask)' : '@location(6) @interpolate(flat)'; + t.params.second === 's2b' ? + '@builtin(sample_mask)' : + '@location(6) @interpolate(flat, either)'; const ra = - t.params.first === 'ra' ? '@builtin(sample_mask)' : '@location(1) @interpolate(flat)'; + t.params.first === 'ra' ? '@builtin(sample_mask)' : '@location(1) @interpolate(flat, either)'; const rb = - t.params.second === 'rb' ? '@builtin(sample_mask)' : '@location(2) @interpolate(flat)'; + t.params.second === 'rb' ? + '@builtin(sample_mask)' : + '@location(2) @interpolate(flat, either)'; const code = ` struct S1 { ${s1a} a : u32, @@ -274,4 +302,145 @@ fn((t) => { code += `fn test() { let ${t.params.name} = 1; }`; } t.expectCompileResult(true, code); +}); + +const kTests = { + pos: { + src: `@builtin(position)`, + pass: true + }, + trailing_comma: { + src: `@builtin(position,)`, + pass: true + }, + newline_in_attr: { + src: `@ \n builtin(position)`, + pass: true + }, + whitespace_in_attr: { + src: `@/* comment */builtin/* comment */\n\n(\t/*comment*/position/*comment*/)`, + pass: true + }, + invalid_name: { + src: `@abuiltin(position)`, + pass: false + }, + no_params: { + src: `@builtin`, + pass: false + }, + missing_param: { + src: `@builtin()`, + pass: false + }, + missing_parens: { + src: `@builtin position`, + pass: false + }, + missing_lparen: { + src: `@builtin position)`, + pass: false + }, + missing_rparen: { + src: `@builtin(position`, + pass: false + }, + multiple_params: { + src: `@builtin(position, frag_depth)`, + pass: false + }, + ident_param: { + src: `@builtin(identifier)`, + pass: false + }, + number_param: { + src: `@builtin(2)`, + pass: false + }, + duplicate: { + src: `@builtin(position) @builtin(position)`, + pass: false + } +}; + +g.test('parse'). +desc(`Test that @builtin is parsed correctly.`). +params((u) => u.combine('builtin', keysOf(kTests))). +fn((t) => { + const src = kTests[t.params.builtin].src; + const code = ` +@vertex +fn main() -> ${src} vec4 { + return vec4(.4, .2, .3, .1); +}`; + t.expectCompileResult(kTests[t.params.builtin].pass, code); +}); + +g.test('placement'). +desc('Tests the locations @builtin is allowed to appear'). +params((u) => +u. +combine('scope', [ +// The fn-param and fn-ret are part of the shader_io/builtins tests +'private-var', +'storage-var', +'struct-member', +'non-ep-param', +'non-ep-ret', +'fn-decl', +'fn-var', +'while-stmt', +undefined] +). +combine('attribute', [ +{ + 'private-var': false, + 'storage-var': false, + 'struct-member': true, + 'non-ep-param': false, + 'non-ep-ret': false, + 'fn-decl': false, + 'fn-var': false, + 'fn-return': false, + 'while-stmt': false +}] +). +beginSubcases() +). +fn((t) => { + const scope = t.params.scope; + + const attr = '@builtin(vertex_index)'; + const code = ` + ${scope === 'private-var' ? attr : ''} + var priv_var : u32; + + ${scope === 'storage-var' ? attr : ''} + @group(0) @binding(0) + var stor_var : u32; + + struct A { + ${scope === 'struct-member' ? attr : ''} + a : u32, + } + + fn v(${scope === 'non-ep-param' ? attr : ''} i : u32) -> + ${scope === 'non-ep-ret' ? attr : ''} u32 { return 1; } + + @vertex + ${scope === 'fn-decl' ? attr : ''} + fn f( + @location(0) b : u32, + ) -> @builtin(position) vec4f { + ${scope === 'fn-var' ? attr : ''} + var func_v : u32; + + ${scope === 'while-stmt' ? attr : ''} + while false {} + + return vec4(1, 1, 1, 1); + } + `; + + t.expectCompileResult(scope === undefined || t.params.attribute[scope], code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/group_and_binding.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/group_and_binding.spec.js index b63f33b4cff..a280112acbc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/group_and_binding.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/group_and_binding.spec.js @@ -96,6 +96,9 @@ combine('stage', ['vertex', 'fragment', 'compute']). combine('a_kind', kResourceKindsA). combine('b_kind', kResourceKindsB). combine('usage', ['direct', 'transitive']). +filter((t) => { + return !(t.stage === 'vertex' && t.b_kind === 'texture_storage_1d'); +}). beginSubcases(). combine('a_group', [0, 3]). combine('b_group', [0, 3]). @@ -140,6 +143,9 @@ combine('b_stage', ['vertex', 'fragment', 'compute']). combine('a_kind', kResourceKindsA). combine('b_kind', kResourceKindsB). combine('usage', ['direct', 'transitive']). +filter((t) => { + return !(t.b_stage === 'vertex' && t.b_kind === 'texture_storage_1d'); +}). beginSubcases() ). fn((t) => { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/interpolate.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/interpolate.spec.js index ec9adc01296..1799aea931e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/interpolate.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/interpolate.spec.js @@ -9,9 +9,18 @@ import { generateShader } from './util.js'; export const g = makeTestGroup(ShaderValidationTest); // List of valid interpolation attributes. -const kValidInterpolationAttributes = new Set([ +const kValidCompatInterpolationAttributes = new Set([ '', +'@interpolate(flat, either)', +'@interpolate(perspective)', +'@interpolate(perspective, center)', +'@interpolate(perspective, centroid)'] +); +const kValidInterpolationAttributes = new Set([ +...kValidCompatInterpolationAttributes, '@interpolate(flat)', +'@interpolate(flat, first)', +'@interpolate(flat, either)', '@interpolate(perspective)', '@interpolate(perspective, center)', '@interpolate(perspective, centroid)', @@ -36,13 +45,19 @@ combine('type', [ 'linear', 'center', // Invalid as first param 'centroid', // Invalid as first param -'sample' // Invalid as first param -]). +'sample', // Invalid as first param +'first', // Invalid as first param +'either' // Invalid as first param +]) +// vertex output must include a position builtin, so must use a struct +.filter((t) => !(t.stage === 'vertex' && t.use_struct === false)). combine('sampling', [ '', 'center', 'centroid', 'sample', +'first', +'either', 'flat', // Invalid as second param 'perspective', // Invalid as second param 'linear' // Invalid as second param @@ -50,10 +65,6 @@ combine('sampling', [ beginSubcases() ). fn((t) => { - if (t.params.stage === 'vertex' && t.params.use_struct === false) { - t.skip('vertex output must include a position builtin, so must use a struct'); - } - let interpolate = ''; if (t.params.type !== '' || t.params.sampling !== '') { interpolate = '@interpolate('; @@ -72,8 +83,10 @@ fn((t) => { io: t.params.io, use_struct: t.params.use_struct }); - - t.expectCompileResult(kValidInterpolationAttributes.has(interpolate), code); + const validInterpolationAttributes = t.isCompatibility ? + kValidCompatInterpolationAttributes : + kValidInterpolationAttributes; + t.expectCompileResult(validInterpolationAttributes.has(interpolate), code); }); g.test('require_location'). @@ -95,7 +108,7 @@ fn((t) => { } const code = generateShader({ - attribute: t.params.attribute + `@interpolate(flat)`, + attribute: t.params.attribute + `@interpolate(flat, either)`, type: 'vec4', stage: t.params.stage, io: t.params.stage === 'fragment' ? 'in' : 'out', @@ -127,7 +140,10 @@ fn((t) => { use_struct: t.params.use_struct }); - t.expectCompileResult(t.params.attribute === '@interpolate(flat)', code); + const expectSuccess = t.isCompatibility ? + t.params.attribute === '@interpolate(flat, either)' : + t.params.attribute.startsWith('@interpolate(flat'); + t.expectCompileResult(expectSuccess, code); }); g.test('duplicate'). @@ -135,7 +151,7 @@ desc(`Test that the interpolate attribute can only be applied once.`). params((u) => u.combine('attr', ['', '@interpolate(flat)'])). fn((t) => { const code = generateShader({ - attribute: `@location(0) @interpolate(flat) ${t.params.attr}`, + attribute: `@location(0) @interpolate(flat, either) ${t.params.attr}`, type: 'vec4', stage: 'fragment', io: 'in', @@ -146,7 +162,7 @@ fn((t) => { const kValidationTests = { valid: { - src: `@interpolate(flat)`, + src: `@interpolate(perspective)`, pass: true }, no_space: { @@ -155,18 +171,19 @@ const kValidationTests = { }, trailing_comma_one_arg: { src: `@interpolate(flat,)`, - pass: true + pass: true, + compatPass: false }, trailing_comma_two_arg: { src: `@interpolate(perspective, center,)`, pass: true }, newline: { - src: '@\ninterpolate(flat)', + src: '@\ninterpolate(perspective)', pass: true }, comment: { - src: `@/* comment */interpolate(flat)`, + src: `@/* comment */interpolate(perspective)`, pass: true }, @@ -175,7 +192,7 @@ const kValidationTests = { pass: false }, missing_left_paren: { - src: `@interpolate flat)`, + src: `@interpolate perspective)`, pass: false }, missing_value_and_left_paren: { @@ -183,7 +200,7 @@ const kValidationTests = { pass: false }, missing_right_paren: { - src: `@interpolate(flat`, + src: `@interpolate(perspective`, pass: false }, missing_parens: { @@ -213,5 +230,9 @@ fn((t) => { @builtin(position) vec4 { return vec4f(0); }`; - t.expectCompileResult(kValidationTests[t.params.attr].pass, code); + const expectSuccess = + kValidationTests[t.params.attr].pass && ( + t.isCompatibility ? kValidationTests[t.params.attr].compatPass ?? true : true); + + t.expectCompileResult(expectSuccess, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/layout_constraints.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/layout_constraints.spec.js new file mode 100644 index 00000000000..1f595f7d23f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/layout_constraints.spec.js @@ -0,0 +1,543 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation of address space layout constraints`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + + +const kLayoutCases = { + // Scalars + u32: { + type: 'u32', + validity: true + }, + i32: { + type: 'i32', + validity: true + }, + f32: { + type: 'f32', + validity: true + }, + f16: { + type: 'f16', + validity: true, + f16: true + }, + bool: { + type: 'bool', + validity: 'non-interface' + }, + + // Vectors + vec2u: { + type: 'vec2u', + validity: true + }, + vec3u: { + type: 'vec3u', + validity: true + }, + vec4u: { + type: 'vec4u', + validity: true + }, + vec2i: { + type: 'vec2i', + validity: true + }, + vec3i: { + type: 'vec3i', + validity: true + }, + vec4i: { + type: 'vec4i', + validity: true + }, + vec2f: { + type: 'vec2f', + validity: true + }, + vec3f: { + type: 'vec3f', + validity: true + }, + vec4f: { + type: 'vec4f', + validity: true + }, + vec2h: { + type: 'vec2h', + validity: true, + f16: true + }, + vec3h: { + type: 'vec3h', + validity: true, + f16: true + }, + vec4h: { + type: 'vec4h', + validity: true, + f16: true + }, + vec2b: { + type: 'vec2', + validity: 'non-interface' + }, + vec3b: { + type: 'vec3', + validity: 'non-interface' + }, + vec4b: { + type: 'vec4', + validity: 'non-interface' + }, + + // Matrices + mat2x2f: { + type: 'mat2x2f', + validity: true + }, + mat2x3f: { + type: 'mat2x3f', + validity: true + }, + mat2x4f: { + type: 'mat2x4f', + validity: true + }, + mat3x2f: { + type: 'mat3x2f', + validity: true + }, + mat3x3f: { + type: 'mat3x3f', + validity: true + }, + mat3x4f: { + type: 'mat3x4f', + validity: true + }, + mat4x2f: { + type: 'mat4x2f', + validity: true + }, + mat4x3f: { + type: 'mat4x3f', + validity: true + }, + mat4x4f: { + type: 'mat4x4f', + validity: true + }, + mat2x2h: { + type: 'mat2x2h', + validity: true, + f16: true + }, + mat2x3h: { + type: 'mat2x3h', + validity: true, + f16: true + }, + mat2x4h: { + type: 'mat2x4h', + validity: true, + f16: true + }, + mat3x2h: { + type: 'mat3x2h', + validity: true, + f16: true + }, + mat3x3h: { + type: 'mat3x3h', + validity: true, + f16: true + }, + mat3x4h: { + type: 'mat3x4h', + validity: true, + f16: true + }, + mat4x2h: { + type: 'mat4x2h', + validity: true, + f16: true + }, + mat4x3h: { + type: 'mat4x3h', + validity: true, + f16: true + }, + mat4x4h: { + type: 'mat4x4h', + validity: true, + f16: true + }, + + // Atomics + atomic_u32: { + type: 'atomic', + validity: 'atomic' + }, + atomic_i32: { + type: 'atomic', + validity: 'atomic' + }, + + // Sized arrays + array_u32: { + type: 'array', + validity: 'non-uniform' + }, + array_i32: { + type: 'array', + validity: 'non-uniform' + }, + array_f32: { + type: 'array', + validity: 'non-uniform' + }, + array_f16: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_bool: { + type: 'array', + validity: 'non-interface' + }, + array_vec2f: { + type: 'array', + validity: 'non-uniform' + }, + array_vec3f: { + type: 'array', + validity: true + }, + array_vec4f: { + type: 'array', + validity: true + }, + array_vec2h: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_vec3h: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_vec4h: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_vec2b: { + type: 'array, 16>', + validity: 'non-interface' + }, + array_vec3b: { + type: 'array, 16>', + validity: 'non-interface' + }, + array_vec4b: { + type: 'array, 16>', + validity: 'non-interface' + }, + array_mat2x2f: { + type: 'array', + validity: true + }, + array_mat2x4f: { + type: 'array', + validity: true + }, + array_mat4x2f: { + type: 'array', + validity: true + }, + array_mat4x4f: { + type: 'array', + validity: true + }, + array_mat2x2h: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_mat2x4h: { + type: 'array', + validity: true, + f16: true + }, + array_mat3x2h: { + type: 'array', + validity: 'non-uniform', + f16: true + }, + array_mat4x2h: { + type: 'array', + validity: true, + f16: true + }, + array_mat4x4h: { + type: 'array', + validity: true, + f16: true + }, + array_atomic: { + type: 'array, 16>', + validity: 'atomic' + }, + + // Runtime arrays + runtime_array_u32: { + type: 'array', + validity: 'storage' + }, + runtime_array_i32: { + type: 'array', + validity: 'storage' + }, + runtime_array_f32: { + type: 'array', + validity: 'storage' + }, + runtime_array_f16: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_bool: { + type: 'array', + validity: false + }, + runtime_array_vec2f: { + type: 'array', + validity: 'storage' + }, + runtime_array_vec3f: { + type: 'array', + validity: 'storage' + }, + runtime_array_vec4f: { + type: 'array', + validity: 'storage' + }, + runtime_array_vec2h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_vec3h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_vec4h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_vec2b: { + type: 'array>', + validity: false + }, + runtime_array_vec3b: { + type: 'array>', + validity: false + }, + runtime_array_vec4b: { + type: 'array>', + validity: false + }, + runtime_array_mat2x2f: { + type: 'array', + validity: 'storage' + }, + runtime_array_mat2x4f: { + type: 'array', + validity: 'storage' + }, + runtime_array_mat4x2f: { + type: 'array', + validity: 'storage' + }, + runtime_array_mat4x4f: { + type: 'array', + validity: 'storage' + }, + runtime_array_mat2x2h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_mat2x4h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_mat3x2h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_mat4x2h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_mat4x4h: { + type: 'array', + validity: 'storage', + f16: true + }, + runtime_array_atomic: { + type: 'array>', + validity: 'storage' + }, + + // Structs (and arrays of structs) + array_struct_u32: { + type: 'array', + decls: 'struct S { x : u32 }', + validity: 'non-uniform' + }, + array_struct_u32_size16: { + type: 'array', + decls: 'struct S { @size(16) x : u32 }', + validity: true + }, + array_struct_vec2f: { + type: 'array', + decls: 'struct S { x : vec2f }', + validity: 'non-uniform' + }, + array_struct_vec2h: { + type: 'array', + decls: 'struct S { x : vec2h }', + validity: 'non-uniform', + f16: true + }, + array_struct_vec2h_align16: { + type: 'array', + decls: 'struct S { @align(16) x : vec2h }', + validity: true, + f16: true + }, + size_too_small: { + type: 'S', + decls: 'struct S { @size(2) x : u32 }', + validity: false + }, + struct_padding: { + type: 'S', + decls: `struct T { x : u32 } + struct S { t : T, x : u32 }`, + validity: 'non-uniform' + }, + struct_array_u32: { + type: 'S', + decls: 'struct S { x : array }', + validity: 'non-uniform' + }, + struct_runtime_array_u32: { + type: 'S', + decls: 'struct S { x : array }', + validity: 'storage' + }, + array_struct_size_5: { + type: 'array', + decls: 'struct S { @size(5) x : u32, y : u32 }', + validity: 'non-uniform' + }, + array_struct_size_5x2: { + type: 'array', + decls: 'struct S { @size(5) x : u32, @size(5) y : u32 }', + validity: true + }, + struct_size_5: { + type: 'S', + decls: `struct T { @size(5) x : u32 } + struct S { x : u32, y : T }`, + validity: 'non-uniform' + }, + struct_size_5_align16: { + type: 'S', + decls: `struct T { @align(16) @size(5) x : u32 } + struct S { x : u32, y : T }`, + validity: true + } +}; + +g.test('layout_constraints'). +desc('Test address space layout constraints'). +params((u) => +u. +combine('case', keysOf(kLayoutCases)). +beginSubcases(). +combine('aspace', ['storage', 'uniform', 'function', 'private', 'workgroup']) +). +beforeAllSubcases((t) => { + const testcase = kLayoutCases[t.params.case]; + if (testcase.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kLayoutCases[t.params.case]; + const decls = testcase.decls !== undefined ? testcase.decls : ''; + let code = ` +${testcase.f16 ? 'enable f16;' : ''} +${decls} + +`; + + switch (t.params.aspace) { + case 'storage': + code += `@group(0) @binding(0) var v : ${testcase.type};\n`; + break; + case 'uniform': + code += `@group(0) @binding(0) var v : ${testcase.type};\n`; + break; + case 'workgroup': + code += `var v : ${testcase.type};\n`; + break; + case 'private': + code += `var v : ${testcase.type};\n`; + break; + default: + break; + } + + code += `@compute @workgroup_size(1,1,1) + fn main() { + `; + + if (t.params.aspace === 'function') { + code += `var v : ${testcase.type};\n`; + } + code += `}\n`; + + const is_interface = t.params.aspace === 'uniform' || t.params.aspace === 'storage'; + const supports_atomic = t.params.aspace === 'storage' || t.params.aspace === 'workgroup'; + const expect = + testcase.validity === true || + testcase.validity === 'non-uniform' && t.params.aspace !== 'uniform' || + testcase.validity === 'non-interface' && !is_interface || + testcase.validity === 'storage' && t.params.aspace === 'storage' || + testcase.validity === 'atomic' && supports_atomic; + t.expectCompileResult(expect, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/locations.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/locations.spec.js index 7dd5492283c..3acf43c6848 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/locations.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/locations.spec.js @@ -163,7 +163,7 @@ fn((t) => { } code += generateShader({ - attribute: '@location(0) @interpolate(flat)', + attribute: '@location(0) @interpolate(flat, either)', type: t.params.type, stage: 'fragment', io: 'in', @@ -344,6 +344,10 @@ const kValidationTests = { vec: { src: `@location(vec2(1,1))`, pass: false + }, + duplicate: { + src: `@location(0) @location(0)`, + pass: false } }; g.test('validation'). @@ -379,4 +383,153 @@ fn((t) => { return vec4f(); }`; t.expectCompileResult(t.params.ext === '', code); +}); + + + + + + + + + +const kOutOfOrderCases = { + reverse_params: { + params: `@location(2) p1 : f32, @location(1) p2 : f32, @location(0) p3 : f32`, + valid: true + }, + no_zero_params: { + params: `@location(2) p1 : f32, @location(1) p2 : f32`, + valid: true + }, + reverse_overlap: { + params: `@location(2) p1 : f32, @location(1) p2 : f32, @location(1) p3 : f32`, + valid: false + }, + struct: { + params: `p1 : S`, + decls: `struct S { + @location(1) x : f32, + @location(0) y : f32, + }`, + valid: true + }, + struct_override: { + params: `@location(0) p1 : S`, + decls: `struct S { + @location(1) x : f32, + @location(0) y : f32, + }`, + valid: false + }, + struct_random: { + params: `p1 : S, p2 : T`, + decls: `struct S { + @location(16) x : f32, + @location(4) y : f32, + } + struct T { + @location(13) x : f32, + @location(7) y : f32, + }`, + valid: true + }, + struct_random_overlap: { + params: `p1 : S, p2 : T`, + decls: `struct S { + @location(16) x : f32, + @location(4) y : f32, + } + struct T { + @location(13) x : f32, + @location(4) y : f32, + }`, + valid: false + }, + mixed_locations1: { + params: `@location(12) p1 : f32, p2 : S`, + decls: `struct S { + @location(2) x : f32, + }`, + valid: true + }, + mixed_locations2: { + params: `p1 : S, @location(2) p2 : f32`, + decls: `struct S { + @location(12) x : f32, + }`, + valid: true + }, + mixed_overlap: { + params: `p1 : S, @location(12) p2 : f32`, + decls: `struct S { + @location(12) x : f32, + }`, + valid: false + }, + with_param_builtin: { + params: `p : S`, + decls: `struct S { + @location(12) x : f32, + @builtin(position) pos : vec4f, + @location(0) y : f32, + }`, + valid: true + }, + non_zero_return: { + returnType: `@location(1) vec4f`, + returnValue: `vec4f()`, + valid: true + }, + reverse_return: { + returnType: `S`, + returnValue: `S()`, + decls: `struct S { + @location(2) x : f32, + @location(1) y : f32, + @location(0) z : f32, + }`, + valid: true + }, + gap_return: { + returnType: `S`, + returnValue: `S()`, + decls: `struct S { + @location(13) x : f32, + @location(7) y : f32, + @location(2) z : f32, + }`, + valid: true + }, + with_return_builtin: { + returnType: `S`, + returnValue: `S()`, + decls: `struct S { + @location(11) x : f32, + @builtin(frag_depth) d : f32, + @location(10) y : f32, + }`, + valid: true + } +}; + +g.test('out_of_order'). +desc(`Test validation of out of order locations`). +params((u) => u.combine('case', keysOf(kOutOfOrderCases))). +fn((t) => { + const testcase = kOutOfOrderCases[t.params.case]; + const decls = testcase.decls !== undefined ? testcase.decls : ``; + const params = testcase.params !== undefined ? testcase.params : ``; + const returnType = testcase.returnType !== undefined ? `-> ${testcase.returnType}` : ``; + const returnValue = testcase.returnValue !== undefined ? `return ${testcase.returnValue};` : ``; + const code = ` +${decls} + +@fragment +fn main(${params}) ${returnType} { + ${returnValue} +} +`; + + t.expectCompileResult(testcase.valid, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/pipeline_stage.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/pipeline_stage.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/pipeline_stage.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/pipeline_stage.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/size.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/size.spec.js index 22eecfc399d..b9ad40058c8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/size.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/size.spec.js @@ -27,6 +27,10 @@ const kSizeTests = { src: `@size(z)`, pass: true }, + const_expr: { + src: `@size(z + 4)`, + pass: true + }, trailing_comma: { src: `@size(4,)`, pass: true @@ -92,7 +96,11 @@ const kSizeTests = { src: `@size(4f)`, pass: false }, - duplicate: { + duplicate1: { + src: `@size(4) @size(4)`, + pass: false + }, + duplicate2: { src: `@size(4) @size(8)`, pass: false }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/util.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/util.js index 934016eaeab..38659014c88 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/util.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/util.js @@ -111,7 +111,7 @@ export const kResourceEmitters = new Map([ ['texture_storage_1d', basicEmitter('texture_storage_1d')], ['texture_storage_2d', basicEmitter('texture_storage_2d')], ['texture_storage_2d_array', basicEmitter('texture_storage_2d_array')], -['texture_storage_3d', basicEmitter('texture_storage_3d')], +['texture_storage_3d', basicEmitter('texture_storage_3d')], ['texture_depth_2d', basicEmitter('texture_depth_2d')], ['texture_depth_2d_array', basicEmitter('texture_depth_2d_array')], ['texture_depth_cube', basicEmitter('texture_depth_cube')], diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/workgroup_size.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/workgroup_size.spec.js index 4c8396bff08..8f3a09e1039 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/workgroup_size.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_io/workgroup_size.spec.js @@ -218,7 +218,11 @@ const kWorkgroupSizeTests = { pass: false }, - duplicate: { + duplicate1: { + src: `@workgroup_size(1) @workgroup_size(1)`, + pass: false + }, + duplicate2: { src: `@workgroup_size(1) @workgroup_size(2, 2, 2)`, pass: false diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_validation_test.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_validation_test.js index efbfe6e0090..82192482e21 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_validation_test.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/shader_validation_test.js @@ -30,9 +30,12 @@ export class ShaderValidationTest extends GPUTest { const compilationInfo = await shaderModule.getCompilationInfo(); // MAINTENANCE_TODO: Pretty-print error messages with source context. - const messagesLog = compilationInfo.messages. + const messagesLog = + compilationInfo.messages. map((m) => `${m.lineNum}:${m.linePos}: ${m.type}: ${m.message}`). - join('\n'); + join('\n') + + '\n\n---- shader ----\n' + + code; error.extra.compilationInfo = compilationInfo; if (compilationInfo.messages.some((m) => m.type === 'error')) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/break.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/break.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/break.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/break.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/break_if.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/break_if.spec.js similarity index 70% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/break_if.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/break_if.spec.js index a525d1514b3..a69f7a505bb 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/break_if.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/break_if.spec.js @@ -1,11 +1,41 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = `Validation tests for break if`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +**/export const description = `Validation tests for 'break if' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; +import { kTestTypes } from './test_types.js'; + export const g = makeTestGroup(ShaderValidationTest); +g.test('condition_type'). +desc(`Tests that an 'break if' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() { + loop { + continuing { + break if ${type.value}; + } + } +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + const kTests = { compound_break: { src: '{ break if true; }', @@ -89,53 +119,4 @@ fn vtx() -> @builtin(position) vec4f { } `; t.expectCompileResult(kTests[t.params.stmt].pass, code); -}); - -const vec_types = [2, 3, 4]. -map((i) => ['i32', 'u32', 'f32', 'f16'].map((j) => `vec${i}<${j}>`)). -reduce((a, c) => a.concat(c), []); -const f32_matrix_types = [2, 3, 4]. -map((i) => [2, 3, 4].map((j) => `mat${i}x${j}f`)). -reduce((a, c) => a.concat(c), []); -const f16_matrix_types = [2, 3, 4]. -map((i) => [2, 3, 4].map((j) => `mat${i}x${j}`)). -reduce((a, c) => a.concat(c), []); - -g.test('non_bool_param'). -desc('Test that break if fails with a non-bool parameter'). -params((u) => -u.combine('type', [ -'f32', -'f16', -'i32', -'u32', -'S', -...vec_types, -...f32_matrix_types, -...f16_matrix_types] -) -). -beforeAllSubcases((t) => { - if (t.params.type.includes('f16')) { - t.selectDeviceOrSkipTestCase('shader-f16'); - } -}). -fn((t) => { - const code = ` -struct S { - a: i32, -} - -@vertex -fn vtx() -> @builtin(position) vec4f { - var v: ${t.params.type}; - - loop { - continuing { - break if v; - } - } - return vec4f(1); -}`; - t.expectCompileResult(t.params.type === 'bool', code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/compound.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/compound.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/compound.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/compound.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const_assert.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/const_assert.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/const_assert.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/const_assert.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continue.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continue.spec.js new file mode 100644 index 00000000000..ed8a3b4cab6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continue.spec.js @@ -0,0 +1,113 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for continue`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kTests = { + continue: { + src: 'continue;', + pass: false + }, + compound_continue: { + src: '{ continue; }', + pass: false + }, + loop_continue: { + src: 'loop { if false { break; } continue; }', + pass: true + }, + while_continue: { + src: 'while true { continue; }', + pass: true + }, + for_continue: { + src: 'for (;true;) { continue; }', + pass: true + }, + continuing_continue: { + src: 'loop { continuing { continue; } }', + pass: false + }, + continuing_nested_loop_continue: { + src: 'loop { if false { break; } continuing { loop { if false { break; } continue; } } }', + pass: true + }, + if_continue: { + src: 'if true { continue; }', + pass: false + }, + nested_if_continue: { + src: 'while true { if true { continue; } }', + pass: true + }, + switch_case_continue: { + src: 'switch(1) { default: { continue; } }', + pass: false + }, + nested_switch_case_continue: { + src: 'while true { switch(1) { default: { continue; } } }', + pass: true + }, + return_continue: { + src: 'return continue;', + pass: false + }, + loop_continue_after_decl_used_in_continuing: { + src: 'loop { let cond = false; continue; continuing { break if cond; } }', + pass: true + }, + loop_continue_before_decl_used_in_continuing: { + src: 'loop { continue; let cond = false; continuing { break if cond; } }', + pass: false + }, + loop_continue_before_decl_not_used_in_continuing: { + src: 'loop { continue; let cond = false; continuing { break if false; } }', + pass: true + }, + loop_nested_continue_before_decl_used_in_continuing: { + src: 'loop { if false { continue; } let cond = false; continuing { break if cond; } }', + pass: false + }, + loop_continue_expression: { + src: 'loop { if false { break; } continue true; }', + pass: false + }, + for_init_continue: { + src: 'for (continue;;) { break; }', + pass: false + }, + for_condition_continue: { + src: 'for (;continue;) { break; }', + pass: false + }, + for_continue_continue: { + src: 'for (;;continue) { break; }', + pass: false + } +}; + +g.test('placement'). +desc('Test that continue placement is validated correctly'). +params((u) => u.combine('stmt', keysOf(kTests))). +fn((t) => { + const code = ` +@vertex +fn vtx() -> @builtin(position) vec4f { + ${kTests[t.params.stmt].src} + return vec4f(1); +} + `; + t.expectCompileResult(kTests[t.params.stmt].pass, code); +}); + +g.test('module_scope'). +desc('Test that continue is not valid at module-scope.'). +fn((t) => { + const code = ` +continue; + `; + t.expectCompileResult(false, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/continuing.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continuing.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/continuing.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/continuing.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/discard.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/discard.spec.js similarity index 100% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/parse/discard.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/discard.spec.js diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/for.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/for.spec.js new file mode 100644 index 00000000000..1cbd5e1dff0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/for.spec.js @@ -0,0 +1,94 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'for' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { kTestTypes } from './test_types.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('condition_type'). +desc(`Tests that a 'for' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() -> bool { + for (; ${type.value};) { + return true; + } + return false; +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + +const kTests = { + break: { wgsl: `for (;;) { break; }`, pass: true }, + + init_var: { wgsl: `for (var i = 1;;) { break; }`, pass: true }, + init_var_type: { wgsl: `for (var i : i32 = 1;;) { break; }`, pass: true }, + init_var_function: { wgsl: `for (var i = 1;;) { break; }`, pass: true }, + init_var_function_type: { wgsl: `for (var i : i32 = 1;;) { break; }`, pass: true }, + init_let: { wgsl: `for (let i = 1;;) { break; }`, pass: true }, + init_let_type: { wgsl: `for (let i : u32 = 1;;) { break; }`, pass: true }, + init_const: { wgsl: `for (const i = 1;;) { break; }`, pass: true }, + init_const_type: { wgsl: `for (const i : f32 = 1;;) { break; }`, pass: true }, + init_call: { wgsl: `for (x();;) { break; }`, pass: true }, + init_phony: { wgsl: `for (_ = v;;) { break; }`, pass: true }, + init_increment: { wgsl: `for (v++;;) { break; }`, pass: true }, + init_compound_assign: { wgsl: `for (v += 3;;) { break; }`, pass: true }, + + cond_true: { wgsl: `for (;true;) { break; }`, pass: true }, + + cont_call: { wgsl: `for (;;x()) { break; }`, pass: true }, + cont_phony: { wgsl: `for (;;_ = v) { break; }`, pass: true }, + cont_increment: { wgsl: `for (;;v++) { break; }`, pass: true }, + cont_compound_assign: { wgsl: `for (;;v += 3) { break; }`, pass: true }, + + init_cond: { wgsl: `for (var i = 1; i < 5;) {}`, pass: true }, + cond_cont: { wgsl: `for (;v < 5; v++) {}`, pass: true }, + init_cond_cont: { wgsl: `for (var i = 0; i < 5; i++) {}`, pass: true }, + init_shadow: { wgsl: `for (var f = 0; f < 5; f++) {}`, pass: true }, + + no_semicolon: { wgsl: `for () { break; }`, pass: false }, + one_semicolon: { wgsl: `for (;) { break; }`, pass: false }, + no_paren: { wgsl: `for ;; { break; }`, pass: false }, + empty: { wgsl: `for (;;) {}`, pass: false }, // note: fails due to behavior-analysis + init_expr: { wgsl: `for (true;;) { break; }`, pass: false }, + cond_stmt: { wgsl: `for (;var i = 0;) { break; }`, pass: false }, + cont_expr: { wgsl: `for (;;true) { break; }`, pass: false }, + cont_var: { wgsl: `for (;;var i = 1) { break; }`, pass: false }, + cont_var_type: { wgsl: `for (;;var i : i32 = 1) { break; }`, pass: false }, + cont_var_function: { wgsl: `for (;;var i = 1) { break; }`, pass: false }, + cont_var_function_type: { wgsl: `for (;;var i : i32 = 1) { break; }`, pass: false }, + cont_let: { wgsl: `for (;;let i = 1) { break; }`, pass: false }, + cont_let_type: { wgsl: `for (;;let i : u32 = 1) { break; }`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'for' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + var v = 1; + ${kTests[t.params.test].wgsl} +} + +fn x() {} +`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/if.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/if.spec.js new file mode 100644 index 00000000000..4b611ab3c9e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/if.spec.js @@ -0,0 +1,128 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'if' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { kTestTypes } from './test_types.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('condition_type'). +desc(`Tests that an 'if' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() -> bool { + if ${type.value} { + return true; + } + return false; +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + +g.test('else_condition_type'). +desc(`Tests that an 'else if' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f(c : bool) -> bool { + if (c) { + return true; + } else if (${type.value}) { + return true; + } + return false; +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + +const kTests = { + true: { wgsl: `if true {}`, pass: true }, + paren_true: { wgsl: `if (true) {}`, pass: true }, + expr: { wgsl: `if expr {}`, pass: true }, + paren_expr: { wgsl: `if (expr) {}`, pass: true }, + + true_else: { wgsl: `if true {} else {}`, pass: true }, + paren_true_else: { wgsl: `if (true) {} else {}`, pass: true }, + expr_else: { wgsl: `if expr {} else {}`, pass: true }, + paren_expr_else: { wgsl: `if (expr) {} else {}`, pass: true }, + + true_else_if_true: { wgsl: `if true {} else if true {}`, pass: true }, + paren_true_else_if_paren_true: { wgsl: `if (true) {} else if (true) {}`, pass: true }, + true_else_if_paren_true: { wgsl: `if true {} else if (true) {}`, pass: true }, + paren_true_else_if_true: { wgsl: `if (true) {} else if true {}`, pass: true }, + + expr_else_if_expr: { wgsl: `if expr {} else if expr {}`, pass: true }, + paren_expr_else_if_paren_expr: { wgsl: `if (expr) {} else if (expr) {}`, pass: true }, + expr_else_if_paren_expr: { wgsl: `if expr {} else if (expr) {}`, pass: true }, + paren_expr_else_if_expr: { wgsl: `if (expr) {} else if expr {}`, pass: true }, + + if: { wgsl: `if`, pass: false }, + block: { wgsl: `if{}`, pass: false }, + semicolon: { wgsl: `if;`, pass: false }, + true_lbrace: { wgsl: `if true {`, pass: false }, + true_rbrace: { wgsl: `if true }`, pass: false }, + + lparen_true: { wgsl: `if (true {}`, pass: false }, + rparen_true: { wgsl: `if )true {}`, pass: false }, + true_lparen: { wgsl: `if true( {}`, pass: false }, + true_rparen: { wgsl: `if true) {}`, pass: false }, + + true_else_if_no_block: { wgsl: `if true {} else if `, pass: false }, + true_else_if: { wgsl: `if true {} else if {}`, pass: false }, + true_else_if_semicolon: { wgsl: `if true {} else if ;`, pass: false }, + true_else_if_true_lbrace: { wgsl: `if true {} else if true {`, pass: false }, + true_else_if_true_rbrace: { wgsl: `if true {} else if true }`, pass: false }, + + true_else_if_lparen_true: { wgsl: `if true {} else if (true {}`, pass: false }, + true_else_if_rparen_true: { wgsl: `if true {} else if )true {}`, pass: false }, + true_else_if_true_lparen: { wgsl: `if true {} else if true( {}`, pass: false }, + true_else_if_true_rparen: { wgsl: `if true {} else if true) {}`, pass: false }, + + else: { wgsl: `else { }`, pass: false }, + else_if: { wgsl: `else if true { }`, pass: false }, + true_elif: { wgsl: `if (true) { } elif (true) {}`, pass: false }, + true_elsif: { wgsl: `if (true) { } elsif (true) {}`, pass: false }, + elif: { wgsl: `elif (true) {}`, pass: false }, + elsif: { wgsl: `elsif (true) {}`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'if' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + let expr = true; + ${kTests[t.params.test].wgsl} +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/increment_decrement.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/increment_decrement.spec.js new file mode 100644 index 00000000000..245fb041c8a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/increment_decrement.spec.js @@ -0,0 +1,270 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation for phony assignment statements`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { scalarTypeOf, Type } from '../../../util/conversion.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + + +const kConstructibleTypes = [ +'bool', +'i32', +'u32', +'f32', +'f16', +'vec2f', +'vec3h', +'vec4u', +'vec3b', +'mat2x3f', +'mat4x2h', +'abstractInt', +'abstractFloat']; + + +const kConstructibleCases = { + ...kConstructibleTypes.reduce( + (acc, t) => ({ + ...acc, + [t]: { + value: Type[t].create(1).wgsl(), + pass: t === 'i32' || t === 'u32' || t === 'abstractInt', + usesF16: scalarTypeOf(Type[t]).kind === 'f16' + } + }), + {} + ), + array: { value: 'array(1,2,3)', pass: false }, + struct: { value: 'S(1,2)', pass: false, gdecl: 'struct S{ a:u32, b:u32}' }, + atomic_u32: { value: 'xu', pass: false, gdecl: 'var xu: atomic;' }, + atomic_i32: { value: 'xi', pass: false, gdecl: 'var xi: atomic;' } +}; + +g.test('var_init_type'). +desc(`Test increment and decrement of a variable of various types`). +params((u) => u.combine('type', keysOf(kConstructibleCases)).combine('direction', ['up', 'down'])). +beforeAllSubcases((t) => { + const c = kConstructibleCases[t.params.type]; + if (c.usesF16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const { value, pass, usesF16, gdecl } = kConstructibleCases[t.params.type]; + const operator = t.params.direction === 'up' ? '++' : '--'; + const code = ` +${usesF16 ? 'enable f16;' : ''} +${gdecl ?? ''} +fn f() { + var a = ${value}; + a${operator}; +}`; + t.expectCompileResult(pass, code); +}); + + + + + + + + + +const kComponentCases = { + v2u_x: { type: 'vec2u', wgsl: 'a.x', pass: true }, + v2u_y: { type: 'vec2u', wgsl: 'a.y', pass: true }, + v3u_x: { type: 'vec3u', wgsl: 'a.x', pass: true }, + v3u_y: { type: 'vec3u', wgsl: 'a.y', pass: true }, + v3u_z: { type: 'vec3u', wgsl: 'a.z', pass: true }, + v4u_x: { type: 'vec4u', wgsl: 'a.x', pass: true }, + v4u_y: { type: 'vec4u', wgsl: 'a.y', pass: true }, + v4u_z: { type: 'vec4u', wgsl: 'a.z', pass: true }, + v4u_w: { type: 'vec4u', wgsl: 'a.w', pass: true }, + v2i_x: { type: 'vec2i', wgsl: 'a.x', pass: true }, + v2i_y: { type: 'vec2i', wgsl: 'a.y', pass: true }, + v3i_x: { type: 'vec3i', wgsl: 'a.x', pass: true }, + v3i_y: { type: 'vec3i', wgsl: 'a.y', pass: true }, + v3i_z: { type: 'vec3i', wgsl: 'a.z', pass: true }, + v4i_x: { type: 'vec4i', wgsl: 'a.x', pass: true }, + v4i_y: { type: 'vec4i', wgsl: 'a.y', pass: true }, + v4i_z: { type: 'vec4i', wgsl: 'a.z', pass: true }, + v4i_w: { type: 'vec4i', wgsl: 'a.w', pass: true }, + v2u_xx: { type: 'vec2u', wgsl: 'a.xx', pass: false }, + v2u_indexed: { type: 'vec2u', wgsl: 'a[0]', pass: true }, + v2f_x: { type: 'vec2f', wgsl: 'a.x', pass: false }, + v2h_x: { type: 'vec2h', wgsl: 'a.x', pass: false, usesF16: true }, + mat2x2f: { type: 'mat2x2f', wgsl: 'a[0][0]', pass: false }, + mat2x2h: { type: 'mat2x2h', wgsl: 'a[0][0]', pass: false, usesF16: true }, + array: { type: 'array', wgsl: 'a', pass: false }, + array_i: { type: 'array', wgsl: 'a[0]', pass: true }, + array_f: { type: 'array', wgsl: 'a[0]', pass: false }, + struct: { type: 'S', wgsl: 'S', pass: false, gdecl: 'struct S{field:i32}' }, + struct_var: { type: 'S', wgsl: 'a', pass: false, gdecl: 'struct S{field:i32}' }, + struct_field: { type: 'S', wgsl: 'a.field', pass: true, gdecl: 'struct S{field:i32}' } +}; + +g.test('component'). +desc('Test increment and decrement of component of various types'). +params((u) => u.combine('type', keysOf(kComponentCases)).combine('direction', ['up', 'down'])). +beforeAllSubcases((t) => { + const c = kComponentCases[t.params.type]; + if (c.usesF16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const { type, wgsl, pass, usesF16, gdecl } = kComponentCases[t.params.type]; + const operator = t.params.direction === 'up' ? '++' : '--'; + const code = ` +${usesF16 ? 'enable f16;' : ''} +${gdecl ?? ''} +fn f() { + var a: ${type}; + ${wgsl}${operator}; +}`; + t.expectCompileResult(pass, code); +}); + + + + + + + + + + +const kTests = { + var: { wgsl: 'a++;', pass: true }, + vector: { wgsl: 'v++;', pass: false }, + paren_var_paren: { wgsl: '(a)++;', pass: true }, + star_and_var: { wgsl: '*&a++;', pass: true }, + paren_star_and_var_paren: { wgsl: '(*&a)++;', pass: true }, + many_star_and_var: { wgsl: '*&*&*&a++;', pass: true }, + + space: { wgsl: 'a ++;', pass: true }, + tab: { wgsl: 'a\t++;', pass: true }, + newline: { wgsl: 'a\n++;', pass: true }, + cr: { wgsl: 'a\r++;', pass: true }, + space_space: { wgsl: 'a ++ ;', pass: true }, + plus_space_plus: { wgsl: 'a+ +;', pass: false }, + minux_space_minus: { wgsl: 'a- -;', pass: false }, + + no_var: { wgsl: '++;', pass: false }, + no_semi: { wgsl: 'a++', pass: false }, + prefix: { wgsl: '++a;', pass: false }, + + postfix_x: { wgsl: 'v++.x;', pass: false }, + postfix_r: { wgsl: 'v++.r;', pass: false }, + postfix_index: { wgsl: 'v++[0];', pass: false }, + postfix_field: { wgsl: 'a++.foo;', pass: false }, + + literal_i32: { wgsl: '12i++;', pass: false }, + literal_u32: { wgsl: '12u++;', pass: false }, + literal_abstract_int: { wgsl: '12++;', pass: false }, + literal_abstract_float: { wgsl: '12.0++;', pass: false }, + literal_f32: { wgsl: '12.0f++;', pass: false }, + + assign_to: { wgsl: 'a++ = 1;', pass: false }, + + at_global: { wgsl: '', pass: false, gdecl: 'var g:i32; g++;' }, + private: { wgsl: 'g++;', pass: true, gdecl: 'var g:i32;' }, + workgroup: { wgsl: 'g++;', pass: true, gdecl: 'var g:i32;' }, + storage_rw: { + wgsl: 'g++;', + pass: true, + gdecl: '@group(0) @binding(0) var g: i32;' + }, + storage_r: { + wgsl: 'g++;', + pass: false, + gdecl: '@group(0) @binding(0) var g: i32;' + }, + storage: { wgsl: 'g++;', pass: false, gdecl: '@group(0) @binding(0) var g: i32;' }, + uniform: { wgsl: 'g++;', pass: false, gdecl: '@group(0) @binding(0) var g: i32;' }, + texture: { wgsl: 'g++;', pass: false, gdecl: '@group(0) @binding(0) var g: texture_2d;' }, + texture_x: { + wgsl: 'g.x++;', + pass: false, + gdecl: '@group(0) @binding(0) var g: texture_2d;' + }, + texture_storage: { + wgsl: 'g++;', + pass: false, + gdecl: '@group(0) @binding(0) var g: texture_storage_2d;' + }, + texture_storage_x: { + wgsl: 'g.x++;', + pass: false, + gdecl: '@group(0) @binding(0) var g: texture_storage_2d;' + }, + sampler: { wgsl: 'g++;', pass: false, gdecl: '@group(0) @binding(0) var g: sampler;' }, + sampler_comparison: { + wgsl: 'g++;', + pass: false, + gdecl: '@group(0) @binding(0) var g: sampler_comparison;' + }, + override: { wgsl: 'g++;', pass: false, gdecl: 'override g:i32;' }, + global_const: { wgsl: 'g++;', pass: false, gdecl: 'const g:i32 = 0;' }, + workgroup_atomic: { wgsl: 'g++;', pass: false, gdecl: 'var g:atomic;' }, + storage_atomic: { + wgsl: 'g++;', + pass: false, + gdecl: '@group(0) @binding(0) var g:atomic;' + }, + + subexpr: { wgsl: 'a = b++;', pass: false }, + expr_paren: { wgsl: '(a++);', pass: false }, + expr_add: { wgsl: '0 + a++;', pass: false }, + expr_negate: { wgsl: '-a++;', pass: false }, + inc_inc: { wgsl: 'a++++;', pass: false }, + inc_space_inc: { wgsl: 'a++ ++;', pass: false }, + inc_dec: { wgsl: 'a++--;', pass: false }, + inc_space_dec: { wgsl: 'a++ --;', pass: false }, + paren_inc: { wgsl: '(a++)++;', pass: false }, + paren_dec: { wgsl: '(a++)--;', pass: false }, + + in_block: { wgsl: '{ a++; }', pass: true }, + in_for_init: { wgsl: 'for (a++;false;) {}', pass: true }, + in_for_cond: { wgsl: 'for (;a++;) {}', pass: false }, + in_for_update: { wgsl: 'for (;false;a++) {}', pass: true }, + in_for_update_semi: { wgsl: 'for (;false;a++;) {}', pass: false }, + in_continuing: { wgsl: 'loop { continuing { a++; break if true;}}', pass: true }, + + let: { wgsl: 'let c = a; c++;', pass: false }, + const: { wgsl: 'const c = 1; c++;', pass: false }, + builtin: { wgsl: 'max++', pass: false }, + enum: { wgsl: 'r32uint++', pass: false }, + param: { wgsl: '', pass: false, gdecl: 'fn bump(p: i32) { p++;}' } +}; + +g.test('parse'). +desc(`Test that increment and decrement statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests)).combine('direction', ['up', 'down'])). +fn((t) => { + const c = kTests[t.params.test]; + let { wgsl, gdecl } = c; + gdecl = gdecl ?? ''; + if (t.params.direction === 'down') { + wgsl = wgsl.replace('++', '--'); + gdecl = gdecl.replace('++', '--'); + } + + const code = ` +${gdecl} +fn f() { + var a: u32; + var b: u32; + var v: vec4u; + ${wgsl} +}`; + t.expectCompileResult(c.pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/loop.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/loop.spec.js new file mode 100644 index 00000000000..77ed4b0920f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/loop.spec.js @@ -0,0 +1,95 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'loop' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { kTestTypes } from './test_types.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('break_if_type'). +desc(`Tests that a 'break if' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() { + loop { + continuing { + break if ${type.value}; + } + } +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + +const kTests = { + break: { wgsl: `loop { break; }`, pass: true }, + return: { wgsl: `loop { return; }`, pass: true }, + break_continuing: { wgsl: `loop { break; continuing {} }`, pass: true }, + var_break: { wgsl: `loop { var a = 1; break; }`, pass: true }, + var_break_continuing_inc: { + wgsl: `loop { var a = 1; break; continuing { a += 1; }}`, + pass: true + }, + var_break_continuing_discard: { + wgsl: `loop { var a = 1; break; continuing { discard; }}`, + pass: true + }, + continuing_break_if: { + wgsl: `loop { continuing { break if true; } }`, + pass: true + }, + + expr_break: { wgsl: `loop expr { break; }`, pass: false }, + loop: { wgsl: `loop`, pass: false }, + continuing_break: { wgsl: `loop { continuing {} break; }`, pass: false }, + break_continuing_continue: { wgsl: `loop { break; continuing { continue; } }`, pass: false }, + break_continuing_return: { wgsl: `loop { break; continuing { return; } }`, pass: false }, + break_continuing_if_break: { + wgsl: `loop { break; continuing { if true { break; } }`, + pass: false + }, + break_continuing_if_return: { + wgsl: `loop { break; continuing { if true { return; } }`, + pass: false + }, + break_continuing_lbrace: { wgsl: `loop { break; continuing { }`, pass: false }, + break_continuing_rbrace: { wgsl: `loop { break; continuing } }`, pass: false }, + continuing: { wgsl: `loop { continuing {} }`, pass: false }, + semicolon: { wgsl: `loop;`, pass: false }, + lbrace: { wgsl: `loop {`, pass: false }, + rbrace: { wgsl: `loop }`, pass: false }, + lparen: { wgsl: `loop ({}`, pass: false }, + rparen: { wgsl: `loop ){}`, pass: false }, + + // note: these parse, but fails due to behavior-analysis + continue: { wgsl: `loop { continue; }`, pass: false }, + discard: { wgsl: `loop { discard; }`, pass: false }, + empty: { wgsl: `loop{}`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'loop' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + let expr = true; + ${kTests[t.params.test].wgsl} +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/phony.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/phony.spec.js new file mode 100644 index 00000000000..da106d26fbc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/phony.spec.js @@ -0,0 +1,172 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation for phony assignment statements`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { scalarTypeOf, Type } from '../../../util/conversion.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + + + + + + + + + +const kConstructibleTypes = [ +'bool', +'i32', +'u32', +'f32', +'f16', +'vec2f', +'vec3h', +'vec4u', +'vec3b', +'mat2x3f', +'mat4x2h', +'abstractInt', +'abstractFloat']; + + +const kConstructibleCases = { + ...kConstructibleTypes.reduce( + (acc, t) => ({ + ...acc, + [t]: { + value: Type[t].create(1).wgsl(), + pass: true, + usesF16: scalarTypeOf(Type[t]).kind === 'f16' + } + }), + {} + ), + array: { value: 'array(1,2,3)', pass: true }, + struct: { value: 'S(1,2)', pass: true, gdecl: 'struct S{ a:u32, b:u32}' }, + atomic_u32: { value: 'xu', pass: false, gdecl: 'var xu: atomic;' }, + atomic_i32: { value: 'xi', pass: false, gdecl: 'var xi: atomic;' } +}; + +g.test('rhs_constructible'). +desc(`Test that the rhs of 'phony assignment' can be a constructible.`). +params((u) => u.combine('type', keysOf(kConstructibleCases))). +beforeAllSubcases((t) => { + const c = kConstructibleCases[t.params.type]; + if (c.usesF16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const { value, pass, usesF16, gdecl } = kConstructibleCases[t.params.type]; + const code = ` +${usesF16 ? 'enable f16;' : ''} +${gdecl ?? ''} +fn f() { + _ = ${value}; +}`; + t.expectCompileResult(pass, code); +}); + +const kVarCases = { + storage: { value: 'x', gdecl: '@group(0) @binding(0) var x: array;', pass: true }, + storage_unsized: { + value: 'x', + gdecl: '@group(0) @binding(0) var x: array;', + pass: false + }, + storage_atomic: { + value: 'x', + gdecl: '@group(0) @binding(0) var x: atomic;', + pass: false + }, + uniform: { value: 'x', gdecl: '@group(0) @binding(0) var x: u32;', pass: true }, + texture: { value: 'x', gdecl: '@group(0) @binding(0) var x: texture_2d;', pass: true }, + sampler: { value: 'x', gdecl: '@group(0) @binding(0) var x: sampler;', pass: true }, + sampler_comparison: { + value: 'x', + gdecl: '@group(0) @binding(0) var x: sampler_comparison;', + pass: true + }, + private: { value: 'x', gdecl: 'var x: u32;', pass: true }, + workgroup: { value: 'x', gdecl: 'var x: u32;', pass: true }, + workgroup_atomic: { value: 'x', gdecl: 'var x: atomic;', pass: false }, + override: { value: 'o', gdecl: 'override o: u32;', pass: true }, + function_var: { value: 'x', ldecl: 'var x: u32;', pass: true }, + let: { value: 'v', ldecl: 'let v = 1;', pass: true }, + const: { value: 'c', gdecl: 'const c = 1;', pass: true }, + function_const: { value: 'c', ldecl: 'const c = 1;', pass: true }, + ptr: { value: '&x', ldecl: 'var x: u32;', pass: true }, + ptr_to_unsized: { + value: '&x', + gdecl: '@group(0) @binding(0) var x: array;', + pass: true + }, + indexed: { + value: 'x[0]', + gdecl: '@group(0) @binding(0) var x: array;', + pass: true + }, + user_fn: { value: 'f', pass: false }, + builtin: { value: 'max', pass: false }, + builtin_call: { value: 'max(1,1)', pass: true }, + user_call: { value: 'callee()', pass: true, gdecl: 'fn callee() -> i32 { return 0; }' }, + undeclared: { value: 'does_not_exist', pass: false } +}; + +g.test('rhs_with_decl'). +desc(`Test rhs of 'phony assignment' involving declared objects.`). +params((u) => u.combine('test', keysOf(kVarCases))). +fn((t) => { + const { value, pass, gdecl, ldecl } = kVarCases[t.params.test]; + const code = ` +${gdecl ?? ''} +@compute @workgroup_size(1) +fn f() { + ${ldecl ?? ''} + _ = ${value}; +}`; + t.expectCompileResult(pass, code); +}); + +const kTests = { + literal: { wgsl: `_ = 1;`, pass: true }, + expr: { wgsl: `_ = (1+v);`, pass: true }, + var: { wgsl: `_ = v;`, pass: true }, + + in_for_init: { wgsl: `for (_ = v;false;) {}`, pass: true }, + in_for_init_semi: { wgsl: `for (_ = v;;false;) {}`, pass: false }, + in_for_update: { wgsl: `for (;false; _ = v) {}`, pass: true }, + in_for_update_semi: { wgsl: `for (;false; _ = v;) {}`, pass: false }, + + in_block: { wgsl: `{_ = v;}`, pass: true }, + in_continuing: { wgsl: `loop { continuing { _ = v; break if true;}}`, pass: true }, + + in_paren: { wgsl: `(_ = v;)`, pass: false }, + + underscore: { wgsl: `_`, pass: false }, + underscore_semi: { wgsl: `_;`, pass: false }, + underscore_equal: { wgsl: `_=`, pass: false }, + underscore_equal_semi: { wgsl: `_=;`, pass: false }, + underscore_equal_underscore_semi: { wgsl: `_=_;`, pass: false }, + paren_underscore_paren: { wgsl: `(_) = 1;`, pass: false }, + // LHS is not a reference type + star_ampersand_undsscore: { wgsl: `*&_ = 1;`, pass: false }, + compound: { wgsl: `_ += 1;`, pass: false }, + equality: { wgsl: `_ == 1;`, pass: false }, + block: { wgsl: `_ = {};`, pass: false }, + return: { wgsl: `_ = return;`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'phony assignment' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + var v: u32; + ${kTests[t.params.test].wgsl} +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/return.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/return.spec.js new file mode 100644 index 00000000000..8c46a8a8eef --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/return.spec.js @@ -0,0 +1,156 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'return' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { isConvertible, scalarTypeOf, Type } from '../../../util/conversion.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kTestTypesNoAbstract = [ +'bool', +'i32', +'u32', +'f32', +'f16', +'vec2f', +'vec3h', +'vec4u', +'vec3b', +'mat2x3f', +'mat4x2h']; + + +const kTestTypes = [ +...kTestTypesNoAbstract, +'abstract-int', +'abstract-float', +'vec2af', +'vec3af', +'vec4af', +'vec2ai', +'vec3ai', +'vec4ai']; + + +g.test('return_missing_value'). +desc(`Tests that a 'return' must have a value if the function has a return type`). +params((u) => u.combine('type', [...kTestTypesNoAbstract, undefined])). +beforeAllSubcases((t) => { + if (t.params.type !== undefined && scalarTypeOf(Type[t.params.type]).kind) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = t.params.type ? Type[t.params.type] : undefined; + const enable = type && scalarTypeOf(type).kind === 'f16' ? 'enable f16;' : ''; + const code = ` +${enable} + +fn f()${type ? `-> ${type}` : ''} { + return; +} +`; + + const pass = type === undefined; + t.expectCompileResult(pass, code); +}); + +g.test('return_unexpected_value'). +desc(`Tests that a 'return' must not have a value if the function has no return type`). +params((u) => u.combine('type', [...kTestTypes, undefined])). +beforeAllSubcases((t) => { + if (t.params.type !== undefined && scalarTypeOf(Type[t.params.type]).kind) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = t.params.type ? Type[t.params.type] : undefined; + const enable = type && scalarTypeOf(type).kind === 'f16' ? 'enable f16;' : ''; + const code = ` +${enable} + +fn f() { + return ${type ? `${type.create(1).wgsl()}` : ''}; +} +`; + + const pass = type === undefined; + t.expectCompileResult(pass, code); +}); + +g.test('return_type_match'). +desc(`Tests that a 'return' value type must match the function return type`). +params((u) => +u.combine('return_value_type', kTestTypes).combine('fn_return_type', kTestTypesNoAbstract) +). +beforeAllSubcases((t) => { + if ( + scalarTypeOf(Type[t.params.return_value_type]).kind === 'f16' || + scalarTypeOf(Type[t.params.fn_return_type]).kind === 'f16') + { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const returnValueType = Type[t.params.return_value_type]; + const fnReturnType = Type[t.params.fn_return_type]; + const enable = + scalarTypeOf(returnValueType).kind === 'f16' || scalarTypeOf(fnReturnType).kind === 'f16' ? + 'enable f16;' : + ''; + const code = ` +${enable} + +fn f() -> ${fnReturnType} { + return ${returnValueType.create(1).wgsl()}; +} +`; + + const pass = isConvertible(returnValueType, fnReturnType); + t.expectCompileResult(pass, code); +}); + +const kTests = { + no_expr: { wgsl: `return;`, pass_value: false, pass_no_value: true }, + v: { wgsl: `return v;`, pass_value: true, pass_no_value: false }, + literal: { wgsl: `return 10;`, pass_value: true, pass_no_value: false }, + expr: { wgsl: `return 1 + 2;`, pass_value: true, pass_no_value: false }, + paren_expr: { wgsl: `return (1 + 2);`, pass_value: true, pass_no_value: false }, + call: { wgsl: `return x();`, pass_value: true, pass_no_value: false }, + + v_no_semicolon: { wgsl: `return v`, pass_value: false, pass_no_value: false }, + expr_no_semicolon: { wgsl: `return 1 + 2`, pass_value: false, pass_no_value: false }, + phony_assign: { wgsl: `return _ = 1;`, pass_value: false, pass_no_value: false }, + increment: { wgsl: `return v++;`, pass_value: false, pass_no_value: false }, + compound_assign: { wgsl: `return v += 4;`, pass_value: false, pass_no_value: false }, + lparen_literal: { wgsl: `return (4;`, pass_value: false, pass_no_value: false }, + literal_lparen: { wgsl: `return 4(;`, pass_value: false, pass_no_value: false }, + rparen_literal: { wgsl: `return )4;`, pass_value: false, pass_no_value: false }, + literal_rparen: { wgsl: `return 4);`, pass_value: false, pass_no_value: false }, + lparen_literal_lparen: { wgsl: `return (4(;`, pass_value: false, pass_no_value: false }, + rparen_literal_rparen: { wgsl: `return )4);`, pass_value: false, pass_no_value: false } +}; + +g.test('parse'). +desc(`Test that 'return' statements are parsed correctly.`). +params((u) => +u.combine('test', keysOf(kTests)).combine('fn_returns_value', [false, true]) +). +fn((t) => { + const code = ` +fn f() ${t.params.fn_returns_value ? '-> i32' : ''} { + let v = 42; + ${kTests[t.params.test].wgsl} +} +fn x() -> i32 { + return 1; +} +`; + t.expectCompileResult( + t.params.fn_returns_value ? + kTests[t.params.test].pass_value : + kTests[t.params.test].pass_no_value, + code + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/statement_behavior.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/statement_behavior.spec.js new file mode 100644 index 00000000000..95407a7d682 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/statement_behavior.spec.js @@ -0,0 +1,143 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Test statement behavior analysis. + +Functions must have a behavior of {Return}, {Next}, or {Return, Next}. +Functions with a return type must have a behavior of {Return}. + +Each statement in the function must be valid according to the table. +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kInvalidStatements = { + break: `break`, + break_if: `break if true`, + continue: `continue`, + loop1: `loop { }`, + loop2: `loop { continuing { } }`, + loop3: `loop { continue; continuing { } }`, + loop4: `loop { continuing { break; } }`, + loop5: `loop { continuing { continue; } }`, + loop6: `loop { continuing { return; } }`, + loop7: `loop { continue; break; }`, + loop8: `loop { continuing { break if true; return; } }`, + for1: `for (;;) { }`, + for2: `for (var i = 0; ; i++) { }`, + for3: `for (;; break) { }`, + for4: `for (;; continue ) { }`, + for5: `for (;; return ) { }`, + for6: `for (;;) { continue; break; }`, + // while loops always have break in their behaviors. + switch1: `switch (1) { case 1 { } }`, + sequence1: `return; loop { }`, + compound1: `{ loop { } }` +}; + +g.test('invalid_statements'). +desc('Test statements with invalid behaviors'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#behaviors-rules'). +params((u) => u.combine('body', keysOf(kInvalidStatements))). +fn((t) => { + const body = kInvalidStatements[t.params.body]; + const code = `fn foo() { + ${body}; + }`; + t.expectCompileResult(false, code); +}); + +const kValidStatements = { + empty: ``, + const_assert: `const_assert true`, + let: `let x = 1`, + var1: `var x = 1`, + var2: `var x : i32`, + assign: `v = 1`, + phony_assign: `_ = 1`, + compound_assign: `v += 1`, + return: `return`, + discard: `discard`, + function_call1: `bar()`, + function_call2: `workgroupBarrier()`, + + if1: `if true { } else { }`, + if2: `if true { }`, + + break1: `loop { break; }`, + break2: `loop { if false { break; } }`, + break_if: `loop { continuing { break if false; } }`, + + continue1: `loop { continue; continuing { break if true; } }`, + + loop1: `loop { break; }`, + loop2: `loop { break; continuing { } }`, + loop3: `loop { continue; continuing { break if true; } }`, + loop4: `loop { break; continue; }`, + + for1: `for (; true; ) { }`, + for2: `for (;;) { break; }`, + for3: `for (;true;) { continue; }`, + + while1: `while true { }`, + while2: `while true { continue; }`, + while3: `while true { continue; break; }`, + + switch1: `switch 1 { default { } }`, + swtich2: `switch 1 { case 1 { } default { } }`, + switch3: `switch 1 { default { break; } }`, + switch4: `switch 1 { default { } case 1 { break; } }`, + + sequence1: `return; let x = 1`, + sequence2: `if true { } let x = 1`, + sequence3: `switch 1 { default { break; return; } }`, + + compound1: `{ }`, + compound2: `{ loop { break; } if true { return; } }` +}; + +g.test('valid_statements'). +desc('Test statements with valid behaviors'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#behaviors-rules'). +params((u) => u.combine('body', keysOf(kValidStatements))). +fn((t) => { + const body = kValidStatements[t.params.body]; + const code = ` + var v : i32; + fn bar() { } + fn foo() { + ${body}; + }`; + t.expectCompileResult(true, code); +}); + +const kInvalidFunctions = { + next_for_type: `fn foo() -> bool { }`, + next_return_for_type: `fn foo() -> bool { if true { return true; } }` +}; + +g.test('invalid_functions'). +desc('Test functions with invalid behaviors'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#behaviors-rules'). +params((u) => u.combine('function', keysOf(kInvalidFunctions))). +fn((t) => { + const func = kInvalidFunctions[t.params.function]; + t.expectCompileResult(false, func); +}); + +const kValidFunctions = { + empty: `fn foo() { }`, + next_return: `fn foo() { if true { return; } }`, + no_final_return: `fn foo() -> bool { if true { return true; } else { return false; } }` +}; + +g.test('valid_functions'). +desc('Test functions with valid behaviors'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#behaviors-rules'). +params((u) => u.combine('function', keysOf(kValidFunctions))). +fn((t) => { + const func = kValidFunctions[t.params.function]; + t.expectCompileResult(true, func); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/switch.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/switch.spec.js new file mode 100644 index 00000000000..dcce0de1fba --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/switch.spec.js @@ -0,0 +1,172 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'switch' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { Type } from '../../../util/conversion.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { kTestTypes } from './test_types.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('condition_type'). +desc(`Tests that a 'switch' condition must be of an integer type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() -> bool { + switch ${type.value} { + case 1: { + return true; + } + default: { + return false; + } + } +} +`; + + const pass = + t.params.type === 'i32' || t.params.type === 'u32' || t.params.type === 'abstract-int'; + t.expectCompileResult(pass, code); +}); + +g.test('condition_type_match_case_type'). +desc(`Tests that a 'switch' condition must have a common type with its case values`). +params((u) => +u. +combine('cond_type', ['i32', 'u32', 'abstract-int']). +combine('case_type', ['i32', 'u32', 'abstract-int']) +). +fn((t) => { + const code = ` +fn f() -> bool { +switch ${Type[t.params.cond_type].create(1).wgsl()} { + case ${Type[t.params.case_type].create(2).wgsl()}: { + return true; + } + default: { + return false; + } +} +} +`; + + const pass = + t.params.cond_type === t.params.case_type || + t.params.cond_type === 'abstract-int' || + t.params.case_type === 'abstract-int'; + t.expectCompileResult(pass, code); +}); + +g.test('case_types_match'). +desc(`Tests that switch case types must have a common type`). +params((u) => +u. +combine('case_a_type', ['i32', 'u32', 'abstract-int']). +combine('case_b_type', ['i32', 'u32', 'abstract-int']) +). +fn((t) => { + const code = ` +fn f() -> bool { +switch 1 { + case ${Type[t.params.case_a_type].create(1).wgsl()}: { + return true; + } + case ${Type[t.params.case_b_type].create(2).wgsl()}: { + return true; + } + default: { + return false; + } +} +} +`; + + const pass = + t.params.case_a_type === t.params.case_b_type || + t.params.case_a_type === 'abstract-int' || + t.params.case_b_type === 'abstract-int'; + t.expectCompileResult(pass, code); +}); + +const kTests = { + L_default: { wgsl: `switch L { default {} }`, pass: true }, + L_paren_default: { wgsl: `switch (L) { default {} }`, pass: true }, + L_case_1_2_default: { wgsl: `switch L { case 1, 2 {} default {} }`, pass: true }, + L_case_1_case_2_default: { wgsl: `switch L { case 1 {} case 2 {} default {} }`, pass: true }, + L_case_1_colon_case_2_colon_default_colon: { + wgsl: `switch L { case 1: {} case 2: {} default: {} }`, + pass: true + }, + L_case_1_colon_default_colon: { wgsl: `switch L { case 1: {} default: {} }`, pass: true }, + L_case_1_colon_default: { wgsl: `switch L { case 1: {} default {} }`, pass: true }, + L_case_1_default_2: { wgsl: `switch L { case 1, default, 2 {} }`, pass: true }, + L_case_1_default_case_2: { wgsl: `switch L { case 1 {} default {} case 2 {} }`, pass: true }, + L_case_1_default_colon: { wgsl: `switch L { case 1 {} default: {} }`, pass: true }, + L_case_1_default: { wgsl: `switch L { case 1 {} default {} }`, pass: true }, + L_case_2_1_default: { wgsl: `switch L { case 2, 1 {} default {} }`, pass: true }, + L_case_2_case_1_default: { wgsl: `switch L { case 2 {} case 1 {} default {} }`, pass: true }, + L_case_2_default_case_1: { wgsl: `switch L { case 2 {} default {} case 1 {} }`, pass: true }, + L_case_builtin_default: { wgsl: `switch L { case max(1,2) {} default {} }`, pass: true }, + L_case_C1_case_C2_default: { wgsl: `switch L { case C1 {} case C2 {} default {} }`, pass: true }, + L_case_C1_default: { wgsl: `switch L { case C1 {} default {} }`, pass: true }, + L_case_default_1: { wgsl: `switch L { case default, 1 {} }`, pass: true }, + L_case_default_2_1: { wgsl: `switch L { case default, 2, 1 {} }`, pass: true }, + L_case_default_2_case_1: { wgsl: `switch L { case default, 2 {} case 1 {} }`, pass: true }, + L_case_default: { wgsl: `switch L { case default {} }`, pass: true }, + L_case_expr_default: { wgsl: `switch L { case 1+1 {} default {} }`, pass: true }, + L_default_break: { wgsl: `switch L { default { break; } }`, pass: true }, + L_default_case_1_2: { wgsl: `switch L { default {} case 1, 2 {} }`, pass: true }, + L_default_case_1_break: { wgsl: `switch L { default {} case 1 { break; } }`, pass: true }, + L_default_case_1_case_2: { wgsl: `switch L { default {} case 1 {} case 2 {} }`, pass: true }, + L_default_case_1_colon_break: { wgsl: `switch L { default {} case 1: { break; } }`, pass: true }, + L_default_case_2_case_1: { wgsl: `switch L { default {} case 2 {} case 1 {} }`, pass: true }, + L_default_colon_break: { wgsl: `switch L { default: { break; } }`, pass: true }, + L_default_colon: { wgsl: `switch L { default: {} }`, pass: true }, + + L_no_block: { wgsl: `switch L`, pass: false }, + L_empty_block: { wgsl: `switch L {}`, pass: false }, + L_no_default: { wgsl: `switch L { case 1 {} }`, pass: false }, + L_default_default: { wgsl: `switch L { default, default {} }`, pass: false }, + L_default_block_default_block: { wgsl: `switch L { default {} default {} }`, pass: false }, + L_case_1_case_1_default: { wgsl: `switch L { case 1 {} case 1 {} default {} }`, pass: false }, + L_case_C1_case_C1_default: { wgsl: `switch L { case C1 {} case C1 {} default {} }`, pass: false }, + L_case_C2_case_expr_default: { + wgsl: `switch L { case C2 {} case 1+1 {} default {} }`, + pass: false + }, + L_default_1: { wgsl: `switch L { default, 1 {} }`, pass: false }, + L_default_2_case_1: { wgsl: `switch L { default, 2 {} case 1 {} }`, pass: false }, + + no_cond: { wgsl: `switch { default{} }`, pass: false }, + no_cond_no_block: { wgsl: `switch;`, pass: false }, + lparen_L: { wgsl: `switch (L { default {}}`, pass: false }, + L_lparen: { wgsl: `switch L) { default {}}`, pass: false }, + lparen_L_lparen: { wgsl: `switch )L) { default {}}`, pass: false }, + rparen_L_rparen: { wgsl: `switch (L( { default {}}`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'switch' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + let L = 1; + const C1 = 1; + const C2 = 2; + ${kTests[t.params.test].wgsl} +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/test_types.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/test_types.js new file mode 100644 index 00000000000..1b3fd8567a9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/test_types.js @@ -0,0 +1,36 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/ + + + + + + +/** A selection of different types used by statement validation tests */ +export const kTestTypes = { + bool: { value: 'true' }, + i32: { value: '1i' }, + u32: { value: '1u' }, + f32: { value: '1f' }, + f16: { value: '1h', requires: 'f16' }, + 'abstract-int': { value: '1' }, + 'abstract-float': { value: '1.0' }, + vec2af: { value: 'vec2(1.0)' }, + vec3af: { value: 'vec3(1.0)' }, + vec4af: { value: 'vec4(1.0)' }, + vec2ai: { value: 'vec2(1)' }, + vec3ai: { value: 'vec3(1)' }, + vec4ai: { value: 'vec4(1)' }, + vec2f: { value: 'vec2f(1)' }, + vec3h: { value: 'vec3h(1)', requires: 'f16' }, + vec4u: { value: 'vec4u(1)' }, + vec3b: { value: 'vec3(true)' }, + mat2x3f: { value: 'mat2x3f(1, 2, 3, 4, 5, 6)' }, + mat4x2h: { value: 'mat4x2h(1, 2, 3, 4, 5, 6, 7, 8)', requires: 'f16' }, + array: { value: 'array(1, 2, 3, 4)' }, + atomic: { value: 'A', header: 'var A : atomic;' }, + struct: { value: 'Str(1)', header: 'struct Str{ i : i32 }' }, + texture: { value: 'T', header: '@group(0) @binding(0) var T : texture_2d;' }, + sampler: { value: 'S', header: '@group(0) @binding(1) var S : sampler;' } +}; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/while.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/while.spec.js new file mode 100644 index 00000000000..04316f05c31 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/statement/while.spec.js @@ -0,0 +1,71 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = `Validation tests for 'while' statements'`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { kTestTypes } from './test_types.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('condition_type'). +desc(`Tests that a 'while' condition must be a bool type`). +params((u) => u.combine('type', keysOf(kTestTypes))). +beforeAllSubcases((t) => { + if (kTestTypes[t.params.type].requires === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const type = kTestTypes[t.params.type]; + const code = ` +${type.requires ? `enable ${type.requires};` : ''} + +${type.header ?? ''} + +fn f() -> bool { + while (${type.value}) { + return true; + } + return false; +} +`; + + const pass = t.params.type === 'bool'; + t.expectCompileResult(pass, code); +}); + +const kTests = { + true: { wgsl: `while true {}`, pass: true }, + paren_true: { wgsl: `while (true) {}`, pass: true }, + true_break: { wgsl: `while true { break; }`, pass: true }, + true_discard: { wgsl: `while true { discard; }`, pass: true }, + true_return: { wgsl: `while true { return; }`, pass: true }, + expr: { wgsl: `while expr {}`, pass: true }, + paren_expr: { wgsl: `while (expr) {}`, pass: true }, + + while: { wgsl: `while`, pass: false }, + block: { wgsl: `while{}`, pass: false }, + semicolon: { wgsl: `while;`, pass: false }, + true_lbrace: { wgsl: `while true {`, pass: false }, + true_rbrace: { wgsl: `while true }`, pass: false }, + + lparen_true: { wgsl: `while (true {}`, pass: false }, + rparen_true: { wgsl: `while )true {}`, pass: false }, + true_lparen: { wgsl: `while true( {}`, pass: false }, + true_rparen: { wgsl: `while true) {}`, pass: false }, + lparen_true_lparen: { wgsl: `while (true( {}`, pass: false }, + rparen_true_rparen: { wgsl: `while )true) {}`, pass: false } +}; + +g.test('parse'). +desc(`Test that 'while' statements are parsed correctly.`). +params((u) => u.combine('test', keysOf(kTests))). +fn((t) => { + const code = ` +fn f() { + let expr = true; + ${kTests[t.params.test].wgsl} +}`; + t.expectCompileResult(kTests[t.params.test].pass, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/alias.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/alias.spec.js index 012652df4ba..7a4b9626aea 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/alias.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/alias.spec.js @@ -3,6 +3,7 @@ **/export const description = ` Validation tests for type aliases `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); @@ -120,4 +121,125 @@ struct S { alias T = ${t.params.target}; `; t.expectCompileResult(t.params.target === 'i32', wgsl); +}); + +const kTypes = [ +'bool', +'i32', +'u32', +'f32', +'f16', +'vec2', +'vec3', +'vec4', +'mat2x2', +'mat2x3', +'mat2x4', +'mat3x2', +'mat3x3', +'mat3x4', +'mat4x2', +'mat4x3', +'mat4x4', +'array', +'array', +'array, 8>', +'S', +'T', +'atomic', +'atomic', +'ptr', +'ptr', +'ptr', +'ptr', +'ptr', +'ptr', +'ptr', +'sampler', +'sampler_comparison', +'texture_1d', +'texture_2d', +'texture_2d_array', +'texture_3d', +'texture_cube', +'texture_cube_array', +'texture_multisampled_2d', +'texture_depth_multisampled_2d', +'texture_external', +'texture_storage_1d', +'texture_storage_1d', +'texture_storage_1d', +'texture_storage_1d', +'texture_storage_2d', +'texture_storage_2d_array', +'texture_storage_3d', +'texture_depth_2d', +'texture_depth_2d_array', +'texture_depth_cube', +'texture_depth_cube_array', + +// Pre-declared aliases (spot check) +'vec2f', +'vec3u', +'vec4i', +'mat2x2f', + +// User-defined aliases +'anotherAlias', +'random_alias']; + + +g.test('any_type'). +desc('Test that any type can be aliased'). +params((u) => u.combine('type', kTypes)). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const ty = t.params.type; + t.skipIf( + ty.includes('texture_storage') && + ty.includes('read') && + !t.hasLanguageFeature('readonly_and_readwrite_storage_textures'), + 'Missing language feature' + ); + const enable = ty === 'f16' ? 'enable f16;' : ''; + const code = ` + ${enable} + struct S { x : u32 } + struct T { y : S } + alias anotherAlias = u32; + alias random_alias = i32; + alias myType = ${ty};`; + t.expectCompileResult(true, code); +}); + +const kMatchCases = { + function_param: ` + fn foo(x : u32) { } + fn bar() { + var x : alias_alias_u32; + foo(x); + }`, + constructor: `var v : u32 = alias_u32(1);`, + template_param: `var v : vec2 = vec2();`, + predeclared_alias: `var v : vec2 = vec2u();`, + struct_element: ` + struct S { x : alias_u32 } + const c_u32 = 0u; + const c = S(c_u32);` +}; + +g.test('match_non_alias'). +desc('Test that type checking succeeds using aliased and unaliased type'). +params((u) => u.combine('case', keysOf(kMatchCases))). +fn((t) => { + const testcase = kMatchCases[t.params.case]; + const code = ` + alias alias_u32 = u32; + alias alias_alias_u32 = alias_u32; + ${testcase}`; + t.expectCompileResult(true, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/array.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/array.spec.js new file mode 100644 index 00000000000..e8b704f4c65 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/array.spec.js @@ -0,0 +1,176 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for array types +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidCases = { + // Basic element types. + i32: `alias T = array;`, + u32: `alias T = array;`, + f32: `alias T = array;`, + f16: `enable f16;\nalias T = array;`, + bool: `alias T = array;`, + + // Composite elements + vec2u: `alias T = array;`, + vec3i: `alias T = array;`, + vec4f: `alias T = array;`, + array: `alias T = array>;`, + struct: `struct S { x : u32 }\nalias T = array;`, + mat2x2f: `alias T = array;`, + mat4x4h: `enable f16;\nalias T = array;`, + + // Atomic elements + atomicu: `alias T = array>;`, + atomici: `alias T = array>;`, + + // Count expressions + literal_count: `alias T = array;`, + literali_count: `alias T = array;`, + literalu_count: `alias T = array;`, + const_count: `const x = 8;\nalias T = array;`, + const_expr_count1: `alias T = array;`, + const_expr_count2: `const x = 4;\nalias T = array;`, + const_expr_func: `alias T = array;`, + override_count: `override x : u32;\nalias T = array;`, + override_expr1: `override x = 2;\nalias T = array;`, + override_expr2: `override x = 1;\nalias T = array;`, + override_zero: `override x = 0;\nalias T = array;`, + override_neg: `override x = -1;\nalias T = array;`, + + // Same array types + same_const_value1: ` + const x = 8; + const y = 8; + var v : array = array();`, + same_const_value2: ` + const x = 8; + var v : array = array();`, + same_const_value3: ` + var v : array = array();`, + same_override: ` + requires unrestricted_pointer_parameters; + override x : u32; + var v : array; + fn bar(p : ptr>) { } + fn foo() { bar(&v); }`, + same_rta: ` + requires unrestricted_pointer_parameters; + @group(0) @binding(0) var x : array; + fn foo(p : ptr>) { } + fn bar() { foo(&x); }`, + + // Shadow + shadow: `alias array = vec2f;`, + + trailing_comma1: `alias T = array;`, + trailing_comma2: `alias T = array;`, + + alias_element: `alias T = u32; alias U = array;` +}; + +g.test('valid'). +desc('Valid array type tests'). +params((u) => u.combine('case', keysOf(kValidCases))). +beforeAllSubcases((t) => { + const code = kValidCases[t.params.case]; + if (code.indexOf('f16') >= 0) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = kValidCases[t.params.case]; + t.skipIf( + code.indexOf('unrestricted') >= 0 && !t.hasLanguageFeature('unrestricted_pointer_parameters'), + 'Test requires unrestricted_pointer_parameters' + ); + t.expectCompileResult(true, code); +}); + +const kInvalidCases = { + f16_without_enable: `alias T = array;`, + texture: `alias T = array, 4>;`, + sampler: `alias T = array;`, + runtime_nested: `alias T = array, 4>;`, + override_nested: ` + override x : u32; + alias T = array, 4>;`, + override_nested_struct: ` + override x : u32; + struct T { x : array }`, + zero_size: `alias T = array;`, + negative_size: `alias T = array;`, + const_zero: `const x = 0;\nalias T = array;`, + const_neg: `const x = 1;\nconst y = 2;\nalias T = array;`, + float_size: `alias T = array;`, + incompatible_overrides: ` + requires unrestricted_pointer_parameters; + override x = 8; + override y = 8; + var v : array + fn bar(p : ptr>) { } + fn foo() { bar(&v); }`, + incompatible_size: ` + var x : array; + fn foo(a : array) { } + fn bar() { foo(x); }`, + incompatible_element: ` + const x : array = array(1,2,3,4); + var y : array = x;`, + incompatible_rta: ` + requires unrestricted_pointer_parameters; + @group(0) @binding(0) var x : array; + fn foo(p : ptr>) { } + fn bar() { foo(&x); }`, + incompatible_override_element: ` + requires unrestricted_pointer_parameters; + override x : i32; + var v : array; + fn bar(p : ptr>) { } + fn foo() { bar(&v); }`, + override_function: ` + override x : i32; + fn foo() { var v : array; }`, + override_private: ` + override x : u32; + var v : array;`, + override_uniform: ` + override x : u32; + @group(0) @binding(0) var v : array;`, + override_storage: ` + override x : u32; + @group(0) @binding(0) var v : array;`, + + // Parsing failures + missing_r_template: `alias T = array;`, + missing_type: `alias T = array<4>;`, + bad_type: `alias T = array;`, + missing_l_template_rta: `alias T = arrayu32>;`, + missing_r_template_rta: `alias T = array;`, + inline_struct: `alias T = array;` +}; + +g.test('invalid'). +desc('Invalid array type tests'). +params((u) => u.combine('case', keysOf(kInvalidCases))). +beforeAllSubcases((t) => { + const code = kInvalidCases[t.params.case]; + if (code.indexOf('f16') >= 0) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = kInvalidCases[t.params.case]; + t.skipIf( + code.indexOf('unrestricted') >= 0 && !t.hasLanguageFeature('unrestricted_pointer_parameters'), + 'Test requires unrestricted_pointer_parameters' + ); + t.expectCompileResult(false, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/atomics.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/atomics.spec.js new file mode 100644 index 00000000000..59ed9f36151 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/atomics.spec.js @@ -0,0 +1,199 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for atomic types + +Tests covered: +* Base type +* Address spaces +* Invalid operations (non-exhaustive) + +Note: valid operations (e.g. atomic built-in functions) are tested in the builtin tests. +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('type'). +desc('Test of the underlying atomic data type'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#atomic-types'). +params((u) => +u.combine('type', [ +'u32', +'i32', +'f32', +'f16', +'bool', +'vec2u', +'vec3i', +'vec4f', +'mat2x2f', +'R', +'S', +'array', +'array', +'array', +'array', +'atomic', +'atomic', +'sampler'] +) +). +beforeAllSubcases((t) => { + if (t.params.type === 'f16') { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = ` +struct S { + x : u32 +} +struct T { + x : i32 +} +struct R { + x : f32 +} + +struct Test { + x : atomic<${t.params.type}> +} +`; + + const expect = t.params.type === 'u32' || t.params.type === 'i32'; + t.expectCompileResult(expect, code); +}); + +const kSpecifierCases = { + no_type: { + code: `alias T = atomic;`, + valid: false + }, + missing_l_template: { + code: `alias T = atomici32>;`, + valid: false + }, + missing_r_template: { + code: `alias T = atomic;`, + valid: true + }, + missing_template_param: { + code: `alias T = atomic<>;`, + valid: false + }, + space_in_specifier: { + code: `alias T = atomic ;`, + valid: true + }, + space_as_l_template: { + code: `alias T = atomic i32>;`, + valid: false + }, + comment: { + code: `alias T = atomic + /* comment */ + ;`, + valid: true + } +}; + +g.test('parse'). +desc('Test atomic parsing'). +params((u) => u.combine('case', keysOf(kSpecifierCases))). +fn((t) => { + const testcase = kSpecifierCases[t.params.case]; + t.expectCompileResult(testcase.valid, testcase.code); +}); + +g.test('address_space'). +desc('Test allowed address spaces for atomics'). +specURL('https://gpuweb.github.io/gpuweb/wgsl/#atomic-types'). +params((u) => +u. +combine('aspace', [ +'storage', +'workgroup', +'storage-ro', +'uniform', +'private', +'function', +'function-let'] +). +beginSubcases(). +combine('type', ['i32', 'u32']) +). +fn((t) => { + let moduleVar = ``; + let functionVar = ''; + switch (t.params.aspace) { + case 'storage-ro': + moduleVar = `@group(0) @binding(0) var x : atomic<${t.params.type}>;\n`; + break; + case 'storage': + moduleVar = `@group(0) @binding(0) var x : atomic<${t.params.type}>;\n`; + break; + case 'uniform': + moduleVar = `@group(0) @binding(0) var x : atomic<${t.params.type}>;\n`; + break; + case 'workgroup': + case 'private': + moduleVar = `var<${t.params.aspace}> x : atomic<${t.params.type}>;\n`; + break; + case 'function': + functionVar = `var x : atomic<${t.params.type}>;\n`; + break; + case 'function-let': + functionVar = `let x : atomic<${t.params.type}>;\n`; + break; + } + const code = ` +${moduleVar} + +fn foo() { + ${functionVar} +} +`; + + const expect = t.params.aspace === 'storage' || t.params.aspace === 'workgroup'; + t.expectCompileResult(expect, code); +}); + +const kInvalidOperations = { + add: `a1 + a2`, + load: `a1`, + store: `a1 = 1u`, + deref: `*a1 = 1u`, + equality: `a1 == a2`, + abs: `abs(a1)`, + address_abs: `abs(&a1)` +}; + +g.test('invalid_operations'). +desc('Tests that a selection of invalid operations are invalid'). +params((u) => u.combine('op', keysOf(kInvalidOperations))). +fn((t) => { + const code = ` +var a1 : atomic; +var a2 : atomic; + +fn foo() { + let x : u32 = ${kInvalidOperations[t.params.op]}; +} +`; + + t.expectCompileResult(false, code); +}); + +g.test('trailing_comma'). +desc('Test that trailing commas are accepted'). +params((u) => u.combine('type', ['u32', 'i32']).combine('comma', ['', ','])). +fn((t) => { + const code = `alias T = atomic<${t.params.type}${t.params.comma}>;`; + t.expectCompileResult(true, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/enumerant.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/enumerant.spec.js new file mode 100644 index 00000000000..55757f327d0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/enumerant.spec.js @@ -0,0 +1,89 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for enumerant types. + +* Values cannot be declared with the type +* Enumerant values cannot be used as values +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kEnumerantTypes = ['access_mode', 'address_space', 'texel_format']; + +g.test('type_declaration'). +desc('Tests that enumerants cannot be used as a type'). +params((u) => u.combine('enum', kEnumerantTypes)). +fn((t) => { + const code = `alias T = ${t.params.enum};`; + t.expectCompileResult(false, code); +}); + +const kValueDecls = ['var', 'let', 'const', 'override']; + +g.test('value_type'). +desc('Tests that enumerant types cannot be the type of declaration'). +params((u) => u.combine('enum', kEnumerantTypes).beginSubcases().combine('decl', kValueDecls)). +fn((t) => { + const decl = `${t.params.decl} x : ${t.params.enum};`; + let code = ``; + if (t.params.decl === 'override') { + code = `${decl}`; + } else { + code = `fn foo() { + ${decl} + }`; + } + t.expectCompileResult(false, code); +}); + +const kEnumerantValues = [ +// Access modes +'read', +'write', +'read_write', + +// Address spaces +'function', +'private', +'workgroup', +'storage', +'uniform', +'handle', + +// Texel formats +'rgba8unorm', +'rgba8snorm', +'rgba8uint', +'rgba8sint', +'rgba16uint', +'rgba16sint', +'rgba16float', +'r32uint', +'r32sint', +'r32float', +'rg32uint', +'rg32sint', +'rg32float', +'rgba32uint', +'rgba32sint', +'rgba32float', +'bgra8unorm']; + + +g.test('decl_value'). +desc('Tests that enumerant values cannot be used as declaration value'). +params((u) => u.combine('value', kEnumerantValues).beginSubcases().combine('decl', kValueDecls)). +fn((t) => { + const decl = `${t.params.decl} x = ${t.params.value};`; + let code = ``; + if (t.params.decl === 'override') { + code = `${decl}`; + } else { + code = `fn foo() { + ${decl} + }`; + } + t.expectCompileResult(false, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/matrix.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/matrix.spec.js new file mode 100644 index 00000000000..750767d66ad --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/matrix.spec.js @@ -0,0 +1,160 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for matrix types +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kValidCases = { + // Basic matrices + mat2x2_f32: `alias T = mat2x2;`, + mat2x3_f32: `alias T = mat2x3;`, + mat2x4_f32: `alias T = mat2x4;`, + mat3x2_f32: `alias T = mat3x2;`, + mat3x3_f32: `alias T = mat3x3;`, + mat3x4_f32: `alias T = mat3x4;`, + mat4x2_f32: `alias T = mat4x2;`, + mat4x3_f32: `alias T = mat4x3;`, + mat4x4_f32: `alias T = mat4x4;`, + mat2x2_f16: `enable f16;\nalias T = mat2x2;`, + mat2x3_f16: `enable f16;\nalias T = mat2x3;`, + mat2x4_f16: `enable f16;\nalias T = mat2x4;`, + mat3x2_f16: `enable f16;\nalias T = mat3x2;`, + mat3x3_f16: `enable f16;\nalias T = mat3x3;`, + mat3x4_f16: `enable f16;\nalias T = mat3x4;`, + mat4x2_f16: `enable f16;\nalias T = mat4x2;`, + mat4x3_f16: `enable f16;\nalias T = mat4x3;`, + mat4x4_f16: `enable f16;\nalias T = mat4x4;`, + + // Pre-declared aliases + mat2x2f: `alias T = mat2x2f;`, + mat2x3f: `alias T = mat2x3f;`, + mat2x4f: `alias T = mat2x4f;`, + mat3x2f: `alias T = mat3x2f;`, + mat3x3f: `alias T = mat3x3f;`, + mat3x4f: `alias T = mat3x4f;`, + mat4x2f: `alias T = mat4x2f;`, + mat4x3f: `alias T = mat4x3f;`, + mat4x4f: `alias T = mat4x4f;`, + mat2x2h: `enable f16;\nalias T = mat2x2h;`, + mat2x3h: `enable f16;\nalias T = mat2x3h;`, + mat2x4h: `enable f16;\nalias T = mat2x4h;`, + mat3x2h: `enable f16;\nalias T = mat3x2h;`, + mat3x3h: `enable f16;\nalias T = mat3x3h;`, + mat3x4h: `enable f16;\nalias T = mat3x4h;`, + mat4x2h: `enable f16;\nalias T = mat4x2h;`, + mat4x3h: `enable f16;\nalias T = mat4x3h;`, + mat4x4h: `enable f16;\nalias T = mat4x4h;`, + + trailing_comma: `alias T = mat2x2;`, + + // Abstract matrices + abstract_2x2: `const m = mat2x2(1,1,1,1);`, + abstract_2x3: `const m = mat2x3(1,1,1,1,1,1);`, + abstract_2x4: `const m = mat2x4(1,1,1,1,1,1,1,1);`, + + // Base roots shadowable + shadow_mat2x2: `alias mat2x2 = array;`, + shadow_mat2x3: `alias mat2x3 = array;`, + shadow_mat2x4: `alias mat2x4 = array;`, + shadow_mat3x2: `alias mat3x2 = array;`, + shadow_mat3x3: `alias mat3x3 = array;`, + shadow_mat3x4: `alias mat3x4 = array;`, + shadow_mat4x2: `alias mat4x2 = array;`, + shadow_mat4x3: `alias mat4x3 = array;`, + shadow_mat4x4: `alias mat4x4 = array;`, + + // Pre-declared aliases shadowable + shadow_mat2x2f: `alias mat2x2f = mat2x2;`, + shadow_mat2x3f: `alias mat2x3f = mat2x3;`, + shadow_mat2x4f: `alias mat2x4f = mat2x4;`, + shadow_mat3x2f: `alias mat3x2f = mat3x2;`, + shadow_mat3x3f: `alias mat3x3f = mat3x3;`, + shadow_mat3x4f: `alias mat3x4f = mat3x4;`, + shadow_mat4x2f: `alias mat4x2f = mat4x2;`, + shadow_mat4x3f: `alias mat4x3f = mat4x3;`, + shadow_mat4x4f: `alias mat4x4f = mat4x4;`, + shadow_mat2x2h: `enable f16;\nalias mat2x2h = mat2x2;`, + shadow_mat2x3h: `enable f16;\nalias mat2x3h = mat2x3;`, + shadow_mat2x4h: `enable f16;\nalias mat2x4h = mat2x4;`, + shadow_mat3x2h: `enable f16;\nalias mat3x2h = mat3x2;`, + shadow_mat3x3h: `enable f16;\nalias mat3x3h = mat3x3;`, + shadow_mat3x4h: `enable f16;\nalias mat3x4h = mat3x4;`, + shadow_mat4x2h: `enable f16;\nalias mat4x2h = mat4x2;`, + shadow_mat4x3h: `enable f16;\nalias mat4x3h = mat4x3;`, + shadow_mat4x4h: `enable f16;\nalias mat4x4h = mat4x4;`, + + // Alias + alias: `alias E = f32; alias T = mat2x2;` +}; + +g.test('valid'). +desc('Valid matrix type tests'). +params((u) => u.combine('case', keysOf(kValidCases))). +beforeAllSubcases((t) => { + const code = kValidCases[t.params.case]; + if (code.indexOf('f16') >= 0) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = kValidCases[t.params.case]; + t.expectCompileResult(true, code); +}); + +const kInvalidCases = { + // Invalid component types + mat2x2_i32: `alias T = mat2x2;`, + mat3x3_u32: `alias T = mat3x3;`, + mat4x4_bool: `alias T = mat4x4;`, + mat2x2_vec4f: `alias T = mat2x2;`, + mat2x2_array: `alias T = mat2x2>;`, + mat2x2_struct: `struct S { x : f32 }\nalias T = mat2x2;`, + + // Invalid dimensions + mat1x1: `alias T = mat1x1;`, + mat2x1: `alias T = mat2x1;`, + mat2x5: `alias T = mat2x5;`, + mat5x5: `alias T = mat5x5;`, + mat2x: `alias T = mat2x;`, + matx2: `alias T = matx2;`, + mat2: `alias T = mat2;`, + mat: `alias T = mat;`, + mat_f32: `alias T = mat;`, + + // Half-precision aliases require enable + no_enable_mat2x2h: `alias T = mat2x2h;`, + no_enable_mat2x3h: `alias T = mat2x3h;`, + no_enable_mat2x4h: `alias T = mat2x4h;`, + no_enable_mat3x2h: `alias T = mat3x2h;`, + no_enable_mat3x3h: `alias T = mat3x3h;`, + no_enable_mat3x4h: `alias T = mat3x4h;`, + no_enable_mat4x2h: `alias T = mat4x2h;`, + no_enable_mat4x3h: `alias T = mat4x3h;`, + no_enable_mat4x4h: `alias T = mat4x4h;`, + + missing_template: `alias T = mat2x2;`, + missing_left_template: `alias T = mat2x2f32>;`, + missing_right_template: `alias T = mat2x2;`, + mat2x2i: `alias T = mat2x2i;`, + mat2x2u: `alias T = mat2x2u;`, + mat2x2b: `alias T = mat2x2b;` +}; + +g.test('invalid'). +desc('Invalid matrix type tests'). +params((u) => u.combine('case', keysOf(kInvalidCases))). +beforeAllSubcases((t) => { + const code = kInvalidCases[t.params.case]; + if (code.indexOf('f16') >= 0) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const code = kInvalidCases[t.params.case]; + t.expectCompileResult(false, code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/ptr_spelling.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/pointer.spec.js similarity index 54% rename from tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/ptr_spelling.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/pointer.spec.js index 14e578b2440..9a205edd9ec 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/decl/ptr_spelling.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/pointer.spec.js @@ -1,29 +1,8 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/export const description = ` -Validate spelling of pointer types. - -Pointer types may appear. - -They are parameterized by: -- address space, always -- store type -- and access mode, as specified by the table in Address Spaces. - Concretely, only 'storage' address space allows it, and allows 'read', and 'read_write'. - -A pointer type can be spelled only if it corresponds to a variable that could be -declared in the program. So we need to test combinations against possible variable -declarations. -`; // This file tests spelling of the pointer type on let-declared pointers. -// -// Spelling of pointer-typed parameters on user-declared functions is tested by -// webgpu:shader,validation,functions,restrictions:function_parameter_types:"*" - -import { makeTestGroup } from '../../../../common/framework/test_group.js'; +**/export const description = 'Test pointer type validation';import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { keysOf } from '../../../../common/util/data_tables.js'; import { kAccessModeInfo, kAddressSpaceInfo } from '../../types.js'; -import { ShaderValidationTest } from '../shader_validation_test.js'; - import { pointerType, explicitSpaceExpander, @@ -31,15 +10,145 @@ import { getVarDeclShader, supportsWrite } from -'./util.js'; +'../decl/util.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('missing_type'). +desc('Test that pointer types require an element type'). +params((u) => +u. +combine('aspace', ['function', 'private', 'workgroup', 'storage', 'uniform']). +combine('comma', ['', ',']) +). +fn((t) => { + const code = `alias T = ptr<${t.params.aspace}${t.params.comma}>;`; + t.expectCompileResult(false, code); +}); + +g.test('address_space'). +desc('Test address spaces in pointer type parameterization'). +params((u) => +u. +combine('aspace', [ +'function', +'private', +'workgroup', +'storage', +'uniform', +'handle', +'bad_aspace'] +). +combine('comma', ['', ',']) +). +fn((t) => { + const code = `alias T = ptr<${t.params.aspace}, u32${t.params.comma}>;`; + const success = t.params.aspace !== 'handle' && t.params.aspace !== 'bad_aspace'; + t.expectCompileResult(success, code); +}); + +g.test('access_mode'). +desc('Test access mode in pointer type parameterization'). +params((u) => +u. +combine('aspace', ['function', 'private', 'storage', 'uniform', 'workgroup']). +combine('access', ['read', 'write', 'read_write']). +combine('comma', ['', ',']) +). +fn((t) => { + // Default access mode is tested above. + const code = `alias T = ptr<${t.params.aspace}, u32, ${t.params.access}${t.params.comma}>;`; + const success = t.params.aspace === 'storage' && t.params.access !== 'write'; + t.expectCompileResult(success, code); +}); + + + + + + + + +const kTypeCases = { + // Scalars + bool: { type: `bool`, storable: true, aspace: 'function' }, + u32: { type: `u32`, storable: true }, + i32: { type: `i32`, storable: true }, + f32: { type: `f32`, storable: true }, + f16: { type: `f16`, storable: true, f16: true }, + + // Vectors + vec2u: { type: `vec2u`, storable: true }, + vec3i: { type: `vec3i`, storable: true }, + vec4f: { type: `vec4f`, storable: true }, + vec2_bool: { type: `vec2`, storable: true, aspace: 'workgroup' }, + vec3h: { type: `vec3h`, storable: true, f16: true }, + + // Matrices + mat2x2f: { type: `mat2x2f`, storable: true }, + mat3x4h: { type: `mat3x4h`, storable: true, f16: true }, + + // Atomics + atomic_u32: { type: `atomic`, storable: true }, + atomic_i32: { type: `atomic`, storable: true }, + + // Arrays + array_sized_u32: { type: `array`, storable: true }, + array_sized_vec4f: { type: `array`, storable: true }, + array_sized_S: { type: `array`, storable: true }, + array_runtime_u32: { type: `array`, storable: true }, + array_runtime_S: { type: `array`, storable: true }, + array_runtime_atomic_u32: { type: `array>`, storable: true }, + array_override_u32: { type: `array`, storable: true, aspace: 'workgroup' }, + + // Structs + struct_S: { type: `S`, storable: true }, + struct_T: { type: `T`, storable: true }, + + // Pointers + ptr_function_u32: { type: `ptr`, storable: false }, + ptr_workgroup_bool: { type: `ptr`, storable: false }, + + // Sampler (while storable, can only be in the handle address space) + sampler: { type: `sampler`, storable: false }, + + // Texture (while storable, can only be in the handle address space) + texture_2d: { type: `texture_2d`, storable: false }, + + // Alias + alias: { type: `u32_alias`, storable: true }, + + // Reference + reference: { type: `ref`, storable: false, aspace: 'function' } +}; + +g.test('type'). +desc('Tests that pointee type must be storable'). +params((u) => u.combine('case', keysOf(kTypeCases))). +beforeAllSubcases((t) => { + if (kTypeCases[t.params.case].f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kTypeCases[t.params.case]; + const aspace = testcase.aspace ?? 'storage'; + const access = testcase.type.includes('atomic') ? ', read_write' : ''; + const code = `${testcase.f16 ? 'enable f16;' : ''} + override o : u32; + struct S { x : u32 } + struct T { s : array } + alias u32_alias = u32; + alias Type = ptr<${aspace}, ${testcase.type}${access}>;`; + t.expectCompileResult(testcase.storable, code); +}); // Address spaces that can hold an i32 variable. const kNonHandleAddressSpaces = keysOf(kAddressSpaceInfo).filter( (as) => as !== 'handle' ); -export const g = makeTestGroup(ShaderValidationTest); - g.test('let_ptr_explicit_type_matches_var'). desc( 'Let-declared pointer with explicit type initialized from var with same address space and access mode' diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/ref.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/ref.spec.js new file mode 100644 index 00000000000..651a3fc1bb9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/ref.spec.js @@ -0,0 +1,57 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for ref types +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +const kTypes = ['bool', 'i32', 'f32', 'vec2i', 'mat2x2f', 'array', 'S']; + +g.test('not_typeable_var'). +desc('Test that `ref` cannot be typed in a shader as an explicit var decl type.'). +params((u) => u.combine('type', kTypes).combine('ref', [false, true])). +fn((t) => { + let ty = t.params.type; + if (t.params.ref) { + ty = `ref`; + } + const code = ` + struct S { a : u32 } + var foo : ${ty};`; + t.expectCompileResult(!t.params.ref, code); +}); + +g.test('not_typeable_let'). +desc('Test that `ref` cannot be typed in a shader as a let decl type.'). +params((u) => u.combine('type', kTypes).combine('view', ['ptr', 'ref'])). +fn((t) => { + const code = ` + struct S { a : u32 } + fn foo() { + var a : ${t.params.type}; + let b : ${t.params.view} = &a; + }`; + t.expectCompileResult(t.params.view === 'ptr', code); +}); + +g.test('not_typeable_param'). +desc('Test that `ref` cannot be typed in a shader as a function parameter type.'). +params((u) => u.combine('type', kTypes).combine('view', ['ptr', 'ref'])). +fn((t) => { + const code = ` + struct S { a : u32 } + fn foo(a : ${t.params.view}) {}`; + t.expectCompileResult(t.params.view === 'ptr', code); +}); + +g.test('not_typeable_alias'). +desc('Test that `ref` cannot be typed in a shader as an alias type.'). +params((u) => u.combine('type', kTypes).combine('view', ['ptr', 'ref'])). +fn((t) => { + const code = ` + struct S { a : u32 } + alias a = ${t.params.view};`; + t.expectCompileResult(t.params.view === 'ptr', code); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/struct.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/struct.spec.js index 80a60642321..b5f4ef5b19f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/struct.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/struct.spec.js @@ -3,6 +3,7 @@ **/export const description = ` Validation tests for struct types `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; import { ShaderValidationTest } from '../shader_validation_test.js'; export const g = makeTestGroup(ShaderValidationTest); @@ -96,4 +97,203 @@ struct S2 { } `; t.expectCompileResult(t.params.target === 'i32', wgsl); +}); + + + + + + + +const kStructureCases = { + bool: { + code: `struct S { x : bool }`, + valid: true + }, + u32: { + code: `struct S { x : u32 }`, + valid: true + }, + i32: { + code: `struct S { x : i32 }`, + valid: true + }, + f32: { + code: `struct S { x : f32 }`, + valid: true + }, + f16: { + code: `struct S { x : f16 }`, + valid: true, + f16: true + }, + + vec2u: { + code: `struct S { x : vec2u }`, + valid: true + }, + vec3i: { + code: `struct S { x : vec3i }`, + valid: true + }, + vec4f: { + code: `struct S { x : vec4f }`, + valid: true + }, + vec4h: { + code: `struct S { x : vec4h }`, + valid: true, + f16: true + }, + + mat2x2f: { + code: `struct S { x : mat2x2f }`, + valid: true + }, + mat3x4h: { + code: `struct S { x : mat3x4h }`, + valid: true, + f16: true + }, + + atomic_u32: { + code: `struct S { x : atomic }`, + valid: true + }, + atomic_i32: { + code: `struct S { x : atomic }`, + valid: true + }, + + array_u32_4: { + code: `struct S { x : array }`, + valid: true + }, + array_u32: { + code: `struct S { x : array }`, + valid: true + }, + array_u32_not_last: { + code: `struct S { x : array, y : u32 }`, + valid: false + }, + array_u32_override: { + code: `override o : u32; + struct S { x : array }`, + valid: false + }, + + structure: { + code: `struct S { x : u32 } + struct T { x : S }`, + valid: true + }, + structure_structure_rta: { + code: `struct S { x : array } + struct T { x : S }`, + valid: false + }, + + pointer: { + code: `struct S { x : ptr }`, + valid: false + }, + + texture: { + code: `struct S { x : texture_2d }`, + valid: false + }, + sampler: { + code: `struct S { x : sampler }`, + valid: false + }, + sampler_comparison: { + code: `struct S { x : sampler_comparison }`, + valid: false + }, + + many_members: { + code: `struct S { + m1 : u32, + m2 : i32, + m3 : vec4f, + m4 : array, + m5 : array + }`, + valid: true + }, + + trailing_comma: { + code: `struct S { x : u32, }`, + valid: true + }, + + empty: { + code: `struct S { }`, + valid: false + }, + + name_collision1: { + code: `struct S { x : u32 } + struct S { x : u32 }`, + valid: false + }, + name_collision2: { + code: `fn S() { } + struct S { x : u32 }`, + valid: false + }, + name_collision3: { + code: `struct S { x : u32 } + alias S = u32;`, + valid: false + }, + member_collision: { + code: `struct S { x : u32, x : u32 }`, + valid: false + }, + no_name: { + code: `struct { x : u32 }`, + valid: false + }, + missing_l_brace: { + code: `struct S x : u32 }`, + valid: false + }, + missing_r_brace: { + code: `struct S { x : u32`, + valid: false + }, + bad_name: { + code: `struct 123 { x : u32 }`, + valid: false + }, + bad_delimiter: { + code: `struct S { x : u32; y : u32 }`, + valid: false + }, + missing_delimiter: { + code: `struct S { x : u32 y : u32 }`, + valid: false + }, + bad_member_decl: { + code: `struct S { x u32 }`, + valid: false + } +}; + +g.test('structures'). +desc('Validation tests for structures'). +params((u) => u.combine('case', keysOf(kStructureCases))). +beforeAllSubcases((t) => { + const testcase = kStructureCases[t.params.case]; + if (testcase.f16) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } +}). +fn((t) => { + const testcase = kStructureCases[t.params.case]; + const code = `${testcase.f16 ? 'enable f16;' : ''} + ${testcase.code}`; + t.expectCompileResult(testcase.valid, code); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/textures.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/textures.spec.js new file mode 100644 index 00000000000..085d450c297 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/types/textures.spec.js @@ -0,0 +1,170 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +Validation tests for various texture types in shaders. +`;import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { + isTextureFormatUsableAsStorageFormat, + kAllTextureFormats, + kColorTextureFormats, + kTextureFormatInfo } from +'../../../format_info.js'; +import { getPlainTypeInfo } from '../../../util/shader.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('texel_formats'). +desc( + 'Test channels and channel format of various texel formats when using as the storage texture format' +). +params((u) => +u. +combine('format', kColorTextureFormats). +filter((p) => kTextureFormatInfo[p.format].color.storage). +beginSubcases(). +combine('shaderScalarType', ['f32', 'u32', 'i32', 'bool', 'f16']) +). +beforeAllSubcases((t) => { + if (t.params.shaderScalarType === 'f16') { + t.selectDeviceOrSkipTestCase({ requiredFeatures: ['shader-f16'] }); + } + + if (!isTextureFormatUsableAsStorageFormat(t.params.format, t.isCompatibility)) { + t.skip('storage usage is unsupported'); + } +}). +fn((t) => { + const { format, shaderScalarType } = t.params; + const info = kTextureFormatInfo[format]; + const validShaderScalarType = getPlainTypeInfo(info.color.type); + const shaderValueType = `vec4<${shaderScalarType}>`; + const wgsl = ` + @group(0) @binding(0) var tex: texture_storage_2d<${format}, read>; + @compute @workgroup_size(1) fn main() { + let v : ${shaderValueType} = textureLoad(tex, vec2u(0)); + _ = v; + } +`; + t.expectCompileResult(validShaderScalarType === shaderScalarType, wgsl); +}); + +g.test('texel_formats,as_value'). +desc('Test that texel format cannot be used as value'). +fn((t) => { + const wgsl = ` + @compute @workgroup_size(1) fn main() { + var i = rgba8unorm; + } +`; + t.expectCompileResult(false, wgsl); +}); + +const kValidTextureSampledTypes = ['f32', 'i32', 'u32']; + +g.test('sampled_texture_types'). +desc( + `Test that for texture_xx +- The sampled type T must be f32, i32, or u32 +` +). +params((u) => +u. +combine('textureType', ['texture_2d', 'texture_multisampled_2d']). +beginSubcases(). +combine('sampledType', [ +...kValidTextureSampledTypes, +'bool', +'vec2', +'mat2x2', +'1.0', +'1', +'1u'] +). +combine('comma', ['', ',']) +). +fn((t) => { + const { textureType, sampledType, comma } = t.params; + const wgsl = `@group(0) @binding(0) var tex: ${textureType}<${sampledType}${comma}>;`; + t.expectCompileResult(kValidTextureSampledTypes.includes(sampledType), wgsl); +}); + +g.test('external_sampled_texture_types'). +desc( + `Test that texture_external compiles and cannot specify address space +` +). +fn((t) => { + t.expectCompileResult(true, `@group(0) @binding(0) var tex: texture_external;`); + t.expectCompileResult(false, `@group(0) @binding(0) var tex: texture_external;`); +}); + +const kAccessModes = ['read', 'write', 'read_write']; + +g.test('storage_texture_types'). +desc( + `Test that for texture_storage_xx +- format must be an enumerant for one of the texel formats for storage textures +- access must be an enumerant for one of the access modes + +Besides, the shader compilation should always pass regardless of whether the format supports the usage indicated by the access or not. +` +). +params((u) => +u. +combine('access', [...kAccessModes, 'storage']). +combine('format', kAllTextureFormats). +combine('comma', ['', ',']) +). +fn((t) => { + const { format, access, comma } = t.params; + // bgra8unorm is considered a valid storage format at shader compilation stage + const isFormatValid = + isTextureFormatUsableAsStorageFormat(format, t.isCompatibility) || format === 'bgra8unorm'; + const isAccessValid = kAccessModes.includes(access); + const wgsl = `@group(0) @binding(0) var tex: texture_storage_2d<${format}, ${access}${comma}>;`; + t.expectCompileResult(isFormatValid && isAccessValid, wgsl); +}); + +g.test('depth_texture_types'). +desc( + `Test that for texture_depth_xx +- must not specify an address space +` +). +params((u) => +u.combine('textureType', [ +'texture_depth_2d', +'texture_depth_2d_array', +'texture_depth_cube', +'texture_depth_cube_array'] +) +). +fn((t) => { + const { textureType } = t.params; + t.expectCompileResult(true, `@group(0) @binding(0) var t: ${textureType};`); + t.expectCompileResult(false, `@group(0) @binding(0) var t: ${textureType};`); + t.expectCompileResult(false, `@group(0) @binding(0) var t: ${textureType};`); +}); + +g.test('sampler_types'). +desc( + `Test that for sampler and sampler_comparison +- cannot specify address space +- cannot be declared in WGSL function scope +` +). +params((u) => u.combine('samplerType', ['sampler', 'sampler_comparison'])). +fn((t) => { + const { samplerType } = t.params; + t.expectCompileResult(true, `@group(0) @binding(0) var s: ${samplerType};`); + t.expectCompileResult(false, `@group(0) @binding(0) var s: ${samplerType};`); + t.expectCompileResult( + false, + ` + @compute @workgroup_size(1) fn main() { + var s: ${samplerType}; + } + ` + ); +}); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js index a808b17675b..2c7464aecc1 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js @@ -268,6 +268,12 @@ const kFragmentBuiltinValues = [ g.test('fragment_builtin_values'). desc(`Test uniformity of fragment built-in values`). params((u) => u.combineWithParams(kFragmentBuiltinValues).beginSubcases()). +beforeAllSubcases((t) => { + t.skipIf( + t.isCompatibility && ['sample_index', 'sample_mask'].includes(t.params.builtin), + 'compatibility mode does not support sample_index or sample_mask' + ); +}). fn((t) => { let cond = ``; switch (t.params.type) { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/buffer.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/buffer.js deleted file mode 100644 index 0ce8bd858d8..00000000000 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/buffer.js +++ /dev/null @@ -1,23 +0,0 @@ -/** -* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { memcpy } from '../../common/util/util.js';import { align } from './math.js'; - -/** - * Creates a buffer with the contents of some TypedArray. - * The buffer size will always be aligned to 4 as we set mappedAtCreation === true when creating the - * buffer. - */ -export function makeBufferWithContents( -device, -dataArray, -usage) -{ - const buffer = device.createBuffer({ - mappedAtCreation: true, - size: align(dataArray.byteLength, 4), - usage - }); - memcpy({ src: dataArray }, { dst: buffer.getMappedRange() }); - buffer.unmap(); - return buffer; -} \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/check_contents.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/check_contents.js index ab0f7949520..f9dfc95549b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/check_contents.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/check_contents.js @@ -43,7 +43,10 @@ actual, expected) { assert(actual.constructor === expected.constructor, 'TypedArray type mismatch'); - assert(actual.length === expected.length, 'size mismatch'); + assert( + actual.length === expected.length, + `length mismatch: expected ${expected.length} got ${actual.length}` + ); let failedElementsFirstMaybe = undefined; /** Sparse array with `true` for elements that failed. */ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/compare.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/compare.js index e884e9a01f6..2b2cd9a751b 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/compare.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/compare.js @@ -8,7 +8,15 @@ import { import { toComparator } from '../shader/execution/expression/expectation.js'; -import { isFloatValue, Matrix, Scalar, Vector } from './conversion.js'; +import { + ArrayValue, + isFloatValue, + isScalarValue, + MatrixValue, + + + VectorValue } from +'./conversion.js'; import { FPInterval } from './floating_point.js'; /** Comparison describes the result of a Comparator function. */ @@ -98,7 +106,7 @@ function compareValue(got, expected) { } } - if (got instanceof Scalar) { + if (isScalarValue(got)) { const g = got; const e = expected; const isFloat = g.type.kind === 'f64' || g.type.kind === 'f32' || g.type.kind === 'f16'; @@ -111,7 +119,7 @@ function compareValue(got, expected) { }; } - if (got instanceof Vector) { + if (got instanceof VectorValue || got instanceof ArrayValue) { const e = expected; const gLen = got.elements.length; const eLen = e.elements.length; @@ -130,7 +138,7 @@ function compareValue(got, expected) { }; } - if (got instanceof Matrix) { + if (got instanceof MatrixValue) { const e = expected; const gCols = got.type.cols; const eCols = e.type.cols; @@ -153,7 +161,7 @@ function compareValue(got, expected) { }; } - throw new Error(`unhandled type '${typeof got}`); + throw new Error(`unhandled type '${typeof got}'`); } /** @@ -175,7 +183,7 @@ function compareInterval(got, expected) { } } - if (got instanceof Scalar) { + if (isScalarValue(got)) { const g = got.value; const matched = expected.contains(g); return { @@ -197,7 +205,7 @@ function compareInterval(got, expected) { */ function compareVector(got, expected) { // Check got type - if (!(got instanceof Vector)) { + if (!(got instanceof VectorValue)) { return { matched: false, got: `${Colors.red((typeof got).toString())}(${got})`, @@ -262,7 +270,7 @@ function convertArrayToString(m) { */ function compareMatrix(got, expected) { // Check got type - if (!(got instanceof Matrix)) { + if (!(got instanceof MatrixValue)) { return { matched: false, got: `${Colors.red((typeof got).toString())}(${got})`, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/constants.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/constants.js index 85cf24117c0..332958cb24f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/constants.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/constants.js @@ -251,6 +251,9 @@ export const kValue = { negative: { min: BigInt(-9223372036854775808n), max: BigInt(0n) + }, + isOOB: (val) => { + return val > kValue.i64.positive.max || val < kValue.i64.negative.min; } }, diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/conversion.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/conversion.js index 81ebee69c8f..e6506d2c7d4 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/conversion.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/conversion.js @@ -1,11 +1,13 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { Colors } from '../../common/util/colors.js';import { assert, objectEquals, unreachable } from '../../common/util/util.js'; +**/import { Colors } from '../../common/util/colors.js';import { objectsToRecord } from '../../common/util/data_tables.js'; +import { assert, objectEquals, unreachable } from '../../common/util/util.js'; import { Float16Array } from '../../external/petamoriken/float16/float16.js'; import { kBit } from './constants.js'; import { + align, cartesianProduct, clamp, correctlyRoundedF16, @@ -15,6 +17,30 @@ import { isSubnormalNumberF64 } from './math.js'; +/** + * Encode a JS `number` into the "normalized" (unorm/snorm) integer scale with `bits` bits but + * remain unquantized. Input must be between -1 and 1 if signed, or 0 and 1 if unsigned. + * e.g. float 0.5 -> "unorm8" 127.5 + * + * MAINTENANCE_TODO: See if performance of texel_data improves if this function is pre-specialized + * for a particular `bits`/`signed`. + */ +export function floatAsNormalizedIntegerUnquantized( +float, +bits, +signed) +{ + if (signed) { + assert(float >= -1 && float <= 1, () => `${float} out of bounds of snorm`); + const max = Math.pow(2, bits - 1) - 1; + return float * max; + } else { + assert(float >= 0 && float <= 1, () => `${float} out of bounds of unorm`); + const max = Math.pow(2, bits) - 1; + return float * max; + } +} + /** * Encodes a JS `number` into a "normalized" (unorm/snorm) integer representation with `bits` bits. * Input must be between -1 and 1 if signed, or 0 and 1 if unsigned. @@ -23,15 +49,7 @@ import { * for a particular `bits`/`signed`. */ export function floatAsNormalizedInteger(float, bits, signed) { - if (signed) { - assert(float >= -1 && float <= 1, () => `${float} out of bounds of snorm`); - const max = Math.pow(2, bits - 1) - 1; - return Math.round(float * max); - } else { - assert(float >= 0 && float <= 1, () => `${float} out of bounds of unorm`); - const max = Math.pow(2, bits) - 1; - return Math.round(float * max); - } + return Math.round(floatAsNormalizedIntegerUnquantized(float, bits, signed)); } /** @@ -85,6 +103,7 @@ const workingDataI32 = new Int32Array(workingData); const workingDataI8 = new Int8Array(workingData); const workingDataF64 = new Float64Array(workingData); const workingDataI64 = new BigInt64Array(workingData); +const workingDataU64 = new BigUint64Array(workingData); const workingDataView = new DataView(workingData); /** @@ -108,7 +127,7 @@ bias) assert(mantissaBits <= 23); if (Number.isNaN(n)) { - // NaN = all exponent bits true, 1 or more mantissia bits true + // NaN = all exponent bits true, 1 or more mantissa bits true return (1 << exponentBits) - 1 << mantissaBits | (1 << mantissaBits) - 1; } @@ -595,11 +614,18 @@ export function float16ToInt16(f16) { export class ScalarType { // The named type // In bytes + // reads a scalar from a buffer - constructor(kind, size, read) { + constructor( + kind, + size, + signed, + read) + { this.kind = kind; this._size = size; + this._signed = signed; this.read = read; } @@ -611,13 +637,32 @@ export class ScalarType { return this._size; } - /** Constructs a Scalar of this type with `value` */ + get alignment() { + return this._size; + } + + get signed() { + return this._signed; + } + + // This allows width to be checked in cases where scalar and vector types are mixed. + get width() { + return 1; + } + + requiresF16() { + return this.kind === 'f16'; + } + + /** Constructs a ScalarValue of this type with `value` */ create(value) { switch (typeof value) { case 'number': switch (this.kind) { case 'abstract-float': return abstractFloat(value); + case 'abstract-int': + return abstractInt(BigInt(value)); case 'f64': return f64(value); case 'f32': @@ -658,6 +703,20 @@ export class VectorType { // Number of elements in the vector // Element type + // Maps a string representation of a vector type to vector type. + static instances = new Map(); + + static create(width, elementType) { + const key = `${elementType.toString()} ${width}}`; + let ty = this.instances.get(key); + if (ty !== undefined) { + return ty; + } + ty = new VectorType(width, elementType); + this.instances.set(key, ty); + return ty; + } + constructor(width, elementType) { this.width = width; this.elementType = elementType; @@ -673,7 +732,7 @@ export class VectorType { elements[i] = this.elementType.read(buf, offset); offset += this.elementType.size; } - return new Vector(elements); + return new VectorValue(elements); } toString() { @@ -684,6 +743,14 @@ export class VectorType { return this.elementType.size * this.width; } + get alignment() { + return VectorType.alignmentOf(this.width, this.elementType); + } + + static alignmentOf(width, elementType) { + return elementType.size * (width === 3 ? 4 : width); + } + /** Constructs a Vector of this type with the given values */ create(value) { if (value instanceof Array) { @@ -691,22 +758,12 @@ export class VectorType { } else { value = Array(this.width).fill(value); } - return new Vector(value.map((v) => this.elementType.create(v))); + return new VectorValue(value.map((v) => this.elementType.create(v))); } -} -// Maps a string representation of a vector type to vector type. -const vectorTypes = new Map(); - -export function TypeVec(width, elementType) { - const key = `${elementType.toString()} ${width}}`; - let ty = vectorTypes.get(key); - if (ty !== undefined) { - return ty; + requiresF16() { + return this.elementType.requiresF16(); } - ty = new VectorType(width, elementType); - vectorTypes.set(key, ty); - return ty; } /** MatrixType describes the type of WGSL Matrix. */ @@ -715,6 +772,20 @@ export class MatrixType { // Number of elements per column in the Matrix // Element type + // Maps a string representation of a Matrix type to Matrix type. + static instances = new Map(); + + static create(cols, rows, elementType) { + const key = `${elementType.toString()} ${cols} ${rows}`; + let ty = this.instances.get(key); + if (ty !== undefined) { + return ty; + } + ty = new MatrixType(cols, rows, elementType); + this.instances.set(key, ty); + return ty; + } + constructor(cols, rows, elementType) { this.cols = cols; this.rows = rows; @@ -744,31 +815,112 @@ export class MatrixType { offset += this.elementType.size; } } - return new Matrix(elements); + return new MatrixValue(elements); } toString() { return `mat${this.cols}x${this.rows}<${this.elementType}>`; } + + get size() { + return VectorType.alignmentOf(this.rows, this.elementType) * this.cols; + } + + get alignment() { + return VectorType.alignmentOf(this.rows, this.elementType); + } + + requiresF16() { + return this.elementType.requiresF16(); + } + + /** Constructs a Matrix of this type with the given values */ + create(value) { + if (value instanceof Array) { + assert(value.length === this.cols * this.rows); + } else { + value = Array(this.cols * this.rows).fill(value); + } + const columns = []; + for (let i = 0; i < this.cols; i++) { + const start = i * this.rows; + columns.push(value.slice(start, start + this.rows)); + } + return new MatrixValue(columns.map((c) => c.map((v) => this.elementType.create(v)))); + } } -// Maps a string representation of a Matrix type to Matrix type. -const matrixTypes = new Map(); +/** ArrayType describes the type of WGSL Array. */ +export class ArrayType { + // Number of elements in the array. Zero represents a runtime-sized array. + // Element type -export function TypeMat(cols, rows, elementType) { - const key = `${elementType.toString()} ${cols} ${rows}`; - let ty = matrixTypes.get(key); - if (ty !== undefined) { + // Maps a string representation of a array type to array type. + static instances = new Map(); + + static create(count, elementType) { + const key = `${elementType.toString()} ${count}`; + let ty = this.instances.get(key); + if (ty !== undefined) { + return ty; + } + ty = new ArrayType(count, elementType); + this.instances.set(key, ty); return ty; } - ty = new MatrixType(cols, rows, elementType); - matrixTypes.set(key, ty); - return ty; + + constructor(count, elementType) { + this.count = count; + this.elementType = elementType; + } + + /** + * @returns a array constructed from the values read from the buffer at the + * given byte offset + */ + read(buf, offset) { + const elements = []; + + for (let i = 0; i < this.count; i++) { + elements[i] = this.elementType.read(buf, offset); + offset += this.stride; + } + return new ArrayValue(elements); + } + + toString() { + return this.count !== 0 ? + `array<${this.elementType}, ${this.count}>` : + `array<${this.elementType}>`; + } + + get stride() { + return align(this.elementType.size, this.elementType.alignment); + } + + get size() { + return this.stride * this.count; + } + + get alignment() { + return this.elementType.alignment; + } + + requiresF16() { + return this.elementType.requiresF16(); + } + + /** Constructs an Array of this type with the given values */ + create(value) { + if (value instanceof Array) { + assert(value.length === this.count); + } else { + value = Array(this.count).fill(value); + } + return new ArrayValue(value.map((v) => this.elementType.create(v))); + } } -/** Type is a ScalarType, VectorType, or MatrixType. */ - - /** ArrayElementType infers the element type of the indexable type A */ @@ -784,74 +936,171 @@ offset) return workingDataOut[0]; } -export const TypeAbstractInt = new ScalarType( - 'abstract-int', - 8, - (buf, offset) => abstractInt(valueFromBytes(workingDataI64, buf, offset)) +const abstractIntType = new ScalarType('abstract-int', 8, true, (buf, offset) => +abstractInt(valueFromBytes(workingDataI64, buf, offset)) ); -export const TypeI32 = new ScalarType('i32', 4, (buf, offset) => +const i32Type = new ScalarType('i32', 4, true, (buf, offset) => i32(valueFromBytes(workingDataI32, buf, offset)) ); -export const TypeU32 = new ScalarType('u32', 4, (buf, offset) => +const u32Type = new ScalarType('u32', 4, false, (buf, offset) => u32(valueFromBytes(workingDataU32, buf, offset)) ); -export const TypeAbstractFloat = new ScalarType( - 'abstract-float', - 8, - (buf, offset) => abstractFloat(valueFromBytes(workingDataF64, buf, offset)) -); -export const TypeF64 = new ScalarType('f64', 8, (buf, offset) => -f64(valueFromBytes(workingDataF64, buf, offset)) -); -export const TypeF32 = new ScalarType('f32', 4, (buf, offset) => -f32(valueFromBytes(workingDataF32, buf, offset)) -); -export const TypeI16 = new ScalarType('i16', 2, (buf, offset) => +const i16Type = new ScalarType('i16', 2, true, (buf, offset) => i16(valueFromBytes(workingDataI16, buf, offset)) ); -export const TypeU16 = new ScalarType('u16', 2, (buf, offset) => +const u16Type = new ScalarType('u16', 2, false, (buf, offset) => u16(valueFromBytes(workingDataU16, buf, offset)) ); -export const TypeF16 = new ScalarType('f16', 2, (buf, offset) => -f16Bits(valueFromBytes(workingDataU16, buf, offset)) -); -export const TypeI8 = new ScalarType('i8', 1, (buf, offset) => +const i8Type = new ScalarType('i8', 1, true, (buf, offset) => i8(valueFromBytes(workingDataI8, buf, offset)) ); -export const TypeU8 = new ScalarType('u8', 1, (buf, offset) => +const u8Type = new ScalarType('u8', 1, false, (buf, offset) => u8(valueFromBytes(workingDataU8, buf, offset)) ); -export const TypeBool = new ScalarType('bool', 4, (buf, offset) => +const abstractFloatType = new ScalarType( + 'abstract-float', + 8, + true, + (buf, offset) => abstractFloat(valueFromBytes(workingDataF64, buf, offset)) +); +const f64Type = new ScalarType('f64', 8, true, (buf, offset) => +f64(valueFromBytes(workingDataF64, buf, offset)) +); +const f32Type = new ScalarType('f32', 4, true, (buf, offset) => +f32(valueFromBytes(workingDataF32, buf, offset)) +); +const f16Type = new ScalarType('f16', 2, true, (buf, offset) => +f16Bits(valueFromBytes(workingDataU16, buf, offset)) +); +const boolType = new ScalarType('bool', 4, false, (buf, offset) => bool(valueFromBytes(workingDataU32, buf, offset) !== 0) ); +/** Type is a ScalarType, VectorType, MatrixType or ArrayType. */ + + +const kVecTypes = { + vec2ai: VectorType.create(2, abstractIntType), + vec2i: VectorType.create(2, i32Type), + vec2u: VectorType.create(2, u32Type), + vec2af: VectorType.create(2, abstractFloatType), + vec2f: VectorType.create(2, f32Type), + vec2h: VectorType.create(2, f16Type), + vec2b: VectorType.create(2, boolType), + vec3ai: VectorType.create(3, abstractIntType), + vec3i: VectorType.create(3, i32Type), + vec3u: VectorType.create(3, u32Type), + vec3af: VectorType.create(3, abstractFloatType), + vec3f: VectorType.create(3, f32Type), + vec3h: VectorType.create(3, f16Type), + vec3b: VectorType.create(3, boolType), + vec4ai: VectorType.create(4, abstractIntType), + vec4i: VectorType.create(4, i32Type), + vec4u: VectorType.create(4, u32Type), + vec4af: VectorType.create(4, abstractFloatType), + vec4f: VectorType.create(4, f32Type), + vec4h: VectorType.create(4, f16Type), + vec4b: VectorType.create(4, boolType) +}; + +const kMatTypes = { + mat2x2f: MatrixType.create(2, 2, f32Type), + mat2x2h: MatrixType.create(2, 2, f16Type), + mat3x2f: MatrixType.create(3, 2, f32Type), + mat3x2h: MatrixType.create(3, 2, f16Type), + mat4x2f: MatrixType.create(4, 2, f32Type), + mat4x2h: MatrixType.create(4, 2, f16Type), + mat2x3f: MatrixType.create(2, 3, f32Type), + mat2x3h: MatrixType.create(2, 3, f16Type), + mat3x3f: MatrixType.create(3, 3, f32Type), + mat3x3h: MatrixType.create(3, 3, f16Type), + mat4x3f: MatrixType.create(4, 3, f32Type), + mat4x3h: MatrixType.create(4, 3, f16Type), + mat2x4f: MatrixType.create(2, 4, f32Type), + mat2x4h: MatrixType.create(2, 4, f16Type), + mat3x4f: MatrixType.create(3, 4, f32Type), + mat3x4h: MatrixType.create(3, 4, f16Type), + mat4x4f: MatrixType.create(4, 4, f32Type), + mat4x4h: MatrixType.create(4, 4, f16Type) +}; + +/** Type holds pre-declared Types along with helper constructor functions. */ +export const Type = { + abstractInt: abstractIntType, + 'abstract-int': abstractIntType, + i32: i32Type, + u32: u32Type, + i16: i16Type, + u16: u16Type, + i8: i8Type, + u8: u8Type, + + abstractFloat: abstractFloatType, + 'abstract-float': abstractFloatType, + f64: f64Type, + f32: f32Type, + f16: f16Type, + + bool: boolType, + + vec: (width, elementType) => VectorType.create(width, elementType), + + // add vec types like vec2i, vec3f, + ...kVecTypes, + // add vec<> types like vec2, vec3 + ...objectsToRecord(Object.values(kVecTypes)), + + mat: (cols, rows, elementType) => + MatrixType.create(cols, rows, elementType), + + // add mat types like mat2x2f, + ...kMatTypes, + // add mat<> types like mat2x2, + ...objectsToRecord(Object.values(kVecTypes)), + + array: (count, elementType) => ArrayType.create(count, elementType) +}; + +/** + * @returns a type from a string + * eg: + * 'f32' -> Type.f32 + * 'vec4' -> Type.vec4f + * 'vec3i' -> Type.vec3i + */ +export function stringToType(s) { + const t = Type[s]; + assert(!!t); + return t; +} + /** @returns the ScalarType from the ScalarKind */ export function scalarType(kind) { switch (kind) { case 'abstract-float': - return TypeAbstractFloat; + return Type.abstractFloat; case 'f64': - return TypeF64; + return Type.f64; case 'f32': - return TypeF32; + return Type.f32; case 'f16': - return TypeF16; + return Type.f16; case 'u32': - return TypeU32; + return Type.u32; case 'u16': - return TypeU16; + return Type.u16; case 'u8': - return TypeU8; + return Type.u8; case 'abstract-int': - return TypeAbstractInt; + return Type.abstractInt; case 'i32': - return TypeI32; + return Type.i32; case 'i16': - return TypeI16; + return Type.i16; case 'i8': - return TypeI8; + return Type.i8; case 'bool': - return TypeBool; + return Type.bool; } } @@ -866,23 +1115,54 @@ export function numElementsOf(ty) { if (ty instanceof MatrixType) { return ty.cols * ty.rows; } + if (ty instanceof ArrayType) { + return ty.count; + } throw new Error(`unhandled type ${ty}`); } /** @returns the scalar elements of the given Value */ export function elementsOf(value) { - if (value instanceof Scalar) { + if (isScalarValue(value)) { return [value]; } - if (value instanceof Vector) { + if (value instanceof VectorValue) { return value.elements; } - if (value instanceof Matrix) { + if (value instanceof MatrixValue) { return value.elements.flat(); } + if (value instanceof ArrayValue) { + return value.elements; + } throw new Error(`unhandled value ${value}`); } +/** @returns the scalar elements of the given Value */ +export function scalarElementsOf(value) { + if (isScalarValue(value)) { + return [value]; + } + if (value instanceof VectorValue) { + return value.elements; + } + if (value instanceof MatrixValue) { + return value.elements.flat(); + } + if (value instanceof ArrayValue) { + return value.elements.map((els) => scalarElementsOf(els)).flat(); + } + throw new Error(`unhandled value ${value}`); +} + +/** @returns the inner element type of the given type */ +export function elementTypeOf(t) { + if (t instanceof ScalarType) { + return t; + } + return t.elementType; +} + /** @returns the scalar (element) type of the given Type */ export function scalarTypeOf(ty) { if (ty instanceof ScalarType) { @@ -894,27 +1174,93 @@ export function scalarTypeOf(ty) { if (ty instanceof MatrixType) { return ty.elementType; } + if (ty instanceof ArrayType) { + return scalarTypeOf(ty.elementType); + } throw new Error(`unhandled type ${ty}`); } -/** ScalarValue is the JS type that can be held by a Scalar */ +/** + * @returns the implicit concretized type of the given Type. + * @param abstractIntToF32 if true, returns f32 for abstractInt else i32 + * Example: vec3 -> vec3 + */ +export function concreteTypeOf(ty, allowedScalarTypes) { + if (allowedScalarTypes && allowedScalarTypes.length > 0) { + // https://www.w3.org/TR/WGSL/#conversion-rank + switch (ty) { + case Type.abstractInt: + if (allowedScalarTypes.includes(Type.i32)) { + return Type.i32; + } + if (allowedScalarTypes.includes(Type.u32)) { + return Type.u32; + } + // fallthrough. + case Type.abstractFloat: + if (allowedScalarTypes.includes(Type.f32)) { + return Type.f32; + } + if (allowedScalarTypes.includes(Type.f16)) { + return Type.f16; + } + throw new Error(`no ${ty}`); + } + } else { + switch (ty) { + case Type.abstractInt: + return Type.i32; + case Type.abstractFloat: + return Type.f32; + } + } + if (ty instanceof ScalarType) { + return ty; + } + if (ty instanceof VectorType) { + return Type.vec(ty.width, concreteTypeOf(ty.elementType, allowedScalarTypes)); + } + if (ty instanceof MatrixType) { + return Type.mat( + ty.cols, + ty.rows, + concreteTypeOf(ty.elementType, allowedScalarTypes) + ); + } + if (ty instanceof ArrayType) { + return Type.array(ty.count, concreteTypeOf(ty.elementType, allowedScalarTypes)); + } + throw new Error(`unhandled type ${ty}`); +} +function hex(sizeInBytes, bitsLow, bitsHigh) { + let hex = ''; + workingDataU32[0] = bitsLow; + if (bitsHigh !== undefined) { + workingDataU32[1] = bitsHigh; + } + for (let i = 0; i < sizeInBytes; ++i) { + hex = workingDataU8[i].toString(16).padStart(2, '0') + hex; + } + return `0x${hex}`; +} -/** Class that encapsulates a single scalar value of various types. */ -export class Scalar { - // The scalar value - // The type of the scalar +function withPoint(x) { + const str = `${x}`; + return str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; +} - // The scalar value, packed in one or two 32-bit unsigned integers. - // Whether or not the bits1 is used depends on `this.type.size`. +/** Class that encapsulates a single abstract-int value. */ +export class AbstractIntValue { + // The abstract-integer value + // The low 32 bits of the abstract-integer value. + // The high 32 bits of the abstract-integer value. + type = Type.abstractInt; // The type of the value. - - - constructor(type, value, bits1, bits0) { + constructor(value, bitsLow, bitsHigh) { this.value = value; - this.type = type; - this.bits1 = bits1; - this.bits0 = bits0; + this.bitsLow = bitsLow; + this.bitsHigh = bitsHigh; } /** @@ -923,226 +1269,583 @@ export class Scalar { * @param offset the offset in buffer, in units of `buffer` */ copyTo(buffer, offset) { - assert( - this.type.kind !== 'abstract-int', - `Copying 'abstract-int' values to/from buffers is yet implemented` - ); - assert(this.type.kind !== 'f64', `Copying f64 values to/from buffers is not defined`); - workingDataU32[1] = this.bits1; - workingDataU32[0] = this.bits0; - for (let i = 0; i < this.type.size; i++) { + workingDataU32[0] = this.bitsLow; + workingDataU32[1] = this.bitsHigh; + for (let i = 0; i < 8; i++) { buffer[offset + i] = workingDataU8[i]; } } - /** - * @returns the WGSL representation of this scalar value - */ + /** @returns the WGSL representation of this scalar value */ wgsl() { - const withPoint = (x) => { - const str = `${x}`; - return str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; - }; - - switch (typeof this.value) { - case 'bigint': - if (this.type.kind === 'abstract-int') { - // WGSL parses negative numbers as a negated positive. - // This means '-9223372036854775808' parses as `-' & - // '9223372036854775808', so must be written as - // '(-9223372036854775807 - 1)' in WGSL, because '9223372036854775808' - // is not a valid AbstractInt. - if (this.value === -9223372036854775808n) { - return `(-9223372036854775807 - 1)`; - } - return `${this.value}`; - } - break; - case 'number': - if (!isFinite(this.value)) break; - switch (this.type.kind) { - case 'abstract-float': - return `${withPoint(this.value)}`; - case 'f64': - return `${withPoint(this.value)}`; - case 'f32': - return `${withPoint(this.value)}f`; - case 'f16': - return `${withPoint(this.value)}h`; - case 'u32': - return `${this.value}u`; - case 'i32': - return `i32(${this.value})`; - } - break; - case 'boolean': - return `${this.value}`; + // WGSL parses negative numbers as a negated positive. + // This means '-9223372036854775808' parses as `-' & '9223372036854775808', so must be written as + // '(-9223372036854775807 - 1)' in WGSL, because '9223372036854775808' is not a valid AbstractInt. + if (this.value === -9223372036854775808n) { + return `(-9223372036854775807 - 1)`; } - - throw new Error( - `scalar of value ${this.value} and type ${this.type} has no WGSL representation` - ); + return `${this.value}`; } toString() { - if (this.type.kind === 'bool') { - return Colors.bold(this.value.toString()); + return `${Colors.bold(this.value.toString())} (${hex(8, this.bitsLow, this.bitsHigh)})`; + } +} + +/** Class that encapsulates a single abstract-float value. */ +export class AbstractFloatValue { + // The f32 value + // The low 32 bits of the abstract-float value. + // The high 32 bits of the abstract-float value. + type = Type.abstractFloat; // The type of the value. + + constructor(value, bitsLow, bitsHigh) { + this.value = value; + this.bitsLow = bitsLow; + this.bitsHigh = bitsHigh; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU32[0] = this.bitsLow; + workingDataU32[1] = this.bitsHigh; + for (let i = 0; i < 8; i++) { + buffer[offset + i] = workingDataU8[i]; } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `${withPoint(this.value)}`; + } + + toString() { switch (this.value) { case Infinity: case -Infinity: return Colors.bold(this.value.toString()); default:{ - workingDataU32[1] = this.bits1; - workingDataU32[0] = this.bits0; - let hex = ''; - for (let i = 0; i < this.type.size; ++i) { - hex = workingDataU8[i].toString(16).padStart(2, '0') + hex; - } - const n = this.value; - if (n !== null && isFloatValue(this)) { - let str = this.value.toString(); - str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; - switch (this.type.kind) { - case 'abstract-float': - return isSubnormalNumberF64(n.valueOf()) ? - `${Colors.bold(str)} (0x${hex} subnormal)` : - `${Colors.bold(str)} (0x${hex})`; - case 'f64': - return isSubnormalNumberF64(n.valueOf()) ? - `${Colors.bold(str)} (0x${hex} subnormal)` : - `${Colors.bold(str)} (0x${hex})`; - case 'f32': - return isSubnormalNumberF32(n.valueOf()) ? - `${Colors.bold(str)} (0x${hex} subnormal)` : - `${Colors.bold(str)} (0x${hex})`; - case 'f16': - return isSubnormalNumberF16(n.valueOf()) ? - `${Colors.bold(str)} (0x${hex} subnormal)` : - `${Colors.bold(str)} (0x${hex})`; - default: - unreachable( - `Printing of floating point kind ${this.type.kind} is not implemented...` - ); - } - } - return `${Colors.bold(this.value.toString())} (0x${hex})`; + let str = this.value.toString(); + str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; + return isSubnormalNumberF64(this.value.valueOf()) ? + `${Colors.bold(str)} (${hex(8, this.bitsLow, this.bitsHigh)} subnormal)` : + `${Colors.bold(str)} (${hex(8, this.bitsLow, this.bitsHigh)})`; } } } } +/** Class that encapsulates a single i32 value. */ +export class I32Value { + // The i32 value + // The i32 value, bitcast to a 32-bit integer. + type = Type.i32; // The type of the value. + constructor(value, bits) { + this.value = value; + this.bits = bits; + } + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU32[0] = this.bits; + for (let i = 0; i < 4; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `i32(${this.value})`; + } -/** Create a Scalar of `type` by storing `value` as an element of `workingDataArray` and retrieving it. - * The working data array *must* be an alias of `workingData`. - */ -function scalarFromValue( -type, -workingDataArray, -value) -{ - // Clear all bits of the working data since `value` may be smaller; the upper bits should be 0. - workingDataU32[1] = 0; - workingDataU32[0] = 0; - workingDataArray[0] = value; - return new Scalar(type, workingDataArray[0], workingDataU32[1], workingDataU32[0]); + toString() { + return `${Colors.bold(this.value.toString())} (${hex(4, this.bits)})`; + } } -/** Create a Scalar of `type` by storing `value` as an element of `workingDataStoreArray` and - * reinterpreting it as an element of `workingDataLoadArray`. - * Both working data arrays *must* be aliases of `workingData`. +/** Class that encapsulates a single u32 value. */ +export class U32Value { + // The u32 value + type = Type.u32; // The type of the value. + + constructor(value) { + this.value = value; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU32[0] = this.value; + for (let i = 0; i < 4; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `${this.value}u`; + } + + toString() { + return `${Colors.bold(this.value.toString())} (${hex(4, this.value)})`; + } +} + +/** + * Class that encapsulates a single i16 value. + * @note type does not exist in WGSL yet */ -function scalarFromBits( -type, -workingDataStoreArray, -workingDataLoadArray, -bits) -{ - // Clear all bits of the working data since `value` may be smaller; the upper bits should be 0. - workingDataU32[1] = 0; - workingDataU32[0] = 0; - workingDataStoreArray[0] = bits; - return new Scalar(type, workingDataLoadArray[0], workingDataU32[1], workingDataU32[0]); +export class I16Value { + // The i16 value + // The i16 value, bitcast to a 16-bit integer. + type = Type.i16; // The type of the value. + + constructor(value, bits) { + this.value = value; + this.bits = bits; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU16[0] = this.bits; + for (let i = 0; i < 4; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `i16(${this.value})`; + } + + toString() { + return `${Colors.bold(this.value.toString())} (${hex(2, this.bits)})`; + } +} + +/** + * Class that encapsulates a single u16 value. + * @note type does not exist in WGSL yet + */ +export class U16Value { + // The u16 value + type = Type.u16; // The type of the value. + + constructor(value) { + this.value = value; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU16[0] = this.value; + for (let i = 0; i < 2; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + assert(false, 'u16 is not a WGSL type'); + return `u16(${this.value})`; + } + + toString() { + return `${Colors.bold(this.value.toString())} (${hex(2, this.value)})`; + } +} + +/** + * Class that encapsulates a single i8 value. + * @note type does not exist in WGSL yet + */ +export class I8Value { + // The i8 value + // The i8 value, bitcast to a 8-bit integer. + type = Type.i8; // The type of the value. + + constructor(value, bits) { + this.value = value; + this.bits = bits; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU8[0] = this.bits; + for (let i = 0; i < 4; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `i8(${this.value})`; + } + + toString() { + return `${Colors.bold(this.value.toString())} (${hex(2, this.bits)})`; + } +} + +/** + * Class that encapsulates a single u8 value. + * @note type does not exist in WGSL yet + */ +export class U8Value { + // The u8 value + type = Type.u8; // The type of the value. + + constructor(value) { + this.value = value; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU8[0] = this.value; + for (let i = 0; i < 2; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + assert(false, 'u8 is not a WGSL type'); + return `u8(${this.value})`; + } + + toString() { + return `${Colors.bold(this.value.toString())} (${hex(2, this.value)})`; + } +} + +/** + * Class that encapsulates a single f64 value + * @note type does not exist in WGSL yet + */ +export class F64Value { + // The f32 value + // The low 32 bits of the abstract-float value. + // The high 32 bits of the abstract-float value. + type = Type.f64; // The type of the value. + + constructor(value, bitsLow, bitsHigh) { + this.value = value; + this.bitsLow = bitsLow; + this.bitsHigh = bitsHigh; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU32[0] = this.bitsLow; + workingDataU32[1] = this.bitsHigh; + for (let i = 0; i < 8; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + assert(false, 'f64 is not a WGSL type'); + return `${withPoint(this.value)}`; + } + + toString() { + switch (this.value) { + case Infinity: + case -Infinity: + return Colors.bold(this.value.toString()); + default:{ + let str = this.value.toString(); + str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; + return isSubnormalNumberF64(this.value.valueOf()) ? + `${Colors.bold(str)} (${hex(8, this.bitsLow, this.bitsHigh)} subnormal)` : + `${Colors.bold(str)} (${hex(8, this.bitsLow, this.bitsHigh)})`; + } + } + } +} + +/** Class that encapsulates a single f32 value. */ +export class F32Value { + // The f32 value + // The f32 value, bitcast to a 32-bit integer. + type = Type.f32; // The type of the value. + + constructor(value, bits) { + this.value = value; + this.bits = bits; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU32[0] = this.bits; + for (let i = 0; i < 4; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `${withPoint(this.value)}f`; + } + + toString() { + switch (this.value) { + case Infinity: + case -Infinity: + return Colors.bold(this.value.toString()); + default:{ + let str = this.value.toString(); + str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; + return isSubnormalNumberF32(this.value.valueOf()) ? + `${Colors.bold(str)} (${hex(4, this.bits)} subnormal)` : + `${Colors.bold(str)} (${hex(4, this.bits)})`; + } + } + } +} + +/** Class that encapsulates a single f16 value. */ +export class F16Value { + // The f16 value + // The f16 value, bitcast to a 16-bit integer. + type = Type.f16; // The type of the value. + + constructor(value, bits) { + this.value = value; + this.bits = bits; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + workingDataU16[0] = this.bits; + for (let i = 0; i < 2; i++) { + buffer[offset + i] = workingDataU8[i]; + } + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return `${withPoint(this.value)}h`; + } + + toString() { + switch (this.value) { + case Infinity: + case -Infinity: + return Colors.bold(this.value.toString()); + default:{ + let str = this.value.toString(); + str = str.indexOf('.') > 0 || str.indexOf('e') > 0 ? str : `${str}.0`; + return isSubnormalNumberF16(this.value.valueOf()) ? + `${Colors.bold(str)} (${hex(2, this.bits)} subnormal)` : + `${Colors.bold(str)} (${hex(2, this.bits)})`; + } + } + } +} +/** Class that encapsulates a single bool value. */ +export class BoolValue { + // The bool value + type = Type.bool; // The type of the value. + + constructor(value) { + this.value = value; + } + + /** + * Copies the scalar value to the buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the offset in buffer, in units of `buffer` + */ + copyTo(buffer, offset) { + buffer[offset] = this.value ? 1 : 0; + } + + /** @returns the WGSL representation of this scalar value */ + wgsl() { + return this.value.toString(); + } + + toString() { + return Colors.bold(this.value.toString()); + } +} + +/** Scalar represents all the scalar value types */ + + + + + + + + + + + + + + + + + + +export function isScalarValue(value) { + return ( + value instanceof AbstractIntValue || + value instanceof AbstractFloatValue || + value instanceof I32Value || + value instanceof U32Value || + value instanceof I16Value || + value instanceof U16Value || + value instanceof I8Value || + value instanceof U8Value || + value instanceof F64Value || + value instanceof F32Value || + value instanceof F16Value || + value instanceof BoolValue); + +} + +/** Create an AbstractInt from a numeric value, a JS `bigint`. */ +export function abstractInt(value) { + workingDataI64[0] = value; + return new AbstractIntValue(workingDataI64[0], workingDataU32[0], workingDataU32[1]); +} + +/** Create an AbstractInt from a bit representation, a uint64 represented as a JS `bigint`. */ +export function abstractIntBits(value) { + workingDataU64[0] = value; + return new AbstractIntValue(workingDataI64[0], workingDataU32[0], workingDataU32[1]); } /** Create an AbstractFloat from a numeric value, a JS `number`. */ -export const abstractFloat = (value) => -scalarFromValue(TypeAbstractFloat, workingDataF64, value); - -/** Create an f64 from a numeric value, a JS `number`. */ -export const f64 = (value) => scalarFromValue(TypeF64, workingDataF64, value); - -/** Create an f32 from a numeric value, a JS `number`. */ -export const f32 = (value) => scalarFromValue(TypeF32, workingDataF32, value); - -/** Create an f16 from a numeric value, a JS `number`. */ -export const f16 = (value) => scalarFromValue(TypeF16, workingDataF16, value); - -/** Create an f32 from a bit representation, a uint32 represented as a JS `number`. */ -export const f32Bits = (bits) => -scalarFromBits(TypeF32, workingDataU32, workingDataF32, bits); - -/** Create an f16 from a bit representation, a uint16 represented as a JS `number`. */ -export const f16Bits = (bits) => -scalarFromBits(TypeF16, workingDataU16, workingDataF16, bits); - -/** Create an AbstractInt from a numeric value, a JS `bigint`. */ -export const abstractInt = (value) => -scalarFromValue(TypeAbstractInt, workingDataI64, value); +export function abstractFloat(value) { + workingDataF64[0] = value; + return new AbstractFloatValue(workingDataF64[0], workingDataU32[0], workingDataU32[1]); +} /** Create an i32 from a numeric value, a JS `number`. */ -export const i32 = (value) => scalarFromValue(TypeI32, workingDataI32, value); - -/** Create an i16 from a numeric value, a JS `number`. */ -export const i16 = (value) => scalarFromValue(TypeI16, workingDataI16, value); - -/** Create an i8 from a numeric value, a JS `number`. */ -export const i8 = (value) => scalarFromValue(TypeI8, workingDataI8, value); +export function i32(value) { + workingDataI32[0] = value; + return new I32Value(workingDataI32[0], workingDataU32[0]); +} /** Create an i32 from a bit representation, a uint32 represented as a JS `number`. */ -export const i32Bits = (bits) => -scalarFromBits(TypeI32, workingDataU32, workingDataI32, bits); - -/** Create an i16 from a bit representation, a uint16 represented as a JS `number`. */ -export const i16Bits = (bits) => -scalarFromBits(TypeI16, workingDataU16, workingDataI16, bits); - -/** Create an i8 from a bit representation, a uint8 represented as a JS `number`. */ -export const i8Bits = (bits) => -scalarFromBits(TypeI8, workingDataU8, workingDataI8, bits); +export function i32Bits(bits) { + workingDataU32[0] = bits; + return new I32Value(workingDataI32[0], workingDataU32[0]); +} /** Create a u32 from a numeric value, a JS `number`. */ -export const u32 = (value) => scalarFromValue(TypeU32, workingDataU32, value); +export function u32(value) { + workingDataU32[0] = value; + return new U32Value(workingDataU32[0]); +} + +/** Create a u32 from a bit representation, a uint32 represented as a JS `number`. */ +export function u32Bits(bits) { + workingDataU32[0] = bits; + return new U32Value(workingDataU32[0]); +} + +/** Create an i16 from a numeric value, a JS `number`. */ +export function i16(value) { + workingDataI16[0] = value; + return new I16Value(workingDataI16[0], workingDataU16[0]); +} /** Create a u16 from a numeric value, a JS `number`. */ -export const u16 = (value) => scalarFromValue(TypeU16, workingDataU16, value); +export function u16(value) { + workingDataU16[0] = value; + return new U16Value(workingDataU16[0]); +} + +/** Create an i8 from a numeric value, a JS `number`. */ +export function i8(value) { + workingDataI8[0] = value; + return new I8Value(workingDataI8[0], workingDataU8[0]); +} /** Create a u8 from a numeric value, a JS `number`. */ -export const u8 = (value) => scalarFromValue(TypeU8, workingDataU8, value); +export function u8(value) { + workingDataU8[0] = value; + return new U8Value(workingDataU8[0]); +} -/** Create an u32 from a bit representation, a uint32 represented as a JS `number`. */ -export const u32Bits = (bits) => -scalarFromBits(TypeU32, workingDataU32, workingDataU32, bits); +/** Create an f64 from a numeric value, a JS `number`. */ +export function f64(value) { + workingDataF64[0] = value; + return new F64Value(workingDataF64[0], workingDataU32[0], workingDataU32[1]); +} -/** Create an u16 from a bit representation, a uint16 represented as a JS `number`. */ -export const u16Bits = (bits) => -scalarFromBits(TypeU16, workingDataU16, workingDataU16, bits); +/** Create an f32 from a numeric value, a JS `number`. */ +export function f32(value) { + workingDataF32[0] = value; + return new F32Value(workingDataF32[0], workingDataU32[0]); +} -/** Create an u8 from a bit representation, a uint8 represented as a JS `number`. */ -export const u8Bits = (bits) => -scalarFromBits(TypeU8, workingDataU8, workingDataU8, bits); +/** Create an f32 from a bit representation, a uint32 represented as a JS `number`. */ +export function f32Bits(bits) { + workingDataU32[0] = bits; + return new F32Value(workingDataF32[0], workingDataU32[0]); +} + +/** Create an f16 from a numeric value, a JS `number`. */ +export function f16(value) { + workingDataF16[0] = value; + return new F16Value(workingDataF16[0], workingDataU16[0]); +} + +/** Create an f16 from a bit representation, a uint16 represented as a JS `number`. */ +export function f16Bits(bits) { + workingDataU16[0] = bits; + return new F16Value(workingDataF16[0], workingDataU16[0]); +} /** Create a boolean value. */ export function bool(value) { - // WGSL does not support using 'bool' types directly in storage / uniform - // buffers, so instead we pack booleans in a u32, where 'false' is zero and - // 'true' is any non-zero value. - workingDataU32[0] = value ? 1 : 0; - workingDataU32[1] = 0; - return new Scalar(TypeBool, value, workingDataU32[1], workingDataU32[0]); + return new BoolValue(value); } /** A 'true' literal value */ @@ -1154,7 +1857,7 @@ export const False = bool(false); /** * Class that encapsulates a vector value. */ -export class Vector { +export class VectorValue { @@ -1172,7 +1875,7 @@ export class Vector { } } this.elements = elements; - this.type = TypeVec(elements.length, elements[0].type); + this.type = VectorType.create(elements.length, elements[0].type); } /** @@ -1220,19 +1923,24 @@ export class Vector { } } +/** Helper for constructing a new vector with the provided values */ +export function vec(...elements) { + return new VectorValue(elements); +} + /** Helper for constructing a new two-element vector with the provided values */ export function vec2(x, y) { - return new Vector([x, y]); + return new VectorValue([x, y]); } /** Helper for constructing a new three-element vector with the provided values */ export function vec3(x, y, z) { - return new Vector([x, y, z]); + return new VectorValue([x, y, z]); } /** Helper for constructing a new four-element vector with the provided values */ export function vec4(x, y, z, w) { - return new Vector([x, y, z, w]); + return new VectorValue([x, y, z, w]); } /** @@ -1256,7 +1964,7 @@ export function toVector(v, op) { /** * Class that encapsulates a Matrix value. */ -export class Matrix { +export class MatrixValue { @@ -1281,7 +1989,7 @@ export class Matrix { } this.elements = elements; - this.type = TypeMat(num_cols, num_rows, elem_type); + this.type = MatrixType.create(num_cols, num_rows, elem_type); } /** @@ -1316,6 +2024,53 @@ export class Matrix { } } +/** + * Class that encapsulates an Array value. + */ +export class ArrayValue { + + + + constructor(elements) { + const elem_type = elements[0].type; + if (!elements.every((c) => elements.every((r) => objectEquals(r.type, elem_type)))) { + throw new Error(`cannot mix array element types`); + } + + this.elements = elements; + this.type = ArrayType.create(elements.length, elem_type); + } + + /** + * Copies the array value to the Uint8Array buffer at the provided byte offset. + * @param buffer the destination buffer + * @param offset the byte offset within buffer + */ + copyTo(buffer, offset) { + for (const element of this.elements) { + element.copyTo(buffer, offset); + offset += this.type.elementType.size; + } + } + + /** + * @returns the WGSL representation of this array value + */ + wgsl() { + const els = this.elements.map((r) => r.wgsl()).join(', '); + return isAbstractType(this.type.elementType) ? `array(${els})` : `${this.type}(${els})`; + } + + toString() { + return this.wgsl(); + } +} + +/** Helper for constructing an ArrayValue with the provided values */ +export function array(...elements) { + return new ArrayValue(elements); +} + /** * Helper for constructing Matrices from arrays of numbers * @@ -1326,17 +2081,19 @@ export class Matrix { export function toMatrix(m, op) { const cols = m.length; const rows = m[0].length; - const elements = [...Array(cols)].map((_) => [...Array(rows)]); + const elements = [...Array(cols)].map((_) => [ + ...Array(rows)] + ); for (let i = 0; i < cols; i++) { for (let j = 0; j < rows; j++) { elements[i][j] = op(m[i][j]); } } - return new Matrix(elements); + return new MatrixValue(elements); } -/** Value is a Scalar or Vector value. */var +/** Value is a Scalar, Vector, Matrix or Array value. */var @@ -1509,13 +2266,13 @@ export function serializeValue(s, v) { } }; - if (v instanceof Scalar) { + if (isScalarValue(v)) { s.writeU8(SerializedValueKind.Scalar); serializeScalarKind(s, v.type.kind); serializeScalar(v, v.type.kind); return; } - if (v instanceof Vector) { + if (v instanceof VectorValue) { s.writeU8(SerializedValueKind.Vector); serializeScalarKind(s, v.type.elementType.kind); s.writeU8(v.type.width); @@ -1524,7 +2281,7 @@ export function serializeValue(s, v) { } return; } - if (v instanceof Matrix) { + if (v instanceof MatrixValue) { s.writeU8(SerializedValueKind.Matrix); serializeScalarKind(s, v.type.elementType.kind); s.writeU8(v.type.cols); @@ -1581,7 +2338,7 @@ export function deserializeValue(s) { for (let i = 0; i < width; i++) { scalars[i] = deserializeScalar(scalarKind); } - return new Vector(scalars); + return new VectorValue(scalars); } case SerializedValueKind.Matrix:{ const numCols = s.readU8(); @@ -1593,7 +2350,7 @@ export function deserializeValue(s) { columns[c][i] = deserializeScalar(scalarKind); } } - return new Matrix(columns); + return new MatrixValue(columns); } default: unreachable(`invalid serialized value kind: ${valueKind}`); @@ -1631,84 +2388,241 @@ export function isFloatType(ty) { return false; } +/** + * @returns if `ty` is an integer point type. + * @note this does not consider composite types. + * Use elementType() if you want to test the element type. + */ +export function isIntegerType(ty) { + if (ty instanceof ScalarType) { + return ( + ty.kind === 'abstract-int' || + ty.kind === 'i32' || + ty.kind === 'i16' || + ty.kind === 'i8' || + ty.kind === 'u32' || + ty.kind === 'u16' || + ty.kind === 'u8'); + + } + return false; +} + +/** + * @returns if `ty` is a type convertible to floating point type. + * @note this does not consider composite types. + * Use elementType() if you want to test the element type. + */ +export function isConvertibleToFloatType(ty) { + if (ty instanceof ScalarType) { + return ( + ty.kind === 'abstract-int' || + ty.kind === 'abstract-float' || + ty.kind === 'f64' || + ty.kind === 'f32' || + ty.kind === 'f16'); + + } + return false; +} + +/** + * @returns if `ty` is an unsigned type. + */ +export function isUnsignedType(ty) { + if (ty instanceof ScalarType) { + return ty.kind === 'u8' || ty.kind === 'u16' || ty.kind === 'u32'; + } else { + return isUnsignedType(ty.elementType); + } +} + +/** @returns true if an argument of type 'src' can be used for a parameter of type 'dst' */ +export function isConvertible(src, dst) { + if (src === dst) { + return true; + } + + const shapeOf = (ty) => { + if (ty instanceof ScalarType) { + return `scalar`; + } + if (ty instanceof VectorType) { + return `vec${ty.width}`; + } + if (ty instanceof MatrixType) { + return `mat${ty.cols}x${ty.rows}`; + } + if (ty instanceof ArrayType) { + return `array<${ty.count}>`; + } + unreachable(`unhandled type: ${ty}`); + }; + + if (shapeOf(src) !== shapeOf(dst)) { + return false; + } + + const elSrc = scalarTypeOf(src); + const elDst = scalarTypeOf(dst); + + switch (elSrc.kind) { + case 'abstract-float': + switch (elDst.kind) { + case 'abstract-float': + case 'f16': + case 'f32': + case 'f64': + return true; + default: + return false; + } + case 'abstract-int': + switch (elDst.kind) { + case 'abstract-int': + case 'abstract-float': + case 'f16': + case 'f32': + case 'f64': + case 'u16': + case 'u32': + case 'u8': + case 'i16': + case 'i32': + case 'i8': + return true; + default: + return false; + } + default: + return false; + } +} + /// All floating-point scalar types -export const kAllFloatScalars = [TypeAbstractFloat, TypeF32, TypeF16]; +export const kFloatScalars = [Type.abstractFloat, Type.f32, Type.f16]; + +/// All concrete floating-point scalar types +export const kConcreteFloatScalars = [Type.f32, Type.f16]; /// All floating-point vec2 types -export const kAllFloatVector2 = [ -TypeVec(2, TypeAbstractFloat), -TypeVec(2, TypeF32), -TypeVec(2, TypeF16)]; - +const kFloatVec2 = [Type.vec2af, Type.vec2f, Type.vec2h]; /// All floating-point vec3 types -export const kAllFloatVector3 = [ -TypeVec(3, TypeAbstractFloat), -TypeVec(3, TypeF32), -TypeVec(3, TypeF16)]; - +const kFloatVec3 = [Type.vec3af, Type.vec3f, Type.vec3h]; /// All floating-point vec4 types -export const kAllFloatVector4 = [ -TypeVec(4, TypeAbstractFloat), -TypeVec(4, TypeF32), -TypeVec(4, TypeF16)]; +const kFloatVec4 = [Type.vec4af, Type.vec4f, Type.vec4h]; + +export const kConcreteF32ScalarsAndVectors = [ +Type.f32, +Type.vec2f, +Type.vec3f, +Type.vec4f]; + + +/// All f16 floating-point scalar and vector types +export const kConcreteF16ScalarsAndVectors = [ +Type.f16, +Type.vec2h, +Type.vec3h, +Type.vec4h]; /// All floating-point vector types -export const kAllFloatVectors = [ -...kAllFloatVector2, -...kAllFloatVector3, -...kAllFloatVector4]; - +export const kFloatVectors = [...kFloatVec2, ...kFloatVec3, ...kFloatVec4]; /// All floating-point scalar and vector types -export const kAllFloatScalarsAndVectors = [...kAllFloatScalars, ...kAllFloatVectors]; +export const kFloatScalarsAndVectors = [...kFloatScalars, ...kFloatVectors]; -/// All integer scalar and vector types -export const kAllIntegerScalarsAndVectors = [ -TypeI32, -TypeVec(2, TypeI32), -TypeVec(3, TypeI32), -TypeVec(4, TypeI32), -TypeU32, -TypeVec(2, TypeU32), -TypeVec(3, TypeU32), -TypeVec(4, TypeU32)]; +// Abstract and concrete integer types are not grouped into an 'all' type, +// because for many validation tests there is a valid conversion of +// AbstractInt -> AbstractFloat, but not one for the concrete integers. Thus, an +// AbstractInt literal will be a potentially valid input, whereas the concrete +// integers will not be. For many tests the pattern is to have separate fixtures +// for the things that might be valid and those that are never valid. + +/// All signed integer vector types +export const kConcreteSignedIntegerVectors = [Type.vec2i, Type.vec3i, Type.vec4i]; + +/// All unsigned integer vector types +export const kConcreteUnsignedIntegerVectors = [Type.vec2u, Type.vec3u, Type.vec4u]; + +/// All concrete integer vector types +export const kConcreteIntegerVectors = [ +...kConcreteSignedIntegerVectors, +...kConcreteUnsignedIntegerVectors]; /// All signed integer scalar and vector types -export const kAllSignedIntegerScalarsAndVectors = [ -TypeI32, -TypeVec(2, TypeI32), -TypeVec(3, TypeI32), -TypeVec(4, TypeI32)]; +export const kConcreteSignedIntegerScalarsAndVectors = [ +Type.i32, +...kConcreteSignedIntegerVectors]; /// All unsigned integer scalar and vector types -export const kAllUnsignedIntegerScalarsAndVectors = [ -TypeU32, -TypeVec(2, TypeU32), -TypeVec(3, TypeU32), -TypeVec(4, TypeU32)]; +export const kConcreteUnsignedIntegerScalarsAndVectors = [ +Type.u32, +...kConcreteUnsignedIntegerVectors]; -/// All floating-point and integer scalar and vector types -export const kAllFloatAndIntegerScalarsAndVectors = [ -...kAllFloatScalarsAndVectors, -...kAllIntegerScalarsAndVectors]; +/// All concrete integer scalar and vector types +export const kConcreteIntegerScalarsAndVectors = [ +...kConcreteSignedIntegerScalarsAndVectors, +...kConcreteUnsignedIntegerScalarsAndVectors]; -/// All floating-point and signed integer scalar and vector types -export const kAllFloatAndSignedIntegerScalarsAndVectors = [ -...kAllFloatScalarsAndVectors, -...kAllSignedIntegerScalarsAndVectors]; +/// All types which are convertable to floating-point scalar types. +export const kConvertableToFloatScalar = [Type.abstractInt, ...kFloatScalars]; + +/// All types which are convertable to floating-point vector 2 types. +export const kConvertableToFloatVec2 = [Type.vec2ai, ...kFloatVec2]; + +/// All types which are convertable to floating-point vector 3 types. +export const kConvertableToFloatVec3 = [Type.vec3ai, ...kFloatVec3]; + +/// All types which are convertable to floating-point vector 4 types. +export const kConvertableToFloatVec4 = [Type.vec4ai, ...kFloatVec4]; + +/// All the types which are convertable to floating-point vector types. +export const kConvertableToFloatVectors = [ +Type.vec2ai, +Type.vec3ai, +Type.vec4ai, +...kFloatVectors]; -/** @returns the inner element type of the given type */ -export function elementType(t) { - if (t instanceof ScalarType) { - return t; - } - return t.elementType; -} \ No newline at end of file +/// All types which are convertable to floating-point scalar or vector types. +export const kConvertableToFloatScalarsAndVectors = [ +Type.abstractInt, +...kFloatScalars, +...kConvertableToFloatVectors]; + + +/// All the numeric scalar and vector types. +export const kAllNumericScalarsAndVectors = [ +...kConvertableToFloatScalarsAndVectors, +...kConcreteIntegerScalarsAndVectors]; + + +/// All the concrete integer and floating point scalars and vectors. +export const kConcreteNumericScalarsAndVectors = [ +...kConcreteIntegerScalarsAndVectors, +...kConcreteF16ScalarsAndVectors, +...kConcreteF32ScalarsAndVectors]; + + +/// All boolean types. +export const kAllBoolScalarsAndVectors = [Type.bool, Type.vec2b, Type.vec3b, Type.vec4b]; + +/// All the scalar and vector types. +export const kAllScalarsAndVectors = [ +...kAllBoolScalarsAndVectors, +...kAllNumericScalarsAndVectors]; + + +/// All the vector types +export const kAllVecTypes = Object.values(kVecTypes); + +/// All the matrix types +export const kAllMatrices = Object.values(kMatTypes); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/copy_to_texture.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/copy_to_texture.js index beaad649fee..5065bd11250 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/copy_to_texture.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/copy_to_texture.js @@ -187,6 +187,5 @@ export class CopyToTextureUtils extends TextureTestMixin(GPUTest) { copySize, texelCompareOptions ); - this.trackForCleanup(dstTextureCopyView.texture); } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/device_pool.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/device_pool.js index 84345c9e5a3..a5a73d7c46c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/device_pool.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/device_pool.js @@ -17,6 +17,8 @@ import { getDefaultLimits, kLimits } from '../capability_info.js'; + + class TestFailedButDeviceReusable extends Error {} class FeaturesNotSupported extends Error {} export class TestOOMedShouldAttemptGC extends Error {} @@ -81,6 +83,8 @@ export class DevicePool { this.holders.delete(holder); if ('destroy' in holder.device) { holder.device.destroy(); + // Wait for destruction (or actual device loss if any) to complete. + await holder.device.lost; } // Release the (hopefully only) ref to the GPUDevice. @@ -286,6 +290,8 @@ descriptor) * Holds a GPUDevice and tracks its state (free/acquired) and handles device loss. */ class DeviceHolder { + /** Adapter the device was created from. Cannot be reused; just for adapter info. */ + /** The device. Will be cleared during cleanup if there were unexpected errors. */ /** Whether the device is in use by a test or not. */ @@ -307,13 +313,16 @@ class DeviceHolder { if (!supportsFeature(adapter, descriptor)) { throw new FeaturesNotSupported('One or more features are not supported'); } + // No trackForCleanup because we plan to reuse the device for the next test. + const device = await adapter.requestDevice(descriptor); assert(device !== null, 'requestDevice returned null'); - return new DeviceHolder(device); + return new DeviceHolder(adapter, device); } - constructor(device) { + constructor(adapter, device) { + this.adapter = adapter; this._device = device; void this._device.lost.then((ev) => { this.lostInfo = ev; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/floating_point.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/floating_point.js index 74743b0fe7a..5c53b46a800 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/floating_point.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/floating_point.js @@ -666,6 +666,7 @@ function addFlushedIfNeededF16(values) { + /** A representation of an FPInterval for a case param */ @@ -1047,14 +1048,14 @@ export class FPTraits { unreachable(`'refract' is not yet implemented for '${this.kind}'`); } - /** Version of absoluteErrorInterval that always returns the unboundedInterval */ - unboundedAbsoluteErrorInterval(_n, _error_range) { - return this.constants().unboundedInterval; + /** Stub for absolute errors */ + unimplementedAbsoluteErrorInterval(_n, _error_range) { + unreachable(`Absolute Error is not implement for '${this.kind}'`); } - /** Version of ulpInterval that always returns the unboundedInterval */ - unboundedUlpInterval(_n, _numULP) { - return this.constants().unboundedInterval; + /** Stub for ULP errors */ + unimplementedUlpInterval(_n, _numULP) { + unreachable(`ULP Error is not implement for '${this.kind}'`); } // Utilities - Defined by subclass @@ -1073,7 +1074,7 @@ export class FPTraits { /** @returns 1 * ULP: (number) */ - /** @returns a builder for converting numbers to Scalars */ + /** @returns a builder for converting numbers to ScalarsValues */ /** @returns a range of scalars for testing */ @@ -1713,7 +1714,6 @@ export class FPTraits { { param0 = map2DArray(param0, this.quantize); param1 = map2DArray(param1, this.quantize); - const results = ops.map((o) => o(param0, param1)); if (filter === 'finite' && results.some((m) => m.some((c) => c.some((r) => !r.isFinite())))) { return undefined; @@ -2527,9 +2527,10 @@ export class FPTraits { runMatrixToMatrixOp(m, op) { const num_cols = m.length; const num_rows = m[0].length; - if (m.some((c) => c.some((r) => !r.isFinite()))) { - return this.constants().unboundedMatrix[num_cols][num_rows]; - } + + // Do not check for OOB inputs and exit early here, because the shape of + // the output matrix may be determined by the operation being run, + // i.e. transpose. const m_flat = flatten2DArray(m); const m_values = cartesianProduct( @@ -2834,7 +2835,7 @@ export class FPTraits { assert(this.kind === 'f32' || this.kind === 'f16'); // asin(n) = atan2(n, sqrt(1.0 - n * n)) or a polynomial approximation with absolute error const x = this.sqrtInterval(this.subtractionInterval(1, this.multiplicationInterval(n, n))); - const approx_abs_error = this.kind === 'f32' ? 6.77e-5 : 3.91e-3; + const approx_abs_error = this.kind === 'f32' ? 6.81e-5 : 3.91e-3; return this.spanIntervals( this.atan2Interval(n, x), this.absoluteErrorInterval(Math.asin(n), approx_abs_error) @@ -3411,7 +3412,10 @@ export class FPTraits { x, y) { - assert(x.length === y.length, `dot not defined for vectors with different lengths`); + assert( + x.length === y.length, + `dot not defined for vectors with different lengths, x = ${x}, y = ${y}` + ); return this.runVectorPairToIntervalOp(this.toVector(x), this.toVector(y), this.DotIntervalOp); } @@ -3599,11 +3603,9 @@ export class FPTraits { LdexpIntervalOp = { impl: (e1, e2) => { - assert(this.kind === 'f32' || this.kind === 'f16'); assert(Number.isInteger(e2), 'the second param of ldexp must be an integer'); - const bias = this.kind === 'f32' ? 127 : 15; // Spec explicitly calls indeterminate value if e2 > bias + 1 - if (e2 > bias + 1) { + if (e2 > this.constants().bias + 1) { return this.constants().unboundedInterval; } // The spec says the result of ldexp(e1, e2) = e1 * 2 ^ e2, and the @@ -3613,7 +3615,7 @@ export class FPTraits { // correctlyRoundedInterval. const result = e1 * 2 ** e2; if (!Number.isFinite(result)) { - // Overflowed TS's number type, so definitely out of bounds for f32/f16 + // Overflowed TS's number type, so definitely out of bounds return this.constants().unboundedInterval; } // The result may be zero if e2 + bias <= 0, but we can't simply span the interval to 0.0. @@ -4459,6 +4461,7 @@ class F32Traits extends FPTraits { sixth: kValue.f32.negative.pi.sixth } }, + bias: 127, unboundedInterval: kF32UnboundedInterval, zeroInterval: kF32ZeroInterval, // Have to use the constants.ts values here, because values defined in the @@ -4926,6 +4929,7 @@ class FPAbstractTraits extends FPTraits { sixth: kValue.f64.negative.pi.sixth } }, + bias: 1023, unboundedInterval: kAbstractUnboundedInterval, zeroInterval: kAbstractZeroInterval, // Have to use the constants.ts values here, because values defined in the @@ -5091,12 +5095,10 @@ class FPAbstractTraits extends FPTraits { sparseMatrixRange = sparseMatrixF64Range; // Framework - Fundamental Error Intervals - Overrides - absoluteErrorInterval = this.unboundedAbsoluteErrorInterval.bind(this); + absoluteErrorInterval = this.unimplementedAbsoluteErrorInterval.bind(this); // Should use FP.f32 instead correctlyRoundedInterval = this.correctlyRoundedIntervalImpl.bind(this); correctlyRoundedMatrix = this.correctlyRoundedMatrixImpl.bind(this); - ulpInterval = (n, numULP) => { - return this.toInterval(kF32Traits.ulpInterval(n, numULP)); - }; + ulpInterval = this.unimplementedUlpInterval.bind(this); // Should use FP.f32 instead // Framework - API - Overrides absInterval = this.absIntervalImpl.bind(this); @@ -5110,8 +5112,14 @@ class FPAbstractTraits extends FPTraits { 'acoshPrimaryInterval' ); acoshIntervals = [this.acoshAlternativeInterval, this.acoshPrimaryInterval]; - additionInterval = this.additionIntervalImpl.bind(this); - additionMatrixMatrixInterval = this.additionMatrixMatrixIntervalImpl.bind(this); + additionInterval = this.unimplementedScalarPairToInterval.bind( + this, + 'additionInterval' + ); + additionMatrixMatrixInterval = this.unimplementedMatrixPairToMatrix.bind( + this, + 'additionMatrixMatrixInterval' + ); asinInterval = this.unimplementedScalarToInterval.bind(this, 'asinInterval'); asinhInterval = this.unimplementedScalarToInterval.bind(this, 'asinhInterval'); atanInterval = this.unimplementedScalarToInterval.bind(this, 'atanInterval'); @@ -5120,50 +5128,57 @@ class FPAbstractTraits extends FPTraits { 'atan2Interval' ); atanhInterval = this.unimplementedScalarToInterval.bind(this, 'atanhInterval'); - ceilInterval = this.unimplementedScalarToInterval.bind(this, 'ceilInterval'); + ceilInterval = this.ceilIntervalImpl.bind(this); clampMedianInterval = this.clampMedianIntervalImpl.bind(this); clampMinMaxInterval = this.clampMinMaxIntervalImpl.bind(this); clampIntervals = [this.clampMedianInterval, this.clampMinMaxInterval]; cosInterval = this.unimplementedScalarToInterval.bind(this, 'cosInterval'); coshInterval = this.unimplementedScalarToInterval.bind(this, 'coshInterval'); - crossInterval = this.crossIntervalImpl.bind(this); - degreesInterval = this.degreesIntervalImpl.bind(this); + crossInterval = this.unimplementedVectorPairToVector.bind(this, 'crossInterval'); + degreesInterval = this.unimplementedScalarToInterval.bind( + this, + 'degreesInterval' + ); determinantInterval = this.unimplementedMatrixToInterval.bind( this, - 'determinantInterval' + 'determinant' ); distanceInterval = this.unimplementedDistance.bind(this); - divisionInterval = ( - x, - y) => - { - return this.toInterval(kF32Traits.divisionInterval(x, y)); - }; + divisionInterval = this.unimplementedScalarPairToInterval.bind( + this, + 'divisionInterval' + ); dotInterval = this.unimplementedVectorPairToInterval.bind(this, 'dotInterval'); expInterval = this.unimplementedScalarToInterval.bind(this, 'expInterval'); exp2Interval = this.unimplementedScalarToInterval.bind(this, 'exp2Interval'); faceForwardIntervals = this.unimplementedFaceForward.bind(this); floorInterval = this.floorIntervalImpl.bind(this); - fmaInterval = this.fmaIntervalImpl.bind(this); + fmaInterval = this.unimplementedScalarTripleToInterval.bind(this, 'fmaInterval'); fractInterval = this.unimplementedScalarToInterval.bind(this, 'fractInterval'); inverseSqrtInterval = this.unimplementedScalarToInterval.bind( this, 'inverseSqrtInterval' ); - ldexpInterval = this.unimplementedScalarPairToInterval.bind( - this, - 'ldexpInterval' - ); + ldexpInterval = this.ldexpIntervalImpl.bind(this); lengthInterval = this.unimplementedLength.bind(this); logInterval = this.unimplementedScalarToInterval.bind(this, 'logInterval'); log2Interval = this.unimplementedScalarToInterval.bind(this, 'log2Interval'); maxInterval = this.maxIntervalImpl.bind(this); minInterval = this.minIntervalImpl.bind(this); - mixImpreciseInterval = this.mixImpreciseIntervalImpl.bind(this); - mixPreciseInterval = this.mixPreciseIntervalImpl.bind(this); + mixImpreciseInterval = this.unimplementedScalarTripleToInterval.bind( + this, + 'mixImpreciseInterval' + ); + mixPreciseInterval = this.unimplementedScalarTripleToInterval.bind( + this, + 'mixPreciseInterval' + ); mixIntervals = [this.mixImpreciseInterval, this.mixPreciseInterval]; modfInterval = this.modfIntervalImpl.bind(this); - multiplicationInterval = this.multiplicationIntervalImpl.bind(this); + multiplicationInterval = this.unimplementedScalarPairToInterval.bind( + this, + 'multiplicationInterval' + ); multiplicationMatrixMatrixInterval = this.unimplementedMatrixPairToMatrix.bind( this, 'multiplicationMatrixMatrixInterval' @@ -5190,15 +5205,16 @@ class FPAbstractTraits extends FPTraits { 'normalizeInterval' ); powInterval = this.unimplementedScalarPairToInterval.bind(this, 'powInterval'); - radiansInterval = this.radiansIntervalImpl.bind(this); + radiansInterval = this.unimplementedScalarToInterval.bind(this, 'radiansImpl'); reflectInterval = this.unimplementedVectorPairToVector.bind( this, 'reflectInterval' ); refractInterval = this.unimplementedRefract.bind(this); - remainderInterval = (x, y) => { - return this.toInterval(kF32Traits.remainderInterval(x, y)); - }; + remainderInterval = this.unimplementedScalarPairToInterval.bind( + this, + 'remainderInterval' + ); roundInterval = this.roundIntervalImpl.bind(this); saturateInterval = this.saturateIntervalImpl.bind(this); signInterval = this.signIntervalImpl.bind(this); @@ -5209,10 +5225,15 @@ class FPAbstractTraits extends FPTraits { 'smoothStepInterval' ); sqrtInterval = this.unimplementedScalarToInterval.bind(this, 'sqrtInterval'); - stepInterval = this.unimplementedScalarPairToInterval.bind(this, 'stepInterval'); - subtractionInterval = this.subtractionIntervalImpl.bind(this); - subtractionMatrixMatrixInterval = - this.subtractionMatrixMatrixIntervalImpl.bind(this); + stepInterval = this.stepIntervalImpl.bind(this); + subtractionInterval = this.unimplementedScalarPairToInterval.bind( + this, + 'subtractionInterval' + ); + subtractionMatrixMatrixInterval = this.unimplementedMatrixPairToMatrix.bind( + this, + 'subtractionMatrixMatrixInterval' + ); tanInterval = this.unimplementedScalarToInterval.bind(this, 'tanInterval'); tanhInterval = this.unimplementedScalarToInterval.bind(this, 'tanhInterval'); transposeInterval = this.transposeIntervalImpl.bind(this); @@ -5270,6 +5291,7 @@ class F16Traits extends FPTraits { sixth: kValue.f16.negative.pi.sixth } }, + bias: 15, unboundedInterval: kF16UnboundedInterval, zeroInterval: kF16ZeroInterval, // Have to use the constants.ts values here, because values defined in the @@ -5535,5 +5557,6 @@ export function isRepresentable(value, type) { const constants = fpTraitsFor(type).constants(); return value >= constants.negative.min && value <= constants.positive.max; } + assert(false, `isRepresentable() is not yet implemented for type ${type}`); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/math.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/math.js index 91cc091c21a..e44458cfbd9 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/math.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/math.js @@ -413,6 +413,25 @@ export function oneULPF32(target, mode = 'flush') { } } +/** + * @returns an integer value between 0..0xffffffff using a simple non-cryptographic hash function + * @param values integers to generate hash from. + */ +export function hashU32(...values) { + let n = 0x3504_f333; + for (const v of values) { + n = v + (n << 7) + (n >>> 1); + n = n * 0x29493 & 0xffff_ffff; + } + n ^= n >>> 8; + n += n << 15; + n = n & 0xffff_ffff; + if (n < 0) { + n = ~n * 2 + 1; + } + return n; +} + /** * @returns ulp(x), the unit of least precision for a specific number as a 32-bit float * @@ -1171,27 +1190,18 @@ export function sparseI32Range() { const kVectorI32Values = { 2: kInterestingI32Values.flatMap((f) => [ [f, 1], - [1, f], - [f, -1], [-1, f]] ), 3: kInterestingI32Values.flatMap((f) => [ - [f, 1, 2], - [1, f, 2], - [1, 2, f], - [f, -1, -2], - [-1, f, -2], - [-1, -2, f]] + [f, 1, -2], + [-1, f, 2], + [1, -2, f]] ), 4: kInterestingI32Values.flatMap((f) => [ - [f, 1, 2, 3], - [1, f, 2, 3], - [1, 2, f, 3], - [1, 2, 3, f], - [f, -1, -2, -3], - [-1, f, -2, -3], - [-1, -2, f, -3], - [-1, -2, -3, f]] + [f, -1, 2, 3], + [1, f, -2, 3], + [1, 2, f, -3], + [-1, 2, -3, f]] ) }; @@ -1213,6 +1223,38 @@ export function vectorI32Range(dim) { return kVectorI32Values[dim]; } +const kSparseVectorI32Values = { + 2: sparseI32Range().map((i, idx) => [idx % 2 === 0 ? i : idx, idx % 2 === 1 ? i : -idx]), + 3: sparseI32Range().map((i, idx) => [ + idx % 3 === 0 ? i : idx, + idx % 3 === 1 ? i : -idx, + idx % 3 === 2 ? i : idx] + ), + 4: sparseI32Range().map((i, idx) => [ + idx % 4 === 0 ? i : idx, + idx % 4 === 1 ? i : -idx, + idx % 4 === 2 ? i : idx, + idx % 4 === 3 ? i : -idx] + ) +}; + +/** + * Minimal set of vectors, indexed by dimension, that contain interesting + * abstract integer values. + * + * This is an even more stripped down version of `vectorI32Range` for when + * pairs of vectors are being tested. + * All interesting integers from sparseI32Range are guaranteed to be + * tested, but not in every position. + */ +export function sparseVectorI32Range(dim) { + assert( + dim === 2 || dim === 3 || dim === 4, + 'sparseVectorI32Range only accepts dimensions 2, 3, and 4' + ); + return kSparseVectorI32Values[dim]; +} + /** * @returns an ascending sorted array of numbers spread over the entire range of 32-bit signed ints * @@ -1291,6 +1333,38 @@ export function vectorU32Range(dim) { return kVectorU32Values[dim]; } +const kSparseVectorU32Values = { + 2: sparseU32Range().map((i, idx) => [idx % 2 === 0 ? i : idx, idx % 2 === 1 ? i : -idx]), + 3: sparseU32Range().map((i, idx) => [ + idx % 3 === 0 ? i : idx, + idx % 3 === 1 ? i : -idx, + idx % 3 === 2 ? i : idx] + ), + 4: sparseU32Range().map((i, idx) => [ + idx % 4 === 0 ? i : idx, + idx % 4 === 1 ? i : -idx, + idx % 4 === 2 ? i : idx, + idx % 4 === 3 ? i : -idx] + ) +}; + +/** + * Minimal set of vectors, indexed by dimension, that contain interesting + * abstract integer values. + * + * This is an even more stripped down version of `vectorU32Range` for when + * pairs of vectors are being tested. + * All interesting integers from sparseU32Range are guaranteed to be + * tested, but not in every position. + */ +export function sparseVectorU32Range(dim) { + assert( + dim === 2 || dim === 3 || dim === 4, + 'sparseVectorU32Range only accepts dimensions 2, 3, and 4' + ); + return kSparseVectorU32Values[dim]; +} + /** * @returns an ascending sorted array of numbers spread over the entire range of 32-bit unsigned ints * @@ -1302,26 +1376,102 @@ export function fullU32Range(count = 50) { return [0, ...biasedRange(1, kValue.u32.max, count)].map(Math.trunc); } -/** Short list of f32 values of interest to test against */ -const kInterestingF32Values = [ -kValue.f32.negative.min, --10.0, --1.0, --0.125, -kValue.f32.negative.max, -kValue.f32.negative.subnormal.min, -kValue.f32.negative.subnormal.max, --0.0, -0.0, -kValue.f32.positive.subnormal.min, -kValue.f32.positive.subnormal.max, -kValue.f32.positive.min, -0.125, -1.0, -10.0, -kValue.f32.positive.max]; +/** Short list of i64 values of interest to test against */ +const kInterestingI64Values = [ +kValue.i64.negative.max, +kValue.i64.negative.max / 2n, +-256n, +-10n, +-1n, +0n, +1n, +10n, +256n, +kValue.i64.positive.max / 2n, +kValue.i64.positive.max]; +/** @returns minimal i64 values that cover the entire range of i64 behaviours + * + * This is used instead of fullI64Range when the number of test cases being + * generated is a super linear function of the length of i64 values which is + * leading to time outs. + */ +export function sparseI64Range() { + return kInterestingI64Values; +} + +const kVectorI64Values = { + 2: kInterestingI64Values.flatMap((f) => [ + [f, 1n], + [-1n, f]] + ), + 3: kInterestingI64Values.flatMap((f) => [ + [f, 1n, -2n], + [-1n, f, 2n], + [1n, -2n, f]] + ), + 4: kInterestingI64Values.flatMap((f) => [ + [f, -1n, 2n, 3n], + [1n, f, -2n, 3n], + [1n, 2n, f, -3n], + [-1n, 2n, -3n, f]] + ) +}; + +/** + * Returns set of vectors, indexed by dimension containing interesting i64 + * values. + * + * The tests do not do the simple option for coverage of computing the cartesian + * product of all of the interesting i64 values N times for vecN tests, + * because that creates a huge number of tests for vec3 and vec4, leading to + * time outs. + * + * Instead they insert the interesting i64 values into each location of the + * vector to get a spread of testing over the entire range. This reduces the + * number of cases being run substantially, but maintains coverage. + */ +export function vectorI64Range(dim) { + assert(dim === 2 || dim === 3 || dim === 4, 'vectorI64Range only accepts dimensions 2, 3, and 4'); + return kVectorI64Values[dim]; +} + +const kSparseVectorI64Values = { + 2: sparseI64Range().map((i, idx) => [ + idx % 2 === 0 ? i : BigInt(idx), + idx % 2 === 1 ? i : -BigInt(idx)] + ), + 3: sparseI64Range().map((i, idx) => [ + idx % 3 === 0 ? i : BigInt(idx), + idx % 3 === 1 ? i : -BigInt(idx), + idx % 3 === 2 ? i : BigInt(idx)] + ), + 4: sparseI64Range().map((i, idx) => [ + idx % 4 === 0 ? i : BigInt(idx), + idx % 4 === 1 ? i : -BigInt(idx), + idx % 4 === 2 ? i : BigInt(idx), + idx % 4 === 3 ? i : -BigInt(idx)] + ) +}; + +/** + * Minimal set of vectors, indexed by dimension, that contain interesting + * abstract integer values. + * + * This is an even more stripped down version of `vectorI64Range` for when + * pairs of vectors are being tested. + * All interesting integers from sparseI64Range are guaranteed to be + * tested, but not in every position. + */ +export function sparseVectorI64Range(dim) { + assert( + dim === 2 || dim === 3 || dim === 4, + 'sparseVectorI64Range only accepts dimensions 2, 3, and 4' + ); + return kSparseVectorI64Values[dim]; +} + /** * @returns an ascending sorted array of numbers spread over the entire range of 64-bit signed ints * @@ -1344,6 +1494,26 @@ counts = } +/** Short list of f32 values of interest to test against */ +const kInterestingF32Values = [ +kValue.f32.negative.min, +-10.0, +-1.0, +-0.125, +kValue.f32.negative.max, +kValue.f32.negative.subnormal.min, +kValue.f32.negative.subnormal.max, +-0.0, +0.0, +kValue.f32.positive.subnormal.min, +kValue.f32.positive.subnormal.max, +kValue.f32.positive.min, +0.125, +1.0, +10.0, +kValue.f32.positive.max]; + + /** @returns minimal f32 values that cover the entire range of f32 behaviours * * Has specially selected values that cover edge cases, normals, and subnormals. @@ -1361,29 +1531,20 @@ export function sparseScalarF32Range() { } const kVectorF32Values = { - 2: sparseScalarF32Range().flatMap((f) => [ + 2: kInterestingF32Values.flatMap((f) => [ [f, 1.0], - [1.0, f], - [f, -1.0], [-1.0, f]] ), - 3: sparseScalarF32Range().flatMap((f) => [ - [f, 1.0, 2.0], - [1.0, f, 2.0], - [1.0, 2.0, f], - [f, -1.0, -2.0], - [-1.0, f, -2.0], - [-1.0, -2.0, f]] + 3: kInterestingF32Values.flatMap((f) => [ + [f, 1.0, -2.0], + [-1.0, f, 2.0], + [1.0, -2.0, f]] ), - 4: sparseScalarF32Range().flatMap((f) => [ - [f, 1.0, 2.0, 3.0], - [1.0, f, 2.0, 3.0], - [1.0, 2.0, f, 3.0], - [1.0, 2.0, 3.0, f], - [f, -1.0, -2.0, -3.0], - [-1.0, f, -2.0, -3.0], - [-1.0, -2.0, f, -3.0], - [-1.0, -2.0, -3.0, f]] + 4: kInterestingF32Values.flatMap((f) => [ + [f, -1.0, 2.0, 3.0], + [1.0, f, -2.0, 3.0], + [1.0, 2.0, f, -3.0], + [-1.0, 2.0, -3.0, f]] ) }; @@ -1597,29 +1758,20 @@ export function sparseScalarF16Range() { } const kVectorF16Values = { - 2: sparseScalarF16Range().flatMap((f) => [ + 2: kInterestingF16Values.flatMap((f) => [ [f, 1.0], - [1.0, f], - [f, -1.0], [-1.0, f]] ), - 3: sparseScalarF16Range().flatMap((f) => [ - [f, 1.0, 2.0], - [1.0, f, 2.0], - [1.0, 2.0, f], - [f, -1.0, -2.0], - [-1.0, f, -2.0], - [-1.0, -2.0, f]] + 3: kInterestingF16Values.flatMap((f) => [ + [f, 1.0, -2.0], + [-1.0, f, 2.0], + [1.0, -2.0, f]] ), - 4: sparseScalarF16Range().flatMap((f) => [ - [f, 1.0, 2.0, 3.0], - [1.0, f, 2.0, 3.0], - [1.0, 2.0, f, 3.0], - [1.0, 2.0, 3.0, f], - [f, -1.0, -2.0, -3.0], - [-1.0, f, -2.0, -3.0], - [-1.0, -2.0, f, -3.0], - [-1.0, -2.0, -3.0, f]] + 4: kInterestingF16Values.flatMap((f) => [ + [f, -1.0, 2.0, 3.0], + [1.0, f, -2.0, 3.0], + [1.0, 2.0, f, -3.0], + [-1.0, 2.0, -3.0, f]] ) }; @@ -1833,29 +1985,20 @@ export function sparseScalarF64Range() { } const kVectorF64Values = { - 2: sparseScalarF64Range().flatMap((f) => [ + 2: kInterestingF64Values.flatMap((f) => [ [f, 1.0], - [1.0, f], - [f, -1.0], [-1.0, f]] ), - 3: sparseScalarF64Range().flatMap((f) => [ - [f, 1.0, 2.0], - [1.0, f, 2.0], - [1.0, 2.0, f], - [f, -1.0, -2.0], - [-1.0, f, -2.0], - [-1.0, -2.0, f]] + 3: kInterestingF64Values.flatMap((f) => [ + [f, 1.0, -2.0], + [-1.0, f, 2.0], + [1.0, -2.0, f]] ), - 4: sparseScalarF64Range().flatMap((f) => [ - [f, 1.0, 2.0, 3.0], - [1.0, f, 2.0, 3.0], - [1.0, 2.0, f, 3.0], - [1.0, 2.0, 3.0, f], - [f, -1.0, -2.0, -3.0], - [-1.0, f, -2.0, -3.0], - [-1.0, -2.0, f, -3.0], - [-1.0, -2.0, -3.0, f]] + 4: kInterestingF64Values.flatMap((f) => [ + [f, -1.0, 2.0, 3.0], + [1.0, f, -2.0, 3.0], + [1.0, 2.0, f, -3.0], + [-1.0, 2.0, -3.0, f]] ) }; @@ -2108,6 +2251,19 @@ export function quantizeToU32(num) { return Math.trunc(num); } +/** + * @returns the closest 64-bit signed integer value to the input. + */ +export function quantizeToI64(num) { + if (num >= kValue.i64.positive.max) { + return kValue.i64.positive.max; + } + if (num <= kValue.i64.negative.min) { + return kValue.i64.negative.min; + } + return num; +} + /** @returns whether the number is an integer and a power of two */ export function isPowerOfTwo(n) { if (!Number.isInteger(n)) { @@ -2316,4 +2472,19 @@ export function subtractVectors(v1, v2) { */ export function dotProduct(v1, v2) { return v1.reduce((a, v, i) => a + v * v2[i], 0); +} + +/** @returns the absolute value of a bigint */ +export function absBigInt(v) { + return v < 0n ? -v : v; +} + +/** @returns the maximum from a list of bigints */ +export function maxBigInt(...vals) { + return vals.reduce((prev, cur) => cur > prev ? cur : prev); +} + +/** @returns the minimum from a list of bigints */ +export function minBigInt(...vals) { + return vals.reduce((prev, cur) => cur < prev ? cur : prev); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/memory.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/memory.js index e48ab32fc98..e178e54daff 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/memory.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/memory.js @@ -3,11 +3,13 @@ **/ /** * Helper to exhaust VRAM until there is less than 64 MB of capacity. Returns * an opaque closure which can be called to free the allocated resources later. - */export async function exhaustVramUntilUnder64MB(device) {const allocateUntilOom = async (device, size) => { + */ +export async function exhaustVramUntilUnder64MB(t) { + const allocateUntilOom = async (device, size) => { const buffers = []; for (;;) { device.pushErrorScope('out-of-memory'); - const buffer = device.createBuffer({ size, usage: GPUBufferUsage.STORAGE }); + const buffer = t.createBufferTracked({ size, usage: GPUBufferUsage.STORAGE }); if (await device.popErrorScope()) { return buffers; } @@ -17,8 +19,8 @@ const kLargeChunkSize = 512 * 1024 * 1024; const kSmallChunkSize = 64 * 1024 * 1024; - const buffers = await allocateUntilOom(device, kLargeChunkSize); - buffers.push(...(await allocateUntilOom(device, kSmallChunkSize))); + const buffers = await allocateUntilOom(t.device, kLargeChunkSize); + buffers.push(...(await allocateUntilOom(t.device, kSmallChunkSize))); return () => { buffers.forEach((buffer) => buffer.destroy()); }; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/prng.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/prng.js index 9e456d734ea..cd2ce728810 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/prng.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/prng.js @@ -122,4 +122,43 @@ export class PRNG { this.next(); return this.temper(); } + + /** @returns a uniformly selected integer in [0, N-1]. N must be at least 1 and at most 2**32. */ + uniformInt(N) { + const upperBound = (1 << 16) * (1 << 16); + assert(N === Math.trunc(N)); // It's an integer + assert(N > 0, `${N} must be positive`); + assert(N <= upperBound, `${N} is too big, should be at most ${upperBound}`); + + // Use a method described in The Stanford GraphBase, + // Donald E. Knuth (New York: ACM Press, 1994), viii+576pp. + // Co-published by Addison-Wesley Publishing Company. + // See GB_FLIP, section 12, Uniform Integers. + + // A naive algorithm would take a random u32 value X, and then + // return (X % N). But this is biased toward smaller values + // when N is not a power of 2. As Knuth writes, if N is + // (2**32) / 3, this naive algorithm would return values + // less than N/2 about 2/3 of the time. + + // Instead, we eliminate the bias by discarding samples when + // they would have been biased. The "keep zone", so to speak, + // must be a multiple of N. We make the algorithm efficient + // by maximizing the size of the keep zone: Find the largest + // multiple of N that fits within a u32. + // On average, this algorithm will discard 2 or fewer samples. + + // Find the largest multiple of N that fits below upperBound. + const keepZoneSize = upperBound - upperBound % N; + assert(keepZoneSize % N === 0); + // It covers a big chunk of the whole u32 range. + assert(keepZoneSize >= upperBound / 2); + // Draw u32 values until we find one in the keep zone. + let candidate; + do { + candidate = this.randomU32(); + } while (candidate >= keepZoneSize); + // Now return the candidate, but folding away multiples of N. + return candidate % N; + } } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/shader.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/shader.js index cb372faaa7f..c4fd89c3af6 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/shader.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/shader.js @@ -178,6 +178,8 @@ fragDepth = null) }`; } +export const kValidShaderStages = ['compute', 'vertex', 'fragment']; + /** diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture.js index c2c980c975e..bd7dd92f94e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { assert } from '../../common/util/util.js';import { getTextureCopyLayout } from './texture/layout.js'; +**/import { assert } from '../../common/util/util.js'; +import { getTextureCopyLayout } from './texture/layout.js'; import { reifyExtent3D } from './unions.js'; @@ -9,7 +10,7 @@ import { reifyExtent3D } from './unions.js'; * from `texelViews[i]`. */ export function createTextureFromTexelViews( -device, +t, texelViews, desc) { @@ -19,7 +20,7 @@ desc) const { width, height, depthOrArrayLayers } = reifyExtent3D(desc.size); // Create the texture and then initialize each mipmap level separately. - const texture = device.createTexture({ + const texture = t.createTextureTracked({ ...desc, format: texelViews[0].format, usage: desc.usage | GPUTextureUsage.COPY_DST, @@ -27,18 +28,19 @@ desc) }); // Copy the texel view into each mip level layer. - const commandEncoder = device.createCommandEncoder(); + const commandEncoder = t.device.createCommandEncoder(); const stagingBuffers = []; for (let mipLevel = 0; mipLevel < texelViews.length; mipLevel++) { const { bytesPerRow, + rowsPerImage, mipSize: [mipWidth, mipHeight, mipDepthOrArray] } = getTextureCopyLayout(format, desc.dimension ?? '2d', [width, height, depthOrArrayLayers], { mipLevel }); // Create a staging buffer to upload the texture mip level contents. - const stagingBuffer = device.createBuffer({ + const stagingBuffer = t.createBufferTracked({ mappedAtCreation: true, size: bytesPerRow * mipHeight * mipDepthOrArray, usage: GPUBufferUsage.COPY_SRC @@ -56,26 +58,15 @@ desc) // Copy from the staging buffer into the texture. commandEncoder.copyBufferToTexture( - { buffer: stagingBuffer, bytesPerRow }, + { buffer: stagingBuffer, bytesPerRow, rowsPerImage }, { texture, mipLevel }, [mipWidth, mipHeight, mipDepthOrArray] ); } - device.queue.submit([commandEncoder.finish()]); + t.device.queue.submit([commandEncoder.finish()]); // Cleanup the staging buffers. stagingBuffers.forEach((value) => value.destroy()); return texture; -} - -/** - * Creates a 1 mip level texture with the contents of a TexelView. - */ -export function createTextureFromTexelView( -device, -texelView, -desc) -{ - return createTextureFromTexelViews(device, [texelView], desc); } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/base.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/base.js index 99636b9ad90..282f6a95a47 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/base.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/base.js @@ -76,13 +76,19 @@ level) () => `level (${level}) too large for base size (${baseSize.width}x${baseSize.height}x${baseSize.depthOrArrayLayers})` ); - assert( - kTextureFormatInfo[format].blockWidth === 1 && kTextureFormatInfo[format].blockHeight === 1, - 'not implemented for 3d block formats' + const virtualWidthAtLevel = Math.max(baseSize.width >> level, 1); + const virtualHeightAtLevel = Math.max(baseSize.height >> level, 1); + const physicalWidthAtLevel = align( + virtualWidthAtLevel, + kTextureFormatInfo[format].blockWidth + ); + const physicalHeightAtLevel = align( + virtualHeightAtLevel, + kTextureFormatInfo[format].blockHeight ); return { - width: Math.max(baseSize.width >> level, 1), - height: Math.max(baseSize.height >> level, 1), + width: physicalWidthAtLevel, + height: physicalHeightAtLevel, depthOrArrayLayers: Math.max(baseSize.depthOrArrayLayers >> level, 1) }; } @@ -104,22 +110,22 @@ mipLevel) /** * Compute the "virtual size" of a mip level of a texture (not accounting for texel block rounding). * - * MAINTENANCE_TODO: Change input/output to Required for consistency. + * MAINTENANCE_TODO: Change output to Required for consistency. */ export function virtualMipSize( dimension, size, mipLevel) { + const { width, height, depthOrArrayLayers } = reifyExtent3D(size); const shiftMinOne = (n) => Math.max(1, n >> mipLevel); switch (dimension) { case '1d': - assert(size[2] === 1); - return [shiftMinOne(size[0]), size[1], size[2]]; + return [shiftMinOne(width), height, depthOrArrayLayers]; case '2d': - return [shiftMinOne(size[0]), shiftMinOne(size[1]), size[2]]; + return [shiftMinOne(width), shiftMinOne(height), depthOrArrayLayers]; case '3d': - return [shiftMinOne(size[0]), shiftMinOne(size[1]), shiftMinOne(size[2])]; + return [shiftMinOne(width), shiftMinOne(height), shiftMinOne(depthOrArrayLayers)]; default: unreachable(); } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/layout.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/layout.js index 36603a1df47..c4c83f6b25d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/layout.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/layout.js @@ -5,6 +5,7 @@ resolvePerAspectFormat } from '../../format_info.js'; + import { align } from '../math.js'; import { reifyExtent3D } from '../unions.js'; @@ -195,8 +196,8 @@ options = kDefaultLayoutOptions) * texture where every texel has the byte value `texelValue`. */ export function createTextureUploadBuffer( +t, texelValue, -device, format, dimension, size, @@ -213,7 +214,7 @@ options = kDefaultLayoutOptions) options ); - const buffer = device.createBuffer({ + const buffer = t.createBufferTracked({ mappedAtCreation: true, size: byteLength, usage: GPUBufferUsage.COPY_SRC diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.js index 602d642724f..4188f047ec8 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.js @@ -1,6 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { assert, unreachable } from '../../../common/util/util.js';import { +**/import { assert, unreachable } from '../../../common/util/util.js';import { kValue } from '../constants.js'; +import { assertInIntegerRange, float32ToFloatBits, float32ToFloat16Bits, @@ -77,12 +78,15 @@ function makePerTexelComponent(components, value) { * @returns {ComponentMapFn} The map function which clones the input component values, and applies * `fn` to each of component of `components`. */ -function applyEach(fn, components) { +function applyEach( +fn, +components) +{ return (values) => { values = Object.assign({}, values); for (const c of components) { assert(values[c] !== undefined); - values[c] = fn(values[c]); + values[c] = fn(values[c], c); } return values; }; @@ -121,7 +125,13 @@ const decodeSRGB = (components) => { export function makeClampToRange(format) { const repr = kTexelRepresentationInfo[format]; assert(repr.numericRange !== null, 'Format has unknown numericRange'); - return applyEach((x) => clamp(x, repr.numericRange), repr.componentOrder); + const perComponentRanges = repr.numericRange; + const range = repr.numericRange; + + return applyEach((x, component) => { + const perComponentRange = perComponentRanges[component]; + return clamp(x, perComponentRange ? perComponentRange : range); + }, repr.componentOrder); } // MAINTENANCE_TODO: Look into exposing this map to the test fixture so that it can be GCed at the @@ -424,6 +434,8 @@ opt) } const dataType = opt.signed ? 'snorm' : 'unorm'; + const min = opt.signed ? -1 : 0; + const max = 1; return { componentOrder, componentInfo: makePerTexelComponent(componentOrder, { @@ -438,7 +450,7 @@ opt) numberToBits, bitsToNumber, bitsToULPFromZero, - numericRange: { min: opt.signed ? -1 : 0, max: 1 } + numericRange: { min, max, finiteMin: min, finiteMax: max } }; } @@ -454,9 +466,9 @@ bitLength, opt) { assert(bitLength <= 32); - const numericRange = opt.signed ? - { min: -(2 ** (bitLength - 1)), max: 2 ** (bitLength - 1) - 1 } : - { min: 0, max: 2 ** bitLength - 1 }; + const min = opt.signed ? -(2 ** (bitLength - 1)) : 0; + const max = opt.signed ? 2 ** (bitLength - 1) - 1 : 2 ** bitLength - 1; + const numericRange = { min, max, finiteMin: min, finiteMax: max }; const maxUnsignedValue = 2 ** bitLength; const encode = applyEach( (n) => (assertInIntegerRange(n, bitLength, opt.signed), n), @@ -576,8 +588,13 @@ bitLength, bitsToNumber, bitsToULPFromZero, numericRange: restrictedDepth ? - { min: 0, max: 1 } : - { min: Number.NEGATIVE_INFINITY, max: Number.POSITIVE_INFINITY } + { min: 0, max: 1, finiteMin: 0, finiteMax: 1 } : + { + min: Number.NEGATIVE_INFINITY, + max: Number.POSITIVE_INFINITY, + finiteMin: bitLength === 32 ? kValue.f32.negative.min : kValue.f16.negative.min, + finiteMax: bitLength === 32 ? kValue.f32.positive.max : kValue.f16.positive.max + } }; } @@ -611,6 +628,25 @@ const kFloat10Format = { signed: 0, exponentBits: 5, mantissaBits: 5, bias: 15 } + + + + + + + + + + + + + + + + + + + @@ -712,7 +748,12 @@ export const kTexelRepresentationInfo = return components; }, bitsToULPFromZero: (components) => components, - numericRange: null + numericRange: { + R: { min: 0, max: 0x3ff, finiteMin: 0, finiteMax: 0x3ff }, + G: { min: 0, max: 0x3ff, finiteMin: 0, finiteMax: 0x3ff }, + B: { min: 0, max: 0x3ff, finiteMin: 0, finiteMax: 0x3ff }, + A: { min: 0, max: 0x3, finiteMin: 0, finiteMax: 0x3 } + } }, rgb10a2unorm: { componentOrder: kRGBA, @@ -765,7 +806,7 @@ export const kTexelRepresentationInfo = A: normalizedIntegerAsFloat(components.A, 2, false) }), bitsToULPFromZero: (components) => components, - numericRange: { min: 0, max: 1 } + numericRange: { min: 0, max: 1, finiteMin: 0, finiteMax: 1 } }, rg11b10ufloat: { componentOrder: kRGB, @@ -809,7 +850,16 @@ export const kTexelRepresentationInfo = G: floatBitsToNormalULPFromZero(components.G, kFloat11Format), B: floatBitsToNormalULPFromZero(components.B, kFloat10Format) }), - numericRange: { min: 0, max: Number.POSITIVE_INFINITY } + numericRange: { + min: 0, + max: Number.POSITIVE_INFINITY, + finiteMin: 0, + finiteMax: { + R: floatBitsToNumber(0b111_1011_1111, kFloat11Format), + G: floatBitsToNumber(0b111_1011_1111, kFloat11Format), + B: floatBitsToNumber(0b11_1101_1111, kFloat10Format) + } + } }, rgb9e5ufloat: { componentOrder: kRGB, @@ -854,7 +904,12 @@ export const kTexelRepresentationInfo = G: floatBitsToNormalULPFromZero(components.G, kUFloat9e5Format), B: floatBitsToNormalULPFromZero(components.B, kUFloat9e5Format) }), - numericRange: { min: 0, max: Number.POSITIVE_INFINITY } + numericRange: { + min: 0, + max: Number.POSITIVE_INFINITY, + finiteMin: 0, + finiteMax: ufloatM9E5BitsToNumber(0b11_1111_1111_1111, kUFloat9e5Format) + } }, depth32float: makeFloatInfo([TexelComponent.Depth], 32, { restrictedDepth: true }), depth16unorm: makeNormalizedInfo([TexelComponent.Depth], 16, { signed: false, sRGB: false }), @@ -868,7 +923,7 @@ export const kTexelRepresentationInfo = numberToBits: () => unreachable('depth24plus has no representation'), bitsToNumber: () => unreachable('depth24plus has no representation'), bitsToULPFromZero: () => unreachable('depth24plus has no representation'), - numericRange: { min: 0, max: 1 } + numericRange: { min: 0, max: 1, finiteMin: 0, finiteMax: 1 } }, stencil8: makeIntegerInfo([TexelComponent.Stencil], 8, { signed: false }), 'depth32float-stencil8': { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.spec.js index ae985b0e844..ae2c050444a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_data.spec.js @@ -8,6 +8,7 @@ import { '../../format_info.js'; import { GPUTest } from '../../gpu_test.js'; +import { gammaCompress, floatAsNormalizedIntegerUnquantized } from '../conversion.js'; import { kTexelRepresentationInfo, @@ -17,7 +18,7 @@ import { export const g = makeTestGroup(GPUTest); -function doTest( +async function doTest( t) @@ -35,7 +36,7 @@ t) const rep = kTexelRepresentationInfo[format]; const texelData = rep.pack(componentData); - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format, size: [1, 1, 1], usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING @@ -77,7 +78,7 @@ t) } }); - const outputBuffer = t.device.createBuffer({ + const outputBuffer = t.createBufferTracked({ size: rep.componentOrder.length * 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); @@ -106,16 +107,65 @@ t) pass.end(); t.device.queue.submit([encoder.finish()]); - t.expectGPUBufferValuesEqual( - outputBuffer, - new ReadbackTypedArray( - rep.componentOrder.map((c) => { - const value = rep.decode(componentData)[c]; - assert(value !== undefined); - return value; - }) - ) + const idealReadbackData = new ReadbackTypedArray( + rep.componentOrder.map((c) => { + const value = rep.decode(componentData)[c]; + assert(value !== undefined); + return value; + }) ); + + if (format === 'rgba8unorm-srgb' || format === 'bgra8unorm-srgb') { + // The SRGB -> float conversion is permitted a tolerance of 0.5f ULP on the SRGB side. The + // procedure for measuring this tolerance is to convert the result back into SRGB space + // using the ideal float -> SRGB conversion specified below but WITHOUT the rounding to integer, + // and taking the floating point difference versus the original SRGB value to yield the error. + // Exact conversion is required: 0.0f and 1.0f (the ends) must be exactly achievable. + const readBackValue = await t.readGPUBufferRangeTyped(outputBuffer, { + type: Float32Array, + typedLength: 4 + }); + // Gamma correction shouldn't be applied to the alpha channel. + t.expect(idealReadbackData[3] === readBackValue.data[3]); + + // Do the ideal float -> 8unorm-srgb conversion on the readback float value without the rounding + // to integer. + const readBackValueToSRGB = new Array(3); + for (let i = 0; i < 3; ++i) { + const gammaCompressed = gammaCompress(readBackValue.data[i]); + let outputIndex = i; + if (format === 'bgra8unorm-srgb' && (i === 0 || i === 2)) { + outputIndex = 2 - i; + } + readBackValueToSRGB[outputIndex] = floatAsNormalizedIntegerUnquantized( + gammaCompressed, + 8, + false + ); + } + readBackValue.cleanup(); + + // Take the floating point difference versus the original SRGB value to yield the error. + const check8UnormSRGB = (inputValue, idealValue) => { + const kToleranceULP = 0.5; + if (idealValue === 0 || idealValue === 255) { + t.expect(inputValue === idealValue); + } else { + t.expect(Math.abs(inputValue - idealValue) <= kToleranceULP); + } + }; + + assert( + componentData.R !== undefined && + componentData.G !== undefined && + componentData.B !== undefined + ); + check8UnormSRGB(readBackValueToSRGB[0], componentData.R); + check8UnormSRGB(readBackValueToSRGB[1], componentData.G); + check8UnormSRGB(readBackValueToSRGB[2], componentData.B); + } else { + t.expectGPUBufferValuesEqual(outputBuffer, idealReadbackData); + } } // Make a test parameter by mapping a format and each component to a texel component diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_view.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_view.js index 45953234f22..e61baf99e44 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_view.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texel_view.js @@ -166,9 +166,13 @@ export class TexelView { const info = kTextureFormatInfo[this.format]; const repr = kTexelRepresentationInfo[this.format]; - const numericToString = numericToStringBuilder( - info.sampleType === 'uint' || info.sampleType === 'sint' - ); + // MAINTENANCE_TODO: Print depth-stencil formats as float+int instead of float+float. + const printAsInteger = info.color ? + // For color, pick the type based on the format type + ['uint', 'sint'].includes(info.color.type) : + // Print depth as "float", depth-stencil as "float,float", stencil as "int". + !info.depth; + const numericToString = numericToStringBuilder(printAsInteger); const componentOrderStr = repr.componentOrder.join(',') + ':'; const subrectCoords = [...fullSubrectCoordinates(subrectOrigin, subrectSize)]; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.js index 992cf9e96da..c4db13ebc5a 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.js @@ -175,11 +175,10 @@ copySize, aspect: source.aspect }); - const buffer = t.device.createBuffer({ + const buffer = t.createBufferTracked({ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, size: byteLength }); - t.trackForCleanup(buffer); const cmd = t.device.createCommandEncoder(); cmd.copyTextureToBuffer(source, { buffer, bytesPerRow, rowsPerImage }, copySize); @@ -223,9 +222,13 @@ coords) const info = kTextureFormatInfo[format]; const repr = kTexelRepresentationInfo[format]; - const numericToString = numericToStringBuilder( - info.sampleType === 'uint' || info.sampleType === 'sint' - ); + // MAINTENANCE_TODO: Print depth-stencil formats as float+int instead of float+float. + const printAsInteger = info.color ? + // For color, pick the type based on the format type + ['uint', 'sint'].includes(info.color.type) : + // Print depth as "float", depth-stencil as "float,float", stencil as "int". + !info.depth; + const numericToString = numericToStringBuilder(printAsInteger); const componentOrderStr = repr.componentOrder.join(',') + ':'; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.spec.js index 76198cb3b6b..48f4f64549d 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/util/texture/texture_ok.spec.js @@ -39,12 +39,11 @@ fn(async (t) => { const { format, data, opts, _ok } = t.params; const size = [1, 1]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format, size, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(texture); t.device.queue.writeTexture({ texture }, new Float32Array([data, data, data, data]), {}, size); const expColor = { R: 0.6, G: 0.6, B: 0.6, A: 0.6 }; @@ -76,12 +75,11 @@ fn(async (t) => { const { mode, format, _maxValue, data, _ok } = t.params; const size = [2, 1]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format, size, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(texture); t.device.queue.writeTexture({ texture }, new Int8Array(data), {}, size); let expTexelView; @@ -123,12 +121,11 @@ fn(async (t) => { const data = [-_maxValue, -_maxValue - 1]; const size = [2, 1]; - const texture = t.device.createTexture({ + const texture = t.createTextureTracked({ format, size, usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC }); - t.trackForCleanup(texture); t.device.queue.writeTexture({ texture }, new Int8Array(data), {}, size); let expTexelView; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js index b87d9cef01e..58ebfb4af58 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js @@ -13,7 +13,6 @@ import { GPUConst } from '../../constants.js'; import { kAllTextureFormats, kFeaturesForFormats, - kTextureFormats, filterFormatsByFeature, viewCompatible } from '../../format_info.js'; @@ -254,7 +253,7 @@ fn((t) => { if (usage & GPUConst.TextureUsage.COPY_SRC) { const size = [currentTexture.width, currentTexture.height, 1]; - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ format: currentTexture.format, usage: GPUTextureUsage.COPY_DST, size @@ -387,7 +386,7 @@ combine('format', kCanvasTextureFormats). combine('viewFormatFeature', kFeaturesForFormats). beginSubcases(). expand('viewFormat', ({ viewFormatFeature }) => -filterFormatsByFeature(viewFormatFeature, kTextureFormats) +filterFormatsByFeature(viewFormatFeature, kAllTextureFormats) ) ). beforeAllSubcases((t) => { diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/getCurrentTexture.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/getCurrentTexture.spec.js index bd13bf4c29f..729a7cdfaf7 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/getCurrentTexture.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/getCurrentTexture.spec.js @@ -191,7 +191,7 @@ fn((t) => { // Ensure that each frame a new texture object is returned. t.expect(currentTexture !== prevTexture); - // Ensure that texture contents are transparent black. + // Ensure that the texture's initial contents are transparent black. t.expectSingleColor(currentTexture, currentTexture.format, { size: [currentTexture.width, currentTexture.height, 1], exp: { R: 0, G: 0, B: 0, A: 0 } @@ -199,7 +199,8 @@ fn((t) => { } if (clearTexture) { - // Clear the texture to test that texture contents don't carry over from frame to frame. + // Fill the texture with a non-zero color, to test that texture + // contents don't carry over from frame to frame. const encoder = t.device.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [ @@ -236,10 +237,8 @@ fn((t) => { } } - // Call frameCheck for the first time from requestAnimationFrame - // To make sure two frameChecks are run in different frames for onscreen canvas. - // offscreen canvas doesn't care. - requestAnimationFrame(frameCheck); + // Render the first frame immediately. The rest will be triggered recursively. + frameCheck(); }); }); @@ -347,6 +346,14 @@ u // combine('prevFrameCallsite', ['runInNewCanvasFrame', 'requestAnimationFrame']). combine('getCurrentTextureAgain', [true, false]) ). +beforeAllSubcases((t) => { + if ( + t.params.prevFrameCallsite === 'requestAnimationFrame' && + typeof requestAnimationFrame === 'undefined') + { + throw new SkipTestCase('requestAnimationFrame not available'); + } +}). fn((t) => { const { canvasType, prevFrameCallsite, getCurrentTextureAgain } = t.params; const ctx = t.initCanvasContext(t.params.canvasType); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/readbackFromWebGPUCanvas.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/readbackFromWebGPUCanvas.spec.js index 9c9cabb9af7..87d73d07455 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/readbackFromWebGPUCanvas.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/canvas/readbackFromWebGPUCanvas.spec.js @@ -31,7 +31,8 @@ import { kAllCanvasTypes, createCanvas, - createOnscreenCanvas } from + createOnscreenCanvas, + createOffscreenCanvas } from '../../util/create_elements.js'; import { TexelView } from '../../util/texture/texel_view.js'; import { findFailedPixels } from '../../util/texture/texture_ok.js'; @@ -108,7 +109,7 @@ canvasType) }); const canvasTexture = ctx.getCurrentTexture(); - const tempTexture = t.device.createTexture({ + const tempTexture = t.createTextureTracked({ size: { width: 1, height: 1, depthOrArrayLayers: 1 }, format, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -146,7 +147,7 @@ t, image, colorSpace) { - const canvas = createOnscreenCanvas(t, 2, 2); + const canvas = createOffscreenCanvas(t, 2, 2); const ctx = canvas.getContext('2d', { colorSpace }); assert(ctx !== null); ctx.drawImage(image, 0, 0); @@ -339,11 +340,7 @@ fn(async (t) => { return; } const blob = await offscreenCanvas.convertToBlob(); - const url = URL.createObjectURL(blob); - const img = new Image(offscreenCanvas.width, offscreenCanvas.height); - img.src = url; - await raceWithRejectOnTimeout(img.decode(), 5000, 'load image timeout'); - snapshot = img; + snapshot = await createImageBitmap(blob); break; } case 'transferToImageBitmap':{ @@ -391,6 +388,7 @@ fn((t) => { return; } + const texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); switch (upload) { @@ -492,18 +490,19 @@ g.test('transferToImageBitmap_unconfigured_nonzero_size'). desc( `Regression test for a crash when calling transferImageBitmap on an unconfigured. Case where the canvas is not empty` ). +params((u) => u.combine('readbackCanvasType', ['onscreen', 'offscreen'])). fn((t) => { - const canvas = createCanvas(t, 'offscreen', 2, 3); + const kWidth = 2; + const kHeight = 3; + const canvas = createCanvas(t, 'offscreen', kWidth, kHeight); canvas.getContext('webgpu'); // Transferring gives an ImageBitmap of the correct size filled with transparent black. const ib = canvas.transferToImageBitmap(); - t.expect(ib.width === canvas.width); - t.expect(ib.height === canvas.height); + t.expect(ib.width === kWidth); + t.expect(ib.height === kHeight); - const readbackCanvas = document.createElement('canvas'); - readbackCanvas.width = canvas.width; - readbackCanvas.height = canvas.height; + const readbackCanvas = createCanvas(t, t.params.readbackCanvasType, kWidth, kHeight); const readbackContext = readbackCanvas.getContext('2d', { alpha: true }); @@ -513,7 +512,7 @@ fn((t) => { } // Since there isn't a configuration we expect the ImageBitmap to have the default alphaMode of "opaque". - const expected = new Uint8ClampedArray(canvas.width * canvas.height * 4); + const expected = new Uint8ClampedArray(kWidth * kHeight * 4); for (let i = 0; i < expected.byteLength; i += 4) { expected[i + 0] = 0; expected[i + 1] = 0; diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageBitmap.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageBitmap.spec.js index e5340e1872b..0ec99fdc591 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageBitmap.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageBitmap.spec.js @@ -98,7 +98,7 @@ fn(async (t) => { colorSpaceConversion }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: { width, height }, format: dstFormat, usage: @@ -245,7 +245,7 @@ fn(async (t) => { colorSpaceConversion }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: { width, height }, format: dstFormat, usage: @@ -363,7 +363,7 @@ fn(async (t) => { colorSpaceConversion }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: dstSize, format: kColorFormat, usage: @@ -502,7 +502,7 @@ fn(async (t) => { colorSpaceConversion }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: dstSize, format: kColorFormat, usage: diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageData.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageData.spec.js index b285afa6cc2..32000fbb011 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageData.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/ImageData.spec.js @@ -71,7 +71,7 @@ fn((t) => { subrectSize: { width, height } }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: { width, height }, format: dstColorFormat, usage: @@ -176,7 +176,7 @@ fn((t) => { subrectSize: srcSize }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: dstSize, format: kColorFormat, usage: diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/canvas.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/canvas.spec.js index 16133fb8f90..5903908611c 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/canvas.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/canvas.spec.js @@ -401,7 +401,7 @@ class F extends CopyToTextureUtils { { - const dst = this.device.createTexture({ + const dst = this.createTextureTracked({ size: { width: p.width, height: p.height, @@ -787,7 +787,7 @@ fn((t) => { colorSpace: srcColorSpace }); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: { width, height }, format: dstColorFormat, usage: diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/image.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/image.spec.js index 173bc9bbb70..1e8fed51d6f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/image.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/image.spec.js @@ -101,7 +101,7 @@ fn(async (t) => { const image = await decodeImageFromCanvas(imageCanvas); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: { width, height }, format: dstColorFormat, usage: @@ -146,6 +146,76 @@ fn(async (t) => { ); }); +g.test('from_fully_transparent_image'). +desc( + ` + Test HTMLImageElement with alpha 0 can be copied to WebGPU texture correctly. + + Use a prebaked 2x2 fully transparent image as source. + + Then call copyExternalImageToTexture() to do a copy to the 0 mipLevel of dst texture, + and read the contents out to compare with the HTMLImageElement contents. + When dest alpha mode is: + - premultiplied, the content should be (0, 0, 0, 0) + - not premultiplied, the content should be the same as prebaked + pixel values (255, 102, 153, 0). + + The tests covers: + - Source HTMLImageElement is fully transparent with valid dest alphaMode. + And the expected results are all passed. + ` +). +params((u) => u.combine('dstPremultiplied', [true, false])). +beforeAllSubcases((t) => { + if (typeof HTMLImageElement === 'undefined') t.skip('HTMLImageElement not available'); +}). +fn(async (t) => { + const { dstPremultiplied } = t.params; + + const kColorFormat = 'rgba8unorm'; + const kImageWidth = 2; + const kImageHeight = 2; + + const imageCanvas = document.createElement('canvas'); + imageCanvas.width = kImageWidth; + imageCanvas.height = kImageHeight; + + // Prebaked fully transparent image with content (255, 102, 153, 0) + const image = new Image(kImageWidth, kImageHeight); + image.src = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEUlEQVR42mP8nzaTAQQYYQwALssD/5ca+r8AAAAASUVORK5CYII='; + await raceWithRejectOnTimeout(image.decode(), 5000, 'decode image timeout'); + + const dst = t.createTextureTracked({ + size: { width: kImageWidth, height: kImageHeight }, + format: kColorFormat, + usage: + GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); + + t.device.queue.copyExternalImageToTexture( + { + source: image + }, + { + texture: dst, + premultipliedAlpha: dstPremultiplied + }, + { + width: kImageWidth, + height: kImageHeight + } + ); + + const expectedPixels = dstPremultiplied ? + new Uint8Array([0, 0, 0, 0]) : + new Uint8Array([255, 102, 153, 0]); + + t.expectSinglePixelComparisonsAreOkInTexture({ texture: dst }, [ + { coord: { x: kImageWidth * 0.3, y: kImageHeight * 0.3 }, exp: expectedPixels }] + ); +}); + g.test('copy_subrect_from_2D_Canvas'). desc( ` @@ -226,7 +296,7 @@ fn(async (t) => { const image = await decodeImageFromCanvas(imageCanvas); - const dst = t.device.createTexture({ + const dst = t.createTextureTracked({ size: dstSize, format: kColorFormat, usage: diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/video.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/video.spec.js index 91d747e6817..9360e125fc2 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/video.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/copyToTexture/video.spec.js @@ -64,15 +64,15 @@ fn(async (t) => { let source, width, height; if (sourceType === 'VideoFrame') { source = await getVideoFrameFromVideoElement(t, videoElement); - width = source.codedWidth; - height = source.codedHeight; + width = source.displayWidth; + height = source.displayHeight; } else { source = videoElement; width = source.videoWidth; height = source.videoHeight; } - const dstTexture = t.device.createTexture({ + const dstTexture = t.createTextureTracked({ format: kFormat, size: { width, height, depthOrArrayLayers: 1 }, usage: @@ -88,7 +88,7 @@ fn(async (t) => { { texture: dstTexture, origin: { x: 0, y: 0 }, - colorSpace: 'srgb', + colorSpace: dstColorSpace, premultipliedAlpha: true }, { width, height, depthOrArrayLayers: 1 } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/external_texture/video.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/external_texture/video.spec.js index a5edc22085d..908287b3b04 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/external_texture/video.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/external_texture/video.spec.js @@ -10,6 +10,7 @@ TODO: consider whether external_texture and copyToTexture video tests should be TODO(#3193): Test video in BT.2020 color space `;import { makeTestGroup } from '../../../common/framework/test_group.js'; import { GPUTest, TextureTestMixin } from '../../gpu_test.js'; +import { createCanvas } from '../../util/create_elements.js'; import { startPlayingAndWaitForVideo, getVideoFrameFromVideoElement, @@ -27,7 +28,10 @@ const kFormat = 'rgba8unorm'; export const g = makeTestGroup(TextureTestMixin(GPUTest)); -function createExternalTextureSamplingTestPipeline(t) { +function createExternalTextureSamplingTestPipeline( +t, +colorAttachmentFormat = kFormat) +{ const pipeline = t.device.createRenderPipeline({ layout: 'auto', vertex: { @@ -63,7 +67,7 @@ function createExternalTextureSamplingTestPipeline(t) { entryPoint: 'main', targets: [ { - format: kFormat + format: colorAttachmentFormat }] }, @@ -163,7 +167,7 @@ fn(async (t) => { await getVideoFrameFromVideoElement(t, videoElement) : videoElement; - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -228,6 +232,131 @@ fn(async (t) => { }); }); +g.test('importExternalTexture,sample_non_YUV_video_frame'). +desc( + ` +Tests that we can import an VideoFrame with non-YUV pixel format into a GPUExternalTexture and sample it. +` +). +params((u) => +u // +.combine('videoFrameFormat', ['RGBA', 'RGBX', 'BGRA', 'BGRX']) +). +fn((t) => { + const { videoFrameFormat } = t.params; + + if (typeof VideoFrame === 'undefined') { + t.skip('WebCodec is not supported'); + } + + const canvas = createCanvas(t, 'onscreen', kWidth, kHeight); + + const canvasContext = canvas.getContext('2d'); + + if (canvasContext === null) { + t.skip(' onscreen canvas 2d context not available'); + } + + const ctx = canvasContext; + + const rectWidth = Math.floor(kWidth / 2); + const rectHeight = Math.floor(kHeight / 2); + + // Red + ctx.fillStyle = `rgba(255, 0, 0, 1.0)`; + ctx.fillRect(0, 0, rectWidth, rectHeight); + // Lime + ctx.fillStyle = `rgba(0, 255, 0, 1.0)`; + ctx.fillRect(rectWidth, 0, kWidth - rectWidth, rectHeight); + // Blue + ctx.fillStyle = `rgba(0, 0, 255, 1.0)`; + ctx.fillRect(0, rectHeight, rectWidth, kHeight - rectHeight); + // Fuchsia + ctx.fillStyle = `rgba(255, 0, 255, 1.0)`; + ctx.fillRect(rectWidth, rectHeight, kWidth - rectWidth, kHeight - rectHeight); + + const imageData = ctx.getImageData(0, 0, kWidth, kHeight); + + // Create video frame with default color space 'srgb' + const frameInit = { + format: videoFrameFormat, + codedWidth: kWidth, + codedHeight: kHeight, + timestamp: 0 + }; + + const frame = new VideoFrame(imageData.data.buffer, frameInit); + let textureFormat = 'rgba8unorm'; + + if (videoFrameFormat === 'BGRA' || videoFrameFormat === 'BGRX') { + textureFormat = 'bgra8unorm'; + } + + const colorAttachment = t.createTextureTracked({ + format: textureFormat, + size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, + usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT + }); + + const pipeline = createExternalTextureSamplingTestPipeline(t, textureFormat); + const bindGroup = createExternalTextureSamplingTestBindGroup( + t, + undefined /* checkNonStandardIsZeroCopy */, + frame, + pipeline, + 'srgb' + ); + + const commandEncoder = t.device.createCommandEncoder(); + const passEncoder = commandEncoder.beginRenderPass({ + colorAttachments: [ + { + view: colorAttachment.createView(), + clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }, + loadOp: 'clear', + storeOp: 'store' + }] + + }); + passEncoder.setPipeline(pipeline); + passEncoder.setBindGroup(0, bindGroup); + passEncoder.draw(6); + passEncoder.end(); + t.device.queue.submit([commandEncoder.finish()]); + + const expected = { + topLeft: new Uint8Array([255, 0, 0, 255]), + topRight: new Uint8Array([0, 255, 0, 255]), + bottomLeft: new Uint8Array([0, 0, 255, 255]), + bottomRight: new Uint8Array([255, 0, 255, 255]) + }; + + // For validation, we sample a few pixels away from the edges to avoid compression + // artifacts. + t.expectSinglePixelComparisonsAreOkInTexture({ texture: colorAttachment }, [ + // Top-left. + { + coord: { x: kWidth * 0.25, y: kHeight * 0.25 }, + exp: expected.topLeft + }, + // Top-right. + { + coord: { x: kWidth * 0.75, y: kHeight * 0.25 }, + exp: expected.topRight + }, + // Bottom-left. + { + coord: { x: kWidth * 0.25, y: kHeight * 0.75 }, + exp: expected.bottomLeft + }, + // Bottom-right. + { + coord: { x: kWidth * 0.75, y: kHeight * 0.75 }, + exp: expected.bottomRight + }] + ); +}); + g.test('importExternalTexture,sampleWithVideoFrameWithVisibleRectParam'). desc( ` @@ -304,7 +433,7 @@ fn(async (t) => { for (const cropParam of cropParams) { const subRect = new VideoFrame(source, { visibleRect: cropParam.subRect }); - const colorAttachment = t.device.createTexture({ + const colorAttachment = t.createTextureTracked({ format: kFormat, size: { width: kWidth, height: kHeight, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT @@ -386,7 +515,7 @@ fn(async (t) => { if (t.params.checkNonStandardIsZeroCopy) { expectZeroCopyNonStandard(t, externalTexture); } - const outputTexture = t.device.createTexture({ + const outputTexture = t.createTextureTracked({ format: 'rgba8unorm', size: [2, 2, 1], usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.html.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.html.js new file mode 100644 index 00000000000..3d62e515d0a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.html.js @@ -0,0 +1,65 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { timeout } from '../../../common/util/timeout.js';import { assert } from '../../../common/util/util.js';import { takeScreenshotDelayed } from '../../../common/util/wpt_reftest_wait.js'; + +void (async () => { + assert( + typeof navigator !== 'undefined' && navigator.gpu !== undefined, + 'No WebGPU implementation found' + ); + + const adapter = await navigator.gpu.requestAdapter(); + assert(adapter !== null); + const device = await adapter.requestDevice(); + assert(device !== null); + const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); + let deviceLost = false; + + function draw(canvasId, alphaMode, abortAfterDeviceLost) { + if (deviceLost && abortAfterDeviceLost) { + return; + } + + const canvas = document.getElementById(canvasId); + const ctx = canvas.getContext('webgpu'); + ctx.configure({ + device, + format: presentationFormat, + alphaMode + }); + + const colorAttachment = ctx.getCurrentTexture(); + const colorAttachmentView = colorAttachment.createView(); + + const encoder = device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [ + { + view: colorAttachmentView, + clearValue: { r: 0.4, g: 1.0, b: 0.0, a: 1.0 }, + loadOp: 'clear', + storeOp: 'store' + }] + + }); + pass.end(); + device.queue.submit([encoder.finish()]); + } + + function drawAll() { + draw('cvs0', 'opaque', true); + draw('cvs1', 'opaque', false); + draw('cvs2', 'premultiplied', true); + draw('cvs3', 'premultiplied', false); + + if (!deviceLost) { + device.destroy(); + deviceLost = true; + timeout(drawAll, 100); + } else { + takeScreenshotDelayed(50); + } + } + + drawAll(); +})(); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html new file mode 100644 index 00000000000..03ff43580a0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/canvas_display_after_device_lost.https.html @@ -0,0 +1,16 @@ + + + WebGPU canvas_display_after_device_lost + + + + + + + + + + + diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/ref/canvas_display_after_device_lost-ref.html b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/ref/canvas_display_after_device_lost-ref.html new file mode 100644 index 00000000000..fbbbafb6fd0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/reftests/ref/canvas_display_after_device_lost-ref.html @@ -0,0 +1,26 @@ + + + WebGPU canvas_display_after_device_lost (ref) + + + + + + + + + diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/util.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/util.js index cf78d2f778d..dc66e3c70dc 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/util.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/util.js @@ -280,7 +280,7 @@ export const kVideoInfo = makeTable({ } }, 'four-colors-h264-bt601-hflip.mp4': { - mimeType: 'video/mp4; codecs=vp09.00.10.08', + mimeType: 'video/mp4; codecs=avc1.4d400c', colorSpace: 'bt601', coded: { topLeftColor: 'yellow', @@ -296,7 +296,7 @@ export const kVideoInfo = makeTable({ } }, 'four-colors-h264-bt601-vflip.mp4': { - mimeType: 'video/mp4; codecs=vp09.00.10.08', + mimeType: 'video/mp4; codecs=avc1.4d400c', colorSpace: 'bt601', coded: { topLeftColor: 'yellow', @@ -370,8 +370,6 @@ callback) try { await callback(); resolve(); - video.src = ''; - video.srcObject = null; } catch (ex) { reject(ex); } @@ -385,7 +383,12 @@ callback) video.addEventListener( 'error', - (event) => reject(new ErrorWithExtra('Video received "error" event', () => ({ event }))), + (event) => + reject( + new ErrorWithExtra('Video received "error" event, message: ' + event.message, () => ({ + event + })) + ), true ); @@ -514,6 +517,8 @@ export function getVideoElement(t, videoName) { const videoUrl = getResourcePath(videoName); videoElement.src = videoUrl; + t.trackForCleanup(videoElement); + return videoElement; } diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.js index 8eff1ae8cdb..01524c66e5f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.js @@ -1,10 +1,15 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/import { getGPU, setDefaultRequestAdapterOptions } from '../../../common/util/navigator_gpu.js';import { assert, objectEquals, iterRange } from '../../../common/util/util.js'; +// Should be WorkerGlobalScope, but importing lib "webworker" conflicts with lib "dom". + + + async function basicTest() { const adapter = await getGPU(null).requestAdapter(); assert(adapter !== null, 'Failed to get adapter.'); + const device = await adapter.requestDevice(); assert(device !== null, 'Failed to get device.'); @@ -29,11 +34,13 @@ async function basicTest() { const kNumElements = 64; const kBufferSize = kNumElements * 4; + const buffer = device.createBuffer({ size: kBufferSize, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }); + const resultBuffer = device.createBuffer({ size: kBufferSize, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST @@ -68,7 +75,7 @@ async function basicTest() { device.destroy(); } -self.onmessage = async (ev) => { +async function reportTestResults(ev) { const defaultRequestAdapterOptions = ev.data.defaultRequestAdapterOptions; setDefaultRequestAdapterOptions(defaultRequestAdapterOptions); @@ -79,5 +86,17 @@ self.onmessage = async (ev) => { } catch (err) { error = err.toString(); } - self.postMessage({ error }); + this.postMessage({ error }); +} + +self.onmessage = (ev) => { + void reportTestResults.call(ev.source || self, ev); +}; + +self.onconnect = (event) => { + const port = event.ports[0]; + + port.onmessage = (ev) => { + void reportTestResults.call(port, ev); + }; }; \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.spec.js index 56d07640e44..43d796f828e 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker.spec.js @@ -1,35 +1,67 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Tests WebGPU is available in a worker. +Tests WebGPU is available in a dedicated worker and a shared worker. -Note: The CTS test can be run in a worker by passing in worker=1 as -a query parameter. This test is specifically to check that WebGPU -is available in a worker. +Note: Any CTS test can be run in a worker by passing ?worker=dedicated, ?worker=shared, +?worker=service as a query parameter. The tests in this file are specifically to check +that WebGPU is available in each worker type. When run in combination with a ?worker flag, +they will test workers created from other workers (where APIs exist to do so). + +TODO[2]: Figure out how to make these tests run in service workers (not actually +important unless service workers gain the ability to launch other workers). `;import { Fixture } from '../../../common/framework/fixture.js'; import { makeTestGroup } from '../../../common/framework/test_group.js'; import { assert } from '../../../common/util/util.js'; export const g = makeTestGroup(Fixture); -function isNode() { - return typeof process !== 'undefined' && process?.versions?.node !== undefined; -} +const isNode = typeof process !== 'undefined' && process?.versions?.node !== undefined; -g.test('worker'). -desc(`test WebGPU is available in DedicatedWorkers and check for basic functionality`). +// [1]: we load worker_launcher dynamically because ts-node support +// is using commonjs which doesn't support import.meta. Further, +// we need to put the url in a string and pass the string to import +// otherwise typescript tries to parse the file which again, fails. +// worker_launcher.js is excluded in node.tsconfig.json. + +// [2]: That hack does not work in Service Workers. +const isServiceWorker = globalThis.constructor.name === 'ServiceWorkerGlobalScope'; + +g.test('dedicated_worker'). +desc(`test WebGPU is available in dedicated workers and check for basic functionality`). fn(async (t) => { - if (isNode()) { - t.skip('node does not support 100% compatible workers'); - return; - } - // Note: we load worker_launcher dynamically because ts-node support - // is using commonjs which doesn't support import.meta. Further, - // we need to put the url in a string add pass the string to import - // otherwise typescript tries to parse the file which again, fails. - // worker_launcher.js is excluded in node.tsconfig.json. + t.skipIf(isNode, 'node does not support 100% compatible workers'); + + t.skipIf(isServiceWorker, 'Service workers do not support this import() hack'); // [2] const url = './worker_launcher.js'; - const { launchWorker } = await import(url); - const result = await launchWorker(); + const { launchDedicatedWorker } = await import(url); // [1] + + const result = await launchDedicatedWorker(); + assert(result.error === undefined, `should be no error from worker but was: ${result.error}`); +}); + +g.test('shared_worker'). +desc(`test WebGPU is available in shared workers and check for basic functionality`). +fn(async (t) => { + t.skipIf(isNode, 'node does not support 100% compatible workers'); + + t.skipIf(isServiceWorker, 'Service workers do not support this import() hack'); // [2] + const url = './worker_launcher.js'; + const { launchSharedWorker } = await import(url); // [1] + + const result = await launchSharedWorker(); + assert(result.error === undefined, `should be no error from worker but was: ${result.error}`); +}); + +g.test('service_worker'). +desc(`test WebGPU is available in service workers and check for basic functionality`). +fn(async (t) => { + t.skipIf(isNode, 'node does not support 100% compatible workers'); + + t.skipIf(isServiceWorker, 'Service workers do not support this import() hack'); // [2] + const url = './worker_launcher.js'; + const { launchServiceWorker } = await import(url); // [1] + + const result = await launchServiceWorker(); assert(result.error === undefined, `should be no error from worker but was: ${result.error}`); }); \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker_launcher.js b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker_launcher.js index 11c4a4e7e38..2024a96f8eb 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker_launcher.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/web_platform/worker/worker_launcher.js @@ -1,10 +1,15 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts -**/import { getDefaultRequestAdapterOptions } from '../../../common/util/navigator_gpu.js'; +**/import { SkipTestCase } from '../../../common/framework/fixture.js';import { getDefaultRequestAdapterOptions } from '../../../common/util/navigator_gpu.js'; -export async function launchWorker() { + +export async function launchDedicatedWorker() { + if (typeof Worker === 'undefined') { + throw new SkipTestCase(`Worker undefined in context ${globalThis.constructor.name}`); + } + const selfPath = import.meta.url; const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); const workerPath = selfPathDir + '/worker.js'; @@ -15,4 +20,56 @@ export async function launchWorker() { }); worker.postMessage({ defaultRequestAdapterOptions: getDefaultRequestAdapterOptions() }); return await promise; +} + +export async function launchSharedWorker() { + if (typeof SharedWorker === 'undefined') { + throw new SkipTestCase(`SharedWorker undefined in context ${globalThis.constructor.name}`); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const workerPath = selfPathDir + '/worker.js'; + const worker = new SharedWorker(workerPath, { type: 'module' }); + + const port = worker.port; + const promise = new Promise((resolve) => { + port.addEventListener('message', (ev) => resolve(ev.data), { once: true }); + }); + port.start(); + port.postMessage({ + defaultRequestAdapterOptions: getDefaultRequestAdapterOptions() + }); + return await promise; +} + +export async function launchServiceWorker() { + if (typeof navigator === 'undefined' || typeof navigator.serviceWorker === 'undefined') { + throw new SkipTestCase( + `navigator.serviceWorker undefined in context ${globalThis.constructor.name}` + ); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const serviceWorkerPath = selfPathDir + '/worker.js'; + const registration = await navigator.serviceWorker.register(serviceWorkerPath, { + type: 'module' + }); + await registration.update(); + + const promise = new Promise((resolve) => { + navigator.serviceWorker.addEventListener( + 'message', + (ev) => { + resolve(ev.data); + void registration.unregister(); + }, + { once: true } + ); + }); + registration.active?.postMessage({ + defaultRequestAdapterOptions: getDefaultRequestAdapterOptions() + }); + return await promise; } \ No newline at end of file diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/info.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/info.as_worker.js new file mode 100644 index 00000000000..202dd2fcfdd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/info.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/adapter/info.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestAdapter.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestAdapter.as_worker.js new file mode 100644 index 00000000000..006b7d926bb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestAdapter.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/adapter/requestAdapter.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestDevice.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestDevice.as_worker.js new file mode 100644 index 00000000000..8e5aa7a3290 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/adapter/requestDevice.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/adapter/requestDevice.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map.as_worker.js new file mode 100644 index 00000000000..ea5d50dcaa1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/buffers/map.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_ArrayBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_ArrayBuffer.as_worker.js new file mode 100644 index 00000000000..5f9c16e71a7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_ArrayBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/buffers/map_ArrayBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_detach.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_detach.as_worker.js new file mode 100644 index 00000000000..60ca0d6b7c7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_detach.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/buffers/map_detach.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_oom.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_oom.as_worker.js new file mode 100644 index 00000000000..c5adf887673 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/map_oom.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/buffers/map_oom.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/threading.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/threading.as_worker.js new file mode 100644 index 00000000000..d65a38a7be3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/buffers/threading.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/buffers/threading.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/basic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/basic.as_worker.js new file mode 100644 index 00000000000..56ebb361a13 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/basic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/command_buffer/basic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/clearBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/clearBuffer.as_worker.js new file mode 100644 index 00000000000..ce7ed9a93de --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/clearBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/command_buffer/clearBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyBufferToBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyBufferToBuffer.as_worker.js new file mode 100644 index 00000000000..4968696863d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyBufferToBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/command_buffer/copyBufferToBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyTextureToTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyTextureToTexture.as_worker.js new file mode 100644 index 00000000000..fac5b03ea74 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/copyTextureToTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/command_buffer/copyTextureToTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/image_copy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/image_copy.as_worker.js new file mode 100644 index 00000000000..2e39a8358bb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/image_copy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/command_buffer/image_copy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/programmable/state_tracking.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/programmable/state_tracking.as_worker.js new file mode 100644 index 00000000000..8e17f588ad4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/programmable/state_tracking.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/command_buffer/programmable/state_tracking.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/queries/occlusionQuery.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/queries/occlusionQuery.as_worker.js new file mode 100644 index 00000000000..de05375bbf7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/queries/occlusionQuery.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/command_buffer/queries/occlusionQuery.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/dynamic_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/dynamic_state.as_worker.js new file mode 100644 index 00000000000..a5e0b76f3e9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/dynamic_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/command_buffer/render/dynamic_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/state_tracking.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/state_tracking.as_worker.js new file mode 100644 index 00000000000..df05ffe4d31 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/command_buffer/render/state_tracking.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/command_buffer/render/state_tracking.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute/basic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute/basic.as_worker.js new file mode 100644 index 00000000000..4129b0f122d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute/basic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/compute/basic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/entry_point_name.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/entry_point_name.as_worker.js new file mode 100644 index 00000000000..e0359948b63 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/entry_point_name.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/compute_pipeline/entry_point_name.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/overrides.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/overrides.as_worker.js new file mode 100644 index 00000000000..8fedbc8f51f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/compute_pipeline/overrides.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/compute_pipeline/overrides.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/device/lost.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/device/lost.as_worker.js new file mode 100644 index 00000000000..afb13ff4f6a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/device/lost.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/device/lost.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/labels.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/labels.as_worker.js new file mode 100644 index 00000000000..e0dc7bae365 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/labels.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/operation/labels.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/multiple_buffers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/multiple_buffers.as_worker.js new file mode 100644 index 00000000000..c5aaa8eeb64 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/multiple_buffers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/memory_sync/buffer/multiple_buffers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/single_buffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/single_buffer.as_worker.js new file mode 100644 index 00000000000..a5db55c892c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/buffer/single_buffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/memory_sync/buffer/single_buffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/readonly_depth_stencil.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/readonly_depth_stencil.as_worker.js new file mode 100644 index 00000000000..4a91e7062ca --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/readonly_depth_stencil.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/memory_sync/texture/readonly_depth_stencil.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/same_subresource.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/same_subresource.as_worker.js new file mode 100644 index 00000000000..f716f5fbd2d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/memory_sync/texture/same_subresource.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/operation/memory_sync/texture/same_subresource.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/onSubmittedWorkDone.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/onSubmittedWorkDone.as_worker.js new file mode 100644 index 00000000000..64fe2f204a2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/onSubmittedWorkDone.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/operation/onSubmittedWorkDone.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/pipeline/default_layout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/pipeline/default_layout.as_worker.js new file mode 100644 index 00000000000..bb32229817a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/pipeline/default_layout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/pipeline/default_layout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/queue/writeBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/queue/writeBuffer.as_worker.js new file mode 100644 index 00000000000..e471b6a15cf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/queue/writeBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/queue/writeBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/reflection.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/reflection.as_worker.js new file mode 100644 index 00000000000..bcc052b651a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/reflection.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/operation/reflection.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/clear_value.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/clear_value.as_worker.js new file mode 100644 index 00000000000..aeb572ddc50 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/clear_value.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pass/clear_value.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/resolve.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/resolve.as_worker.js new file mode 100644 index 00000000000..ee1d6ac5b8d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/resolve.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pass/resolve.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeOp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeOp.as_worker.js new file mode 100644 index 00000000000..9fe4944f8e0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeOp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pass/storeOp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeop2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeop2.as_worker.js new file mode 100644 index 00000000000..7b91a303028 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pass/storeop2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pass/storeop2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/culling_tests.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/culling_tests.as_worker.js new file mode 100644 index 00000000000..b3e56a8171c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/culling_tests.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/culling_tests.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/overrides.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/overrides.as_worker.js new file mode 100644 index 00000000000..4d35070f204 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/overrides.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/overrides.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/pipeline_output_targets.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/pipeline_output_targets.as_worker.js new file mode 100644 index 00000000000..4752f3e5383 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/pipeline_output_targets.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/pipeline_output_targets.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/primitive_topology.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/primitive_topology.as_worker.js new file mode 100644 index 00000000000..9e3664a3fe8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/primitive_topology.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/primitive_topology.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/sample_mask.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/sample_mask.as_worker.js new file mode 100644 index 00000000000..148f38687ff --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/sample_mask.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/sample_mask.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/vertex_only_render_pipeline.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/vertex_only_render_pipeline.as_worker.js new file mode 100644 index 00000000000..03c7feee043 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/render_pipeline/vertex_only_render_pipeline.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/render_pipeline/vertex_only_render_pipeline.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/3d_texture_slices.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/3d_texture_slices.as_worker.js new file mode 100644 index 00000000000..aa13489087b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/3d_texture_slices.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/3d_texture_slices.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/basic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/basic.as_worker.js new file mode 100644 index 00000000000..5a68ad5d0f5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/basic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/basic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/color_target_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/color_target_state.as_worker.js new file mode 100644 index 00000000000..e22643306d2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/color_target_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/color_target_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth.as_worker.js new file mode 100644 index 00000000000..3887717ca0e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/depth.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_bias.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_bias.as_worker.js new file mode 100644 index 00000000000..164c83d8e9f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_bias.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/depth_bias.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_clip_clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_clip_clamp.as_worker.js new file mode 100644 index 00000000000..dbb129adad4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/depth_clip_clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/depth_clip_clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/draw.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/draw.as_worker.js new file mode 100644 index 00000000000..4b7dcaa34a8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/draw.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/draw.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/indirect_draw.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/indirect_draw.as_worker.js new file mode 100644 index 00000000000..1241861451f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/indirect_draw.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/indirect_draw.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/robust_access_index.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/robust_access_index.as_worker.js new file mode 100644 index 00000000000..88dcfa7bfb6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/robust_access_index.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/robust_access_index.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/stencil.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/stencil.as_worker.js new file mode 100644 index 00000000000..386683f8805 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/rendering/stencil.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/rendering/stencil.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/buffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/buffer.as_worker.js new file mode 100644 index 00000000000..a17cd337c43 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/buffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/resource_init/buffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/texture_zero.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/texture_zero.as_worker.js new file mode 100644 index 00000000000..e425408557f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/resource_init/texture_zero.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/resource_init/texture_zero.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/anisotropy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/anisotropy.as_worker.js new file mode 100644 index 00000000000..634e853bb92 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/anisotropy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/sampling/anisotropy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/filter_mode.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/filter_mode.as_worker.js new file mode 100644 index 00000000000..992f61f32ab --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/filter_mode.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/sampling/filter_mode.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/lod_clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/lod_clamp.as_worker.js new file mode 100644 index 00000000000..690ccdc922b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/sampling/lod_clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/sampling/lod_clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/shader_module/compilation_info.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/shader_module/compilation_info.as_worker.js new file mode 100644 index 00000000000..56650a37aeb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/shader_module/compilation_info.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/shader_module/compilation_info.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_only.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_only.as_worker.js new file mode 100644 index 00000000000..1e1b3141cdc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_only.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/storage_texture/read_only.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_write.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_write.as_worker.js new file mode 100644 index 00000000000..68a7804b943 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/storage_texture/read_write.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/storage_texture/read_write.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/format_reinterpretation.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/format_reinterpretation.as_worker.js new file mode 100644 index 00000000000..149586acaed --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/format_reinterpretation.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/texture_view/format_reinterpretation.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/read.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/read.as_worker.js new file mode 100644 index 00000000000..9cae75cc80c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/read.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/texture_view/read.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/write.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/write.as_worker.js new file mode 100644 index 00000000000..d5a8fef0b54 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/texture_view/write.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/texture_view/write.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/uncapturederror.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/uncapturederror.as_worker.js new file mode 100644 index 00000000000..7f58278d953 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/uncapturederror.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/operation/uncapturederror.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/correctness.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/correctness.as_worker.js new file mode 100644 index 00000000000..409931bddc2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/correctness.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/vertex_state/correctness.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/index_format.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/index_format.as_worker.js new file mode 100644 index 00000000000..131b3eec8ac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/operation/vertex_state/index_format.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/operation/vertex_state/index_format.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/create.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/create.as_worker.js new file mode 100644 index 00000000000..9956d030dbe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/create.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/buffer/create.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/destroy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/destroy.as_worker.js new file mode 100644 index 00000000000..0bc23d441aa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/destroy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/buffer/destroy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/mapping.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/mapping.as_worker.js new file mode 100644 index 00000000000..ced5a04bc24 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/mapping.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/buffer/mapping.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/threading.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/threading.as_worker.js new file mode 100644 index 00000000000..87a0dcb5460 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/buffer/threading.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/buffer/threading.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/query_types.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/query_types.as_worker.js new file mode 100644 index 00000000000..1b47f1ebe58 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/query_types.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/features/query_types.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/texture_formats.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/texture_formats.as_worker.js new file mode 100644 index 00000000000..46be9cf8e68 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/features/texture_formats.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/features/texture_formats.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroups.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroups.as_worker.js new file mode 100644 index 00000000000..a7ad4947d6f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroups.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxBindGroups.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.as_worker.js new file mode 100644 index 00000000000..77da34e1b98 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindingsPerBindGroup.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindingsPerBindGroup.as_worker.js new file mode 100644 index 00000000000..34ce60042c9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBindingsPerBindGroup.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBufferSize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBufferSize.as_worker.js new file mode 100644 index 00000000000..e16e1a828ba --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxBufferSize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxBufferSize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.as_worker.js new file mode 100644 index 00000000000..53202de2525 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxColorAttachmentBytesPerSample.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachments.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachments.as_worker.js new file mode 100644 index 00000000000..93f409b9aa1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxColorAttachments.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxColorAttachments.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeInvocationsPerWorkgroup.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeInvocationsPerWorkgroup.as_worker.js new file mode 100644 index 00000000000..ca774003d61 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeInvocationsPerWorkgroup.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeInvocationsPerWorkgroup.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.as_worker.js new file mode 100644 index 00000000000..cf2dfd7d83c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.as_worker.js new file mode 100644 index 00000000000..fac5b8adb7f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.as_worker.js new file mode 100644 index 00000000000..fc6ecee71ad --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupStorageSize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupStorageSize.as_worker.js new file mode 100644 index 00000000000..c621df8750c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupStorageSize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeWorkgroupStorageSize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.as_worker.js new file mode 100644 index 00000000000..0adb573ac3d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicStorageBuffersPerPipelineLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicStorageBuffersPerPipelineLayout.as_worker.js new file mode 100644 index 00000000000..348f858ab9b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicStorageBuffersPerPipelineLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxDynamicStorageBuffersPerPipelineLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicUniformBuffersPerPipelineLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicUniformBuffersPerPipelineLayout.as_worker.js new file mode 100644 index 00000000000..2f8f6eac6b0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxDynamicUniformBuffersPerPipelineLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxDynamicUniformBuffersPerPipelineLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderComponents.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderComponents.as_worker.js new file mode 100644 index 00000000000..5141c00a5c4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderComponents.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxInterStageShaderComponents.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderVariables.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderVariables.as_worker.js new file mode 100644 index 00000000000..9eed84a0236 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxInterStageShaderVariables.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxInterStageShaderVariables.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSampledTexturesPerShaderStage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSampledTexturesPerShaderStage.as_worker.js new file mode 100644 index 00000000000..4c786280458 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSampledTexturesPerShaderStage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxSampledTexturesPerShaderStage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSamplersPerShaderStage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSamplersPerShaderStage.as_worker.js new file mode 100644 index 00000000000..171c51ba3ee --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxSamplersPerShaderStage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxSamplersPerShaderStage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBufferBindingSize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBufferBindingSize.as_worker.js new file mode 100644 index 00000000000..fc013f5a33a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBufferBindingSize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBuffersPerShaderStage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBuffersPerShaderStage.as_worker.js new file mode 100644 index 00000000000..0534c599313 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageBuffersPerShaderStage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxStorageBuffersPerShaderStage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageTexturesPerShaderStage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageTexturesPerShaderStage.as_worker.js new file mode 100644 index 00000000000..7528bfcb768 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxStorageTexturesPerShaderStage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxStorageTexturesPerShaderStage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureArrayLayers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureArrayLayers.as_worker.js new file mode 100644 index 00000000000..d9d4a2695b7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureArrayLayers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxTextureArrayLayers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension1D.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension1D.as_worker.js new file mode 100644 index 00000000000..b01d232fb11 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension1D.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxTextureDimension1D.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension2D.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension2D.as_worker.js new file mode 100644 index 00000000000..9e0be3b1412 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension2D.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxTextureDimension2D.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension3D.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension3D.as_worker.js new file mode 100644 index 00000000000..8b7ab4335e1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxTextureDimension3D.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxTextureDimension3D.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBufferBindingSize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBufferBindingSize.as_worker.js new file mode 100644 index 00000000000..4b8569d2833 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBufferBindingSize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxUniformBufferBindingSize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBuffersPerShaderStage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBuffersPerShaderStage.as_worker.js new file mode 100644 index 00000000000..a39add9d222 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxUniformBuffersPerShaderStage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxUniformBuffersPerShaderStage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexAttributes.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexAttributes.as_worker.js new file mode 100644 index 00000000000..e5fb866a616 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexAttributes.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxVertexAttributes.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBufferArrayStride.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBufferArrayStride.as_worker.js new file mode 100644 index 00000000000..f8d938fcd89 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBufferArrayStride.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxVertexBufferArrayStride.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBuffers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBuffers.as_worker.js new file mode 100644 index 00000000000..dead0eea960 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/maxVertexBuffers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/maxVertexBuffers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.as_worker.js new file mode 100644 index 00000000000..11228efe782 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/minStorageBufferOffsetAlignment.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.as_worker.js new file mode 100644 index 00000000000..b484c0f1dad --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/capability_checks/limits/minUniformBufferOffsetAlignment.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/compute_pipeline.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/compute_pipeline.as_worker.js new file mode 100644 index 00000000000..9ab87dd3891 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/compute_pipeline.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/compute_pipeline.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroup.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroup.as_worker.js new file mode 100644 index 00000000000..c28e40bba91 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroup.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createBindGroup.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroupLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroupLayout.as_worker.js new file mode 100644 index 00000000000..d0db0125d7c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createBindGroupLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createBindGroupLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createPipelineLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createPipelineLayout.as_worker.js new file mode 100644 index 00000000000..7931f8f0a21 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createPipelineLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createPipelineLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createSampler.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createSampler.as_worker.js new file mode 100644 index 00000000000..980383283b2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createSampler.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createSampler.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createTexture.as_worker.js new file mode 100644 index 00000000000..bc8d5ca90f8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createView.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createView.as_worker.js new file mode 100644 index 00000000000..7a6d9fc3302 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/createView.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/createView.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/debugMarker.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/debugMarker.as_worker.js new file mode 100644 index 00000000000..0fadeb557a0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/debugMarker.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/debugMarker.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginComputePass.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginComputePass.as_worker.js new file mode 100644 index 00000000000..2e321f41296 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginComputePass.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/beginComputePass.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginRenderPass.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginRenderPass.as_worker.js new file mode 100644 index 00000000000..ed5e0d97b7f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/beginRenderPass.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/beginRenderPass.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/clearBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/clearBuffer.as_worker.js new file mode 100644 index 00000000000..dcbd091e774 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/clearBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/clearBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/compute_pass.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/compute_pass.as_worker.js new file mode 100644 index 00000000000..02ef60bff86 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/compute_pass.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/compute_pass.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyBufferToBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyBufferToBuffer.as_worker.js new file mode 100644 index 00000000000..6627e804658 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyBufferToBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/copyBufferToBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js new file mode 100644 index 00000000000..d0806be0f71 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/copyTextureToTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/debug.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/debug.as_worker.js new file mode 100644 index 00000000000..e46686daa0b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/debug.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/debug.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/index_access.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/index_access.as_worker.js new file mode 100644 index 00000000000..e0afa5f787e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/index_access.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/index_access.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/draw.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/draw.as_worker.js new file mode 100644 index 00000000000..830d3af791d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/draw.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/draw.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/dynamic_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/dynamic_state.as_worker.js new file mode 100644 index 00000000000..69993c2b186 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/dynamic_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/dynamic_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/indirect_draw.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/indirect_draw.as_worker.js new file mode 100644 index 00000000000..0fc8c4297ea --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/indirect_draw.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/indirect_draw.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setIndexBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setIndexBuffer.as_worker.js new file mode 100644 index 00000000000..e89a3d9e0b9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setIndexBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/setIndexBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setPipeline.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setPipeline.as_worker.js new file mode 100644 index 00000000000..7733659e3e4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setPipeline.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/setPipeline.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setVertexBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setVertexBuffer.as_worker.js new file mode 100644 index 00000000000..506c30d2f26 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/setVertexBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/setVertexBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/state_tracking.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/state_tracking.as_worker.js new file mode 100644 index 00000000000..0670d300958 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render/state_tracking.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../api/validation/encoding/cmds/render/state_tracking.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render_pass.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render_pass.as_worker.js new file mode 100644 index 00000000000..1e72576a2b0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/render_pass.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/render_pass.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setBindGroup.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setBindGroup.as_worker.js new file mode 100644 index 00000000000..25ac67208db --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setBindGroup.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/setBindGroup.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/createRenderBundleEncoder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/createRenderBundleEncoder.as_worker.js new file mode 100644 index 00000000000..67f3071613c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/createRenderBundleEncoder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/createRenderBundleEncoder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_open_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_open_state.as_worker.js new file mode 100644 index 00000000000..15124bde336 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_open_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/encoder_open_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_state.as_worker.js new file mode 100644 index 00000000000..f3a8102fd4b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/encoder_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/encoder_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js new file mode 100644 index 00000000000..3d5af06ba05 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/begin_end.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/begin_end.as_worker.js new file mode 100644 index 00000000000..b723940977a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/begin_end.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/queries/begin_end.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/general.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/general.as_worker.js new file mode 100644 index 00000000000..1a4a48d56ff --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/general.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/queries/general.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/resolveQuerySet.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/resolveQuerySet.as_worker.js new file mode 100644 index 00000000000..ef133a2e650 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/queries/resolveQuerySet.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/queries/resolveQuerySet.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/render_bundle.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/render_bundle.as_worker.js new file mode 100644 index 00000000000..b711a626b7e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/encoding/render_bundle.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/encoding/render_bundle.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/error_scope.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/error_scope.as_worker.js new file mode 100644 index 00000000000..4134bbb2d2e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/error_scope.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/error_scope.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/getBindGroupLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/getBindGroupLayout.as_worker.js new file mode 100644 index 00000000000..008f952ac37 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/getBindGroupLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/getBindGroupLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/gpu_external_texture_expiration.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/gpu_external_texture_expiration.as_worker.js new file mode 100644 index 00000000000..cc27a53cb32 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/gpu_external_texture_expiration.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/gpu_external_texture_expiration.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_related.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_related.as_worker.js new file mode 100644 index 00000000000..2dd3ff15aa2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_related.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/image_copy/buffer_related.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_texture_copies.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_texture_copies.as_worker.js new file mode 100644 index 00000000000..4198982692c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/buffer_texture_copies.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/image_copy/buffer_texture_copies.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/layout_related.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/layout_related.as_worker.js new file mode 100644 index 00000000000..82475148104 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/layout_related.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/image_copy/layout_related.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/texture_related.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/texture_related.as_worker.js new file mode 100644 index 00000000000..750edbb59ef --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/image_copy/texture_related.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/image_copy/texture_related.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/layout_shader_compat.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/layout_shader_compat.as_worker.js new file mode 100644 index 00000000000..c62cff190f0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/layout_shader_compat.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../api/validation/layout_shader_compat.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/create.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/create.as_worker.js new file mode 100644 index 00000000000..6b25b2e59a9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/create.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/query_set/create.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/destroy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/destroy.as_worker.js new file mode 100644 index 00000000000..18c5be27800 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/query_set/destroy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/query_set/destroy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/buffer_mapped.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/buffer_mapped.as_worker.js new file mode 100644 index 00000000000..2ef88aaba42 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/buffer_mapped.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/queue/buffer_mapped.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/copyToTexture/CopyExternalImageToTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/copyToTexture/CopyExternalImageToTexture.as_worker.js new file mode 100644 index 00000000000..dbeb6498374 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/copyToTexture/CopyExternalImageToTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/queue/copyToTexture/CopyExternalImageToTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/buffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/buffer.as_worker.js new file mode 100644 index 00000000000..b6ace0141b9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/buffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/queue/destroyed/buffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/query_set.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/query_set.as_worker.js new file mode 100644 index 00000000000..7d0ad59976f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/query_set.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/queue/destroyed/query_set.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/texture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/texture.as_worker.js new file mode 100644 index 00000000000..3a55f8ac8b2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/destroyed/texture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/queue/destroyed/texture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/submit.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/submit.as_worker.js new file mode 100644 index 00000000000..dadadd8cca8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/submit.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/queue/submit.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeBuffer.as_worker.js new file mode 100644 index 00000000000..3b08d8f6f83 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/queue/writeBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeTexture.as_worker.js new file mode 100644 index 00000000000..3c4aa50c90a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/queue/writeTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/queue/writeTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/attachment_compatibility.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/attachment_compatibility.as_worker.js new file mode 100644 index 00000000000..1e401477f95 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/attachment_compatibility.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pass/attachment_compatibility.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/render_pass_descriptor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/render_pass_descriptor.as_worker.js new file mode 100644 index 00000000000..5b0ff9dac3f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/render_pass_descriptor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pass/render_pass_descriptor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/resolve.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/resolve.as_worker.js new file mode 100644 index 00000000000..03c82fe256d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pass/resolve.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pass/resolve.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/depth_stencil_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/depth_stencil_state.as_worker.js new file mode 100644 index 00000000000..6ac988850f9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/depth_stencil_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/depth_stencil_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/fragment_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/fragment_state.as_worker.js new file mode 100644 index 00000000000..c72d44ea90b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/fragment_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/fragment_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/inter_stage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/inter_stage.as_worker.js new file mode 100644 index 00000000000..1a15d1262cd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/inter_stage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/inter_stage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/misc.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/misc.as_worker.js new file mode 100644 index 00000000000..8e4b205225e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/misc.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/misc.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/multisample_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/multisample_state.as_worker.js new file mode 100644 index 00000000000..58e9dafa354 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/multisample_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/multisample_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/overrides.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/overrides.as_worker.js new file mode 100644 index 00000000000..0390971fa32 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/overrides.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/overrides.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/primitive_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/primitive_state.as_worker.js new file mode 100644 index 00000000000..0989905dd12 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/primitive_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/primitive_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/resource_compatibility.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/resource_compatibility.as_worker.js new file mode 100644 index 00000000000..34a92baee9d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/resource_compatibility.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/resource_compatibility.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/shader_module.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/shader_module.as_worker.js new file mode 100644 index 00000000000..2a183cac86e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/shader_module.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/shader_module.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/vertex_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/vertex_state.as_worker.js new file mode 100644 index 00000000000..a9107e37828 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/render_pipeline/vertex_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/render_pipeline/vertex_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_encoder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_encoder.as_worker.js new file mode 100644 index 00000000000..210d2a2db16 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_encoder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/resource_usages/buffer/in_pass_encoder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_misc.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_misc.as_worker.js new file mode 100644 index 00000000000..4f6eaca9c49 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/buffer/in_pass_misc.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/resource_usages/buffer/in_pass_misc.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_pass_encoder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_pass_encoder.as_worker.js new file mode 100644 index 00000000000..77dabff1d43 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_pass_encoder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/resource_usages/texture/in_pass_encoder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_common.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_common.as_worker.js new file mode 100644 index 00000000000..12158a6fd1a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_common.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/resource_usages/texture/in_render_common.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_misc.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_misc.as_worker.js new file mode 100644 index 00000000000..113a040aedd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/resource_usages/texture/in_render_misc.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/resource_usages/texture/in_render_misc.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/entry_point.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/entry_point.as_worker.js new file mode 100644 index 00000000000..6f395fba801 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/entry_point.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/shader_module/entry_point.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/overrides.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/overrides.as_worker.js new file mode 100644 index 00000000000..e3144b7fc43 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/shader_module/overrides.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/shader_module/overrides.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/state/device_lost/destroy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/state/device_lost/destroy.as_worker.js new file mode 100644 index 00000000000..7aca2300190 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/state/device_lost/destroy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/state/device_lost/destroy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/bgra8unorm_storage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/bgra8unorm_storage.as_worker.js new file mode 100644 index 00000000000..e77ed783ae1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/bgra8unorm_storage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/texture/bgra8unorm_storage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/destroy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/destroy.as_worker.js new file mode 100644 index 00000000000..92b96ec9add --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/destroy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/texture/destroy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/float32_filterable.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/float32_filterable.as_worker.js new file mode 100644 index 00000000000..09ea5238bb7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/float32_filterable.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/texture/float32_filterable.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/rg11b10ufloat_renderable.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/rg11b10ufloat_renderable.as_worker.js new file mode 100644 index 00000000000..795241e1d85 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/api/validation/texture/rg11b10ufloat_renderable.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../api/validation/texture/rg11b10ufloat_renderable.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroup.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroup.as_worker.js new file mode 100644 index 00000000000..2d81691f8f6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroup.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../compat/api/validation/createBindGroup.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroupLayout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroupLayout.as_worker.js new file mode 100644 index 00000000000..3305962eb88 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/createBindGroupLayout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../compat/api/validation/createBindGroupLayout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToBuffer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToBuffer.as_worker.js new file mode 100644 index 00000000000..ad24236d47e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToBuffer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../compat/api/validation/encoding/cmds/copyTextureToBuffer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js new file mode 100644 index 00000000000..f8e1928824d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/cmds/copyTextureToTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../compat/api/validation/encoding/cmds/copyTextureToTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js new file mode 100644 index 00000000000..af10ab581ca --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/encoding/programmable/pipeline_bind_group_compat.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../compat/api/validation/encoding/programmable/pipeline_bind_group_compat.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/depth_stencil_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/depth_stencil_state.as_worker.js new file mode 100644 index 00000000000..d24b5fa7451 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/depth_stencil_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/render_pipeline/depth_stencil_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/fragment_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/fragment_state.as_worker.js new file mode 100644 index 00000000000..98196d03d1d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/fragment_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/render_pipeline/fragment_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/vertex_state.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/vertex_state.as_worker.js new file mode 100644 index 00000000000..20e8dd4ce76 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/render_pipeline/vertex_state.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/render_pipeline/vertex_state.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/shader_module/shader_module.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/shader_module/shader_module.as_worker.js new file mode 100644 index 00000000000..dca678fc5c2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/shader_module/shader_module.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/shader_module/shader_module.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/createTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/createTexture.as_worker.js new file mode 100644 index 00000000000..d0fb1f6d706 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/createTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/texture/createTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/cubeArray.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/cubeArray.as_worker.js new file mode 100644 index 00000000000..53286a24886 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/compat/api/validation/texture/cubeArray.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../compat/api/validation/texture/cubeArray.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/examples.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/examples.as_worker.js new file mode 100644 index 00000000000..ecd9374c221 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/examples.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../examples.spec.js'; +import { wrapTestGroupForWorker } from '../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constants/flags.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constants/flags.as_worker.js new file mode 100644 index 00000000000..f54be7798f8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constants/flags.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../idl/constants/flags.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constructable.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constructable.as_worker.js new file mode 100644 index 00000000000..fe624207cb8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/idl/constructable.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../idl/constructable.spec.js'; +import { wrapTestGroupForWorker } from '../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/print_environment.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/print_environment.as_worker.js new file mode 100644 index 00000000000..71ab073cc1b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/print_environment.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../print_environment.spec.js'; +import { wrapTestGroupForWorker } from '../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/array/index.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/array/index.as_worker.js new file mode 100644 index 00000000000..9cc97b7c4e8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/array/index.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/access/array/index.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/matrix/index.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/matrix/index.as_worker.js new file mode 100644 index 00000000000..9538240899f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/matrix/index.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/access/matrix/index.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/structure/index.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/structure/index.as_worker.js new file mode 100644 index 00000000000..9aa32ce4796 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/structure/index.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/access/structure/index.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/components.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/components.as_worker.js new file mode 100644 index 00000000000..076c7fed905 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/components.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/access/vector/components.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/index.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/index.as_worker.js new file mode 100644 index 00000000000..3781e618ff0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/access/vector/index.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/access/vector/index.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_addition.as_worker.js new file mode 100644 index 00000000000..3f25d7f105c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_comparison.as_worker.js new file mode 100644 index 00000000000..7cf5dd33144 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_division.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_division.as_worker.js new file mode 100644 index 00000000000..17a9993f954 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_division.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_division.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_addition.as_worker.js new file mode 100644 index 00000000000..2bc11305ae5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_matrix_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_matrix_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_matrix_multiplication.as_worker.js new file mode 100644 index 00000000000..c22a0382f9e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_matrix_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_scalar_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_scalar_multiplication.as_worker.js new file mode 100644 index 00000000000..b5b23f073c5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_scalar_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_subtraction.as_worker.js new file mode 100644 index 00000000000..926d93f6297 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_matrix_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_vector_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_vector_multiplication.as_worker.js new file mode 100644 index 00000000000..8e2de76fda7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_matrix_vector_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_matrix_vector_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_multiplication.as_worker.js new file mode 100644 index 00000000000..2a313bcbe75 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_remainder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_remainder.as_worker.js new file mode 100644 index 00000000000..79ff0a10a74 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_remainder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_remainder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_subtraction.as_worker.js new file mode 100644 index 00000000000..59de223470d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/af_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/af_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_arithmetic.as_worker.js new file mode 100644 index 00000000000..35c5bad2bb8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/ai_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_comparison.as_worker.js new file mode 100644 index 00000000000..bf119f5a82e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/ai_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/ai_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise.as_worker.js new file mode 100644 index 00000000000..1b78a114163 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/bitwise.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise_shift.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise_shift.as_worker.js new file mode 100644 index 00000000000..50df7799cc6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bitwise_shift.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/bitwise_shift.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bool_logical.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bool_logical.as_worker.js new file mode 100644 index 00000000000..c97a65500a5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/bool_logical.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/bool_logical.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_addition.as_worker.js new file mode 100644 index 00000000000..b4d1ba4e9af --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_comparison.as_worker.js new file mode 100644 index 00000000000..343e81cd66f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_division.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_division.as_worker.js new file mode 100644 index 00000000000..df89b1d70f4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_division.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_division.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_addition.as_worker.js new file mode 100644 index 00000000000..3d37d6b0281 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_matrix_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_matrix_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_matrix_multiplication.as_worker.js new file mode 100644 index 00000000000..f66a6197dc1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_matrix_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_matrix_matrix_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_scalar_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_scalar_multiplication.as_worker.js new file mode 100644 index 00000000000..560e1f8d73e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_scalar_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_matrix_scalar_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_subtraction.as_worker.js new file mode 100644 index 00000000000..f8b9a5c9fbd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_matrix_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_vector_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_vector_multiplication.as_worker.js new file mode 100644 index 00000000000..d15ae4e874a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_matrix_vector_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_matrix_vector_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_multiplication.as_worker.js new file mode 100644 index 00000000000..07a20c242cc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_remainder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_remainder.as_worker.js new file mode 100644 index 00000000000..2062f2f6c2d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_remainder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_remainder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_subtraction.as_worker.js new file mode 100644 index 00000000000..0812e2596ad --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f16_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f16_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_addition.as_worker.js new file mode 100644 index 00000000000..6a4e8567812 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_comparison.as_worker.js new file mode 100644 index 00000000000..24be70b2b14 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_division.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_division.as_worker.js new file mode 100644 index 00000000000..c4c529c8f4c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_division.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_division.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_addition.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_addition.as_worker.js new file mode 100644 index 00000000000..f1782f5375d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_addition.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_matrix_addition.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_matrix_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_matrix_multiplication.as_worker.js new file mode 100644 index 00000000000..039780dcae0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_matrix_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_matrix_matrix_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_scalar_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_scalar_multiplication.as_worker.js new file mode 100644 index 00000000000..4438ac0342b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_scalar_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_matrix_scalar_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_subtraction.as_worker.js new file mode 100644 index 00000000000..02f57adfac1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_matrix_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_vector_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_vector_multiplication.as_worker.js new file mode 100644 index 00000000000..ddb363aaa40 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_matrix_vector_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_matrix_vector_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_multiplication.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_multiplication.as_worker.js new file mode 100644 index 00000000000..7fec7f76d56 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_multiplication.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_multiplication.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_remainder.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_remainder.as_worker.js new file mode 100644 index 00000000000..05b5a3c79f9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_remainder.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_remainder.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_subtraction.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_subtraction.as_worker.js new file mode 100644 index 00000000000..c227a5eab52 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/f32_subtraction.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/f32_subtraction.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_arithmetic.as_worker.js new file mode 100644 index 00000000000..9cb5320d769 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/i32_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_comparison.as_worker.js new file mode 100644 index 00000000000..54b62bca250 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/i32_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/i32_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_arithmetic.as_worker.js new file mode 100644 index 00000000000..a630ff22b3f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/u32_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_comparison.as_worker.js new file mode 100644 index 00000000000..f554e8aa269 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/binary/u32_comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/binary/u32_comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/abs.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/abs.as_worker.js new file mode 100644 index 00000000000..1a0c5737c40 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/abs.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/abs.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acos.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acos.as_worker.js new file mode 100644 index 00000000000..918deeca0ac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acos.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/acos.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acosh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acosh.as_worker.js new file mode 100644 index 00000000000..eebceffa12d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/acosh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/acosh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/all.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/all.as_worker.js new file mode 100644 index 00000000000..9232689fb1b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/all.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/all.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/any.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/any.as_worker.js new file mode 100644 index 00000000000..ee03b527c32 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/any.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/any.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/arrayLength.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/arrayLength.as_worker.js new file mode 100644 index 00000000000..d13d0e94129 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/arrayLength.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/arrayLength.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asin.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asin.as_worker.js new file mode 100644 index 00000000000..84b154faaef --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asin.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/asin.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asinh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asinh.as_worker.js new file mode 100644 index 00000000000..94eef38c0d3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/asinh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/asinh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan.as_worker.js new file mode 100644 index 00000000000..0e583ed82f9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/atan.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan2.as_worker.js new file mode 100644 index 00000000000..04e39bb68ed --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atan2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/atan2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atanh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atanh.as_worker.js new file mode 100644 index 00000000000..6c807c08bb4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atanh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/atanh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAdd.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAdd.as_worker.js new file mode 100644 index 00000000000..76f5f7443f3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAdd.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicAdd.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAnd.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAnd.as_worker.js new file mode 100644 index 00000000000..a86260b4142 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicAnd.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.as_worker.js new file mode 100644 index 00000000000..ba86a542445 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicCompareExchangeWeak.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicExchange.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicExchange.as_worker.js new file mode 100644 index 00000000000..53f4028fa4f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicExchange.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicExchange.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicLoad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicLoad.as_worker.js new file mode 100644 index 00000000000..aac4f05de06 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicLoad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicLoad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMax.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMax.as_worker.js new file mode 100644 index 00000000000..d000bc90add --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMax.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicMax.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMin.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMin.as_worker.js new file mode 100644 index 00000000000..12db37164b1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicMin.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicMin.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicOr.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicOr.as_worker.js new file mode 100644 index 00000000000..0416b23e84a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicOr.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicOr.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicStore.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicStore.as_worker.js new file mode 100644 index 00000000000..591ea6c1352 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicStore.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicStore.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicSub.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicSub.as_worker.js new file mode 100644 index 00000000000..8767389e87c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicSub.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicSub.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicXor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicXor.as_worker.js new file mode 100644 index 00000000000..c239fc2797a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/atomics/atomicXor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../../shader/execution/expression/call/builtin/atomics/atomicXor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/bitcast.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/bitcast.as_worker.js new file mode 100644 index 00000000000..481abb1d267 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/bitcast.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/bitcast.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ceil.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ceil.as_worker.js new file mode 100644 index 00000000000..c24b27665db --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ceil.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/ceil.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/clamp.as_worker.js new file mode 100644 index 00000000000..19ab86e3ff7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cos.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cos.as_worker.js new file mode 100644 index 00000000000..b10ddecef77 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cos.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/cos.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cosh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cosh.as_worker.js new file mode 100644 index 00000000000..f5613135c46 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cosh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/cosh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countLeadingZeros.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countLeadingZeros.as_worker.js new file mode 100644 index 00000000000..9b3e765eb2a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countLeadingZeros.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/countLeadingZeros.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countOneBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countOneBits.as_worker.js new file mode 100644 index 00000000000..755c44f8839 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countOneBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/countOneBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countTrailingZeros.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countTrailingZeros.as_worker.js new file mode 100644 index 00000000000..023d8979a69 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/countTrailingZeros.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/countTrailingZeros.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cross.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cross.as_worker.js new file mode 100644 index 00000000000..e741a038c2a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/cross.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/cross.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/degrees.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/degrees.as_worker.js new file mode 100644 index 00000000000..11a9befc7cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/degrees.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/degrees.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/determinant.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/determinant.as_worker.js new file mode 100644 index 00000000000..d7b2083a0cd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/determinant.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/determinant.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/distance.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/distance.as_worker.js new file mode 100644 index 00000000000..d08c9b959fc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/distance.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/distance.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot.as_worker.js new file mode 100644 index 00000000000..ba9b9861c46 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dot.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4I8Packed.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4I8Packed.as_worker.js new file mode 100644 index 00000000000..47e81aee2ce --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4I8Packed.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dot4I8Packed.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4U8Packed.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4U8Packed.as_worker.js new file mode 100644 index 00000000000..1997d588839 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dot4U8Packed.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dot4U8Packed.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdx.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdx.as_worker.js new file mode 100644 index 00000000000..1f23c8f7439 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdx.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdx.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxCoarse.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxCoarse.as_worker.js new file mode 100644 index 00000000000..332238aa986 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxCoarse.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdxCoarse.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxFine.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxFine.as_worker.js new file mode 100644 index 00000000000..45d0dd15f6a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdxFine.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdxFine.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdy.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdy.as_worker.js new file mode 100644 index 00000000000..d7fa774c700 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdy.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdy.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyCoarse.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyCoarse.as_worker.js new file mode 100644 index 00000000000..f818422cf43 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyCoarse.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdyCoarse.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyFine.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyFine.as_worker.js new file mode 100644 index 00000000000..b96b3c2d7b4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/dpdyFine.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/dpdyFine.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp.as_worker.js new file mode 100644 index 00000000000..b3f99653b12 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/exp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp2.as_worker.js new file mode 100644 index 00000000000..943f79d3fad --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/exp2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/exp2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/extractBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/extractBits.as_worker.js new file mode 100644 index 00000000000..1e720dea491 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/extractBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/extractBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/faceForward.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/faceForward.as_worker.js new file mode 100644 index 00000000000..771f30a6abe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/faceForward.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/faceForward.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstLeadingBit.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstLeadingBit.as_worker.js new file mode 100644 index 00000000000..560b19314cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstLeadingBit.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/firstLeadingBit.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstTrailingBit.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstTrailingBit.as_worker.js new file mode 100644 index 00000000000..6a4da57be15 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/firstTrailingBit.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/firstTrailingBit.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/floor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/floor.as_worker.js new file mode 100644 index 00000000000..577ee0ff0fe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/floor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/floor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fma.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fma.as_worker.js new file mode 100644 index 00000000000..278df598650 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fma.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/fma.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fract.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fract.as_worker.js new file mode 100644 index 00000000000..f96aff459ea --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fract.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/fract.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/frexp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/frexp.as_worker.js new file mode 100644 index 00000000000..08efc302806 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/frexp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/frexp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidth.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidth.as_worker.js new file mode 100644 index 00000000000..ebb0a1e6124 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidth.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/fwidth.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthCoarse.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthCoarse.as_worker.js new file mode 100644 index 00000000000..17e286ccf20 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthCoarse.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/fwidthCoarse.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthFine.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthFine.as_worker.js new file mode 100644 index 00000000000..a8ec6865ac2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/fwidthFine.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/fwidthFine.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/insertBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/insertBits.as_worker.js new file mode 100644 index 00000000000..244c0aef8d8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/insertBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/insertBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/inversesqrt.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/inversesqrt.as_worker.js new file mode 100644 index 00000000000..3808e163f6c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/inversesqrt.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/inversesqrt.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ldexp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ldexp.as_worker.js new file mode 100644 index 00000000000..538d662fe16 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/ldexp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/ldexp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/length.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/length.as_worker.js new file mode 100644 index 00000000000..e9a7510c002 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/length.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/length.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log.as_worker.js new file mode 100644 index 00000000000..a4726143d27 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/log.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log2.as_worker.js new file mode 100644 index 00000000000..17f7b312335 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/log2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/log2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/max.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/max.as_worker.js new file mode 100644 index 00000000000..071ee77eb11 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/max.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/max.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/min.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/min.as_worker.js new file mode 100644 index 00000000000..1f713e08779 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/min.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/min.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/mix.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/mix.as_worker.js new file mode 100644 index 00000000000..8d31ff9367b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/mix.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/mix.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/modf.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/modf.as_worker.js new file mode 100644 index 00000000000..b6f1af2f666 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/modf.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/modf.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/normalize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/normalize.as_worker.js new file mode 100644 index 00000000000..41eba8d1ea4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/normalize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/normalize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16float.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16float.as_worker.js new file mode 100644 index 00000000000..0b607cc6155 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16float.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack2x16float.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16snorm.as_worker.js new file mode 100644 index 00000000000..f4b1a9fc964 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack2x16snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16unorm.as_worker.js new file mode 100644 index 00000000000..867aacc6084 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack2x16unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack2x16unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8snorm.as_worker.js new file mode 100644 index 00000000000..80520d1f0b7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4x8snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8unorm.as_worker.js new file mode 100644 index 00000000000..d78be03afbb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4x8unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4x8unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8.as_worker.js new file mode 100644 index 00000000000..9e15ccc5c7a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4xI8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8Clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8Clamp.as_worker.js new file mode 100644 index 00000000000..2f3e6fe2dac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xI8Clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4xI8Clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8.as_worker.js new file mode 100644 index 00000000000..fd46e2f76bb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4xU8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8Clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8Clamp.as_worker.js new file mode 100644 index 00000000000..6f3ddc8d631 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pack4xU8Clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pack4xU8Clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pow.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pow.as_worker.js new file mode 100644 index 00000000000..6bd477c788d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/pow.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/pow.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/quantizeToF16.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/quantizeToF16.as_worker.js new file mode 100644 index 00000000000..d99fc9bbaba --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/quantizeToF16.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/quantizeToF16.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/radians.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/radians.as_worker.js new file mode 100644 index 00000000000..19f07b4d98b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/radians.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/radians.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reflect.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reflect.as_worker.js new file mode 100644 index 00000000000..cd834840ad0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reflect.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/reflect.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/refract.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/refract.as_worker.js new file mode 100644 index 00000000000..a8a1de177df --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/refract.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/refract.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reverseBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reverseBits.as_worker.js new file mode 100644 index 00000000000..11f63b1017c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/reverseBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/reverseBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/round.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/round.as_worker.js new file mode 100644 index 00000000000..3d159b67182 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/round.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/round.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/saturate.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/saturate.as_worker.js new file mode 100644 index 00000000000..81d2f8f62fa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/saturate.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/saturate.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/select.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/select.as_worker.js new file mode 100644 index 00000000000..35a204c1c13 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/select.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/select.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sign.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sign.as_worker.js new file mode 100644 index 00000000000..7125ebd4ea4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sign.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/sign.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sin.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sin.as_worker.js new file mode 100644 index 00000000000..9cd044bf3bf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sin.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/sin.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sinh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sinh.as_worker.js new file mode 100644 index 00000000000..d248983ec1f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sinh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/sinh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/smoothstep.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/smoothstep.as_worker.js new file mode 100644 index 00000000000..e7c64223164 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/smoothstep.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/smoothstep.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sqrt.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sqrt.as_worker.js new file mode 100644 index 00000000000..c5718ef5713 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/sqrt.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/sqrt.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/step.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/step.as_worker.js new file mode 100644 index 00000000000..78b2e7056d5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/step.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/step.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/storageBarrier.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/storageBarrier.as_worker.js new file mode 100644 index 00000000000..bc402636419 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/storageBarrier.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/storageBarrier.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tan.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tan.as_worker.js new file mode 100644 index 00000000000..4ed7807bda8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tan.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/tan.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tanh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tanh.as_worker.js new file mode 100644 index 00000000000..f24791180a4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/tanh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/tanh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureDimensions.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureDimensions.as_worker.js new file mode 100644 index 00000000000..eda70ffb331 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureDimensions.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureDimensions.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGather.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGather.as_worker.js new file mode 100644 index 00000000000..c632b85bb84 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGather.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureGather.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGatherCompare.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGatherCompare.as_worker.js new file mode 100644 index 00000000000..cf00fc8ae66 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureGatherCompare.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureGatherCompare.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureLoad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureLoad.as_worker.js new file mode 100644 index 00000000000..3f7aeaf39b4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureLoad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureLoad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLayers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLayers.as_worker.js new file mode 100644 index 00000000000..5cad50f39dd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLayers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureNumLayers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLevels.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLevels.as_worker.js new file mode 100644 index 00000000000..d1d13ca8f14 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumLevels.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureNumLevels.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumSamples.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumSamples.as_worker.js new file mode 100644 index 00000000000..3636b6fc5ce --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureNumSamples.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureNumSamples.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSample.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSample.as_worker.js new file mode 100644 index 00000000000..8d6cffd9725 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSample.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSample.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleBias.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleBias.as_worker.js new file mode 100644 index 00000000000..6f15b0455f0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleBias.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSampleBias.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompare.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompare.as_worker.js new file mode 100644 index 00000000000..7b2442f62e1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompare.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSampleCompare.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompareLevel.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompareLevel.as_worker.js new file mode 100644 index 00000000000..ce8edf2a39d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleCompareLevel.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSampleCompareLevel.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleGrad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleGrad.as_worker.js new file mode 100644 index 00000000000..4b93570bb63 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleGrad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSampleGrad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleLevel.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleLevel.as_worker.js new file mode 100644 index 00000000000..36c0342b3c5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureSampleLevel.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureSampleLevel.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureStore.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureStore.as_worker.js new file mode 100644 index 00000000000..7c3ef351efa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/textureStore.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/textureStore.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/transpose.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/transpose.as_worker.js new file mode 100644 index 00000000000..ad5e60d152c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/transpose.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/transpose.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/trunc.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/trunc.as_worker.js new file mode 100644 index 00000000000..0b312f07a82 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/trunc.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/trunc.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16float.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16float.as_worker.js new file mode 100644 index 00000000000..b2fd425c067 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16float.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack2x16float.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16snorm.as_worker.js new file mode 100644 index 00000000000..6eb47032827 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack2x16snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16unorm.as_worker.js new file mode 100644 index 00000000000..6b8b918cf09 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack2x16unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack2x16unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8snorm.as_worker.js new file mode 100644 index 00000000000..281dd18ee9d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack4x8snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8unorm.as_worker.js new file mode 100644 index 00000000000..d67901b2864 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4x8unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack4x8unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xI8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xI8.as_worker.js new file mode 100644 index 00000000000..c5b84ae2c54 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xI8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack4xI8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xU8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xU8.as_worker.js new file mode 100644 index 00000000000..59d7cf25b3d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/unpack4xU8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/unpack4xU8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupBarrier.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupBarrier.as_worker.js new file mode 100644 index 00000000000..5a2ff0b8302 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupBarrier.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/workgroupBarrier.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupUniformLoad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupUniformLoad.as_worker.js new file mode 100644 index 00000000000..9b341af87df --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/builtin/workgroupUniformLoad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/builtin/workgroupUniformLoad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/user/ptr_params.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/user/ptr_params.as_worker.js new file mode 100644 index 00000000000..850fec5f5f7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/call/user/ptr_params.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/execution/expression/call/user/ptr_params.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/non_zero.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/non_zero.as_worker.js new file mode 100644 index 00000000000..ae66debc946 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/non_zero.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/constructor/non_zero.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/zero_value.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/zero_value.as_worker.js new file mode 100644 index 00000000000..9ddbaa9daee --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/constructor/zero_value.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/constructor/zero_value.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/precedence.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/precedence.as_worker.js new file mode 100644 index 00000000000..a83f045413a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/precedence.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/expression/precedence.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/address_of_and_indirection.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/address_of_and_indirection.as_worker.js new file mode 100644 index 00000000000..e8939856929 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/address_of_and_indirection.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/address_of_and_indirection.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_arithmetic.as_worker.js new file mode 100644 index 00000000000..d0c1b8f3d50 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/af_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_assignment.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_assignment.as_worker.js new file mode 100644 index 00000000000..cc871a1984f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/af_assignment.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/af_assignment.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_arithmetic.as_worker.js new file mode 100644 index 00000000000..ba35df71861 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/ai_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_assignment.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_assignment.as_worker.js new file mode 100644 index 00000000000..9431211f171 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_assignment.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/ai_assignment.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_complement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_complement.as_worker.js new file mode 100644 index 00000000000..db525f760b1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/ai_complement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/ai_complement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_conversion.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_conversion.as_worker.js new file mode 100644 index 00000000000..303fc054efe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_conversion.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/bool_conversion.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_logical.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_logical.as_worker.js new file mode 100644 index 00000000000..77674f07c77 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/bool_logical.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/bool_logical.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_arithmetic.as_worker.js new file mode 100644 index 00000000000..1bcd1bdd23f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/f16_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_conversion.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_conversion.as_worker.js new file mode 100644 index 00000000000..a6b5ac343aa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f16_conversion.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/f16_conversion.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_arithmetic.as_worker.js new file mode 100644 index 00000000000..8ec016fb008 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/f32_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_conversion.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_conversion.as_worker.js new file mode 100644 index 00000000000..d175bd5dca5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/f32_conversion.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/f32_conversion.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_arithmetic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_arithmetic.as_worker.js new file mode 100644 index 00000000000..f435320547a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_arithmetic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/i32_arithmetic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_complement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_complement.as_worker.js new file mode 100644 index 00000000000..00ea9f8c258 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_complement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/i32_complement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_conversion.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_conversion.as_worker.js new file mode 100644 index 00000000000..28302ac1fc9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/i32_conversion.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/i32_conversion.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_complement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_complement.as_worker.js new file mode 100644 index 00000000000..c2a5ca06886 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_complement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/u32_complement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_conversion.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_conversion.as_worker.js new file mode 100644 index 00000000000..ac55bd61e2d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/expression/unary/u32_conversion.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/execution/expression/unary/u32_conversion.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/float_parse.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/float_parse.as_worker.js new file mode 100644 index 00000000000..070bb888f61 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/float_parse.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/float_parse.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/call.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/call.as_worker.js new file mode 100644 index 00000000000..03930d032c8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/call.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/call.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/complex.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/complex.as_worker.js new file mode 100644 index 00000000000..1cd99e11c06 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/complex.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/complex.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/eval_order.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/eval_order.as_worker.js new file mode 100644 index 00000000000..78b9b84fd39 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/eval_order.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/eval_order.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/for.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/for.as_worker.js new file mode 100644 index 00000000000..379c29f9ce6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/for.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/for.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/if.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/if.as_worker.js new file mode 100644 index 00000000000..9b086d3ed72 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/if.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/if.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/loop.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/loop.as_worker.js new file mode 100644 index 00000000000..bab864b5c38 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/loop.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/loop.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/phony.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/phony.as_worker.js new file mode 100644 index 00000000000..5badcd1df83 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/phony.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/phony.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/return.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/return.as_worker.js new file mode 100644 index 00000000000..8e545f3fae0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/return.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/return.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/switch.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/switch.as_worker.js new file mode 100644 index 00000000000..845493427b9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/switch.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/switch.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/while.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/while.as_worker.js new file mode 100644 index 00000000000..3eae3483909 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/flow_control/while.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/flow_control/while.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/limits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/limits.as_worker.js new file mode 100644 index 00000000000..046704071e1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/limits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/limits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_layout.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_layout.as_worker.js new file mode 100644 index 00000000000..a89aac4149b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_layout.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/memory_layout.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/adjacent.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/adjacent.as_worker.js new file mode 100644 index 00000000000..3c7ead1467f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/adjacent.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/adjacent.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/atomicity.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/atomicity.as_worker.js new file mode 100644 index 00000000000..d26549c1e3b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/atomicity.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/atomicity.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/barrier.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/barrier.as_worker.js new file mode 100644 index 00000000000..e97bc4eb867 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/barrier.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/barrier.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/coherence.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/coherence.as_worker.js new file mode 100644 index 00000000000..289c01b3546 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/coherence.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/coherence.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/texture_intra_invocation_coherence.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/texture_intra_invocation_coherence.as_worker.js new file mode 100644 index 00000000000..00a5fabc3a3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/texture_intra_invocation_coherence.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/texture_intra_invocation_coherence.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/weak.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/weak.as_worker.js new file mode 100644 index 00000000000..fc4486c6e33 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/memory_model/weak.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/memory_model/weak.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/padding.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/padding.as_worker.js new file mode 100644 index 00000000000..23e642f6c14 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/padding.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/padding.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access.as_worker.js new file mode 100644 index 00000000000..96517050076 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/robust_access.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access_vertex.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access_vertex.as_worker.js new file mode 100644 index 00000000000..909c40a7974 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/robust_access_vertex.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/robust_access_vertex.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/compute_builtins.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/compute_builtins.as_worker.js new file mode 100644 index 00000000000..10509037693 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/compute_builtins.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/shader_io/compute_builtins.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/fragment_builtins.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/fragment_builtins.as_worker.js new file mode 100644 index 00000000000..b8332b455a2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/fragment_builtins.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/shader_io/fragment_builtins.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/shared_structs.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/shared_structs.as_worker.js new file mode 100644 index 00000000000..399b32a33b1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/shared_structs.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/shader_io/shared_structs.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/user_io.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/user_io.as_worker.js new file mode 100644 index 00000000000..2b4570a48c0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/user_io.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/shader_io/user_io.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/workgroup_size.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/workgroup_size.as_worker.js new file mode 100644 index 00000000000..31827b5e391 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shader_io/workgroup_size.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/shader_io/workgroup_size.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shadow.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shadow.as_worker.js new file mode 100644 index 00000000000..b0c166c51cd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/shadow.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/shadow.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/stage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/stage.as_worker.js new file mode 100644 index 00000000000..c30bb087de6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/stage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/stage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/compound.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/compound.as_worker.js new file mode 100644 index 00000000000..e25b55ffdfb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/compound.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/statement/compound.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/discard.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/discard.as_worker.js new file mode 100644 index 00000000000..16353062fd7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/discard.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/statement/discard.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/increment_decrement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/increment_decrement.as_worker.js new file mode 100644 index 00000000000..6d82f168287 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/statement/increment_decrement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/execution/statement/increment_decrement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/value_init.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/value_init.as_worker.js new file mode 100644 index 00000000000..a98b9a0b8b5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/value_init.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/value_init.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/zero_init.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/zero_init.as_worker.js new file mode 100644 index 00000000000..5e79410031e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/execution/zero_init.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../shader/execution/zero_init.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/const_assert/const_assert.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/const_assert/const_assert.as_worker.js new file mode 100644 index 00000000000..58990b9148f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/const_assert/const_assert.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/const_assert/const_assert.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/compound_statement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/compound_statement.as_worker.js new file mode 100644 index 00000000000..815908c745c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/compound_statement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/compound_statement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/const.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/const.as_worker.js new file mode 100644 index 00000000000..37baed5e7ff --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/const.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/const.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/context_dependent_resolution.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/context_dependent_resolution.as_worker.js new file mode 100644 index 00000000000..c2ebfd9e90f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/context_dependent_resolution.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/context_dependent_resolution.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/let.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/let.as_worker.js new file mode 100644 index 00000000000..75234ef572e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/let.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/let.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/override.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/override.as_worker.js new file mode 100644 index 00000000000..bfe7adb3c1c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/override.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/override.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/var.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/var.as_worker.js new file mode 100644 index 00000000000..832a4601cfa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/decl/var.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/decl/var.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/array.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/array.as_worker.js new file mode 100644 index 00000000000..3d2c85bce5c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/array.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/access/array.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/matrix.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/matrix.as_worker.js new file mode 100644 index 00000000000..68ef5095f72 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/matrix.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/access/matrix.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/structure.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/structure.as_worker.js new file mode 100644 index 00000000000..dfac1f75d71 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/structure.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/access/structure.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/vector.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/vector.as_worker.js new file mode 100644 index 00000000000..dc667d45382 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/access/vector.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/access/vector.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/add_sub_mul.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/add_sub_mul.as_worker.js new file mode 100644 index 00000000000..34ae46a86f3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/add_sub_mul.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/add_sub_mul.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/and_or_xor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/and_or_xor.as_worker.js new file mode 100644 index 00000000000..d5423e62259 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/and_or_xor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/and_or_xor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/bitwise_shift.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/bitwise_shift.as_worker.js new file mode 100644 index 00000000000..b1b74edf027 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/bitwise_shift.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/bitwise_shift.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/comparison.as_worker.js new file mode 100644 index 00000000000..b44f38ccee2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/div_rem.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/div_rem.as_worker.js new file mode 100644 index 00000000000..4d1e0c841d9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/div_rem.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/div_rem.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/parse.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/parse.as_worker.js new file mode 100644 index 00000000000..58165f7a8c9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/binary/parse.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/binary/parse.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/abs.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/abs.as_worker.js new file mode 100644 index 00000000000..efa34631797 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/abs.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/abs.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acos.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acos.as_worker.js new file mode 100644 index 00000000000..0575195da9e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acos.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/acos.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acosh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acosh.as_worker.js new file mode 100644 index 00000000000..ede7c1e3d1c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/acosh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/acosh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/all.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/all.as_worker.js new file mode 100644 index 00000000000..e7440848776 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/all.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/all.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/any.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/any.as_worker.js new file mode 100644 index 00000000000..f79ee3ccb26 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/any.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/any.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/arrayLength.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/arrayLength.as_worker.js new file mode 100644 index 00000000000..efea85fabfe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/arrayLength.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/arrayLength.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asin.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asin.as_worker.js new file mode 100644 index 00000000000..d8037c639e6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asin.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/asin.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asinh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asinh.as_worker.js new file mode 100644 index 00000000000..255cbdce4cf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/asinh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/asinh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan.as_worker.js new file mode 100644 index 00000000000..7dd62768780 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/atan.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan2.as_worker.js new file mode 100644 index 00000000000..db2d9a6ac35 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atan2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/atan2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atanh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atanh.as_worker.js new file mode 100644 index 00000000000..2d610e868a0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atanh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/atanh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atomics.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atomics.as_worker.js new file mode 100644 index 00000000000..94fa14244ec --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/atomics.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/atomics.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/barriers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/barriers.as_worker.js new file mode 100644 index 00000000000..6055fde4658 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/barriers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/barriers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/bitcast.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/bitcast.as_worker.js new file mode 100644 index 00000000000..00b3673e4bc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/bitcast.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/bitcast.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ceil.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ceil.as_worker.js new file mode 100644 index 00000000000..ab5ec7adf78 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ceil.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/ceil.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/clamp.as_worker.js new file mode 100644 index 00000000000..3d09f8f68d3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cos.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cos.as_worker.js new file mode 100644 index 00000000000..cf9af678f32 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cos.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/cos.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cosh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cosh.as_worker.js new file mode 100644 index 00000000000..e29d253a6fb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cosh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/cosh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countLeadingZeros.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countLeadingZeros.as_worker.js new file mode 100644 index 00000000000..1555d2b2115 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countLeadingZeros.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/countLeadingZeros.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countOneBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countOneBits.as_worker.js new file mode 100644 index 00000000000..7116dae8ba0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countOneBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/countOneBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countTrailingZeros.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countTrailingZeros.as_worker.js new file mode 100644 index 00000000000..fab97cbfd79 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/countTrailingZeros.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/countTrailingZeros.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cross.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cross.as_worker.js new file mode 100644 index 00000000000..7a69266441b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/cross.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/cross.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/degrees.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/degrees.as_worker.js new file mode 100644 index 00000000000..b5653c8ca10 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/degrees.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/degrees.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/derivatives.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/derivatives.as_worker.js new file mode 100644 index 00000000000..3c127105b9c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/derivatives.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/derivatives.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/determinant.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/determinant.as_worker.js new file mode 100644 index 00000000000..191c4352e40 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/determinant.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/determinant.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/distance.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/distance.as_worker.js new file mode 100644 index 00000000000..0d7c43c2a1b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/distance.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/distance.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot.as_worker.js new file mode 100644 index 00000000000..6af52a5dc18 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/dot.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4I8Packed.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4I8Packed.as_worker.js new file mode 100644 index 00000000000..f30e513574f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4I8Packed.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/dot4I8Packed.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4U8Packed.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4U8Packed.as_worker.js new file mode 100644 index 00000000000..decdbc1387f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/dot4U8Packed.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/dot4U8Packed.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp.as_worker.js new file mode 100644 index 00000000000..247338299d4 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/exp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp2.as_worker.js new file mode 100644 index 00000000000..1f6aaf585bd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/exp2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/exp2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/extractBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/extractBits.as_worker.js new file mode 100644 index 00000000000..a869a585ef9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/extractBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/extractBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/faceForward.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/faceForward.as_worker.js new file mode 100644 index 00000000000..d61b7555ccf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/faceForward.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/faceForward.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstLeadingBit.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstLeadingBit.as_worker.js new file mode 100644 index 00000000000..a7c401830ac --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstLeadingBit.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/firstLeadingBit.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstTrailingBit.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstTrailingBit.as_worker.js new file mode 100644 index 00000000000..d1079ddf88f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/firstTrailingBit.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/firstTrailingBit.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/floor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/floor.as_worker.js new file mode 100644 index 00000000000..636e721f143 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/floor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/floor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fma.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fma.as_worker.js new file mode 100644 index 00000000000..4b7a5057f0a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fma.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/fma.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fract.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fract.as_worker.js new file mode 100644 index 00000000000..0bcd6610eb2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/fract.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/fract.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/frexp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/frexp.as_worker.js new file mode 100644 index 00000000000..89c4f4d5efa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/frexp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/frexp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/insertBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/insertBits.as_worker.js new file mode 100644 index 00000000000..fa96c1d1216 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/insertBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/insertBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/inverseSqrt.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/inverseSqrt.as_worker.js new file mode 100644 index 00000000000..6decc3216cc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/inverseSqrt.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/inverseSqrt.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ldexp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ldexp.as_worker.js new file mode 100644 index 00000000000..28f9e2ee813 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/ldexp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/ldexp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/length.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/length.as_worker.js new file mode 100644 index 00000000000..609f0bd26a2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/length.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/length.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log.as_worker.js new file mode 100644 index 00000000000..339e911dcd7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/log.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log2.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log2.as_worker.js new file mode 100644 index 00000000000..bd2490ee01f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/log2.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/log2.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/max.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/max.as_worker.js new file mode 100644 index 00000000000..0660d196f20 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/max.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/max.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/min.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/min.as_worker.js new file mode 100644 index 00000000000..4d0d4896cfa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/min.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/min.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/mix.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/mix.as_worker.js new file mode 100644 index 00000000000..a721ad744e9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/mix.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/mix.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/modf.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/modf.as_worker.js new file mode 100644 index 00000000000..55f2b00583b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/modf.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/modf.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/normalize.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/normalize.as_worker.js new file mode 100644 index 00000000000..cb8077d1d6e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/normalize.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/normalize.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16float.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16float.as_worker.js new file mode 100644 index 00000000000..99a7589f01c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16float.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack2x16float.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16snorm.as_worker.js new file mode 100644 index 00000000000..21d8d4b881d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack2x16snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16unorm.as_worker.js new file mode 100644 index 00000000000..1df8200fd39 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack2x16unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack2x16unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8snorm.as_worker.js new file mode 100644 index 00000000000..2bc4b2737c8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4x8snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8unorm.as_worker.js new file mode 100644 index 00000000000..32b359c074f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4x8unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4x8unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8.as_worker.js new file mode 100644 index 00000000000..1f7ea4059fa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4xI8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8Clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8Clamp.as_worker.js new file mode 100644 index 00000000000..504ef65f54b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xI8Clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4xI8Clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8.as_worker.js new file mode 100644 index 00000000000..50378494c3b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4xU8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8Clamp.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8Clamp.as_worker.js new file mode 100644 index 00000000000..a4392cae9d5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pack4xU8Clamp.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pack4xU8Clamp.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pow.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pow.as_worker.js new file mode 100644 index 00000000000..89a9e26cc4d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/pow.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/pow.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/quantizeToF16.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/quantizeToF16.as_worker.js new file mode 100644 index 00000000000..0fe919929f9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/quantizeToF16.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/quantizeToF16.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/radians.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/radians.as_worker.js new file mode 100644 index 00000000000..6c4a0ffcd42 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/radians.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/radians.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reflect.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reflect.as_worker.js new file mode 100644 index 00000000000..9c5978d38d2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reflect.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/reflect.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/refract.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/refract.as_worker.js new file mode 100644 index 00000000000..0e6f5e4b6bf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/refract.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/refract.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reverseBits.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reverseBits.as_worker.js new file mode 100644 index 00000000000..e28c74fb719 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/reverseBits.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/reverseBits.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/round.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/round.as_worker.js new file mode 100644 index 00000000000..d2f3ad201db --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/round.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/round.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/saturate.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/saturate.as_worker.js new file mode 100644 index 00000000000..f2c2f6c78fa --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/saturate.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/saturate.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/select.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/select.as_worker.js new file mode 100644 index 00000000000..b5127349289 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/select.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/select.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sign.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sign.as_worker.js new file mode 100644 index 00000000000..24b9c617ad1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sign.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/sign.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sin.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sin.as_worker.js new file mode 100644 index 00000000000..daa78363cdc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sin.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/sin.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sinh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sinh.as_worker.js new file mode 100644 index 00000000000..f09269f6906 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sinh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/sinh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/smoothstep.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/smoothstep.as_worker.js new file mode 100644 index 00000000000..9c990e153ce --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/smoothstep.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/smoothstep.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sqrt.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sqrt.as_worker.js new file mode 100644 index 00000000000..8edaa59086d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/sqrt.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/sqrt.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/step.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/step.as_worker.js new file mode 100644 index 00000000000..bd3b7ba060f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/step.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/step.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tan.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tan.as_worker.js new file mode 100644 index 00000000000..39f53bb1733 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tan.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/tan.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tanh.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tanh.as_worker.js new file mode 100644 index 00000000000..9e9a1a438e0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/tanh.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/tanh.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureDimensions.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureDimensions.as_worker.js new file mode 100644 index 00000000000..46dff716743 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureDimensions.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureDimensions.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGather.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGather.as_worker.js new file mode 100644 index 00000000000..5cdd6b2f90b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGather.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureGather.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGatherCompare.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGatherCompare.as_worker.js new file mode 100644 index 00000000000..9d4cb5ddcd0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureGatherCompare.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureGatherCompare.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureLoad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureLoad.as_worker.js new file mode 100644 index 00000000000..2ece8f78bd9 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureLoad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureLoad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLayers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLayers.as_worker.js new file mode 100644 index 00000000000..4b4f6389669 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLayers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureNumLayers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLevels.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLevels.as_worker.js new file mode 100644 index 00000000000..d9112343833 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumLevels.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureNumLevels.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumSamples.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumSamples.as_worker.js new file mode 100644 index 00000000000..973d116905d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureNumSamples.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureNumSamples.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSample.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSample.as_worker.js new file mode 100644 index 00000000000..9c8718f0e71 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSample.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSample.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.as_worker.js new file mode 100644 index 00000000000..a22b541dc1f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBias.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBias.as_worker.js new file mode 100644 index 00000000000..0e13ca82dd2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleBias.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleBias.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompare.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompare.as_worker.js new file mode 100644 index 00000000000..0e7adb6429d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompare.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleCompare.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompareLevel.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompareLevel.as_worker.js new file mode 100644 index 00000000000..3bb98849e11 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleCompareLevel.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleGrad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleGrad.as_worker.js new file mode 100644 index 00000000000..560763704ff --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleGrad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleGrad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleLevel.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleLevel.as_worker.js new file mode 100644 index 00000000000..2ecbac54e1c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureSampleLevel.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureSampleLevel.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureStore.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureStore.as_worker.js new file mode 100644 index 00000000000..edf84909431 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/textureStore.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/textureStore.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/transpose.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/transpose.as_worker.js new file mode 100644 index 00000000000..4aab6a4fb94 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/transpose.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/transpose.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/trunc.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/trunc.as_worker.js new file mode 100644 index 00000000000..c21736648e6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/trunc.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/trunc.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16float.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16float.as_worker.js new file mode 100644 index 00000000000..f9be70e83ec --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16float.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack2x16float.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16snorm.as_worker.js new file mode 100644 index 00000000000..9b33b717840 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack2x16snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16unorm.as_worker.js new file mode 100644 index 00000000000..c3a856b8a44 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack2x16unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack2x16unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8snorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8snorm.as_worker.js new file mode 100644 index 00000000000..d1a576a28c1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8snorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack4x8snorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8unorm.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8unorm.as_worker.js new file mode 100644 index 00000000000..8d43d6ddd16 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4x8unorm.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack4x8unorm.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xI8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xI8.as_worker.js new file mode 100644 index 00000000000..422c6d5a52d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xI8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack4xI8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xU8.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xU8.as_worker.js new file mode 100644 index 00000000000..e8b87e5b423 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/unpack4xU8.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/unpack4xU8.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/value_constructor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/value_constructor.as_worker.js new file mode 100644 index 00000000000..87c2226e1bb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/value_constructor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/value_constructor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/workgroupUniformLoad.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/workgroupUniformLoad.as_worker.js new file mode 100644 index 00000000000..8597dedce27 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/call/builtin/workgroupUniformLoad.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../../shader/validation/expression/call/builtin/workgroupUniformLoad.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/early_evaluation.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/early_evaluation.as_worker.js new file mode 100644 index 00000000000..798513bbdf1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/early_evaluation.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/expression/early_evaluation.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/add_sub.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/add_sub.as_worker.js new file mode 100644 index 00000000000..88214bcf9fb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/add_sub.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/add_sub.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/and_or_xor.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/and_or_xor.as_worker.js new file mode 100644 index 00000000000..e6e181316f6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/and_or_xor.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/and_or_xor.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/bitwise_shift.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/bitwise_shift.as_worker.js new file mode 100644 index 00000000000..d22a70124bc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/bitwise_shift.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/bitwise_shift.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/comparison.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/comparison.as_worker.js new file mode 100644 index 00000000000..1565750788d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/comparison.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/comparison.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/div_rem.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/div_rem.as_worker.js new file mode 100644 index 00000000000..6bb88c6d225 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/div_rem.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/div_rem.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/mul.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/mul.as_worker.js new file mode 100644 index 00000000000..6781b6df40b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/matrix/mul.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/matrix/mul.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/overload_resolution.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/overload_resolution.as_worker.js new file mode 100644 index 00000000000..be8db508ebe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/overload_resolution.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/expression/overload_resolution.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/precedence.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/precedence.as_worker.js new file mode 100644 index 00000000000..3cd2a99b0cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/precedence.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/expression/precedence.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/address_of_and_indirection.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/address_of_and_indirection.as_worker.js new file mode 100644 index 00000000000..a9474b7386b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/address_of_and_indirection.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/unary/address_of_and_indirection.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/arithmetic_negation.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/arithmetic_negation.as_worker.js new file mode 100644 index 00000000000..a62640f655a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/arithmetic_negation.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/unary/arithmetic_negation.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/bitwise_complement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/bitwise_complement.as_worker.js new file mode 100644 index 00000000000..0ae7343d892 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/bitwise_complement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/unary/bitwise_complement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/logical_negation.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/logical_negation.as_worker.js new file mode 100644 index 00000000000..11e80449276 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/expression/unary/logical_negation.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../shader/validation/expression/unary/logical_negation.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/dual_source_blending.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/dual_source_blending.as_worker.js new file mode 100644 index 00000000000..dd30e93ce28 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/dual_source_blending.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/extension/dual_source_blending.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/pointer_composite_access.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/pointer_composite_access.as_worker.js new file mode 100644 index 00000000000..d773ad793d6 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/pointer_composite_access.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/extension/pointer_composite_access.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/readonly_and_readwrite_storage_textures.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/readonly_and_readwrite_storage_textures.as_worker.js new file mode 100644 index 00000000000..8479487b10c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/extension/readonly_and_readwrite_storage_textures.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/extension/readonly_and_readwrite_storage_textures.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/alias_analysis.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/alias_analysis.as_worker.js new file mode 100644 index 00000000000..807f1217c27 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/alias_analysis.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/functions/alias_analysis.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/restrictions.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/restrictions.as_worker.js new file mode 100644 index 00000000000..6f73a164117 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/functions/restrictions.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/functions/restrictions.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/attribute.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/attribute.as_worker.js new file mode 100644 index 00000000000..acf3a576013 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/attribute.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/attribute.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/blankspace.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/blankspace.as_worker.js new file mode 100644 index 00000000000..33333b84fe8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/blankspace.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/blankspace.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/comments.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/comments.as_worker.js new file mode 100644 index 00000000000..5f035ebcfcb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/comments.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/comments.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/diagnostic.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/diagnostic.as_worker.js new file mode 100644 index 00000000000..a311d903a13 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/diagnostic.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/diagnostic.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/enable.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/enable.as_worker.js new file mode 100644 index 00000000000..8722aa3ec65 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/enable.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/enable.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/identifiers.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/identifiers.as_worker.js new file mode 100644 index 00000000000..d3f98b121bf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/identifiers.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/identifiers.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/literal.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/literal.as_worker.js new file mode 100644 index 00000000000..ef24ba83fd2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/literal.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/literal.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/must_use.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/must_use.as_worker.js new file mode 100644 index 00000000000..888541ed1d8 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/must_use.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/must_use.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/requires.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/requires.as_worker.js new file mode 100644 index 00000000000..dba15898294 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/requires.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/requires.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/semicolon.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/semicolon.as_worker.js new file mode 100644 index 00000000000..036f7b6d412 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/semicolon.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/semicolon.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/shadow_builtins.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/shadow_builtins.as_worker.js new file mode 100644 index 00000000000..843b1e9a99e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/shadow_builtins.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/shadow_builtins.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/source.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/source.as_worker.js new file mode 100644 index 00000000000..cfc5a6870cb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/parse/source.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/parse/source.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/align.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/align.as_worker.js new file mode 100644 index 00000000000..47afbfc4d80 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/align.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/align.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/binding.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/binding.as_worker.js new file mode 100644 index 00000000000..93747e17b96 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/binding.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/binding.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/builtins.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/builtins.as_worker.js new file mode 100644 index 00000000000..c616848fa9a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/builtins.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/builtins.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/entry_point.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/entry_point.as_worker.js new file mode 100644 index 00000000000..7df3a5679a0 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/entry_point.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/entry_point.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group.as_worker.js new file mode 100644 index 00000000000..91cc5ee843a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/group.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group_and_binding.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group_and_binding.as_worker.js new file mode 100644 index 00000000000..de145c124fc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/group_and_binding.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/group_and_binding.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/id.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/id.as_worker.js new file mode 100644 index 00000000000..94bfbb1d9e2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/id.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/id.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/interpolate.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/interpolate.as_worker.js new file mode 100644 index 00000000000..1ef4a8537a2 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/interpolate.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/interpolate.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/invariant.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/invariant.as_worker.js new file mode 100644 index 00000000000..c443c1c7666 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/invariant.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/invariant.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/layout_constraints.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/layout_constraints.as_worker.js new file mode 100644 index 00000000000..bd6e43ab662 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/layout_constraints.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/layout_constraints.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/locations.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/locations.as_worker.js new file mode 100644 index 00000000000..bcc4bf954f1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/locations.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/locations.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/pipeline_stage.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/pipeline_stage.as_worker.js new file mode 100644 index 00000000000..e531533ade5 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/pipeline_stage.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/pipeline_stage.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/size.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/size.as_worker.js new file mode 100644 index 00000000000..639041ced4d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/size.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/size.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/workgroup_size.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/workgroup_size.as_worker.js new file mode 100644 index 00000000000..da1c4058d58 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/shader_io/workgroup_size.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/shader_io/workgroup_size.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break.as_worker.js new file mode 100644 index 00000000000..b6b56cb1abf --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/break.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break_if.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break_if.as_worker.js new file mode 100644 index 00000000000..d187ba3e4d3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/break_if.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/break_if.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/compound.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/compound.as_worker.js new file mode 100644 index 00000000000..9866e1bd30f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/compound.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/compound.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/const_assert.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/const_assert.as_worker.js new file mode 100644 index 00000000000..73625d9e2a1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/const_assert.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/const_assert.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continue.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continue.as_worker.js new file mode 100644 index 00000000000..79c87793019 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continue.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/continue.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continuing.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continuing.as_worker.js new file mode 100644 index 00000000000..a84e513e36d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/continuing.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/continuing.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/discard.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/discard.as_worker.js new file mode 100644 index 00000000000..d1fe0cdf060 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/discard.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/discard.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/for.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/for.as_worker.js new file mode 100644 index 00000000000..990515f9885 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/for.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/for.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/if.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/if.as_worker.js new file mode 100644 index 00000000000..67a6de9f98b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/if.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/if.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/increment_decrement.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/increment_decrement.as_worker.js new file mode 100644 index 00000000000..03aae35519d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/increment_decrement.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/increment_decrement.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/loop.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/loop.as_worker.js new file mode 100644 index 00000000000..1e209cca7dd --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/loop.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/loop.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/phony.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/phony.as_worker.js new file mode 100644 index 00000000000..908e55e0175 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/phony.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/phony.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/return.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/return.as_worker.js new file mode 100644 index 00000000000..002415f782b --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/return.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/return.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/statement_behavior.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/statement_behavior.as_worker.js new file mode 100644 index 00000000000..38e2498c0e7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/statement_behavior.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/statement_behavior.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/switch.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/switch.as_worker.js new file mode 100644 index 00000000000..c7a975bc33c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/switch.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/switch.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/while.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/while.as_worker.js new file mode 100644 index 00000000000..6d1fb31475a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/statement/while.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/statement/while.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/alias.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/alias.as_worker.js new file mode 100644 index 00000000000..318e1606c72 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/alias.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/alias.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/array.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/array.as_worker.js new file mode 100644 index 00000000000..ba738910ee3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/array.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/array.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/atomics.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/atomics.as_worker.js new file mode 100644 index 00000000000..dbbf764275a --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/atomics.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/atomics.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/enumerant.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/enumerant.as_worker.js new file mode 100644 index 00000000000..fa4e2d9766e --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/enumerant.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/enumerant.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/matrix.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/matrix.as_worker.js new file mode 100644 index 00000000000..a3879d8e5e1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/matrix.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/matrix.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/pointer.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/pointer.as_worker.js new file mode 100644 index 00000000000..c618c8049eb --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/pointer.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/pointer.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/ref.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/ref.as_worker.js new file mode 100644 index 00000000000..d02f230e138 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/ref.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/ref.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/struct.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/struct.as_worker.js new file mode 100644 index 00000000000..97155cb9b07 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/struct.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/struct.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/textures.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/textures.as_worker.js new file mode 100644 index 00000000000..a0198cd3f7c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/textures.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/textures.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/vector.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/vector.as_worker.js new file mode 100644 index 00000000000..6d1b6ab76c7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/types/vector.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/types/vector.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/uniformity/uniformity.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/uniformity/uniformity.as_worker.js new file mode 100644 index 00000000000..9a03cf6a339 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/shader/validation/uniformity/uniformity.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../shader/validation/uniformity/uniformity.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/color_space_conversions.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/color_space_conversions.as_worker.js new file mode 100644 index 00000000000..92b7e45c2fc --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/color_space_conversions.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../util/texture/color_space_conversions.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texel_data.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texel_data.as_worker.js new file mode 100644 index 00000000000..401eed9d2d3 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texel_data.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../util/texture/texel_data.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texture_ok.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texture_ok.as_worker.js new file mode 100644 index 00000000000..a12097bc55d --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/util/texture/texture_ok.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../util/texture/texture_ok.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/configure.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/configure.as_worker.js new file mode 100644 index 00000000000..63126497f66 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/configure.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/canvas/configure.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/context_creation.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/context_creation.as_worker.js new file mode 100644 index 00000000000..5165c5dd60f --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/context_creation.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/canvas/context_creation.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getCurrentTexture.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getCurrentTexture.as_worker.js new file mode 100644 index 00000000000..776783039f7 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getCurrentTexture.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/canvas/getCurrentTexture.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getPreferredCanvasFormat.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getPreferredCanvasFormat.as_worker.js new file mode 100644 index 00000000000..c412fea2299 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/getPreferredCanvasFormat.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/canvas/getPreferredCanvasFormat.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/readbackFromWebGPUCanvas.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/readbackFromWebGPUCanvas.as_worker.js new file mode 100644 index 00000000000..f9a9f362f7c --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/canvas/readbackFromWebGPUCanvas.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/canvas/readbackFromWebGPUCanvas.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageBitmap.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageBitmap.as_worker.js new file mode 100644 index 00000000000..7d5f20ff007 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageBitmap.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/copyToTexture/ImageBitmap.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageData.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageData.as_worker.js new file mode 100644 index 00000000000..8cc3f679e42 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/ImageData.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/copyToTexture/ImageData.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/canvas.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/canvas.as_worker.js new file mode 100644 index 00000000000..d5826979845 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/canvas.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/copyToTexture/canvas.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/image.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/image.as_worker.js new file mode 100644 index 00000000000..1aa1ad8c4fe --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/image.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/copyToTexture/image.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/video.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/video.as_worker.js new file mode 100644 index 00000000000..dc686d044f1 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/copyToTexture/video.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/copyToTexture/video.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/external_texture/video.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/external_texture/video.as_worker.js new file mode 100644 index 00000000000..610a8871794 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/external_texture/video.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/external_texture/video.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g); diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/worker/worker.as_worker.js b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/worker/worker.as_worker.js new file mode 100644 index 00000000000..09109c25279 --- /dev/null +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/webworker/web_platform/worker/worker.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../web_platform/worker/worker.spec.js'; +import { wrapTestGroupForWorker } from '../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g);

J=-tP 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 Wp5F>Cl?71QLY4o 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