Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#define COMPUTE_SHADER_MAIN(dimx, dimy, dimz) [numthreads(dimx, dimy, dimz)] void main(uvec3 gl_LocalInvocationID : SV_GroupThreadID, uvec3 gl_WorkGroupID : SV_GroupID)
#define UNIFORM_BUFFER(name, bindidx) cbuffer name : register(b##bindidx)
#define DECLARE_SAMPLER_IBUF(bindidx, type, name) Buffer<type> name : register(t##bindidx)
#define DECLARE_SAMPLER_U2D(bindidx, name) Texture2D<uint4> name : register(t##bindidx)
#define DECLARE_SAMPLER_U2D_GATHER(bindidx, name) Texture2D<float4> name : register(t##bindidx)
#define DECLARE_IMAGE_R16I_BUF(bindidx, name) RWBuffer<int> name : register(u##bindidx)
#define DECLARE_IMAGE_R32I_BUF(bindidx, name) RWBuffer<int> name : register(u##bindidx)
#define DECLARE_IMAGE_TYPELESS_BUF(bindidx, name) RWByteAddressBuffer name : register(u##bindidx)
#define DECLARE_IMAGE_R8UI_2D(bindidx, name) RWTexture2D<uint> name : register(u##bindidx)
#define DECLARE_IMAGE_RG8UI_2D(bindidx, name) RWTexture2D<uint2> name : register(u##bindidx)
#define NEED_DC_COPY
#define DC_TYPELESS
#define DC_WRITE_OFFS dir_mask.x
typedef float2 vec2;
typedef float3 vec3;
typedef float4 vec4;
typedef int2 ivec2;
typedef int3 ivec3;
typedef int4 ivec4;
typedef uint2 uvec2;
typedef uint3 uvec3;
typedef uint4 uvec4;
#define shared groupshared
SamplerState default_sampler : register(s0);
#define IMPL_BITFIELD(T) \
T bitfieldExtract(T val, int offset, int size) \
{ \
val <<= 32 - (offset + size); \
val >>= 32 - size; \
return val; \
} \
T bitfieldInsert(T base, T insert, int offset, int bits) \
{ \
int mask = (-1 >> (32 - bits)) << offset; \
return (base & ~mask) | ((insert << offset) & mask); \
}
IMPL_BITFIELD(int);
IMPL_BITFIELD(ivec2);
IMPL_BITFIELD(ivec3);
IMPL_BITFIELD(ivec4);
IMPL_BITFIELD(uint);
IMPL_BITFIELD(uvec2);
IMPL_BITFIELD(uvec3);
IMPL_BITFIELD(uvec4);
int bitCount(int v)
{
return int(countbits(uint(v)));
}
uint bitCount(uint v)
{
return countbits(v);
}
int2 imageLoad_buf_i2(RWByteAddressBuffer in_buf, uint pos) { return int2(in_buf.Load2(pos*8)); }
int4 imageLoad_buf_i4(RWByteAddressBuffer in_buf, uint pos) { return int4(in_buf.Load4(pos*16)); }
void imageStore_u1(RWTexture2D<uint> out_tex, uvec2 pos, uint val) { out_tex[pos] = val; }
void imageStore_u2(RWTexture2D<uint2> out_tex, uvec2 pos, uvec2 vals) { out_tex[pos] = vals; }
void imageStore_buf_i1(RWBuffer<int> out_buf, uint pos, int val) { out_buf[pos] = val; }
void imageStore_buf_i2(RWByteAddressBuffer out_buf, uint pos, int2 val) { out_buf.Store2(pos*8, uint2(val)); }
void imageStore_buf_i4(RWByteAddressBuffer out_buf, uint pos, int4 val) { out_buf.Store4(pos*16, uint4(val)); }
uvec4 texelFetch(Texture2D<uint4> tex, ivec2 pos, int mip) { return tex.Load(int3(pos, mip)); }
uvec4 textureGather(Texture2D<float4> tex, vec2 st) { return uvec4(tex.Gather(default_sampler, st) * 255.0 + 0.5); }
uvec4 textureGatherOffset(Texture2D<float4> tex, vec2 st, ivec2 offs) { return uvec4(tex.Gather(default_sampler, st, offs) * 255.0 + 0.5); }
bool2 lessThan(uvec2 a, uvec2 b) { return a < b; }
bool2 greaterThan(uvec2 a, uvec2 b) { return a > b; }
#define bufferFetch(buf, offs) buf[offs]
#define texelOrImageFetch(tex, image, pos) (image).Load(int2(pos))
#define imul24(a,b) ((a)*(b))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment