<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?.waitUntilDone();

async function window0() {
let adapter0 = await navigator.gpu.requestAdapter({});
let device0 = await adapter0.requestDevice({
  defaultQueue: {},
  requiredFeatures: [
    'depth-clip-control',
    'depth32float-stencil8',
    'texture-compression-etc2',
    'texture-compression-astc',
    'indirect-first-instance',
    'shader-f16',
    'rg11b10ufloat-renderable',
    'float32-blendable',
    'float16-renderable',
    'float32-renderable',
    'core-features-and-limits',
    'timestamp-query',
  ],
  requiredLimits: {
    maxBindGroups: 4,
    maxBindingsPerBindGroup: 1000,
    maxInterStageShaderComponents: 64,
    maxStorageBufferBindingSize: 139264339,
    maxUniformBufferBindingSize: 66046090,
  },
});
// START

let shaderModule0 = device0.createShaderModule({ code: `
@group(0) @binding(221) var<storage, read_write> buffer1: vec2h;
@group(2) @binding(3) var<uniform> buffer5: vec4f;

@group(1) @binding(52) var<storage, read_write> buffer4: array<FragmentOutput1>;
@group(1) @binding(14) var<storage, read_write> buffer3: array<array<array<array<array<f16, 37>, 1>, 8>, 2>>;

struct FragmentOutput1 {
  @location(2) @interpolate(flat) location_2: u32,
}

@compute @workgroup_size(1, 1, 1) fn compute0() {
  switch u32(buffer3[0][0][0][0][0]) {
    default {
      buffer3[1][0][0][0][0] = buffer3[0][0][0][0][0];
      switch bitcast<u32>(buffer5.g) {
        default: {
          buffer4[0].location_2 = 0;
        }
        case 590589182: {
          buffer4[0].location_2 = 1u;
          return;
        }
        case 1385788756, 350663882 {
        }
      }
      buffer1.x = buffer1.y;
    }
  }
}
`, });
let pipeline0 = device0.createComputePipeline({
    layout: 'auto',
    compute: {
        module: shaderModule0,
        constants: {}
    }
});
// END
await device0.queue.onSubmittedWorkDone();

}

onload = async () => {
  try {
  let sharedScript = document.querySelector('#shared').textContent;

  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?.dumpAsText();
  globalThis.testRunner?.notifyDone();
};
</script>
