summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/bgfx_compute.sh
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/bgfx_compute.sh')
-rw-r--r--3rdparty/bgfx/src/bgfx_compute.sh374
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 \