//
// fragment_main
//
#version 310 es
precision highp float;
precision highp int;


struct TintTextureUniformData {
  uint tint_builtin_value_0;
};

layout(binding = 0, std430)
buffer prevent_dce_block_1_ssbo {
  vec4 inner;
} v;
layout(binding = 0, std140)
uniform tint_symbol_1_ubo {
  TintTextureUniformData inner;
} v_1;
uniform highp sampler3D arg_0;
vec4 textureLoad_019da0() {
  uint v_2 = min(1u, (v_1.inner.tint_builtin_value_0 - 1u));
  uvec3 v_3 = (uvec3(textureSize(arg_0, int(v_2))) - uvec3(1u));
  ivec3 v_4 = ivec3(min(uvec3(ivec3(1)), v_3));
  vec4 res = texelFetch(arg_0, v_4, int(v_2));
  return res;
}
void main() {
  v.inner = textureLoad_019da0();
}
//
// compute_main
//
#version 310 es


struct TintTextureUniformData {
  uint tint_builtin_value_0;
};

layout(binding = 0, std430)
buffer prevent_dce_block_1_ssbo {
  vec4 inner;
} v;
layout(binding = 0, std140)
uniform tint_symbol_1_ubo {
  TintTextureUniformData inner;
} v_1;
uniform highp sampler3D arg_0;
vec4 textureLoad_019da0() {
  uint v_2 = min(1u, (v_1.inner.tint_builtin_value_0 - 1u));
  uvec3 v_3 = (uvec3(textureSize(arg_0, int(v_2))) - uvec3(1u));
  ivec3 v_4 = ivec3(min(uvec3(ivec3(1)), v_3));
  vec4 res = texelFetch(arg_0, v_4, int(v_2));
  return res;
}
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
  v.inner = textureLoad_019da0();
}
//
// vertex_main
//
#version 310 es


struct TintTextureUniformData {
  uint tint_builtin_value_0;
};

struct VertexOutput {
  vec4 pos;
  vec4 prevent_dce;
};

layout(binding = 0, std140)
uniform tint_symbol_1_1_ubo {
  TintTextureUniformData inner;
} v;
uniform highp sampler3D arg_0;
layout(location = 0) flat out vec4 vertex_main_loc0_Output;
vec4 textureLoad_019da0() {
  uint v_1 = min(1u, (v.inner.tint_builtin_value_0 - 1u));
  uvec3 v_2 = (uvec3(textureSize(arg_0, int(v_1))) - uvec3(1u));
  ivec3 v_3 = ivec3(min(uvec3(ivec3(1)), v_2));
  vec4 res = texelFetch(arg_0, v_3, int(v_1));
  return res;
}
VertexOutput vertex_main_inner() {
  VertexOutput tint_symbol = VertexOutput(vec4(0.0f), vec4(0.0f));
  tint_symbol.pos = vec4(0.0f);
  tint_symbol.prevent_dce = textureLoad_019da0();
  return tint_symbol;
}
void main() {
  VertexOutput v_4 = vertex_main_inner();
  gl_Position = v_4.pos;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  vertex_main_loc0_Output = v_4.prevent_dce;
  gl_PointSize = 1.0f;
}
