diff options
Diffstat (limited to '3rdparty/bgfx/examples/08-update/update.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/08-update/update.cpp | 93 |
1 files changed, 68 insertions, 25 deletions
diff --git a/3rdparty/bgfx/examples/08-update/update.cpp b/3rdparty/bgfx/examples/08-update/update.cpp index e919fc6eafe..13f9d5bc180 100644 --- a/3rdparty/bgfx/examples/08-update/update.cpp +++ b/3rdparty/bgfx/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_numTextures3d = 0; if (m_texture3DSupported) { @@ -186,17 +187,17 @@ public: if (0 != (BGFX_CAPS_FORMAT_TEXTURE_2D & caps->formats[bgfx::TextureFormat::R8]) ) { - m_textures3d[m_numm_textures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R8, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem8); + m_textures3d[m_numTextures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R8, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem8); } if (0 != (BGFX_CAPS_FORMAT_TEXTURE_2D & caps->formats[bgfx::TextureFormat::R16F]) ) { - m_textures3d[m_numm_textures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R16F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem16f); + m_textures3d[m_numTextures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R16F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem16f); } if (0 != (BGFX_CAPS_FORMAT_TEXTURE_2D & caps->formats[bgfx::TextureFormat::R32F]) ) { - m_textures3d[m_numm_textures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R32F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem32f); + m_textures3d[m_numTextures3d++] = bgfx::createTexture3D(32, 32, 32, false, bgfx::TextureFormat::R32F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem32f); } } @@ -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<BX_COUNTOF( m_textureCube ); ++ii) + { + m_textureCube[ii].idx = bgfx::invalidHandle; + } + m_textureCube[0] = bgfx::createTextureCube( textureside , false @@ -241,6 +253,17 @@ public: ); } + if (m_computeSupported) + { + m_textureCube[2] = bgfx::createTextureCube( + textureside + , false + , 1 + , bgfx::TextureFormat::RGBA8 + , BGFX_TEXTURE_COMPUTE_WRITE + ); + } + m_texture2d = bgfx::createTexture2D( texture2dSize , texture2dSize @@ -278,17 +301,21 @@ public: bgfx::destroyTexture(m_textures[ii]); } - for (uint32_t ii = 0; ii < m_numm_textures3d; ++ii) + for (uint32_t ii = 0; ii < m_numTextures3d; ++ii) { bgfx::destroyTexture(m_textures3d[ii]); } bgfx::destroyTexture(m_texture2d); - bgfx::destroyTexture(m_textureCube[0]); - if (m_blitSupported) + + for (uint32_t ii = 0; ii<BX_COUNTOF(m_textureCube); ++ii) { - bgfx::destroyTexture(m_textureCube[1]); + if (bgfx::isValid(m_textureCube[ii])) + { + bgfx::destroyTexture(m_textureCube[ii]); + } } + bgfx::destroyIndexBuffer(m_ibh); bgfx::destroyVertexBuffer(m_vbh); if (bgfx::isValid(m_program3d) ) @@ -296,6 +323,10 @@ public: bgfx::destroyProgram(m_program3d); } bgfx::destroyProgram(m_programCmp); + if (bgfx::isValid(m_programCompute) ) + { + bgfx::destroyProgram(m_programCompute); + } bgfx::destroyProgram(m_program); bgfx::destroyUniform(u_time); bgfx::destroyUniform(s_texColor); @@ -426,26 +457,36 @@ public: // Set view and projection matrix for view 0. bgfx::setViewTransform(0, view, proj); - for (uint32_t ii = 0; ii < 1 + uint32_t(m_blitSupported); ++ii) + // Update texturecube using compute shader + if (bgfx::isValid(m_programCompute) ) { - float mtx[16]; - bx::mtxSRT(mtx, 1.0f, 1.0f, 1.0f, time, time*0.37f, 0.0f, -1.5f*m_blitSupported + ii*3.0f, 0.0f, 0.0f); + bgfx::setImage(0, s_texCube, m_textureCube[2], 0, bgfx::Access::Write); + bgfx::dispatch(0, m_programCompute, textureside/16, textureside/16); + } - // Set model matrix for rendering. - bgfx::setTransform(mtx); + for (uint32_t ii = 0; ii < BX_COUNTOF(m_textureCube); ++ii) + { + if (bgfx::isValid(m_textureCube[ii])) + { + float mtx[16]; + bx::mtxSRT( mtx, 0.7f, 0.7f, 0.7f, time, time*0.37f, 0.0f, -2.0f +ii*2.0f, 0.0f, 0.0f ); - // Set vertex and index buffer. - bgfx::setVertexBuffer(m_vbh); - bgfx::setIndexBuffer(m_ibh); + // Set model matrix for rendering. + bgfx::setTransform( mtx ); - // Bind texture. - bgfx::setTexture(0, s_texCube, m_textureCube[ii]); + // Set vertex and index buffer. + bgfx::setVertexBuffer( m_vbh ); + bgfx::setIndexBuffer( m_ibh ); - // Set render states. - bgfx::setState(BGFX_STATE_DEFAULT); + // Bind texture. + bgfx::setTexture( 0, s_texCube, m_textureCube[ii] ); + + // Set render states. + bgfx::setState( BGFX_STATE_DEFAULT ); - // Submit primitive for rendering to view 0. - bgfx::submit(0, m_program); + // Submit primitive for rendering to view 0. + bgfx::submit( 0, m_program ); + } } // Set view and projection matrix for view 1. @@ -496,7 +537,7 @@ public: bgfx::submit(1, m_programCmp); } - for (uint32_t ii = 0; ii < m_numm_textures3d; ++ii) + for (uint32_t ii = 0; ii < m_numTextures3d; ++ii) { bx::mtxTranslate(mtx, xpos + ii*2.1f, -size+6.5f, 0.0f); @@ -554,9 +595,10 @@ public: uint32_t m_debug; uint32_t m_reset; - uint32_t m_numm_textures3d; + uint32_t m_numTextures3d; bool m_texture3DSupported; bool m_blitSupported; + bool m_computeSupported; std::list<PackCube> 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; |