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 16111ac66a3..4cba9b72dff 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/abs.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/abs.bin differ 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 3765fcd2bef..2ecaaa389a4 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acos.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acos.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acosh.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acosh.bin index ee127796edb..d48659f3c32 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acosh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/acosh.bin differ 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 439de48fb3f..b199953eaf4 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asin.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asin.bin differ 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 eda7179e759..b370c53b017 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asinh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/asinh.bin differ 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 d15ee8b6b7f..6ab0ba106a9 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan.bin differ 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 2966b4ea155..0109ddbc375 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan2.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atan2.bin differ 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 d919b4bcb78..e6a190b35df 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atanh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/atanh.bin differ 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 ebd757c1b6b..03e1f4a57bf 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_addition.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_addition.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_division.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_division.bin index af690dcfb53..656356d32e6 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_division.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_division.bin differ 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 e386de36b7e..e3594458f25 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_logical.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_logical.bin differ 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 d387abcd7f2..abd3cdde021 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_addition.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_addition.bin differ 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 00000000000..58d0d40cb97 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin differ 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 00000000000..61401e54700 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_subtraction.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_subtraction.bin index 4a144918210..fa000a20eba 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_subtraction.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_subtraction.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin new file mode 100644 index 00000000000..545a5112cf0 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_multiplication.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_multiplication.bin index 552d8b4892c..be7c44d84e8 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_multiplication.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_multiplication.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_remainder.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_remainder.bin index b9cd253ac7c..c45792abf49 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_remainder.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_remainder.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_subtraction.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_subtraction.bin index 6f0be297858..a28375db8b2 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_subtraction.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/af_subtraction.bin differ 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 00000000000..658eb46d394 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/ai_arithmetic.bin differ 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 c05b627fa12..22e60bef813 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_division.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_division.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_logical.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_logical.bin index 558a25ded45..932af58208a 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_logical.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f16_logical.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f32_logical.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f32_logical.bin index 5a6fbe92d5d..a819eab08cb 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f32_logical.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/f32_logical.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_arithmetic.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_arithmetic.bin index 55880fdeede..bacd4c0c54e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_arithmetic.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_arithmetic.bin differ 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 4bc8882dea9..d5a745e85cb 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_comparison.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/binary/i32_comparison.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/bitcast.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/bitcast.bin index d3954903ac8..ead299d5e78 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/bitcast.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/bitcast.bin differ 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 5ec60b6e150..9b93ed416f6 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ceil.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ceil.bin differ 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 1ceb3f19a10..492be017aab 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/clamp.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/clamp.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cos.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cos.bin index a7951b44702..4e34eff3f1b 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cos.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cos.bin differ 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 693b2d3230e..5b30d2786c5 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cosh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cosh.bin differ 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 64041c73119..c8ee9d3e1aa 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cross.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/cross.bin differ 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 715e6b656f7..662558d78ac 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/degrees.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/degrees.bin differ 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 00000000000..d6d07887759 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/derivatives.bin differ 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 cef09cd67bd..0475a6e6a6c 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/determinant.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/determinant.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/distance.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/distance.bin index 68e892671e1..23a4756a69e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/distance.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/distance.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/dot.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/dot.bin index 9c243ea4f00..13622a686b3 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/dot.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/dot.bin differ 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 0c4ed5bfea0..29361a2b273 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp.bin differ 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 7ffbb062f1b..367b5a8e903 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp2.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/exp2.bin differ 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 13436dde01b..8f065bb97cb 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/faceForward.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/faceForward.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/floor.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/floor.bin index a4b363825be..b5341907f8e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/floor.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/floor.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fma.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fma.bin index db54353a526..eb4cb9ebbe5 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fma.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fma.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fract.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fract.bin index 566b95144f3..7f09e8f60b2 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fract.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fract.bin differ 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 2e20d4ce033..6811dfa2950 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/frexp.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/frexp.bin differ 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 00000000000..cfe00bfaa97 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/fwidth.bin differ 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 731c62903cc..5039345ad0d 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/inverseSqrt.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/inverseSqrt.bin differ 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 d441928d1cb..bab78ed2af9 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ldexp.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/ldexp.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/length.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/length.bin index 9ecedd7d997..3644d9b683a 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/length.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/length.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log.bin index 5c860bfaa65..ba591faad8a 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log.bin differ 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 7f6d35346b3..00641ce119c 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log2.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/log2.bin differ 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 63704eb2330..3861a94acac 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/max.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/max.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/min.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/min.bin index 18b26a3bf8c..21c29e62ed4 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/min.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/min.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/mix.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/mix.bin index e6d92fc898d..c42b2aa067e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/mix.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/mix.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/modf.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/modf.bin index e5387db4625..363cc161fd7 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/modf.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/modf.bin differ 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 434bbe2dd16..01b8eab7003 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/normalize.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/normalize.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/pow.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/pow.bin index 1f23a1f3818..4f5faf3293f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/pow.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/pow.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/radians.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/radians.bin index 63c7cc3ccd5..f5285d10877 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/radians.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/radians.bin differ 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 6608646fd01..30cd7ee925d 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/reflect.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/reflect.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/refract.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/refract.bin index 037496f0930..c428285817f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/refract.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/refract.bin differ 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 39df7169b75..2e1eb821a9e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/saturate.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/saturate.bin differ 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 2f3b2aa258b..033f2e8158f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sign.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sign.bin differ 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 d583876c518..a2ca632008f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sin.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sin.bin differ 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 072c53393f4..1176cd472bf 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sinh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sinh.bin differ 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 43aac2b1c46..73b65d17c2e 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/smoothstep.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/smoothstep.bin differ 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 f466d2379f6..6dd8088c089 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sqrt.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/sqrt.bin differ 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 03f251cb65c..f6c6c7b5f3f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/step.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/step.bin differ 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 aafb900347d..572bee4df2a 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tan.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tan.bin differ 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 709427217c2..a13028b165f 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tanh.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/tanh.bin differ 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 00000000000..2fa273ff194 Binary files /dev/null and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/ai_arithmetic.bin differ 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 5b386b07043..14299da7667 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f16_conversion.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f16_conversion.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f32_conversion.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f32_conversion.bin index bdcc0c72988..66b2bc73f88 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f32_conversion.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/f32_conversion.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_complement.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_complement.bin deleted file mode 100644 index f7b8bd680c3..00000000000 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_complement.bin and /dev/null differ 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 74c5d000e3f..04841df6078 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_conversion.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/i32_conversion.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_complement.bin b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_complement.bin deleted file mode 100644 index 526456273e4..00000000000 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_complement.bin and /dev/null differ 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 609caf94fe6..277ffc4d76b 100644 Binary files a/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_conversion.bin and b/tests/wpt/webgpu/tests/webgpu/resources/cache/webgpu/shader/execution/unary/u32_conversion.bin differ diff --git a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapterInfo.spec.js b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/info.spec.js similarity index 67% rename from tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapterInfo.spec.js rename to tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/info.spec.js index 170f5c53855..be4421fc50f 100644 --- a/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/requestAdapterInfo.spec.js +++ b/tests/wpt/webgpu/tests/webgpu/webgpu/api/operation/adapter/info.spec.js @@ -1,10 +1,7 @@ /** * AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts **/export const description = ` -Tests various ways of calling GPUAdapter.requestAdapterInfo. - -TODO: -- Find a way to perform tests with and without user activation +Tests GPUAdapter.info members formatting. `;import { Fixture } from '../../../../common/framework/fixture.js'; import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { getGPU } from '../../../../common/util/navigator_gpu.js'; @@ -17,16 +14,15 @@ const normalizedIdentifierRegex = /^$|^[a-z0-9]+(-[a-z0-9]+)*$/; g.test('adapter_info'). desc( ` - Test that calling requestAdapterInfo with no arguments: - - Returns a GPUAdapterInfo structure - - Every member in the structure except description is properly formatted` + Test that every member in the GPUAdapter.info except description is properly formatted` ). fn(async (t) => { 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);