diff --git a/examples/08-update/update.cpp b/examples/08-update/update.cpp index e335790ef..26da1b6fa 100644 --- a/examples/08-update/update.cpp +++ b/examples/08-update/update.cpp @@ -154,11 +154,11 @@ bgfx::TextureHandle loadTextureWithUpdate(const char* _filePath, uint64_t _flags if (NULL != imageContainer) { BX_ASSERT(!imageContainer->m_cubeMap, "Cubemap Texture loading not supported"); - BX_ASSERT(1 >= imageContainer->m_depth, "3D Texture loading not supported"); + BX_ASSERT(!bimg::isVolume(*imageContainer), "3D Texture loading not supported"); BX_ASSERT(1 == imageContainer->m_numLayers, "Texture Layer loading not supported"); if (!imageContainer->m_cubeMap - && 1 >= imageContainer->m_depth + && !bimg::isVolume(*imageContainer) && 1 == imageContainer->m_numLayers && bgfx::isTextureValid(0, false, imageContainer->m_numLayers, bgfx::TextureFormat::Enum(imageContainer->m_format), _flags) ) diff --git a/examples/47-pixelformats/pixelformats.cpp b/examples/47-pixelformats/pixelformats.cpp index 2a996bdc8..a9c1eba8c 100644 --- a/examples/47-pixelformats/pixelformats.cpp +++ b/examples/47-pixelformats/pixelformats.cpp @@ -118,7 +118,7 @@ static bimg::ImageContainer* generateHueWheelImage() bimg::TextureFormat::RGBA32F, kTextureSize, kTextureSize, - 1, + 0, 1, false, false, diff --git a/examples/common/bgfx_utils.cpp b/examples/common/bgfx_utils.cpp index 65e469bb2..764633d54 100644 --- a/examples/common/bgfx_utils.cpp +++ b/examples/common/bgfx_utils.cpp @@ -224,7 +224,7 @@ bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const bx::FilePath& _f , mem ); } - else if (1 < imageContainer->m_depth) + else if (bimg::isVolume(*imageContainer) ) { handle = bgfx::createTexture3D( uint16_t(imageContainer->m_width) diff --git a/src/bgfx.cpp b/src/bgfx.cpp index fde901605..5b222e91e 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -2184,7 +2184,7 @@ namespace bgfx && 0 != (formatCaps & BGFX_CAPS_FORMAT_TEXTURE_CUBE_EMULATED) ; } - else if (_imageContainer.m_depth > 1) + else if (isVolume(_imageContainer) ) { convert |= 0 == (formatCaps & BGFX_CAPS_FORMAT_TEXTURE_3D) && 0 != (formatCaps & BGFX_CAPS_FORMAT_TEXTURE_3D_EMULATED) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index c791997a8..dbff41d73 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -618,6 +618,8 @@ namespace bgfx } }; + using bimg::isVolume; + void setGraphicsDebuggerPresent(bool _present); bool isGraphicsDebuggerPresent(); void release(const Memory* _mem); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 55dd09056..4a9281ac4 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -4503,11 +4503,13 @@ namespace bgfx { namespace d3d11 } } - static ID3D11Texture2D* zeroInitTile(DXGI_FORMAT _fmt, uint32_t _tileDim, uint32_t _blockW, uint32_t _blockH, uint32_t _blockSize) + static ID3D11Resource* zeroInitTile(DXGI_FORMAT _fmt, uint32_t _tileDim, uint32_t _blockW, uint32_t _blockH, uint32_t _blockSize, bool _volume) { - if (IUnknown** cached = s_renderD3D11->m_zeroInitTileCache.find(uint64_t(_fmt) ) ) + const uint64_t key = uint64_t(_fmt) | (_volume ? UINT64_C(0x100000000) : 0); + + if (IUnknown** cached = s_renderD3D11->m_zeroInitTileCache.find(key) ) { - return static_cast(*cached); + return static_cast(*cached); } const uint32_t rowPitch = (_tileDim / _blockW) * _blockSize; @@ -4515,24 +4517,47 @@ namespace bgfx { namespace d3d11 uint8_t zeros[kTextureZeroInitBudget] = {}; BX_ASSERT(rowPitch * numRows <= sizeof(zeros), "Zero-init tile exceeds budget."); - D3D11_TEXTURE2D_DESC desc; - bx::memSet(&desc, 0, sizeof(desc) ); - desc.Width = _tileDim; - desc.Height = _tileDim; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = _fmt; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - D3D11_SUBRESOURCE_DATA srd = { zeros, rowPitch, 0 }; + D3D11_SUBRESOURCE_DATA srd = { zeros, rowPitch, rowPitch * numRows }; - ID3D11Texture2D* tile = NULL; - s_renderD3D11->m_device->CreateTexture2D(&desc, &srd, &tile); + ID3D11Resource* tile = NULL; + + if (_volume) + { + D3D11_TEXTURE3D_DESC desc; + bx::memSet(&desc, 0, sizeof(desc) ); + desc.Width = _tileDim; + desc.Height = _tileDim; + desc.Depth = 1; + desc.MipLevels = 1; + desc.Format = _fmt; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + ID3D11Texture3D* volumeTile = NULL; + s_renderD3D11->m_device->CreateTexture3D(&desc, &srd, &volumeTile); + tile = volumeTile; + } + else + { + D3D11_TEXTURE2D_DESC desc; + bx::memSet(&desc, 0, sizeof(desc) ); + desc.Width = _tileDim; + desc.Height = _tileDim; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = _fmt; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + ID3D11Texture2D* planeTile = NULL; + s_renderD3D11->m_device->CreateTexture2D(&desc, &srd, &planeTile); + tile = planeTile; + } if (NULL != tile) { - s_renderD3D11->m_zeroInitTileCache.add(uint64_t(_fmt), tile, 0); + s_renderD3D11->m_zeroInitTileCache.add(key, tile, 0); } return tile; @@ -4600,7 +4625,7 @@ namespace bgfx { namespace d3d11 const uint32_t blockSize = bi.blockSize; const uint32_t tileDim = textureZeroInitTileDim(bimg::getBitsPerPixel(tf) ); - ID3D11Texture2D* tile = zeroInitTile(fmt, tileDim, blockW, blockH, blockSize); + ID3D11Resource* tile = zeroInitTile(fmt, tileDim, blockW, blockH, blockSize, is3D); if (NULL == tile) { return; @@ -4673,7 +4698,7 @@ namespace bgfx { namespace d3d11 { m_type = TextureCube; } - else if (imageContainer.m_depth > 1) + else if (isVolume(imageContainer) ) { m_type = Texture3D; } diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 11313d8b1..91650e301 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -6094,7 +6094,7 @@ namespace bgfx { namespace d3d12 { m_type = TextureCube; } - else if (imageContainer.m_depth > 1) + else if (isVolume(imageContainer) ) { m_type = Texture3D; } diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 1c13174af..187a4c28b 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -6004,7 +6004,7 @@ namespace bgfx { namespace gl { target = GL_TEXTURE_CUBE_MAP; } - else if (imageContainer.m_depth > 1) + else if (isVolume(imageContainer) ) { target = GL_TEXTURE_3D; } @@ -6065,7 +6065,7 @@ namespace bgfx { namespace gl ; BX_TRACE("Texture%-4s %3d: %s %s(requested: %s), layers %d, %dx%dx%d%s." - , imageContainer.m_cubeMap ? "Cube" : (1 < imageContainer.m_depth ? "3D" : "2D") + , imageContainer.m_cubeMap ? "Cube" : (isVolume(imageContainer) ? "3D" : "2D") , this - s_renderGL->m_textures , getName( (TextureFormat::Enum)m_textureFormat) , srgb ? "+sRGB " : "" @@ -6073,7 +6073,7 @@ namespace bgfx { namespace gl , ti.numLayers , ti.width , ti.height - , imageContainer.m_cubeMap ? 6 : (1 < imageContainer.m_depth ? imageContainer.m_depth : 0) + , imageContainer.m_cubeMap ? 6 : (isVolume(imageContainer) ? imageContainer.m_depth : 0) , 0 != (m_flags&BGFX_TEXTURE_RT_MASK) ? " (render target)" : "" ); @@ -6107,7 +6107,7 @@ namespace bgfx { namespace gl { width = bx::max(1, width); height = bx::max(1, height); - depth = 1 < imageContainer.m_depth + depth = isVolume(imageContainer) ? bx::max(1, depth) : side ; diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index 85b919cdb..a299df724 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -3800,7 +3800,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames desc->setTextureType(MTL::TextureTypeCube); m_type = TextureCube; } - else if (1 < imageContainer.m_depth) + else if (isVolume(imageContainer) ) { desc->setTextureType(MTL::TextureType3D); m_type = Texture3D; diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 25d1c1dfa..61fba36ff 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -6805,7 +6805,7 @@ VK_DESTROY : VK_IMAGE_VIEW_TYPE_CUBE ; } - else if (imageContainer.m_depth > 1) + else if (isVolume(imageContainer) ) { m_type = VK_IMAGE_VIEW_TYPE_3D; } diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index 3a17bfd40..e43446d86 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -4007,7 +4007,7 @@ WGPU_IMPORT ; depthOrArrayLayers = 6; } - else if (imageContainer.m_depth > 1) + else if (isVolume(imageContainer) ) { m_type = Texture3D; m_viewDimension = WGPUTextureViewDimension_3D;