Skip to content

Commit

Permalink
GLSL Definitions: added fallback implementations for reversebits and …
Browse files Browse the repository at this point in the history
…countbits functions
  • Loading branch information
TheMostDiligent committed Jan 2, 2024
1 parent bd41481 commit 68362a8
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 8 deletions.
64 changes: 60 additions & 4 deletions Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,66 @@
#define fmod mod
#define lerp mix
#define dst distance
#define countbits bitCount
#define firstbithigh findMSB
#define firstbitlow findLSB
#define reversebits bitfieldReverse

#if defined(GL_ES) && (__VERSION__ < 310)

uint _reversebits(uint Value)
{
uint Bits = (Value << 16u) | (Value >> 16u);
Bits = ((Bits & 0x55555555u) << 1u) | ((Bits & 0xAAAAAAAAu) >> 1u);
Bits = ((Bits & 0x33333333u) << 2u) | ((Bits & 0xCCCCCCCCu) >> 2u);
Bits = ((Bits & 0x0F0F0F0Fu) << 4u) | ((Bits & 0xF0F0F0F0u) >> 4u);
Bits = ((Bits & 0x00FF00FFu) << 8u) | ((Bits & 0xFF00FF00u) >> 8u);
return Bits;
}
uint reversebits(uint Value)
{
return _reversebits(Value);
}
uint2 reversebits(uint2 Value)
{
return uint2(_reversebits(Value.x), _reversebits(Value.y));
}
uint3 reversebits(uint3 Value)
{
return uint3(_reversebits(Value.x), _reversebits(Value.y), _reversebits(Value.z));
}
uint4 reversebits(uint4 Value)
{
return uint4(_reversebits(Value.x), _reversebits(Value.y), _reversebits(Value.z), _reversebits(Value.w));
}

uint _countbits(uint Val)
{
Val = Val - ((Val >> 1u) & 0x55555555u); // add pairs of bits
Val = (Val & 0x33333333u) + ((Val >> 2u) & 0x33333333u); // quads
Val = (Val + (Val >> 4u)) & 0x0F0F0F0Fu; // groups of 8
Val *= 0x01010101u; // horizontal sum of bytes
return Val >> 24u; // return just that top byte (after truncating to 32-bit)
}
uint countbits(uint Val)
{
return _countbits(Val);
}
uint2 countbits(uint2 Val)
{
return uint2(_countbits(Val.x), _countbits(Val.y));
}
uint3 countbits(uint3 Val)
{
return uint3(_countbits(Val.x), _countbits(Val.y), _countbits(Val.z));
}
uint4 countbits(uint4 Val)
{
return uint4(_countbits(Val.x), _countbits(Val.y), _countbits(Val.z), _countbits(Val.w));
}

#else
# define countbits bitCount
# define firstbithigh findMSB
# define firstbitlow findLSB
# define reversebits bitfieldReverse
#endif

float rcp( float x ){ return 1.0 / x; }
vec2 rcp( vec2 x ){ return vec2(1.0,1.0) / x; }
Expand Down
64 changes: 60 additions & 4 deletions Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,66 @@
"#define fmod mod\n"
"#define lerp mix\n"
"#define dst distance\n"
"#define countbits bitCount\n"
"#define firstbithigh findMSB\n"
"#define firstbitlow findLSB\n"
"#define reversebits bitfieldReverse\n"
"\n"
"#if defined(GL_ES) && (__VERSION__ < 310)\n"
"\n"
"uint _reversebits(uint Value)\n"
"{\n"
" uint Bits = (Value << 16u) | (Value >> 16u);\n"
" Bits = ((Bits & 0x55555555u) << 1u) | ((Bits & 0xAAAAAAAAu) >> 1u);\n"
" Bits = ((Bits & 0x33333333u) << 2u) | ((Bits & 0xCCCCCCCCu) >> 2u);\n"
" Bits = ((Bits & 0x0F0F0F0Fu) << 4u) | ((Bits & 0xF0F0F0F0u) >> 4u);\n"
" Bits = ((Bits & 0x00FF00FFu) << 8u) | ((Bits & 0xFF00FF00u) >> 8u);\n"
" return Bits;\n"
"}\n"
"uint reversebits(uint Value)\n"
"{\n"
" return _reversebits(Value);\n"
"}\n"
"uint2 reversebits(uint2 Value)\n"
"{\n"
" return uint2(_reversebits(Value.x), _reversebits(Value.y));\n"
"}\n"
"uint3 reversebits(uint3 Value)\n"
"{\n"
" return uint3(_reversebits(Value.x), _reversebits(Value.y), _reversebits(Value.z));\n"
"}\n"
"uint4 reversebits(uint4 Value)\n"
"{\n"
" return uint4(_reversebits(Value.x), _reversebits(Value.y), _reversebits(Value.z), _reversebits(Value.w));\n"
"}\n"
"\n"
"uint _countbits(uint Val)\n"
"{\n"
" Val = Val - ((Val >> 1u) & 0x55555555u); // add pairs of bits\n"
" Val = (Val & 0x33333333u) + ((Val >> 2u) & 0x33333333u); // quads\n"
" Val = (Val + (Val >> 4u)) & 0x0F0F0F0Fu; // groups of 8\n"
" Val *= 0x01010101u; // horizontal sum of bytes\n"
" return Val >> 24u; // return just that top byte (after truncating to 32-bit)\n"
"}\n"
"uint countbits(uint Val)\n"
"{\n"
" return _countbits(Val);\n"
"}\n"
"uint2 countbits(uint2 Val)\n"
"{\n"
" return uint2(_countbits(Val.x), _countbits(Val.y));\n"
"}\n"
"uint3 countbits(uint3 Val)\n"
"{\n"
" return uint3(_countbits(Val.x), _countbits(Val.y), _countbits(Val.z));\n"
"}\n"
"uint4 countbits(uint4 Val)\n"
"{\n"
" return uint4(_countbits(Val.x), _countbits(Val.y), _countbits(Val.z), _countbits(Val.w));\n"
"}\n"
"\n"
"#else\n"
"# define countbits bitCount\n"
"# define firstbithigh findMSB\n"
"# define firstbitlow findLSB\n"
"# define reversebits bitfieldReverse\n"
"#endif\n"
"\n"
"float rcp( float x ){ return 1.0 / x; }\n"
"vec2 rcp( vec2 x ){ return vec2(1.0,1.0) / x; }\n"
Expand Down

0 comments on commit 68362a8

Please sign in to comment.