diff --git a/examples/08-update/cs_update.sc b/examples/08-update/cs_update.sc new file mode 100644 index 000000000..2599a92c5 --- /dev/null +++ b/examples/08-update/cs_update.sc @@ -0,0 +1,32 @@ +/* + * Copyright 2014 Stanlo Slasinski. All rights reserved. + * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause + */ + +#include "bgfx_compute.sh" + +IMAGE2D_ARRAY_WR(s_texColor,rgba32f,0); +uniform vec4 u_time; + +NUM_THREADS(16, 16, 1) +void main() +{ + vec3 colors[] = { + vec3(1,0,0), + vec3(1,1,0), + vec3(1,0,1), + vec3(0,1,0), + vec3(0,1,1), + vec3(0,0,1), + }; + + for (int face=0;face<6;face++) + { + vec3 color = colors[face]*0.75 + sin( u_time.x*4.0 )*0.25; + ivec3 dest = ivec3( gl_GlobalInvocationID.xy, face ); + imageStore( s_texColor, dest, vec4(color,1) ); + } +} + + + diff --git a/examples/08-update/update.cpp b/examples/08-update/update.cpp index e919fc6ea..1cbf32105 100644 --- a/examples/08-update/update.cpp +++ b/examples/08-update/update.cpp @@ -162,7 +162,8 @@ public: const bgfx::Caps* caps = bgfx::getCaps(); m_texture3DSupported = !!(caps->supported & BGFX_CAPS_TEXTURE_3D); m_blitSupported = !!(caps->supported & BGFX_CAPS_TEXTURE_BLIT); - m_numm_textures3d = 0; + m_computeSupported = !!(caps->supported & BGFX_CAPS_COMPUTE); + m_numm_textures3d = 0; if (m_texture3DSupported) { @@ -215,6 +216,12 @@ public: m_program3d = loadProgram("vs_update", "fs_update_3d"); } + m_programCompute.idx = bgfx::invalidHandle; + if (m_computeSupported) + { + m_programCompute = bgfx::createProgram( loadShader( "cs_update" ), true ); + } + // Create texture sampler uniforms. s_texCube = bgfx::createUniform("s_texCube", bgfx::UniformType::Int1); s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1); @@ -222,6 +229,11 @@ public: // Create time uniform. u_time = bgfx::createUniform("u_time", bgfx::UniformType::Vec4); + for(uint32_t ii = 0; ii m_quads; RectPackCubeT<256> m_cube; @@ -573,11 +615,12 @@ public: bgfx::TextureHandle m_textures[9]; bgfx::TextureHandle m_textures3d[3]; bgfx::TextureHandle m_texture2d; - bgfx::TextureHandle m_textureCube[2]; + bgfx::TextureHandle m_textureCube[3]; bgfx::IndexBufferHandle m_ibh; bgfx::VertexBufferHandle m_vbh; bgfx::ProgramHandle m_program3d; bgfx::ProgramHandle m_programCmp; + bgfx::ProgramHandle m_programCompute; bgfx::ProgramHandle m_program; bgfx::UniformHandle u_time; bgfx::UniformHandle s_texColor; diff --git a/examples/runtime/shaders/dx11/cs_update.bin b/examples/runtime/shaders/dx11/cs_update.bin new file mode 100644 index 000000000..1b77e9e74 Binary files /dev/null and b/examples/runtime/shaders/dx11/cs_update.bin differ diff --git a/examples/runtime/shaders/glsl/cs_update.bin b/examples/runtime/shaders/glsl/cs_update.bin new file mode 100644 index 000000000..0c75741ce Binary files /dev/null and b/examples/runtime/shaders/glsl/cs_update.bin differ diff --git a/src/bgfx_compute.sh b/src/bgfx_compute.sh index 32cdac319..f6dd7541f 100644 --- a/src/bgfx_compute.sh +++ b/src/bgfx_compute.sh @@ -19,6 +19,7 @@ #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]) @@ -27,6 +28,13 @@ #define IMAGE2D_RW( _name, _reg) RWTexture2D _name : register(u[_reg]) #define UIMAGE2D_RW(_name, _reg) RWTexture2D _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 _name : register(u[_reg]) +#define UIMAGE2D_ARRAY_RW(_name, _reg) RWTexture2DArray _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]) @@ -41,12 +49,15 @@ #define NUM_THREADS(_x, _y, _z) [numthreads(_x, _y, _z)] #define __IMAGE_IMPL(_textureType, _storeComponents, _type, _loadComponents) \ - _type imageLoad( Texture2D<_textureType> _image, ivec2 _uv) { return _image[_uv ]._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(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(RWTexture3D<_textureType> _image, ivec3 _uvw, _type _value) { _image[_uvw] = _value._storeComponents; } + _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) @@ -148,6 +159,13 @@ uint atomicCompSwap(uint _mem, uint _compare, uint _data) #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) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 4e5075576..c76fdda2c 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -3088,11 +3088,17 @@ BX_PRAGMA_DIAGNOSTIC_POP(); switch (texture.m_type) { case TextureD3D11::Texture2D: - case TextureD3D11::TextureCube: desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; desc.Texture2D.MipSlice = _mip; break; + case TextureD3D11::TextureCube: + desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY; + desc.Texture2DArray.ArraySize = 6; + desc.Texture2DArray.FirstArraySlice = 0; + desc.Texture2DArray.MipSlice = _mip; + break; + case TextureD3D11::Texture3D: desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; desc.Texture3D.MipSlice = _mip; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 7899c4ed1..4b0d22426 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -3012,6 +3012,7 @@ data.NumQualityLevels = 0; D3D12_UNORDERED_ACCESS_VIEW_DESC tmpUavd; D3D12_UNORDERED_ACCESS_VIEW_DESC* uavd = &_texture.m_uavd; + if (0 != _mip) { memcpy(&tmpUavd, uavd, sizeof(tmpUavd) ); @@ -3024,6 +3025,10 @@ data.NumQualityLevels = 0; uavd->Texture2D.MipSlice = _mip; uavd->Texture2D.PlaneSlice = 0; break; + case D3D12_UAV_DIMENSION_TEXTURE2DARRAY: + uavd->Texture2DArray.MipSlice = _mip; + uavd->Texture2DArray.PlaneSlice = 0; + break; case D3D12_UAV_DIMENSION_TEXTURE3D: uavd->Texture3D.MipSlice = _mip; @@ -4239,6 +4244,14 @@ data.NumQualityLevels = 0; m_uavd.Texture2D.MipSlice = 0; m_uavd.Texture2D.PlaneSlice = 0; } + + if( m_type==TextureCube ) + { + m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; + m_uavd.Texture2DArray.MipSlice = 0; + m_uavd.Texture2DArray.ArraySize = 6; + } + break; case Texture3D: diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 9351d1fd9..07cfa44e1 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3763,6 +3763,7 @@ namespace bgfx { namespace gl GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_1D); GLSL_TYPE(GL_IMAGE_2D); + GLSL_TYPE(GL_IMAGE_2D_ARRAY); GLSL_TYPE(GL_INT_IMAGE_2D); GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_2D); @@ -3860,6 +3861,7 @@ namespace bgfx { namespace gl case GL_UNSIGNED_INT_IMAGE_1D: case GL_IMAGE_2D: + case GL_IMAGE_2D_ARRAY: case GL_INT_IMAGE_2D: case GL_UNSIGNED_INT_IMAGE_2D: @@ -6389,7 +6391,7 @@ namespace bgfx { namespace gl GL_CHECK(glBindImageTexture(ii , texture.m_id , bind.m_un.m_compute.m_mip - , GL_FALSE + , texture.isCubeMap()?GL_TRUE:GL_FALSE , 0 , s_access[bind.m_un.m_compute.m_access] , s_imageFormat[bind.m_un.m_compute.m_format])