No Recursion?

This commit is contained in:
John Hunter
2023-03-17 20:13:15 +00:00
parent a749c1e627
commit d487b22e3e
2 changed files with 87 additions and 46 deletions
+4
View File
@@ -62,6 +62,9 @@ void main()
positions[i].z += (bounds[2]-bounds[5])*0.25 * (floor(gl_LocalInvocationID.x/16.)-1.5+gl_WorkGroupID.z*2.); positions[i].z += (bounds[2]-bounds[5])*0.25 * (floor(gl_LocalInvocationID.x/16.)-1.5+gl_WorkGroupID.z*2.);
} }
float[2] check = scene(vec3[2](vec3(positions[0].xyz),vec3(positions[7].xyz)), true);
if ((check[0] < 0) && (check[1] > 0))
{
//mat4 sw=pc.world; //mat4 sw=pc.world;
gl_MeshVerticesEXT[vindex+0].gl_Position=mvp*(positions[0]); gl_MeshVerticesEXT[vindex+0].gl_Position=mvp*(positions[0]);
gl_MeshVerticesEXT[vindex+1].gl_Position=mvp*(positions[1]); gl_MeshVerticesEXT[vindex+1].gl_Position=mvp*(positions[1]);
@@ -101,4 +104,5 @@ void main()
gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(0,2,4)+uvec3(vindex); gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(0,2,4)+uvec3(vindex);
gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(2,4,6)+uvec3(vindex); gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(2,4,6)+uvec3(vindex);
} }
}
} }
+44 -7
View File
@@ -52,7 +52,7 @@ layout(set=0,binding=11)restrict readonly buffer MatConst{
mat4 mats[]; mat4 mats[];
}matconst; }matconst;
layout(set=0,binding=12)restrict readonly buffer DepInfo{ layout(set=0,binding=12)restrict readonly buffer DepInfo{
uint8_t dependencies[2][]; uint8_t dependencies[][2];
}depinfo; }depinfo;
// unpack integers // unpack integers
@@ -557,18 +557,55 @@ Description desc;
void pruneall (uint8_t pos) { void pruneall (uint8_t pos) {
uint8_t[2] deps; uint8_t[2] deps;
for (int i = 0; i < pos; i++) for (uint8_t i = uint8_t(0); i < pos; i++)
{ {
deps = depinfo.dependencies[desc.dependencies+i]; deps = depinfo.dependencies[desc.dependencies+i];
if (deps[1] != 255) { if (deps[1] != 255) {
//this is a dual output function (dup) if ((deps[0] == pos) || (deps[1] == pos))
//todo {
if ((mask[i>>3] & ~(1<<(i&7))) > 0)
{
mask[i>>3] &= uint8_t(~(1<<(i&7)));
}
else {
pruneall(i);
}
}
} }
else if (deps[0] == pos) { else if (deps[0] == pos) {
pruneall(i); pruneall(i);
} }
} }
mask[pos>>3] &= ~(1<<(pos&7)); mask[pos>>3] &= uint8_t(~(1<<(pos&7)));
}
void prunesome (uint8_t pos, bool prunemask[6]) {
uint8_t[2] deps;
int maskindex = 0;
for (uint8_t i = uint8_t(0); i < pos; i++)
{
deps = depinfo.dependencies[desc.dependencies+i];
if (deps[1] != 255) {
if ((deps[0] == pos) || (deps[1] == pos))
{
if (prunemask[maskindex++]) {
if ((mask[i>>3] & ~(1<<(i&7))) > 0)
{
mask[i>>3] &= uint8_t(~(1<<(i&7)));
}
else {
pruneall(i);
}
}
}
}
else if (deps[0] == pos) {
if (prunemask[maskindex++]) {
pruneall(i);
}
}
}
mask[pos>>3] &= uint8_t(~(1<<(pos&7)));
} }
#ifdef debug #ifdef debug
@@ -2748,12 +2785,12 @@ float[2]scene(vec3 p[2], bool prune)
#ifdef debug #ifdef debug
vec3 sceneoverride(vec3 p, bool m) vec3 sceneoverride(vec3 p, bool m)
{ {
return scene(vec3[2](p,p)); return scene(vec3[2](p,p), false);
} }
#else #else
float sceneoverride(vec3 p, bool m) float sceneoverride(vec3 p, bool m)
{ {
return scene(vec3[2](p,p))[0]; return scene(vec3[2](p,p), false)[0];
} }
#endif #endif