blob: 582a10279b0aa692a4e177506f5d33ce9be9abf2 [file]
<!-- webkit-test-runner [ enableMetalShaderValidation=true ] -->
<style>
:root { background: #102030e0; color: #99ddbbcc; font-size: 15px; }
</style>
<script src="../../../resources/js-test-pre.js"></script>
<script id="shared">
const log = console.log;
async function gc() {
await 0;
if (globalThis.GCController) {
globalThis.GCController.collect();
} else if (globalThis.$vm) {
globalThis.$vm.gc();
} else {
log('no GC available');
}
}
/**
* @param {GPUDevice} device
* @param {GPUComputePassEncoder} computePassEncoder
*/
function clearResourceUsages(device, computePassEncoder) {
let code = `@compute @workgroup_size(1) fn c() {}`;
let module = device.createShaderModule({code});
computePassEncoder.setPipeline(device.createComputePipeline(
{
layout: 'auto',
compute: {module},
}));
computePassEncoder.dispatchWorkgroups(1);
}
/**
* @template {any} T
* @param {GPUDevice} device
* @param {string} label
* @param {()=>T} payload
* @returns {Promise<T>}
*/
async function validationWrapper(device, label, payload) {
device.pushErrorScope('internal');
device.pushErrorScope('out-of-memory');
device.pushErrorScope('validation');
let result = payload();
let validationError = await device.popErrorScope();
let outOfMemoryError = await device.popErrorScope();
let internalError = await device.popErrorScope();
let error = validationError ?? outOfMemoryError ?? internalError;
if (error) {
log('*'.repeat(25));
log(error[Symbol.toStringTag]);
log(error.message);
log(label);
if (error.stack != `_`) {
log(error.stack);
}
log(location);
log('*'.repeat(25));
throw error;
}
return result;
}
const videoUrls = [
];
/**
* @param {number} index
* @returns {Promise<HTMLVideoElement>}
*/
function videoWithData(index) {
let video = document.createElement('video');
video.src = videoUrls[index % videoUrls.length];
return new Promise(resolve => {
video.onloadeddata = () => {
resolve(video);
};
});
}
/**
* @returns {Promise<string>}
*/
async function makeDataUrl(width, height, color0, color1) {
let offscreenCanvas = new OffscreenCanvas(width, height);
let ctx = offscreenCanvas.getContext('2d');
let gradient = ctx.createLinearGradient(0, 0, width, height);
gradient.addColorStop(0, color0);
gradient.addColorStop(0.1, color1);
gradient.addColorStop(0.3, color0);
gradient.addColorStop(0.7, color1);
gradient.addColorStop(0.9, color0);
gradient.addColorStop(1, color1);
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, width, height);
let blob = await offscreenCanvas.convertToBlob();
let fileReader = new FileReader();
fileReader.readAsDataURL(blob);
return new Promise(resolve => {
fileReader.onload = () => {
resolve(fileReader.result);
};
});
}
async function imageWithData(width, height, color0, color1) {
let dataUrl = await makeDataUrl(width, height, color0, color1);
let img = document.createElement('img');
img.src = dataUrl;
await img.decode();
return img;
}
/**
* @param {string} payload
* @returns {string}
*/
function toBlobUrl(payload) {
let blob = new Blob([payload], {type: 'text/javascript'});
return URL.createObjectURL(blob);
}
</script>
<script>
globalThis.testRunner?.dumpAsText();
globalThis.testRunner?.waitUntilDone();
async function window0() {
// START
adapter0 = await navigator.gpu.requestAdapter();
device0 = await adapter0.requestDevice();
;
commandEncoder6 = device0.createCommandEncoder();
device0;
buffer10 = device0.createBuffer(
{size : 4667, usage : GPUBufferUsage.INDEX });
shaderModule0 = device0.createShaderModule({
code : ` @id(5834) override override0: f16;
struct VertexOutput0 {
@builtin(position) f0: vec4f}
fn fn0() -> array<array<array<bool, 1>, 1>, 24> {
var out: array<array<array<bool, 1>, 1>, 24>;
return out;
_ = override0;
}
@vertex fn vertex0(@location(3) a0: f16, ) -> VertexOutput0 {
var out: VertexOutput0;
fn0();
switch (vec2i())[1] {
default {
out.f0 = vec4f(f32(a0));
}
}
return out;
}
`
});
pipelineLayout3 = device0.createPipelineLayout({bindGroupLayouts : []});
shaderModule1 = device0.createShaderModule({
code : ` struct FragmentOutput2 {
@location(0) f1: vec2u}
@fragment fn fragment2() -> FragmentOutput2 {
var out: FragmentOutput2;
return out;
}
`
});
device0;
pipeline1 = device0.createRenderPipeline({
layout : pipelineLayout3,
fragment : {
module : shaderModule1,
targets : [ {
format : 'rg32uint'} ]
},
depthStencil : {
format : 'depth16unorm',
depthWriteEnabled : false},
vertex : {
module : shaderModule0,
constants : {5_834 : 1},
buffers : [ {
arrayStride : 36,
attributes : [
{
format : 'unorm16x4', offset : 0, shaderLocation : 3}
]
} ]
}
});
texture22 = device0.createTexture({
size : [
1828],
format : 'depth16unorm',
usage : GPUTextureUsage.RENDER_ATTACHMENT
});
texture26 = device0.createTexture({
size : {width : 1828, depthOrArrayLayers : 565},
dimension : '3d',
format : 'rg32uint',
usage : GPUTextureUsage.RENDER_ATTACHMENT
});
renderBundleEncoder4 = device0.createRenderBundleEncoder({
colorFormats : []});
renderBundle4 = renderBundleEncoder4.finish();
texture35 = device0.createTexture({
size : {width : 1828, depthOrArrayLayers : 19},
dimension : '3d',
format : 'rg32uint',
usage : GPUTextureUsage.RENDER_ATTACHMENT
});
buffer31 = device0.createBuffer({size : 364, usage : GPUBufferUsage.VERTEX});
pipelineLayout8 = device0.createPipelineLayout({bindGroupLayouts : []});
textureView57 = texture22.createView();
textureView58 = texture35.createView();
buffer37 = device0.createBuffer(
{size : 6365, usage : GPUBufferUsage.INDIRECT });
shaderModule2 = device0.createShaderModule({
code : ` struct VertexOutput1 {
@builtin(position) f3: vec4f}
@vertex fn vertex1() -> VertexOutput1 {
var out: VertexOutput1;
return out;
}
`
});
pipeline17 = await device0.createRenderPipelineAsync({
layout : pipelineLayout8,
fragment : {
module : shaderModule1,
targets : [ {
format : 'rg32uint'} ]
},
depthStencil : {
format : 'depth16unorm',
depthWriteEnabled : false},
vertex : {
module : shaderModule2}
});
renderBundleEncoder11 = device0.createRenderBundleEncoder({
colorFormats : [ 'rg32uint' ],
depthStencilFormat : 'depth16unorm'});
try {
renderBundleEncoder11.setIndexBuffer(
buffer10,
'uint16');
renderBundleEncoder11.setVertexBuffer(
0,
buffer31)
renderBundleEncoder11.setPipeline(pipeline17)
} catch {
}
querySet10 = device0.createQuerySet({type : 'occlusion', count : 1030});
try {
renderBundleEncoder11.drawIndirect(buffer37, 1_368)
renderBundleEncoder11.setPipeline(pipeline1)
} catch {
}
textureView93 = texture26.createView();
try {
renderBundleEncoder11.drawIndexed(7, 30, 10, 137)
} catch {
}
renderBundle13 = renderBundleEncoder11.finish();
renderPassEncoder26 = commandEncoder6.beginRenderPass({
colorAttachments : [
{view : textureView93, depthSlice : 12, loadOp : 'clear', storeOp : 'store'}
],
depthStencilAttachment : {
view : textureView57,
depthLoadOp : 'load',
depthStoreOp : 'discard'}});
commandEncoder104 = device0.createCommandEncoder();
renderPassEncoder28 = commandEncoder104.beginRenderPass({
colorAttachments : [ {
view : textureView58,
depthSlice : 15,
clearValue : {r : 522.6, g : 355.6, b : 952.9, a : 576.7},
loadOp : 'clear',
storeOp : 'store'
} ],
depthStencilAttachment : {
view : textureView57,
depthClearValue : 0.22322037873015754,
depthLoadOp : 'clear',
depthStoreOp : 'discard'},
occlusionQuerySet : querySet10
});
try {
renderPassEncoder26.executeBundles([ renderBundle13, renderBundle4 ])
await device0.queue.onSubmittedWorkDone()
renderPassEncoder28.beginOcclusionQuery(36);
renderPassEncoder28.executeBundles([
renderBundle13])
renderPassEncoder28.endOcclusionQuery()
renderPassEncoder28.end()
} catch {
}
commandBuffer23 = commandEncoder104.finish();
try {
device0.queue.submit([ commandBuffer23 ])
} catch {
}
// END
await device0.queue.onSubmittedWorkDone();
}
onload = async () => {
try {
let sharedScript = document.querySelector('#shared').textContent;
let workers = [
];
let promises = [ window0() ];
debug('promises created');
let results = await Promise.allSettled(promises);
for (let result of results) {
if (result.status === 'rejected') { throw result.reason; }
}
debug('Pass')
} catch (e) {
log('error');
log(e);
log(e[Symbol.toStringTag]);
log(e.stack);
if (e instanceof GPUPipelineError) {
log(`${e} - ${e.reason}`);
} else if (e instanceof DOMException) {
if (e.name === 'OperationError') {
log(e.message);
} else if (e.name === 'InvalidStateError') {
} else {
log(e);
}
} else if (e instanceof GPUValidationError) {
} else if (e instanceof GPUOutOfMemoryError) {
} else if (e instanceof TypeError) {
log(e);
} else {
log('unexpected error type');
log(e);
}
}
globalThis.testRunner?.notifyDone();
};
</script>