Restructure A
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
#define SCENE_UNIFORM_INDEX 0
|
||||
#define NODE_DATA_INDEX 1
|
||||
#define REQUEST_QUEUE_INDEX 2
|
||||
#define RENDER_QUEUE_INDEX 3
|
||||
#define TRANSFORM_ARRAY_INDEX 4
|
||||
#define NODE_QUEUE_INDEX 2
|
||||
#define REQUEST_QUEUE_INDEX 3
|
||||
#define RENDER_QUEUE_INDEX 4
|
||||
#define TRANSFORM_ARRAY_INDEX 5
|
||||
|
||||
//Samplers
|
||||
#define HIZ_BINDING_INDEX 0
|
||||
|
||||
@@ -25,12 +25,12 @@ struct UnpackedNode {
|
||||
uint childPtr;
|
||||
};
|
||||
|
||||
#define NULL_NODE ((1<<25)-1)
|
||||
#define NULL_NODE ((1<<24)-1)
|
||||
#define NULL_MESH ((1<<24)-1)
|
||||
|
||||
void unpackNode(inout UnpackedNode node, uint nodeId) {
|
||||
node.nodeId = nodeId;
|
||||
void unpackNode(out UnpackedNode node, uint nodeId) {
|
||||
uvec4 compactedNode = nodes[nodeId];
|
||||
node.nodeId = nodeId;
|
||||
node.lodLevel = compactedNode.x >> 28;
|
||||
|
||||
{
|
||||
@@ -40,13 +40,12 @@ void unpackNode(inout UnpackedNode node, uint nodeId) {
|
||||
z |= int(compactedNode.y>>28);
|
||||
z <<= 8;
|
||||
z >>= 8;
|
||||
|
||||
node.pos = ivec3(x, y, z);
|
||||
}
|
||||
|
||||
node.meshPtr = compactedNode.z&0xFFFFFFu;
|
||||
node.childPtr = compactedNode.w&0x1FFFFFFu;
|
||||
node.flags = (compactedNode.z>>24) | ((compactedNode.w>>23)<<8);
|
||||
node.childPtr = compactedNode.w&0xFFFFFFu;
|
||||
node.flags = ((compactedNode.z>>24)&0xFFu) | (((compactedNode.w>>24)&0xFFu)<<8);
|
||||
}
|
||||
|
||||
bool hasMesh(in UnpackedNode node) {
|
||||
@@ -89,5 +88,5 @@ void markRequested(inout UnpackedNode node) {
|
||||
}
|
||||
|
||||
void debugDumpNode(in UnpackedNode node) {
|
||||
printf("Node %d, %d@[%d,%d,%d], flags: %d, mesh: %d, ChildPtr: %d", node.nodeId, node.lodLevel, node.pos.x, node.pos.z, node.pos.z, node.flags, node.meshPtr, node.childPtr);
|
||||
printf("Node %d, %d@[%d,%d,%d], flags: %d, mesh: %d, ChildPtr: %d", node.nodeId, node.lodLevel, node.pos.x, node.pos.y, node.pos.z, node.flags, node.meshPtr, node.childPtr);
|
||||
}
|
||||
@@ -25,6 +25,11 @@ layout(binding = SCENE_UNIFORM_INDEX, std140) uniform SceneUniform {
|
||||
uint renderQueueMaxSize;
|
||||
};
|
||||
|
||||
layout(binding = NODE_QUEUE_INDEX, std430) restrict buffer NodeQueue {
|
||||
uint nodeQueueSize;
|
||||
uint[] nodeQueue;
|
||||
};
|
||||
|
||||
layout(binding = REQUEST_QUEUE_INDEX, std430) restrict buffer RequestQueue {
|
||||
uint requestQueueIndex;
|
||||
uint[] requestQueue;
|
||||
@@ -35,6 +40,7 @@ layout(binding = RENDER_QUEUE_INDEX, std430) restrict buffer RenderQueue {
|
||||
uint[] renderQueue;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
layout(binding = 2, std430) restrict buffer QueueData {
|
||||
uint tail;
|
||||
@@ -83,11 +89,11 @@ void addRequest(inout UnpackedNode node) {
|
||||
}
|
||||
|
||||
void enqueueChildren(in UnpackedNode node) {
|
||||
printf("children");
|
||||
//printf("children");
|
||||
}
|
||||
|
||||
void enqueueSelfForRender(in UnpackedNode node) {
|
||||
printf("render");
|
||||
//printf("render");
|
||||
if (renderQueueIndex < renderQueueMaxSize) {
|
||||
renderQueue[atomicAdd(renderQueueIndex, 1)] = getMesh(node);
|
||||
}
|
||||
@@ -98,17 +104,17 @@ void main() {
|
||||
UnpackedNode node;
|
||||
|
||||
//Setup/unpack the node
|
||||
unpackNode(node, gl_GlobalInvocationID.x);
|
||||
unpackNode(node, nodeQueue[gl_GlobalInvocationID.x]);
|
||||
|
||||
//TODO: check the node is OK first??? maybe?
|
||||
|
||||
//Compute screenspace
|
||||
setupScreenspace(node);
|
||||
|
||||
debugDumpNode(node);
|
||||
//debugDumpNode(node);
|
||||
|
||||
if (isCulledByHiz()) {
|
||||
printf("HizCulled");
|
||||
//printf("HizCulled");
|
||||
//We are done here, dont do any more, the issue is the shader barriers maybe
|
||||
// its culled, maybe just mark it as culled?
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user