input View {
  mat4 mvp,
  mat4 proj,
  mat4 proj_inverse,
  mat4 view,
  mat4 world, //geometry.world atm
  float2 fov, //fov.x, fov.y
  float2 resolution,
  float4 target_region,
  float4 target_region_size
}

input UniformShaderData {
    #0 image2D image,
    float4 rect,
    bool flipy
}

stage vertex vert_layer_pass(
    input {},
    vertex in {
        #0 float2 pos,
        #1 float2 uv
    },
    fragment out { float2 uv }
) {
  out.uv = in.uv;
  stage.pos = float4(in.pos, 0.0, 1.0);
}

stage fragment upscale_top_center(
    input { View view, UniformShaderData pass },
    fragment in { float2 uv }
) {

    //this is the uv in the full screen area
  float y = in.uv.y;
  if(input.pass.flipy) { y = 1.0 - y; }
  float2 uv = float2(in.uv.x, y);

  float2 dest_size = floor(input.view.target_region_size.zw);
  float4 local_rect = float4(input.pass.rect.xy / dest_size, input.pass.rect.zw / dest_size);
  float2 local_uv = (uv - local_rect.xy) / local_rect.zw;
  stage.color[0] = texture(input.pass.image, local_uv);

  if(local_uv.x < 0.0 || local_uv.y < 0.0 || local_uv.x > 1.0 || local_uv.y > 1.0){
    stage.color[0] = float4(0, 0, 0, 1);
  }
  return;
}