From 67d1cce8f86d7fb6fa5ae99acf701d52afdf760e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Thu, 11 Nov 2021 15:46:29 -0800 Subject: [PATCH] D3D1x: Fixed update surface size when texture is transcoded. --- src/renderer_d3d11.cpp | 6 +++++- src/renderer_d3d12.cpp | 20 +++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 863338c7a..e8b55bbcd 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -4751,9 +4751,10 @@ namespace bgfx { namespace d3d11 uint32_t rectpitch = _rect.m_width*bpp/8; if (bimg::isCompressed(bimg::TextureFormat::Enum(m_textureFormat))) { - const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(m_textureFormat)); + const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(m_textureFormat) ); rectpitch = (_rect.m_width / blockInfo.blockWidth)*blockInfo.blockSize; } + const uint32_t srcpitch = UINT16_MAX == _pitch ? rectpitch : _pitch; const uint32_t slicepitch = rectpitch*_rect.m_height; @@ -4767,6 +4768,9 @@ namespace bgfx { namespace d3d11 temp = (uint8_t*)BX_ALLOC(g_allocator, slicepitch); bimg::imageDecodeToBgra8(g_allocator, temp, data, _rect.m_width, _rect.m_height, srcpitch, bimg::TextureFormat::Enum(m_requestedFormat) ); data = temp; + + box.right = bx::max(1u, m_width >> _mip); + box.bottom = bx::max(1u, m_height >> _mip); } deviceCtx->UpdateSubresource( diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 2da26569e..18b5fb9c4 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -5105,6 +5105,14 @@ namespace bgfx { namespace d3d12 const bool convert = m_textureFormat != m_requestedFormat; + D3D12_BOX box; + box.left = 0; + box.top = 0; + box.right = box.left + _rect.m_width; + box.bottom = box.top + _rect.m_height; + box.front = _z; + box.back = _z + _depth; + uint8_t* srcData = _mem->data; uint8_t* temp = NULL; @@ -5113,8 +5121,10 @@ namespace bgfx { namespace d3d12 temp = (uint8_t*)BX_ALLOC(g_allocator, slicepitch); bimg::imageDecodeToBgra8(g_allocator, temp, srcData, _rect.m_width, _rect.m_height, srcpitch, bimg::TextureFormat::Enum(m_requestedFormat)); srcData = temp; - } + box.right = bx::max(1u, m_width >> _mip); + box.bottom = bx::max(1u, m_height >> _mip); + } D3D12_RESOURCE_DESC desc = getResourceDesc(m_ptr); @@ -5155,14 +5165,6 @@ namespace bgfx { namespace d3d12 D3D12_RANGE writeRange = { 0, numRows*rowPitch }; staging->Unmap(0, &writeRange); - D3D12_BOX box; - box.left = 0; - box.top = 0; - box.right = box.left + _rect.m_width; - box.bottom = box.top + _rect.m_height; - box.front = _z; - box.back = _z+_depth; - D3D12_TEXTURE_COPY_LOCATION dst = { m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, { } }; dst.SubresourceIndex = subres; D3D12_TEXTURE_COPY_LOCATION src = { staging, D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, { layout } };