#version 330 core

layout(location = 0) out uint fragHits;

uniform sampler2D hdr_tex;

// color.glsl
float linear_srgb_to_luminance(vec3 color);
// histogram.glsl
uint luminance_to_bin_index(float luminance);
// exposure.glsl
vec3 undo_exposure(vec3 color);

void main()
{
    ivec2 hdr_tex_size = textureSize(hdr_tex, 0);
    int column = int(gl_FragCoord.x);
    uint target_bin = uint(gl_FragCoord.y); // [0, 255]

    uint hits = 0u;

    for (int row = 0; row < hdr_tex_size.y; ++row) {
        vec3 hdr_color = texelFetch(hdr_tex, ivec2(column, row), 0).rgb;
        hdr_color = undo_exposure(hdr_color);
        // sRGB to relative luminance
        float lum = linear_srgb_to_luminance(hdr_color);
        // Get the bin index corresponding to the given pixel luminance
        uint pixel_bin = luminance_to_bin_index(lum);
        // Check if this pixel should go in the bin
        if (pixel_bin == target_bin) {
            hits += 1u;
        }
    }

    fragHits = hits;
}