<!-- 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;

</script>

<script>
globalThis.testRunner?.dumpAsText();
globalThis.testRunner?.waitUntilDone();


async function window0() {
// START
adapter0 = await navigator.gpu.requestAdapter();
device0 = await adapter0.requestDevice();
texture1 = device0.createTexture({
  size : {width : 11},
  format : 'rgba32sint',
  usage : GPUTextureUsage.RENDER_ATTACHMENT |
              GPUTextureUsage});
bindGroupLayout1 = device0.createBindGroupLayout({
  entries : [
    {
      binding : 46,
      visibility : GPUShaderStage.FRAGMENT,
      texture :
          {viewDimension : '3d', }},
    {
      binding : 120,
      visibility : GPUShaderStage.COMPUTE,
      storageTexture : {
        format : 'rg32uint',
        viewDimension : '2d-array'
      }},
    {
      binding : 24,
      visibility : GPUShaderStage.VERTEX,
      buffer : {type : 'read-only-storage', }},
    {
      binding : 156,
      visibility : GPUShaderStage.COMPUTE,
      texture : {
        viewDimension : 'cube-array',
        sampleType : 'uint',
        }}]});
texture6 = device0.createTexture({
  size : [],
  dimension : '3d',
  format : 'rgba8snorm',
  usage : GPUTextureUsage.TEXTURE_BINDING,
  });
textureView4 = texture6.createView();
texture21 = device0.createTexture({
  size : [],
  format : 'rg32uint',
  usage : GPUTextureUsage.STORAGE_BINDING,
  });
textureView9 = texture1.createView();
texture29 = device0.createTexture({
  size : [ 256, 256, 13 ],
  mipLevelCount : 2,
  format : 'stencil8',
  usage : GPUTextureUsage.TEXTURE_BINDING,
  });
textureView13 = texture29.createView({
  dimension : 'cube-array',
  arrayLayerCount : 6});
commandEncoder24 = device0.createCommandEncoder();
renderPassEncoder12 = commandEncoder24.beginRenderPass({
  colorAttachments : [ {
    view : textureView9,
    clearValue : {
      r : 611.5,
      g : 589.5,
      b : 245.7,
      a : 753.4},
    loadOp : 'load',
    storeOp : 'discard'} ]});
{
}
buffer20 = device0.createBuffer({
  size : 17127,
  usage : GPUBufferUsage.STORAGE});
device0;
textureView25 = texture21.createView({dimension : '2d-array'});
pipelineLayout4 =
    device0.createPipelineLayout({bindGroupLayouts : [ bindGroupLayout1 ]});
{
}
bindGroup16 = device0.createBindGroup({
  layout : bindGroupLayout1,
  entries : [
    {binding : 120, resource : textureView25},
    {binding : 46, resource : textureView4},
    {binding : 156, resource : textureView13},
    {binding : 24, resource : {buffer : buffer20, size : 1456}}]});
shaderModule0 = device0.createShaderModule({
  code : ` ;
                     fn unconst_u32(v: u32) -> u32 {
                  return v;
                  }
                     @group(0) @binding(24) var<storage> buffer29: array<array<array<FragmentOutput0, 10>, 5>>;
                     struct VertexOutput0 {
                    @location(4) f0: vec2h,   @builtin(position) f1: vec4f}
                     struct FragmentOutput0 {
                    @location(0) f0: vec4i,   @location(4) f1: f32}
                     @vertex fn vertex0() -> VertexOutput0 {
                    var out: VertexOutput0;
                    let ptr5= &buffer29[bitcast<u32>((buffer29)[((134))][4][9].f1)][4][9].f0;
                    out.f0 = vec2h((ptr5).gr);
                    return out;
                  }
                     @fragment fn fragment0() -> FragmentOutput0 {
                    var out: FragmentOutput0;
                    return out;
                  }
                    `,
  });
pipeline0 = await device0.createRenderPipelineAsync({
  layout : pipelineLayout4,
  fragment : {
    module : shaderModule0,
    targets : [ {
      format : 'rgba32sint',
      } ]},
  vertex : {module : shaderModule0, }});
{
}
renderBundleEncoder16 = device0.createRenderBundleEncoder({
  colorFormats : [ 'rgba32sint' ],
  });
try {
  renderBundleEncoder16.setPipeline(pipeline0);
  renderBundleEncoder16.setBindGroup(0, bindGroup16)} catch {
}
try {
  renderBundleEncoder16.draw(139)} catch {
}
renderBundle16 = renderBundleEncoder16.finish();
try {
  renderPassEncoder12.executeBundles([ renderBundle16 ])} catch {
}
try {
  renderPassEncoder12.end()} catch {
}
commandBuffer10 = commandEncoder24.finish();
try {
  device0.queue.submit([ commandBuffer10 ])} 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>

