a
This commit is contained in:
@@ -7,6 +7,7 @@ layout(binding = 2) uniform sampler2D depthTex;
|
||||
|
||||
layout(location=1) perprimitiveEXT in PerPrimData {
|
||||
uvec4 data;
|
||||
uvec4 padd;
|
||||
} primIn;
|
||||
|
||||
layout(location = 0) out vec4 outColour;
|
||||
@@ -49,6 +50,29 @@ vec2 getBaseUV() {
|
||||
|
||||
|
||||
void main() {
|
||||
if (all(equal(primIn.data, uvec4(0)).yzw)) {
|
||||
outColour = vec4(0,1,0,0);
|
||||
} else {
|
||||
if (all(equal(primIn.data, uvec4(1)).yzw)) {
|
||||
outColour = vec4(1, 0, 1, 0);
|
||||
} else {
|
||||
outColour = vec4(primIn.data%256)/255;
|
||||
return;
|
||||
}
|
||||
}
|
||||
uint quadDebug = primIn.data.x;
|
||||
uint hash = quadDebug;
|
||||
if (hash != 0) {
|
||||
hash = hash*1231421+123141;
|
||||
hash ^= hash>>16;
|
||||
hash = hash*1231421+123141;
|
||||
hash ^= hash>>16;
|
||||
hash = hash * 1827364925 + 123325621;
|
||||
}
|
||||
outColour = vec4(float(hash&15u)/15, float((hash>>4)&15u)/15, float((hash>>8)&15u)/15, 0);
|
||||
|
||||
return;
|
||||
|
||||
vec2 uv = vec2(0);
|
||||
|
||||
//Tile is the tile we are in
|
||||
@@ -85,6 +109,14 @@ void main() {
|
||||
}
|
||||
|
||||
colour = computeColour(colour);
|
||||
|
||||
outColour = colour;
|
||||
|
||||
/*
|
||||
uint quadDebug = gl_PrimitiveID;
|
||||
uint hash = quadDebug*1231421+123141;
|
||||
hash ^= hash>>16;
|
||||
hash = hash*1231421+123141;
|
||||
hash ^= hash>>16;
|
||||
hash = hash * 1827364925 + 123325621;
|
||||
outColour = vec4(float(hash&15u)/15, float((hash>>4)&15u)/15, float((hash>>8)&15u)/15, 1);*/
|
||||
}
|
||||
@@ -19,18 +19,19 @@ layout(triangles, max_vertices=(MESH_SIZE*4), max_primitives=(MESH_SIZE*2)) out;
|
||||
//uvec4 binB;
|
||||
struct Task {
|
||||
uint bins[8];
|
||||
|
||||
vec3 cameraOffset;
|
||||
uint lodLvl;
|
||||
|
||||
uint baseQuad;
|
||||
uint quadCount;
|
||||
//uint padddd[64];
|
||||
};
|
||||
|
||||
taskPayloadSharedEXT Task task;
|
||||
|
||||
layout(location=1) perprimitiveEXT out PerPrimData {
|
||||
uvec4 data;
|
||||
uvec4 padd;
|
||||
} primOut[];
|
||||
|
||||
|
||||
@@ -273,6 +274,18 @@ layout(binding = STATISTICS_BUFFER_BINDING, std430) restrict buffer statisticsBu
|
||||
#endif
|
||||
|
||||
void main() {
|
||||
/*
|
||||
if (task.quadCount == 0) {
|
||||
SetMeshOutputsEXT(0,0);
|
||||
return;
|
||||
}
|
||||
SetMeshOutputsEXT(0,0);
|
||||
#ifdef HAS_STATISTICS
|
||||
atomicAdd(quadCounts[task.quadCount%5], 1);
|
||||
#endif
|
||||
return;
|
||||
*/
|
||||
|
||||
uint qid = uint(-1);
|
||||
Quad quad;
|
||||
if (gl_GlobalInvocationID.x<task.quadCount) {
|
||||
@@ -289,6 +302,7 @@ void main() {
|
||||
uint qc = subgroupMax(triId_+(qid!=uint(-1)?2:0));
|
||||
SetMeshOutputsEXT(qc*2, qc);
|
||||
|
||||
|
||||
#ifdef HAS_STATISTICS
|
||||
if (subgroupElect()) {
|
||||
atomicAdd(quadCounts[task.lodLvl], qc);
|
||||
@@ -317,11 +331,11 @@ void main() {
|
||||
//Prim 1
|
||||
gl_PrimitiveTriangleIndicesEXT[triId] = uvec3(vertId_+0, vertId_+1, vertId);
|
||||
gl_MeshVerticesEXT[vertId++].gl_Position = p0;
|
||||
primOut[triId++].data = data;
|
||||
primOut[triId++].data = uvec4(qid,0,0,0);
|
||||
|
||||
//Prim 2
|
||||
gl_PrimitiveTriangleIndicesEXT[triId] = uvec3(vertId_+0, vertId, vertId_+1);
|
||||
gl_MeshVerticesEXT[vertId++].gl_Position = p3;
|
||||
primOut[triId++].data = data;
|
||||
primOut[triId++].data = uvec4(qid,1,1,1);
|
||||
}
|
||||
}
|
||||
@@ -40,12 +40,12 @@ struct Task {
|
||||
//uvec4 binA;
|
||||
//uvec4 binB;
|
||||
uint bins[8];
|
||||
|
||||
vec3 cameraOffset;
|
||||
uint lodLvl;
|
||||
|
||||
uint baseQuad;
|
||||
uint quadCount;
|
||||
//uint padddd[64];
|
||||
};
|
||||
taskPayloadSharedEXT Task task;
|
||||
|
||||
@@ -97,8 +97,7 @@ void main() {
|
||||
bool shouldRender = (vis&0x7fffffffu) == frameId-1;//-1 since we are technically in the next frame for the primary rasterization
|
||||
bool renderTemporally = (vis&0x80000000u)==0;
|
||||
|
||||
task.quadCount = 0;
|
||||
|
||||
uint qc = 0;
|
||||
if (shouldRender) {
|
||||
SectionMeta section = sectionData[secId];
|
||||
|
||||
@@ -114,12 +113,14 @@ void main() {
|
||||
//TODO: here enqueue the id here for both translucent and temporal (if relevant) (* note technically dont need for temporal as can just check :tm: if we are in temporal render mode)
|
||||
|
||||
task.baseQuad = extractQuadStart(section);
|
||||
task.quadCount = fillBins(section.b, relative);
|
||||
qc = fillBins(section.b, relative);
|
||||
task.quadCount = qc;
|
||||
|
||||
task.cameraOffset = vec3(((ipos<<detail) - baseSectionPos)<<5);
|
||||
task.lodLvl = detail;
|
||||
}
|
||||
|
||||
|
||||
//It appears to be valid to read from taskPayloadSharedEXT
|
||||
EmitMeshTasksEXT((task.quadCount+(MESH_SIZE-1))/MESH_SIZE, 1, 1);
|
||||
EmitMeshTasksEXT((qc+(MESH_SIZE-1))/MESH_SIZE, 1, 1);
|
||||
}
|
||||
Reference in New Issue
Block a user