754 lines
13 KiB
GLSL
754 lines
13 KiB
GLSL
#version 450
|
|
#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require
|
|
layout(row_major) uniform;
|
|
layout(row_major) buffer;
|
|
|
|
#line 8 0
|
|
struct GeometryCB_std140_0
|
|
{
|
|
uint totalNumElements_0;
|
|
uint baseDepth_0;
|
|
uint totalNumVertices_0;
|
|
};
|
|
|
|
|
|
#line 8
|
|
layout(binding = 0, set = 1)
|
|
layout(std140) uniform block_GeometryCB_std140_0
|
|
{
|
|
uint totalNumElements_0;
|
|
uint baseDepth_0;
|
|
uint totalNumVertices_0;
|
|
}pParams_geometry_0;
|
|
|
|
#line 1334 1
|
|
struct _MatrixStorage_float4x4_ColMajorstd140_0
|
|
{
|
|
vec4 data_0[4];
|
|
};
|
|
|
|
|
|
#line 27 0
|
|
struct UpdateCB_std140_0
|
|
{
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 viewProjectionMatrix_0;
|
|
float triangleSize_0;
|
|
uint maxSubdivisionDepth_0;
|
|
float fov_0;
|
|
float farPlaneDistance_0;
|
|
};
|
|
|
|
|
|
#line 27
|
|
layout(binding = 1, set = 1)
|
|
layout(std140) uniform block_UpdateCB_std140_0
|
|
{
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 viewProjectionMatrix_0;
|
|
float triangleSize_0;
|
|
uint maxSubdivisionDepth_0;
|
|
float fov_0;
|
|
float farPlaneDistance_0;
|
|
}pParams_update_0;
|
|
|
|
#line 40
|
|
layout(std430, binding = 2, set = 1) buffer StructuredBuffer_vectorx3Cfloatx2C4x3E_t_0 {
|
|
vec4 _data[];
|
|
} pParams_currentVertexBuffer_0;
|
|
|
|
#line 40
|
|
layout(std430, binding = 3, set = 1) readonly buffer StructuredBuffer_uint_t_0 {
|
|
uint _data[];
|
|
} pParams_indexedBisectorBuffer_0;
|
|
|
|
#line 40
|
|
layout(std430, binding = 4, set = 1) buffer StructuredBuffer_uint_t_1 {
|
|
uint _data[];
|
|
} pParams_indirectDrawBuffer_0;
|
|
|
|
#line 40
|
|
layout(std430, binding = 5, set = 1) buffer StructuredBuffer_uint64_t_0 {
|
|
uint64_t _data[];
|
|
} pParams_heapIDBuffer_0;
|
|
|
|
#line 20 2
|
|
struct _Array_std430_uint3_0
|
|
{
|
|
uint data_1[3];
|
|
};
|
|
|
|
|
|
#line 35
|
|
struct BisectorData_std430_0
|
|
{
|
|
_Array_std430_uint3_0 indices_0;
|
|
uint subdivisionPattern_0;
|
|
uint problematicNeighbor_0;
|
|
uint bisectorState_0;
|
|
uint flags_0;
|
|
uint propagationID_0;
|
|
};
|
|
|
|
|
|
#line 35
|
|
layout(std430, binding = 6, set = 1) buffer StructuredBuffer_BisectorData_std430_t_0 {
|
|
BisectorData_std430_0 _data[];
|
|
} pParams_bisectorDataBuffer_0;
|
|
|
|
#line 35
|
|
layout(std430, binding = 7, set = 1) buffer StructuredBuffer_uint_t_2 {
|
|
uint _data[];
|
|
} pParams_classificationBuffer_0;
|
|
|
|
#line 102 3
|
|
struct Plane_std140_0
|
|
{
|
|
vec3 n_0;
|
|
float d_0;
|
|
};
|
|
|
|
|
|
#line 102
|
|
struct _Array_std140_Plane4_0
|
|
{
|
|
Plane_std140_0 data_2[4];
|
|
};
|
|
|
|
|
|
#line 102
|
|
struct Frustum_std140_0
|
|
{
|
|
_Array_std140_Plane4_0 sides_0;
|
|
};
|
|
|
|
|
|
#line 19
|
|
struct ViewParameter_std140_0
|
|
{
|
|
Frustum_std140_0 viewFrustum_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 viewMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 inverseViewMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 projectionMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 inverseProjection_0;
|
|
vec4 cameraPosition_WS_0;
|
|
vec4 cameraForward_WS_0;
|
|
vec2 screenDimensions_0;
|
|
vec2 invScreenDimensions_0;
|
|
uint frameIndex_0;
|
|
float time_0;
|
|
};
|
|
|
|
|
|
#line 22
|
|
layout(binding = 0)
|
|
layout(std140) uniform block_ViewParameter_std140_0
|
|
{
|
|
Frustum_std140_0 viewFrustum_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 viewMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 inverseViewMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 projectionMatrix_0;
|
|
_MatrixStorage_float4x4_ColMajorstd140_0 inverseProjection_0;
|
|
vec4 cameraPosition_WS_0;
|
|
vec4 cameraForward_WS_0;
|
|
vec2 screenDimensions_0;
|
|
vec2 invScreenDimensions_0;
|
|
uint frameIndex_0;
|
|
float time_0;
|
|
}pViewParams_0;
|
|
|
|
#line 22
|
|
mat4x4 unpackStorage_0(_MatrixStorage_float4x4_ColMajorstd140_0 _S1)
|
|
{
|
|
|
|
#line 22
|
|
return mat4x4(_S1.data_0[0][0], _S1.data_0[1][0], _S1.data_0[2][0], _S1.data_0[3][0], _S1.data_0[0][1], _S1.data_0[1][1], _S1.data_0[2][1], _S1.data_0[3][1], _S1.data_0[0][2], _S1.data_0[1][2], _S1.data_0[2][2], _S1.data_0[3][2], _S1.data_0[0][3], _S1.data_0[1][3], _S1.data_0[2][3], _S1.data_0[3][3]);
|
|
}
|
|
|
|
|
|
#line 99
|
|
struct Plane_0
|
|
{
|
|
vec3 n_0;
|
|
float d_0;
|
|
};
|
|
|
|
|
|
#line 109
|
|
Plane_0 unpackStorage_1(Plane_std140_0 _S2)
|
|
{
|
|
|
|
#line 109
|
|
Plane_0 _S3 = { _S2.n_0, _S2.d_0 };
|
|
|
|
#line 109
|
|
return _S3;
|
|
}
|
|
|
|
|
|
#line 109
|
|
void unpackStorage_2(_Array_std140_Plane4_0 _S4, out Plane_0 _S5[4])
|
|
{
|
|
|
|
#line 109
|
|
Plane_0 _S6 = unpackStorage_1(_S4.data_2[1]);
|
|
|
|
#line 109
|
|
Plane_0 _S7 = unpackStorage_1(_S4.data_2[2]);
|
|
|
|
#line 109
|
|
Plane_0 _S8 = unpackStorage_1(_S4.data_2[3]);
|
|
|
|
#line 109
|
|
_S5[0] = unpackStorage_1(_S4.data_2[0]);
|
|
|
|
#line 109
|
|
_S5[1] = _S6;
|
|
|
|
#line 109
|
|
_S5[2] = _S7;
|
|
|
|
#line 109
|
|
_S5[3] = _S8;
|
|
|
|
#line 109
|
|
return;
|
|
}
|
|
|
|
|
|
#line 17 2
|
|
_Array_std430_uint3_0 packStorage_0(uint _S9[3])
|
|
{
|
|
|
|
#line 17
|
|
uint _S10[3] = { _S9[0], _S9[1], _S9[2] };
|
|
|
|
#line 17
|
|
_Array_std430_uint3_0 _S11 = { _S10 };
|
|
|
|
#line 17
|
|
return _S11;
|
|
}
|
|
|
|
|
|
#line 17
|
|
void unpackStorage_3(_Array_std430_uint3_0 _S12, out uint _S13[3])
|
|
{
|
|
|
|
#line 17
|
|
_S13[0] = _S12.data_1[0];
|
|
|
|
#line 17
|
|
_S13[1] = _S12.data_1[1];
|
|
|
|
#line 17
|
|
_S13[2] = _S12.data_1[2];
|
|
|
|
#line 17
|
|
return;
|
|
}
|
|
|
|
|
|
#line 17
|
|
struct BisectorData_0
|
|
{
|
|
uint indices_0[3];
|
|
uint subdivisionPattern_0;
|
|
uint problematicNeighbor_0;
|
|
uint bisectorState_0;
|
|
uint flags_0;
|
|
uint propagationID_0;
|
|
};
|
|
|
|
|
|
#line 17
|
|
BisectorData_0 unpackStorage_4(BisectorData_std430_0 _S14)
|
|
{
|
|
|
|
#line 17
|
|
uint _S15[3];
|
|
|
|
#line 17
|
|
unpackStorage_3(_S14.indices_0, _S15);
|
|
|
|
#line 17
|
|
BisectorData_0 _S16 = { _S15, _S14.subdivisionPattern_0, _S14.problematicNeighbor_0, _S14.bisectorState_0, _S14.flags_0, _S14.propagationID_0 };
|
|
|
|
#line 17
|
|
return _S16;
|
|
}
|
|
|
|
|
|
#line 17
|
|
BisectorData_std430_0 packStorage_1(BisectorData_0 _S17)
|
|
{
|
|
|
|
#line 17
|
|
BisectorData_std430_0 _S18 = { packStorage_0(_S17.indices_0), _S17.subdivisionPattern_0, _S17.problematicNeighbor_0, _S17.bisectorState_0, _S17.flags_0, _S17.propagationID_0 };
|
|
|
|
#line 17
|
|
return _S18;
|
|
}
|
|
|
|
|
|
#line 38
|
|
uint HeapIDDepth_0(uint64_t x_0)
|
|
{
|
|
|
|
#line 38
|
|
uint64_t _S19 = x_0;
|
|
|
|
#line 38
|
|
uint depth_0 = 0U;
|
|
|
|
|
|
for(;;)
|
|
{
|
|
|
|
#line 41
|
|
if(_S19 > 0UL)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 41
|
|
break;
|
|
}
|
|
|
|
#line 42
|
|
uint depth_1 = depth_0 + 1U;
|
|
|
|
#line 42
|
|
_S19 = _S19 >> 1U;
|
|
|
|
#line 42
|
|
depth_0 = depth_1;
|
|
|
|
#line 41
|
|
}
|
|
|
|
|
|
|
|
return depth_0;
|
|
}
|
|
|
|
|
|
#line 109 3
|
|
struct Frustum_0
|
|
{
|
|
Plane_0 sides_0[4];
|
|
};
|
|
|
|
|
|
#line 109
|
|
Frustum_0 unpackStorage_5(Frustum_std140_0 _S20)
|
|
{
|
|
|
|
#line 109
|
|
Plane_0 _S21[4];
|
|
|
|
#line 109
|
|
unpackStorage_2(_S20.sides_0, _S21);
|
|
|
|
#line 109
|
|
Frustum_0 _S22 = { _S21 };
|
|
|
|
#line 109
|
|
return _S22;
|
|
}
|
|
|
|
|
|
#line 26 4
|
|
bool FrustumAABBIntersect_0(Frustum_0 frustum_0, vec3 aabbMin_0, vec3 aabbMax_0)
|
|
{
|
|
vec3 _S23 = (aabbMax_0 + aabbMin_0) * 0.5;
|
|
vec3 _S24 = (aabbMax_0 - aabbMin_0) * 0.5;
|
|
|
|
#line 29
|
|
int i_0 = 0;
|
|
for(;;)
|
|
{
|
|
|
|
#line 30
|
|
if(i_0 < 4)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 30
|
|
break;
|
|
}
|
|
|
|
#line 37
|
|
if(dot(_S23 + _S24 * vec3((ivec3(sign((frustum_0.sides_0[i_0].n_0))))), frustum_0.sides_0[i_0].n_0) + frustum_0.sides_0[i_0].d_0 < 0.0)
|
|
{
|
|
|
|
#line 38
|
|
return false;
|
|
}
|
|
|
|
#line 30
|
|
i_0 = i_0 + 1;
|
|
|
|
#line 30
|
|
}
|
|
|
|
#line 40
|
|
return true;
|
|
}
|
|
|
|
|
|
#line 7
|
|
struct BisectorGeometry_0
|
|
{
|
|
vec3 p_0[4];
|
|
};
|
|
|
|
|
|
#line 43
|
|
int ClassifyBisector_0(BisectorGeometry_0 tri_0, uint depth_2)
|
|
{
|
|
|
|
|
|
|
|
vec3 viewDir_0 = normalize(- ((tri_0.p_0[0] + tri_0.p_0[1] + tri_0.p_0[2]) / 3.0));
|
|
|
|
float VdotN_0 = dot(viewDir_0, normalize(cross(tri_0.p_0[2] - tri_0.p_0[1], tri_0.p_0[0] - tri_0.p_0[1])));
|
|
|
|
#line 50
|
|
bool _S25;
|
|
|
|
|
|
if(dot(viewDir_0, pViewParams_0.cameraForward_WS_0.xyz) < 0.0)
|
|
{
|
|
|
|
#line 53
|
|
_S25 = VdotN_0 < -0.00100000004749745;
|
|
|
|
#line 53
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 53
|
|
_S25 = false;
|
|
|
|
#line 53
|
|
}
|
|
|
|
#line 53
|
|
if(_S25)
|
|
{
|
|
|
|
#line 54
|
|
return -3;
|
|
}
|
|
|
|
float _S26 = tri_0.p_0[0].x;
|
|
|
|
#line 57
|
|
float _S27 = tri_0.p_0[1].x;
|
|
|
|
#line 57
|
|
float _S28 = tri_0.p_0[2].x;
|
|
|
|
#line 57
|
|
float _S29 = tri_0.p_0[0].y;
|
|
|
|
#line 57
|
|
float _S30 = tri_0.p_0[1].y;
|
|
|
|
#line 57
|
|
float _S31 = tri_0.p_0[2].y;
|
|
|
|
#line 57
|
|
float _S32 = tri_0.p_0[0].z;
|
|
|
|
#line 57
|
|
float _S33 = tri_0.p_0[1].z;
|
|
|
|
#line 57
|
|
float _S34 = tri_0.p_0[2].z;
|
|
|
|
|
|
|
|
if(!FrustumAABBIntersect_0(unpackStorage_5(pViewParams_0.viewFrustum_0), vec3(min(min(_S26, _S27), _S28), min(min(_S29, _S30), _S31), min(min(_S32, _S33), _S34)), vec3(max(max(_S26, _S27), _S28), max(max(_S29, _S30), _S31), max(max(_S32, _S33), _S34))))
|
|
{
|
|
|
|
#line 62
|
|
return -2;
|
|
}
|
|
|
|
#line 62
|
|
mat4x4 _S35 = unpackStorage_0(pParams_update_0.viewProjectionMatrix_0);
|
|
|
|
|
|
|
|
vec4 _S36 = (((vec4(tri_0.p_0[0], 1.0)) * (_S35)));
|
|
|
|
#line 66
|
|
vec4 p0P_0 = _S36;
|
|
p0P_0.xy = _S36.xy / _S36.w;
|
|
p0P_0.xy = p0P_0.xy * 0.5 + 0.5;
|
|
|
|
vec4 _S37 = (((vec4(tri_0.p_0[1], 1.0)) * (_S35)));
|
|
|
|
#line 70
|
|
vec4 p1P_0 = _S37;
|
|
p1P_0.xy = _S37.xy / _S37.w;
|
|
p1P_0.xy = p1P_0.xy * 0.5 + 0.5;
|
|
|
|
vec4 _S38 = (((vec4(tri_0.p_0[2], 1.0)) * (_S35)));
|
|
|
|
#line 74
|
|
vec4 p2P_0 = _S38;
|
|
p2P_0.xy = _S38.xy / _S38.w;
|
|
p2P_0.xy = p2P_0.xy * 0.5 + 0.5;
|
|
|
|
#line 85
|
|
float areaOverestimation_0 = mix(2.0, 1.0, pow(VdotN_0, 0.20000000298023224));
|
|
float area_0 = 0.5 * abs(p0P_0.x * (p2P_0.y - p1P_0.y) + p1P_0.x * (p0P_0.y - p2P_0.y) + p2P_0.x * (p1P_0.y - p0P_0.y)) * (pViewParams_0.screenDimensions_0.x * pViewParams_0.screenDimensions_0.y) * areaOverestimation_0;
|
|
|
|
|
|
if(pParams_update_0.triangleSize_0 < area_0)
|
|
{
|
|
|
|
#line 89
|
|
_S25 = depth_2 < pParams_update_0.maxSubdivisionDepth_0;
|
|
|
|
#line 89
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 89
|
|
_S25 = false;
|
|
|
|
#line 89
|
|
}
|
|
|
|
#line 89
|
|
if(_S25)
|
|
{
|
|
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 94
|
|
if(pParams_update_0.triangleSize_0 * 0.5 > area_0)
|
|
{
|
|
|
|
#line 94
|
|
_S25 = true;
|
|
|
|
#line 94
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 94
|
|
_S25 = depth_2 > pParams_update_0.maxSubdivisionDepth_0;
|
|
|
|
#line 94
|
|
}
|
|
|
|
#line 94
|
|
if(_S25)
|
|
{
|
|
|
|
vec4 _S39 = (((vec4(tri_0.p_0[3], 1.0)) * (_S35)));
|
|
|
|
#line 97
|
|
vec4 p3P_0 = _S39;
|
|
p3P_0.xy = _S39.xy / _S39.w;
|
|
p3P_0.xy = p3P_0.xy * 0.5 + 0.5;
|
|
|
|
#line 107
|
|
if(pParams_update_0.triangleSize_0 >= 0.5 * abs(p0P_0.x * (p2P_0.y - p3P_0.y) + p3P_0.x * (p0P_0.y - p2P_0.y) + p2P_0.x * (p3P_0.y - p0P_0.y)) * (pViewParams_0.screenDimensions_0.x * pViewParams_0.screenDimensions_0.y) * areaOverestimation_0)
|
|
{
|
|
|
|
#line 107
|
|
_S25 = true;
|
|
|
|
#line 107
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 107
|
|
_S25 = depth_2 > pParams_update_0.maxSubdivisionDepth_0;
|
|
|
|
#line 107
|
|
}
|
|
|
|
#line 107
|
|
int _S40;
|
|
|
|
#line 107
|
|
if(_S25)
|
|
{
|
|
|
|
#line 107
|
|
_S40 = -1;
|
|
|
|
#line 107
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 107
|
|
_S40 = 0;
|
|
|
|
#line 107
|
|
}
|
|
|
|
#line 107
|
|
return _S40;
|
|
}
|
|
|
|
#line 89
|
|
}
|
|
|
|
#line 109
|
|
return 0;
|
|
}
|
|
|
|
|
|
#line 140
|
|
void ClassifyElement_0(uint currentID_0, BisectorGeometry_0 bis_0, uint totalNumElements_1, uint baseDepth_1)
|
|
{
|
|
|
|
uint64_t heapID_0 = pParams_heapIDBuffer_0._data[uint(currentID_0)];
|
|
uint depth_3 = HeapIDDepth_0(pParams_heapIDBuffer_0._data[uint(currentID_0)]);
|
|
BisectorData_0 cbisectorData_0 = unpackStorage_4(pParams_bisectorDataBuffer_0._data[uint(currentID_0)]);
|
|
|
|
|
|
cbisectorData_0.subdivisionPattern_0 = 0U;
|
|
cbisectorData_0.bisectorState_0 = 0U;
|
|
cbisectorData_0.problematicNeighbor_0 = 4294967295U;
|
|
cbisectorData_0.flags_0 = 1U;
|
|
|
|
|
|
int currentValidity_0 = ClassifyBisector_0(bis_0, depth_3);
|
|
if(currentValidity_0 > 0)
|
|
{
|
|
|
|
|
|
cbisectorData_0.bisectorState_0 = 1U;
|
|
uint targetSlot_0 = atomicAdd(pParams_classificationBuffer_0._data[uint(0UL)], 1U);
|
|
pParams_classificationBuffer_0._data[uint(2UL + uint64_t(targetSlot_0))] = currentID_0;
|
|
|
|
#line 155
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 155
|
|
int _S41;
|
|
|
|
#line 165
|
|
if(currentValidity_0 >= -1)
|
|
{
|
|
|
|
#line 165
|
|
_S41 = 1;
|
|
|
|
#line 165
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 165
|
|
_S41 = 0;
|
|
|
|
#line 165
|
|
}
|
|
|
|
#line 165
|
|
cbisectorData_0.flags_0 = uint(_S41);
|
|
|
|
#line 155
|
|
}
|
|
|
|
#line 155
|
|
bool _S42;
|
|
|
|
#line 168
|
|
if(baseDepth_1 != depth_3)
|
|
{
|
|
|
|
#line 168
|
|
_S42 = currentValidity_0 < 0;
|
|
|
|
#line 168
|
|
}
|
|
else
|
|
{
|
|
|
|
#line 168
|
|
_S42 = false;
|
|
|
|
#line 168
|
|
}
|
|
|
|
#line 168
|
|
if(_S42)
|
|
{
|
|
|
|
cbisectorData_0.bisectorState_0 = 2U;
|
|
|
|
|
|
if(heapID_0 % 2UL == 0UL)
|
|
{
|
|
|
|
uint targetSlot_1 = atomicAdd(pParams_classificationBuffer_0._data[uint(1UL)], 1U);
|
|
pParams_classificationBuffer_0._data[uint(2UL + uint64_t(totalNumElements_1) + uint64_t(targetSlot_1))] = currentID_0;
|
|
|
|
#line 174
|
|
}
|
|
|
|
#line 168
|
|
}
|
|
|
|
#line 183
|
|
pParams_bisectorDataBuffer_0._data[uint(currentID_0)] = packStorage_1(cbisectorData_0);
|
|
return;
|
|
}
|
|
|
|
|
|
#line 14 5
|
|
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
|
|
void main()
|
|
{
|
|
|
|
#line 14
|
|
uint _S43 = gl_GlobalInvocationID.x;
|
|
|
|
|
|
if(_S43 >= pParams_indirectDrawBuffer_0._data[uint(9)])
|
|
{
|
|
|
|
#line 18
|
|
return;
|
|
}
|
|
|
|
uint _S44 = pParams_indexedBisectorBuffer_0._data[uint(_S43)];
|
|
|
|
|
|
BisectorGeometry_0 bis_1;
|
|
uint _S45 = 3U * _S44;
|
|
|
|
#line 25
|
|
bis_1.p_0[0] = pParams_currentVertexBuffer_0._data[uint(_S45)].xyz;
|
|
bis_1.p_0[1] = pParams_currentVertexBuffer_0._data[uint(_S45 + 1U)].xyz;
|
|
bis_1.p_0[2] = pParams_currentVertexBuffer_0._data[uint(_S45 + 2U)].xyz;
|
|
bis_1.p_0[3] = pParams_currentVertexBuffer_0._data[uint(3U * pParams_geometry_0.totalNumElements_0 + _S44)].xyz;
|
|
|
|
|
|
ClassifyElement_0(_S44, bis_1, pParams_geometry_0.totalNumElements_0, pParams_geometry_0.baseDepth_0);
|
|
return;
|
|
}
|
|
|