#version 310 es
precision mediump float;

struct Uniforms {
  uvec2 aShape;
  uvec2 bShape;
  uvec2 outShape;
};

layout(binding = 0) buffer Matrix_1 {
  uint numbers[];
} firstMatrix;
layout(binding = 1) buffer Matrix_2 {
  uint numbers[];
} secondMatrix;
layout(binding = 2) buffer Matrix_3 {
  uint numbers[];
} resultMatrix;
layout(binding = 3) uniform Uniforms_1 {
  uvec2 aShape;
  uvec2 bShape;
  uvec2 outShape;
} uniforms;

struct tint_symbol_2 {
  uvec3 global_id;
};

void tint_symbol_inner(uvec3 global_id) {
  uvec2 resultCell = uvec2(global_id.y, global_id.x);
  uint dimInner = uniforms.aShape.y;
  uint dimOutter = uniforms.outShape.y;
  uint result = 0u;
  {
    for(uint i = 0u; (i < dimInner); i = (i + 1u)) {
      uint a = (i + (resultCell.x * dimInner));
      uint b = (resultCell.y + (i * dimOutter));
      result = (result + (firstMatrix.numbers[a] * secondMatrix.numbers[b]));
    }
  }
  uint index = (resultCell.y + (resultCell.x * dimOutter));
  resultMatrix.numbers[index] = result;
}

layout(local_size_x = 2, local_size_y = 2, local_size_z = 1) in;
void tint_symbol(tint_symbol_2 tint_symbol_1) {
  tint_symbol_inner(tint_symbol_1.global_id);
  return;
}


void main() {
  tint_symbol_2 inputs;
  inputs.global_id = gl_GlobalInvocationID;
  tint_symbol(inputs);
}

