blob: 445391982efe46cb0ff462fd374ef6b9234703a2 [file]
#version 310 es
struct LightData {
vec4 position;
vec3 color;
float radius;
};
struct TileLightIdData {
uint count;
uint lightId[64];
};
struct Tiles {
TileLightIdData data[4];
};
struct Config {
uint numLights;
uint numTiles;
uint tileCountX;
uint tileCountY;
uint numTileLightSlot;
uint tileSize;
};
struct Uniforms {
vec4 member_0;
vec4 member_1;
mat4 viewMatrix;
mat4 projectionMatrix;
vec4 fullScreenSize;
};
layout(binding = 0, std430)
buffer LightsBuffer_1_ssbo {
LightData lights[];
} lightsBuffer;
layout(binding = 1, std430)
buffer tileLightId_block_1_ssbo {
Tiles inner;
} v;
layout(binding = 2, std140)
uniform config_block_1_ubo {
Config inner;
} v_1;
layout(binding = 3, std140)
uniform uniforms_block_1_ubo {
Uniforms inner;
} v_2;
void main_inner(uvec3 GlobalInvocationID) {
uint index = GlobalInvocationID.x;
if ((index >= v_1.inner.numLights)) {
return;
}
uint v_3 = index;
uint v_4 = min(v_3, (uint(lightsBuffer.lights.length()) - 1u));
uint v_5 = index;
uint v_6 = min(v_5, (uint(lightsBuffer.lights.length()) - 1u));
float v_7 = (lightsBuffer.lights[v_6].position.y - 0.10000000149011611938f);
float v_8 = float(index);
lightsBuffer.lights[v_4].position.y = (v_7 + (0.00100000004749745131f * (v_8 - (64.0f * floor((float(index) / 64.0f))))));
uint v_9 = index;
uint v_10 = min(v_9, (uint(lightsBuffer.lights.length()) - 1u));
if ((lightsBuffer.lights[v_10].position.y < v_2.inner.member_0.y)) {
uint v_11 = index;
uint v_12 = min(v_11, (uint(lightsBuffer.lights.length()) - 1u));
lightsBuffer.lights[v_12].position.y = v_2.inner.member_1.y;
}
mat4 M = v_2.inner.projectionMatrix;
float viewNear = (-(M[3u].z) / (-1.0f + M[2u].z));
float viewFar = (-(M[3u].z) / (1.0f + M[2u].z));
uint v_13 = index;
uint v_14 = min(v_13, (uint(lightsBuffer.lights.length()) - 1u));
vec4 lightPos = lightsBuffer.lights[v_14].position;
lightPos = (v_2.inner.viewMatrix * lightPos);
lightPos = (lightPos / lightPos.w);
uint v_15 = index;
uint v_16 = min(v_15, (uint(lightsBuffer.lights.length()) - 1u));
float lightRadius = lightsBuffer.lights[v_16].radius;
vec4 v_17 = lightPos;
vec4 boxMin = (v_17 - vec4(vec3(lightRadius), 0.0f));
vec4 v_18 = lightPos;
vec4 boxMax = (v_18 + vec4(vec3(lightRadius), 0.0f));
vec4 frustumPlanes[6] = vec4[6](vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f));
frustumPlanes[4u] = vec4(0.0f, 0.0f, -1.0f, viewNear);
frustumPlanes[5u] = vec4(0.0f, 0.0f, 1.0f, -(viewFar));
int TILE_SIZE = 16;
int TILE_COUNT_X = 2;
int TILE_COUNT_Y = 2;
{
int y = 0;
while(true) {
if ((y < TILE_COUNT_Y)) {
} else {
break;
}
{
int x = 0;
while(true) {
if ((x < TILE_COUNT_X)) {
} else {
break;
}
uint v_19 = uint(x);
int v_20 = int((v_19 * uint(TILE_SIZE)));
uint v_21 = uint(y);
ivec2 tilePixel0Idx = ivec2(v_20, int((v_21 * uint(TILE_SIZE))));
vec2 v_22 = (2.0f * vec2(tilePixel0Idx));
vec2 floorCoord = ((v_22 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
ivec2 v_23 = tilePixel0Idx;
ivec2 v_24 = ivec2(TILE_SIZE);
uvec2 v_25 = uvec2(v_23);
vec2 v_26 = (2.0f * vec2(ivec2((v_25 + uvec2(v_24)))));
vec2 ceilCoord = ((v_26 / v_2.inner.fullScreenSize.xy) - vec2(1.0f));
vec2 viewFloorCoord = vec2((((-(viewNear) * floorCoord.x) - (M[2u].x * viewNear)) / M[0u].x), (((-(viewNear) * floorCoord.y) - (M[2u].y * viewNear)) / M[1u].y));
vec2 viewCeilCoord = vec2((((-(viewNear) * ceilCoord.x) - (M[2u].x * viewNear)) / M[0u].x), (((-(viewNear) * ceilCoord.y) - (M[2u].y * viewNear)) / M[1u].y));
frustumPlanes[0u] = vec4(1.0f, 0.0f, (-(viewFloorCoord.x) / viewNear), 0.0f);
frustumPlanes[1u] = vec4(-1.0f, 0.0f, (viewCeilCoord.x / viewNear), 0.0f);
frustumPlanes[2u] = vec4(0.0f, 1.0f, (-(viewFloorCoord.y) / viewNear), 0.0f);
frustumPlanes[3u] = vec4(0.0f, -1.0f, (viewCeilCoord.y / viewNear), 0.0f);
float dp = 0.0f;
{
uint i = 0u;
while(true) {
if ((i < 6u)) {
} else {
break;
}
vec4 p = vec4(0.0f);
uint v_27 = min(i, 5u);
if ((frustumPlanes[v_27].x > 0.0f)) {
p.x = boxMax.x;
} else {
p.x = boxMin.x;
}
uint v_28 = min(i, 5u);
if ((frustumPlanes[v_28].y > 0.0f)) {
p.y = boxMax.y;
} else {
p.y = boxMin.y;
}
uint v_29 = min(i, 5u);
if ((frustumPlanes[v_29].z > 0.0f)) {
p.z = boxMax.z;
} else {
p.z = boxMin.z;
}
p.w = 1.0f;
float v_30 = dp;
vec4 v_31 = p;
uint v_32 = min(i, 5u);
dp = (v_30 + min(0.0f, dot(v_31, frustumPlanes[v_32])));
{
i = (i + 1u);
}
continue;
}
}
if ((dp >= 0.0f)) {
int v_33 = x;
uint v_34 = uint(y);
int v_35 = int((v_34 * uint(TILE_COUNT_X)));
uint v_36 = uint(v_33);
uint tileId = uint(int((v_36 + uint(v_35))));
bool v_37 = false;
if ((tileId < 0u)) {
v_37 = true;
} else {
v_37 = (tileId >= v_1.inner.numTiles);
}
if (v_37) {
{
uint v_38 = uint(x);
x = int((v_38 + uint(1)));
}
continue;
}
uint v_39 = min(tileId, 3u);
uint offset = atomicAdd(v.inner.data[v_39].count, 1u);
if ((offset >= v_1.inner.numTileLightSlot)) {
{
uint v_38 = uint(x);
x = int((v_38 + uint(1)));
}
continue;
}
uint v_40 = min(tileId, 3u);
uint v_41 = min(offset, 63u);
v.inner.data[v_40].lightId[v_41] = GlobalInvocationID.x;
}
{
uint v_38 = uint(x);
x = int((v_38 + uint(1)));
}
continue;
}
}
{
uint v_42 = uint(y);
y = int((v_42 + uint(1)));
}
continue;
}
}
}
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
void main() {
main_inner(gl_GlobalInvocationID);
}