diff options
Diffstat (limited to '3rdparty/bgfx/src/bgfx_compute.sh')
-rw-r--r-- | 3rdparty/bgfx/src/bgfx_compute.sh | 374 |
1 files changed, 242 insertions, 132 deletions
diff --git a/3rdparty/bgfx/src/bgfx_compute.sh b/3rdparty/bgfx/src/bgfx_compute.sh index 641dda89a31..902651e9c8c 100644 --- a/3rdparty/bgfx/src/bgfx_compute.sh +++ b/3rdparty/bgfx/src/bgfx_compute.sh @@ -10,105 +10,256 @@ #ifndef __cplusplus -#if BGFX_SHADER_LANGUAGE_HLSL +#if BGFX_SHADER_LANGUAGE_GLSL + +#define SHARED shared + +#define __IMAGE_XX(_name, _format, _reg, _image, _access) \ + layout(_format, binding=_reg) _access uniform highp _image _name + +#define readwrite +#define IMAGE2D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, readonly) +#define UIMAGE2D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, readonly) +#define IMAGE2D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, writeonly) +#define UIMAGE2D_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, writeonly) +#define IMAGE2D_RW( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, readwrite) +#define UIMAGE2D_RW(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, readwrite) + +#define IMAGE2D_ARRAY_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray, readonly) +#define UIMAGE2D_ARRAY_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, readonly) +#define IMAGE2D_ARRAY_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray, writeonly) +#define UIMAGE2D_ARRAY_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, writeonly) +#define IMAGE2D_ARRAY_RW( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray, readwrite) +#define UIMAGE2D_ARRAY_RW(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, readwrite) + +#define IMAGE3D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, readonly) +#define UIMAGE3D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, readonly) +#define IMAGE3D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, writeonly) +#define UIMAGE3D_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, writeonly) +#define IMAGE3D_RW( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, readwrite) +#define UIMAGE3D_RW(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, readwrite) + +#define __BUFFER_XX(_name, _type, _reg, _access) \ + layout(std430, binding=_reg) _access buffer _name ## Buffer \ + { \ + _type _name[]; \ + } + +#define BUFFER_RO(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, readonly) +#define BUFFER_RW(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, readwrite) +#define BUFFER_WR(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, writeonly) + +#define NUM_THREADS(_x, _y, _z) layout (local_size_x = _x, local_size_y = _y, local_size_z = _z) in; + +#else #define SHARED groupshared -#define r32ui uint -#define r32f float -#define rg16f float2 -#define rgba16f float4 -#define rgba8 float4 -#define rgba32f float4 - -#define IMAGE2D_RO( _name, _format, _reg) Texture2D<_format> _name : register(t[_reg]) -#define UIMAGE2D_RO(_name, _format, _reg) Texture2D<_format> _name : register(t[_reg]) -#define IMAGE2D_WR( _name, _format, _reg) RWTexture2D<_format> _name : register(u[_reg]) -#define UIMAGE2D_WR(_name, _format, _reg) RWTexture2D<_format> _name : register(u[_reg]) -#define IMAGE2D_RW( _name, _reg) RWTexture2D<float> _name : register(u[_reg]) -#define UIMAGE2D_RW(_name, _reg) RWTexture2D<uint> _name : register(u[_reg]) - -#define IMAGE2D_ARRAY_RO( _name, _format, _reg) Texture2DArray<_format> _name : register(t[_reg]) -#define UIMAGE2D_ARRAY_RO(_name, _format, _reg) Texture2DArray<_format> _name : register(t[_reg]) -#define IMAGE2D_ARRAY_WR( _name, _format, _reg) RWTexture2DArray<_format> _name : register(u[_reg]) -#define UIMAGE2D_ARRAY_WR(_name, _format, _reg) RWTexture2DArray<_format> _name : register(u[_reg]) -#define IMAGE2D_ARRAY_RW( _name, _reg) RWTexture2DArray<float> _name : register(u[_reg]) -#define UIMAGE2D_ARRAY_RW(_name, _reg) RWTexture2DArray<uint> _name : register(u[_reg]) - -#define IMAGE3D_RO( _name, _format, _reg) Texture3D<_format> _name : register(t[_reg]) -#define UIMAGE3D_RO(_name, _format, _reg) Texture3D<_format> _name : register(t[_reg]) -#define IMAGE3D_WR( _name, _format, _reg) RWTexture3D<_format> _name : register(u[_reg]) -#define UIMAGE3D_WR(_name, _format, _reg) RWTexture3D<_format> _name : register(u[_reg]) -#define IMAGE3D_RW( _name, _reg) RWTexture3D<float> _name : register(u[_reg]) -#define UIMAGE3D_RW(_name, _reg) RWTexture3D<uint> _name : register(u[_reg]) - -#define BUFFER_RO(_name, _struct, _reg) Buffer<_struct> _name : register(t[_reg]) -#define BUFFER_RW(_name, _struct, _reg) RWBuffer<_struct> _name : register(u[_reg]) -#define BUFFER_WR(_name, _struct, _reg) BUFFER_RW(_name, _struct, _reg) +#define r32ui uint +#define rg32ui uint2 +#define rgba32ui uint4 +#define r32f float +#define rg16f float2 +#define rgba16f float4 +#if BGFX_SHADER_LANGUAGE_HLSL +# define rgba8 unorm float4 +#else +# define rgba8 float4 +#endif // BGFX_SHADER_LANGUAGE_HLSL +#define rgba32f float4 -#define NUM_THREADS(_x, _y, _z) [numthreads(_x, _y, _z)] +#define IMAGE2D_RO( _name, _format, _reg) \ + Texture2D<_format> _name ## Texture : REGISTER(t, _reg); \ + static BgfxROImage2D_ ## _format _name = { _name ## Texture } -#define __IMAGE_IMPL(_textureType, _storeComponents, _type, _loadComponents) \ - _type imageLoad( Texture2D<_textureType> _image, ivec2 _uv) { return _image[_uv ]._loadComponents; } \ - _type imageLoad(RWTexture2DArray<_textureType> _image, ivec3 _uvw) { return _image[_uvw ]._loadComponents; } \ - _type imageLoad( Texture3D<_textureType> _image, ivec3 _uvw) { return _image[_uvw]._loadComponents; } \ - _type imageLoad( RWTexture2D<_textureType> _image, ivec2 _uv) { return _image[_uv ]._loadComponents; } \ - _type imageLoad(RWTexture2DArray<_textureType> _image, ivec3 _uvw, _type _value) { return _image[_uvw]._loadComponents; } \ - _type imageLoad( RWTexture3D<_textureType> _image, ivec3 _uvw, _type _value) { return _image[_uvw]._loadComponents; } \ - void imageStore( RWTexture2D<_textureType> _image, ivec2 _uv, _type _value) { _image[_uv ] = _value._storeComponents; } \ - void imageStore(RWTexture2DArray<_textureType> _image, ivec3 _uvw, _type _value) { _image[_uvw] = _value._storeComponents; } \ - void imageStore( RWTexture3D<_textureType> _image, ivec3 _uvw, _type _value) { _image[_uvw] = _value._storeComponents; } - -__IMAGE_IMPL(float, x, vec4, xxxx) -__IMAGE_IMPL(vec2, xy, vec4, xyyy) -__IMAGE_IMPL(vec3, xyz, vec4, xyzz) -__IMAGE_IMPL(vec4, xyzw, vec4, xyzw) -__IMAGE_IMPL(uint, x, uvec4, xxxx) -__IMAGE_IMPL(uvec2, xy, uvec4, xyyy) -__IMAGE_IMPL(uvec3, xyz, uvec4, xyzz) -__IMAGE_IMPL(uvec4, xyzw, uvec4, xyzw) -__IMAGE_IMPL(int, x, ivec4, xxxx) -__IMAGE_IMPL(ivec2, xy, ivec4, xyyy) -__IMAGE_IMPL(ivec3, xyz, ivec4, xyzz) -__IMAGE_IMPL(ivec4, xyzw, ivec4, xyzw) - -ivec2 imageSize(Texture2D _image) -{ - ivec2 result; - _image.GetDimensions(result.x, result.y); - return result; -} +#define UIMAGE2D_RO(_name, _format, _reg) IMAGE2D_RO(_name, _format, _reg) -ivec2 imageSize(Texture2D<uint> _image) -{ - ivec2 result; - _image.GetDimensions(result.x, result.y); - return result; -} +#define IMAGE2D_RW( _name, _format, _reg) \ + RWTexture2D<_format> _name ## Texture : REGISTER(u, _reg); \ + static BgfxRWImage2D_ ## _format _name = { _name ## Texture } -ivec2 imageSize(RWTexture2D<float4> _image) -{ - ivec2 result; - _image.GetDimensions(result.x, result.y); - return result; -} +#define IMAGE2D_WR( _name, _format, _reg) IMAGE2D_RW(_name, _format, _reg) +#define UIMAGE2D_WR(_name, _format, _reg) IMAGE2D_RW(_name, _format, _reg) +#define UIMAGE2D_RW(_name, _format, _reg) IMAGE2D_RW(_name, _format, _reg) -ivec2 imageSize(RWTexture2D<uint> _image) -{ - ivec2 result; - _image.GetDimensions(result.x, result.y); - return result; -} +#define IMAGE2D_ARRAY_RO(_name, _format, _reg) \ + Texture2DArray<_format> _name ## Texture : REGISTER(t, _reg); \ + static BgfxROImage2DArray_ ## _format _name = { _name ## Texture } + +#define UIMAGE2D_ARRAY_RO(_name, _format, _reg) IMAGE2D_ARRAY_RO(_name, _format, _reg) + +#define IMAGE2D_ARRAY_RW(_name, _format, _reg) \ + RWTexture2DArray<_format> _name ## Texture : REGISTER(u, _reg); \ + static BgfxRWImage2DArray_ ## _format _name = { _name ## Texture } + +#define UIMAGE2D_ARRAY_RW(_name, _format, _reg) IMAGE2D_ARRAY_RW(_name, _format, _reg) +#define IMAGE2D_ARRAY_WR( _name, _format, _reg) IMAGE2D_ARRAY_RW(_name, _format, _reg) +#define UIMAGE2D_ARRAY_WR(_name, _format, _reg) IMAGE2D_ARRAY_RW(_name, _format, _reg) + +#define IMAGE3D_RO( _name, _format, _reg) \ + Texture3D<_format> _name ## Texture : REGISTER(t, _reg); \ + static BgfxROImage3D_ ## _format _name = { _name ## Texture } + +#define UIMAGE3D_RO(_name, _format, _reg) IMAGE3D_RO(_name, _format, _reg) + +#define IMAGE3D_RW( _name, _format, _reg) \ + RWTexture3D<_format> _name ## Texture : REGISTER(u, _reg); \ + static BgfxRWImage3D_ ## _format _name = { _name ## Texture } + +#define UIMAGE3D_RW(_name, _format, _reg) IMAGE3D_RW(_name, _format, _reg) +#define IMAGE3D_WR( _name, _format, _reg) IMAGE3D_RW(_name, _format, _reg) +#define UIMAGE3D_WR(_name, _format, _reg) IMAGE3D_RW(_name, _format, _reg) + +#define BUFFER_RO(_name, _struct, _reg) Buffer<_struct> _name : REGISTER(t, _reg) +#define BUFFER_RW(_name, _struct, _reg) RWBuffer<_struct> _name : REGISTER(u, _reg) +#define BUFFER_WR(_name, _struct, _reg) BUFFER_RW(_name, _struct, _reg) + +#define NUM_THREADS(_x, _y, _z) [numthreads(_x, _y, _z)] -#define __ATOMIC_IMPL_TYPE(_genType, _glFunc, _dxFunc) \ - _genType _glFunc(_genType _mem, _genType _data) \ - { \ - _genType result; \ - _dxFunc(_mem, _data, result); \ - return result; \ +#define __IMAGE_IMPL_S(_format, _storeComponents, _type, _loadComponents) \ + \ + struct BgfxROImage2D_ ## _format \ + { \ + Texture2D<_format> m_texture; \ + }; \ + \ + struct BgfxRWImage2D_ ## _format \ + { \ + RWTexture2D<_format> m_texture; \ + }; \ + \ + struct BgfxROImage2DArray_ ## _format \ + { \ + Texture2DArray<_format> m_texture; \ + }; \ + \ + struct BgfxRWImage2DArray_ ## _format \ + { \ + RWTexture2DArray<_format> m_texture; \ + }; \ + \ + struct BgfxROImage3D_ ## _format \ + { \ + Texture3D<_format> m_texture; \ + }; \ + \ + struct BgfxRWImage3D_ ## _format \ + { \ + RWTexture3D<_format> m_texture; \ + }; \ + +#define __IMAGE_IMPL_A(_format, _storeComponents, _type, _loadComponents) \ + __IMAGE_IMPL_S(_format, _storeComponents, _type, _loadComponents) \ + \ + _type imageLoad(BgfxROImage2D_ ## _format _image, ivec2 _uv) \ + { \ + return _image.m_texture[_uv]._loadComponents; \ + } \ + \ + ivec2 imageSize(BgfxROImage2D_ ## _format _image) \ + { \ + uvec2 result; \ + _image.m_texture.GetDimensions(result.x, result.y); \ + return ivec2(result); \ + } \ + \ + _type imageLoad(BgfxRWImage2D_ ## _format _image, ivec2 _uv) \ + { \ + return _image.m_texture[_uv]._loadComponents; \ + } \ + \ + ivec2 imageSize(BgfxRWImage2D_ ## _format _image) \ + { \ + uvec2 result; \ + _image.m_texture.GetDimensions(result.x, result.y); \ + return ivec2(result); \ + } \ + \ + void imageStore(BgfxRWImage2D_ ## _format _image, ivec2 _uv, _type _value) \ + { \ + _image.m_texture[_uv] = _value._storeComponents; \ + } \ + \ + _type imageLoad(BgfxROImage2DArray_ ## _format _image, ivec3 _uvw) \ + { \ + return _image.m_texture[_uvw]._loadComponents; \ + } \ + \ + ivec3 imageSize(BgfxROImage2DArray_ ## _format _image) \ + { \ + uvec3 result; \ + _image.m_texture.GetDimensions(result.x, result.y, result.z); \ + return ivec3(result); \ + } \ + \ + _type imageLoad(BgfxRWImage2DArray_ ## _format _image, ivec3 _uvw) \ + { \ + return _image.m_texture[_uvw]._loadComponents; \ + } \ + \ + void imageStore(BgfxRWImage2DArray_ ## _format _image, ivec3 _uvw, _type _value) \ + { \ + _image.m_texture[_uvw] = _value._storeComponents; \ + } \ + \ + ivec3 imageSize(BgfxRWImage2DArray_ ## _format _image) \ + { \ + uvec3 result; \ + _image.m_texture.GetDimensions(result.x, result.y, result.z); \ + return ivec3(result); \ + } \ + \ + _type imageLoad(BgfxROImage3D_ ## _format _image, ivec3 _uvw) \ + { \ + return _image.m_texture[_uvw]._loadComponents; \ + } \ + \ + ivec3 imageSize(BgfxROImage3D_ ## _format _image) \ + { \ + uvec3 result; \ + _image.m_texture.GetDimensions(result.x, result.y, result.z); \ + return ivec3(result); \ + } \ + \ + _type imageLoad(BgfxRWImage3D_ ## _format _image, ivec3 _uvw) \ + { \ + return _image.m_texture[_uvw]._loadComponents; \ + } \ + \ + ivec3 imageSize(BgfxRWImage3D_ ## _format _image) \ + { \ + uvec3 result; \ + _image.m_texture.GetDimensions(result.x, result.y, result.z); \ + return ivec3(result); \ + } \ + \ + void imageStore(BgfxRWImage3D_ ## _format _image, ivec3 _uvw, _type _value) \ + { \ + _image.m_texture[_uvw] = _value._storeComponents; \ + } + +__IMAGE_IMPL_A(rgba8, xyzw, vec4, xyzw) +__IMAGE_IMPL_A(rg16f, xy, vec4, xyyy) +#if BGFX_SHADER_LANGUAGE_HLSL +__IMAGE_IMPL_S(rgba16f, xyzw, vec4, xyzw) +#else +__IMAGE_IMPL_A(rgba16f, xyzw, vec4, xyzw) +#endif // BGFX_SHADER_LANGUAGE_HLSL +__IMAGE_IMPL_A(r32f, x, vec4, xxxx) +__IMAGE_IMPL_A(rgba32f, xyzw, vec4, xyzw) +__IMAGE_IMPL_A(r32ui, x, uvec4, xxxx) +__IMAGE_IMPL_A(rg32ui, xy, uvec4, xyyy) +__IMAGE_IMPL_A(rgba32ui, xyzw, uvec4, xyzw) + +#define __ATOMIC_IMPL_TYPE(_genType, _glFunc, _dxFunc) \ + _genType _glFunc(inout _genType _mem, _genType _data) \ + { \ + _genType result; \ + _dxFunc(_mem, _data, result); \ + return result; \ } -#define __ATOMIC_IMPL(_glFunc, _dxFunc) \ +#define __ATOMIC_IMPL(_glFunc, _dxFunc) \ __ATOMIC_IMPL_TYPE(int, _glFunc, _dxFunc) \ __ATOMIC_IMPL_TYPE(uint, _glFunc, _dxFunc) @@ -120,14 +271,14 @@ __ATOMIC_IMPL(atomicMin, InterlockedMin); __ATOMIC_IMPL(atomicOr, InterlockedOr); __ATOMIC_IMPL(atomicXor, InterlockedXor); -int atomicCompSwap(int _mem, int _compare, int _data) +int atomicCompSwap(inout int _mem, int _compare, int _data) { int result; InterlockedCompareExchange(_mem, _compare, _data, result); return result; } -uint atomicCompSwap(uint _mem, uint _compare, uint _data) +uint atomicCompSwap(inout uint _mem, uint _compare, uint _data) { uint result; InterlockedCompareExchange(_mem, _compare, _data, result); @@ -144,48 +295,7 @@ uint atomicCompSwap(uint _mem, uint _compare, uint _data) #define memoryBarrierShared() GroupMemoryBarrierWithGroupSync() #define groupMemoryBarrier() GroupMemoryBarrierWithGroupSync() -#else - -#define SHARED shared - -#define __IMAGE_XX(_name, _format, _reg, _image, _access) \ - layout(_format, binding=_reg) _access uniform highp _image _name - -#define readwrite -#define IMAGE2D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, readonly) -#define UIMAGE2D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, readonly) -#define IMAGE2D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, writeonly) -#define UIMAGE2D_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, writeonly) -#define IMAGE2D_RW( _name, _reg) __IMAGE_XX(_name, r32f, _reg, image2D, readwrite) -#define UIMAGE2D_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2D, readwrite) - -#define IMAGE2D_ARRAY_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray, readonly) -#define UIMAGE2D_ARRAY_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, readonly) -#define IMAGE2D_ARRAY_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray, writeonly) -#define UIMAGE2D_ARRAY_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, writeonly) -#define IMAGE2D_ARRAY_RW( _name, _reg) __IMAGE_XX(_name, r32f, _reg, image2DArray, readwrite) -#define UIMAGE2D_ARRAY_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2DArray, readwrite) - -#define IMAGE3D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, readonly) -#define UIMAGE3D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, readonly) -#define IMAGE3D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, writeonly) -#define UIMAGE3D_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, writeonly) -#define IMAGE3D_RW( _name, _reg) __IMAGE_XX(_name, r32f, _reg, image2D, readwrite) -#define UIMAGE3D_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2D, readwrite) - -#define __BUFFER_XX(_name, _type, _reg, _access) \ - layout(std430, binding=_reg) _access buffer _name ## Buffer \ - { \ - _type _name[]; \ - } - -#define BUFFER_RO(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, readonly) -#define BUFFER_RW(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, readwrite) -#define BUFFER_WR(_name, _type, _reg) __BUFFER_XX(_name, _type, _reg, writeonly) - -#define NUM_THREADS(_x, _y, _z) layout (local_size_x = _x, local_size_y = _y, local_size_z = _z) in; - -#endif // BGFX_SHADER_LANGUAGE_HLSL +#endif // BGFX_SHADER_LANGUAGE_GLSL #define dispatchIndirect(_buffer \ , _offset \ |