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 1fc57a474..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]) @@ -153,12 +154,18 @@ uint atomicCompSwap(uint _mem, uint _compare, uint _data) #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) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index b13398941..2923acf5c 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3754,6 +3754,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); @@ -3851,6 +3852,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: @@ -6356,7 +6358,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])