<!-- 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() {
let promise0 = navigator.gpu.requestAdapter({});
let promise1 = navigator.gpu.requestAdapter({});
let adapter0 = await promise0;
let device0 = await adapter0.requestDevice({
  defaultQueue: {},
  requiredFeatures: [
    'depth-clip-control',
    'depth32float-stencil8',
    'texture-compression-etc2',
    'indirect-first-instance',
    'rg11b10ufloat-renderable',
    'bgra8unorm-storage',
    'float32-blendable',
  ],
  requiredLimits: {
    maxUniformBufferBindingSize: 13240071,
    maxStorageBufferBindingSize: 141623714,
    maxSampledTexturesPerShaderStage: 16,
  },
});
// START
veryExplicitBindGroupLayout0 = device0.createBindGroupLayout({
      entries : [     {
         binding : 478,       visibility : GPUShaderStage.FRAGMENT,       buffer : {
 }
  }
   ]}
    );
     buffer0 = device0.createBuffer({
      label : '\u9cf1\u0a5e\u0b34\ue493',   size : 14850,   usage : GPUBufferUsage.STORAGE | GPUBufferUsage.UNIFORM}
    );
     pipelineLayout1 = device0.createPipelineLayout(     {
   bindGroupLayouts : [ veryExplicitBindGroupLayout0 ]}
    );
     bindGroup0 = device0.createBindGroup({
      layout : veryExplicitBindGroupLayout0,   entries : [     {
  binding : 478, resource : {
 buffer : buffer0, offset : 4608, size : 5803}
  }
      ]}
    );
     shaderModule0 = device0.createShaderModule({
      label : '\u01ca\u024b\u1f904',   code : ` enable f16;
                     struct S0 {
                   @location(12) f0: vec4i,   @location(3) f1: vec4i,   @location(0) f2: vec4u}
                     struct FragmentOutput0 {
                   @location(0) f0: vec2i,   @location(2) f1: vec4u,   @location(6) @interpolate(perspective) f2: f32}
                     fn fn7(a0: i32) {
                   vp0 = S0(bitcast<vec4i>((buffer1)[1][8]), bitcast<vec4i>((buffer1)[1][8]), vec4u((buffer1)[1][8]));
                   let ptr10: ptr<uniform, vec4f> = &buffer1[1][unconst_u32(394)];
                   var vf34 = fn5();
                   var vf35 = fn2((mat2x4h() * mat2x2h())[unconst_i32(0)].r);
                   while bool((mat2x4h((2640.6), (11877.4), (37888.7), (18686.1), (3473.3), (24355.4), (7694.0), (3896.5)) * mat2x2h((7520.7), (2421.4), (4808.6), unconst_f16(17626.4)))[(0)].g) {
      }
                   vf35 += (*ptr10);
                 }
                     fn unconst_i32(v: i32) -> i32 {
                 return v;
                 }
                     var<private> vp0: S0 = S0();
                     fn unconst_f32(v: f32) -> f32 {
                 return v;
                 }
                     fn unconst_u32(v: u32) -> u32 {
                 return v;
                 }
                     @must_use  fn fn2(a0: f16) -> vec4f {
                   var out: vec4f;
                   let vf12i32 = vp0.f0[unconst_u32(83)];
                   return out;
                 }
                     struct VertexOutput0 {
                   @builtin(position) f0: vec4f,   @location(3) @interpolate(flat, either) f1: u32,   @location(13) @interpolate(flat, centroid) f2: vec2u}
                     override override2: f32;
                     struct S1 {
                   @builtin(local_invocation_index) f0: u32,   @builtin(local_invocation_id) @size(16) f1: vec3u}
                     override override4: f16;
                     override override0: f32;
                     fn fn5() -> S1 {
                   var out: S1;
                   var vf27 = fn4();
                   _ = fn2(f16((vec2f((0.08689), unconst_f32(0.4009)))[0]));
                   out.f0 = u32(vp0.f0[unconst_u32(207)]);
                   return out;
                 }
                     var<private> vp1 = modf(vec4f());
                     @group(0) @binding(478) var<uniform> buffer1: array<array<vec4f, 9>, 2>;
                     @must_use  fn fn4() -> FragmentOutput0 {
                   var out: FragmentOutput0;
                   loop {
               break;
             }
                   switch bitcast<i32>(override0) {
                default {
           vp0.f2 = unpack4xU8(u32(vp0.f0[unconst_u32(233)]));
           _ = fn2(vec2h((vec2f((0.2101), unconst_f32(0.04690))))[1]);
           var vf17 = fn2(f16());
           var vf18 = fn2(f16());
           let vf19: vec2f = acos(vec2f(vf17[unconst_u32(342)]));
         }
               }
                   vp1 = modf(vec4f(f32(override4)));
                   var vf20 = fn2(vec4h().y);
                   out.f0 = vec2i(i32(override2));
                   while bool(vp0.f0.z) {
      }
                   if bool(vf20[unconst_u32(294)]) {
      }
                   return out;
                 }
                     fn unconst_f16(v: f16) -> f16 {
                 return v;
                 }
                     @vertex fn vertex0() -> VertexOutput0 {
                   var out: VertexOutput0;
                   _ = fn4();
                   return out;
                 }
                     @fragment fn fragment0() -> FragmentOutput0 {
                   var out: FragmentOutput0;
                   for (var it2=u32((*&buffer1)[1][unconst_u32(122)][0]);
                 it2<firstLeadingBit(vec2u()).y;
                 it2++) {
               for (var it1=pack4xI8((vec4i() << vec4u()));
             it1<pack4x8snorm((*&buffer1)[1][unconst_u32(127)]);
             it1++) {
    }
               return out;
             }
                   fn7(i32());
                   var vf51 = fn4();
                   switch i32() {
                default {
           fn7(bitcast<i32>(saturate((*&buffer1)[1][8].g)));
         }
               }
                   return out;
                 }
                    `, }
    );
     let querySet0 = device0.createQuerySet0;
     let texture12 = device0.createTexture({
      size : {
  width : 1200, height : 1, depthOrArrayLayers : 1}
   ,   sampleCount : 4,   format : 'r16sint',   usage : GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT |               GPUTextureUsage.TEXTURE_BINDING,   viewFormats : [], }
    );
     let textureView17 = texture12.createView();
     try {
    }
     catch {
    }
     let pipeline2 = await device0.createRenderPipelineAsync({
      layout : pipelineLayout1,   multisample : {
  count : 4, mask : 0x2bb3f243}
   ,   fragment : {
       module : shaderModule0,     constants : {
 override4 : 1, override0 : 1, override2 : 1}
  ,     targets : [ {
 format : 'r16sint', writeMask : 0}
   ],   }
   ,   vertex : {
       module : shaderModule0,     constants : {
 override0 : 1, override4 : 1, override2 : 1}
  ,     buffers : [],   }
   ,   primitive :       {
  topology : 'point-list', frontFace : 'cw', unclippedDepth : true}
   , }
    );
     try {
    }
     catch {
    }
     let commandEncoder29 = device0.createCommandEncoder();
     let renderPassEncoder2 = commandEncoder29.beginRenderPass({
      colorAttachments : [ {
       view : textureView17,     clearValue : {
        r : 562.0,       g : 421.8,       b : -672.4,       a : 694.7,     }
  ,     loadOp : 'load',     storeOp : 'store',   }
    ],   occlusionQuerySet : querySet0, }
    );
     try {
      renderPassEncoder2.setBindGroup(0, bindGroup0, new Uint32Array(1234), 47, 0);
      renderPassEncoder2.setPipeline(pipeline2);
    }
     catch {
    }
     try {
      renderPassEncoder2.draw(17, 68, 12, 542_724_990);
      renderPassEncoder2.end();
    }
     catch {
    }
     let commandBuffer0 = commandEncoder29.finish();
     try {
      device0.queue.submit([ commandBuffer0 ]);
    }
     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>

