diff --git a/res/shaders/terrain/CBT.slang b/res/shaders/terrain/CBT.slang index 91bf368..0b0e4c9 100644 --- a/res/shaders/terrain/CBT.slang +++ b/res/shaders/terrain/CBT.slang @@ -61,51 +61,28 @@ static const uint32_t OCBT_depth_offset[18] = { 0, // Level 0 }; -static const uint OCBT_bit_mask_high[18] = { - 0x0, // Root 17 - 0x0, // Level 16 - 0x0, // level 15 - 0x0, // level 14 - 0x0, // level 13 - 0x0, // level 12 - 0x0, // level 11 - 0x0, // level 10 - 0x0, // level 9 - 0x0, // level 8 - 0x0, // level 8 +static const uint64_t OCBT_bit_mask[18] = { + 0xffffffffULL, // Root 17 + 0xffffffffULL, // Level 16 + 0xffffffffULL, // level 15 + 0xffffffffULL, // level 14 + 0xffffffffULL, // level 13 + 0xffffffffULL, // level 12 + 0xffffffffULL, // level 11 - 0xffffffff, // level 7 - 0x0, // Level 6 - 0x0, // level 5 - 0x0, // level 4 - 0x0, // level 3 - 0x0, // level 2 - 0x0, // level 1 -}; + 0xffffULL, // level 10 + 0xffffULL, // level 9 + 0xffffULL, // level 8 + 0xffULL, // level 8 - -static const uint OCBT_bit_mask_low[18] = { - 0xffffffff, // Root 17 - 0xffffffff, // Level 16 - 0xffffffff, // level 15 - 0xffffffff, // level 14 - 0xffffffff, // level 13 - 0xffffffff, // level 12 - 0xffffffff, // level 11 - - 0xffff, // level 10 - 0xffff, // level 9 - 0xffff, // level 8 - 0xff, // level 8 - - 0xffffffff, // level 7 - 0xffffffff, // Level 6 - 0xffff, // level 5 - 0xff, // level 4 - 0xf, // level 3 - 0x3, // level 2 - 0x1, // level 1 + 0xffffffffffffffffULL, // level 7 + 0xffffffffULL, // Level 6 + 0xffffULL, // level 5 + 0xffULL, // level 4 + 0xfULL, // level 3 + 0x3ULL, // level 2 + 0x1ULL, // level 1 }; static const uint32_t OCBT_bit_count[18] = { 32, // Root 17 @@ -198,15 +175,13 @@ uint get_heap_element(uint id, inout HeapDebug debug) { uint32_t slot = first_bit / 32; uint32_t local_id = first_bit % 32; - return (pParams.cbtBuffer[slot] >> local_id) & OCBT_bit_mask_low[depth]; + return (pParams.cbtBuffer[slot] >> local_id) & uint32_t(OCBT_bit_mask[depth]); } else { uint32_t slot = first_bit / 64; uint32_t local_id = first_bit % 64; - uint64_t mask = OCBT_bit_mask_high[depth]; - mask = (mask << 32) | OCBT_bit_mask_low[depth]; - uint64_t target_bits = (pParams.bitFieldBuffer[slot] >> local_id) & mask; + uint64_t target_bits = (pParams.bitFieldBuffer[slot] >> local_id) & OCBT_bit_mask[depth]; debug.target_bits = target_bits; return countbits(uint(target_bits >> 32)) + countbits(uint(target_bits)); } @@ -226,8 +201,8 @@ void set_heap_element(uint id, uint value) uint local_id = first_bit % 32; // Extract the relevant bits - gs_cbtTree[slot] &= ~(uint32_t(OCBT_bit_mask_low[depth]) << local_id); - gs_cbtTree[slot] |= ((uint32_t(OCBT_bit_mask_low[depth]) & value) << local_id); + gs_cbtTree[slot] &= ~(uint32_t(OCBT_bit_mask[depth]) << local_id); + gs_cbtTree[slot] |= ((uint32_t(OCBT_bit_mask[depth]) & value) << local_id); } // Should not be called if depth > TREE_LAST_LEVEL @@ -244,8 +219,8 @@ void set_heap_element_atomic(uint id, uint value) uint local_id = first_bit % 32; // Extract the relevant bits - InterlockedAnd(gs_cbtTree[slot], ~(uint32_t(OCBT_bit_mask_low[depth]) << local_id)); - InterlockedOr(gs_cbtTree[slot], ((uint32_t(OCBT_bit_mask_low[depth]) & value) << local_id)); + InterlockedAnd(gs_cbtTree[slot], ~(uint32_t(OCBT_bit_mask[depth]) << local_id)); + InterlockedOr(gs_cbtTree[slot], ((uint32_t(OCBT_bit_mask[depth]) & value) << local_id)); } // Function that returns the number of active bits @@ -291,19 +266,19 @@ uint decode_bit_complement(uint handle, inout DebugStruct debug) handle = handle - t; c /= 2u; } - return (bitID ^ OCBT_NUM_ELEMENTS); - //handle = temp; - //for(uint i = 0; i < OCBT_NUM_ELEMENTS; ++i) - //{ - // if(get_bit(i) == 0) - // { - // if(handle == 0) - // { - // return i; - // } - // handle--; - // } - //} + uint result = (bitID ^ OCBT_NUM_ELEMENTS); + handle = temp; + for(uint i = 0; i < OCBT_NUM_ELEMENTS; ++i) + { + if(get_bit(i) == 0) + { + if(handle == 0) + { + return i; + } + handle--; + } + } } void reduce(uint groupIndex) diff --git a/res/shaders/terrain/CompileTest.glsl b/res/shaders/terrain/CompileTest.glsl index 43d552c..22270e2 100644 --- a/res/shaders/terrain/CompileTest.glsl +++ b/res/shaders/terrain/CompileTest.glsl @@ -9,7 +9,7 @@ layout(std430, binding = 0) buffer StructuredBuffer_uint64_t_0 { } pParams_bitFieldBuffer_0; #line 8 -const uint OCBT_bit_mask_0[18] = { 4294967295U, 4294967295U, 4294967295U, 4294967295U, 4294967295U, 4294967295U, 4294967295U, 65535U, 65535U, 65535U, 255U, 4294967295U, 4294967295U, 65535U, 255U, 15U, 3U, 1U }; +const uint64_t OCBT_bit_mask_0[18] = { 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 65535UL, 65535UL, 65535UL, 255UL, 18446744073709551615UL, 4294967295UL, 65535UL, 255UL, 15UL, 3UL, 1UL }; #line 33 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; @@ -19,7 +19,7 @@ void main() #line 33 uint _S1 = gl_GlobalInvocationID.x; - pParams_bitFieldBuffer_0._data[uint(_S1)] = uint64_t(OCBT_bit_mask_0[_S1]); + pParams_bitFieldBuffer_0._data[uint(_S1)] = OCBT_bit_mask_0[_S1]; return; } diff --git a/res/shaders/terrain/CompileTest.slang b/res/shaders/terrain/CompileTest.slang index 1f54200..8f29995 100644 --- a/res/shaders/terrain/CompileTest.slang +++ b/res/shaders/terrain/CompileTest.slang @@ -5,27 +5,27 @@ struct ComputeParams }; ParameterBlock pParams; -static const uint32_t OCBT_bit_mask[18] = { - 0xffffffff, // Root 17 - 0xffffffff, // Level 16 - 0xffffffff, // level 15 - 0xffffffff, // level 14 - 0xffffffff, // level 13 - 0xffffffff, // level 12 - 0xffffffff, // level 11 +static const uint64_t OCBT_bit_mask[18] = { + 0xffffffffULL, // Root 17 + 0xffffffffULL, // Level 16 + 0xffffffffULL, // level 15 + 0xffffffffULL, // level 14 + 0xffffffffULL, // level 13 + 0xffffffffULL, // level 12 + 0xffffffffULL, // level 11 - 0xffff, // level 10 - 0xffff, // level 9 - 0xffff, // level 8 - 0xff, // level 8 + 0xffffULL, // level 10 + 0xffffULL, // level 9 + 0xffffULL, // level 8 + 0xffULL, // level 8 - 0xffffffff, // level 7 - 0xffffffff, // Level 6 - 0xffff, // level 5 - 0xff, // level 4 - 0xf, // level 3 - 0x3, // level 2 - 0x1, // level 1 + 0xffffffffffffffffULL, // level 7 + 0xffffffffULL, // Level 6 + 0xffffULL, // level 5 + 0xffULL, // level 4 + 0xfULL, // level 3 + 0x3ULL, // level 2 + 0x1ULL, // level 1 }; [numthreads(1, 1, 1)]