From f5ec9cae37ecbcdd7fd4f275f3476d1a20d78ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 24 Aug 2016 17:09:46 -0700 Subject: [PATCH] D3D12: Added support for texture array. --- src/renderer_d3d12.cpp | 82 ++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index b0da04a61..08773c597 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -1008,6 +1008,8 @@ namespace bgfx { namespace d3d12 | BGFX_CAPS_TEXTURE_READ_BACK | BGFX_CAPS_OCCLUSION_QUERY | BGFX_CAPS_ALPHA_TO_COVERAGE + | BGFX_CAPS_TEXTURE_2D_ARRAY + | BGFX_CAPS_TEXTURE_CUBE_ARRAY ); g_caps.maxTextureSize = 16384; g_caps.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) ); @@ -3961,6 +3963,7 @@ data.NumQualityLevels = 0; const ImageBlockInfo& blockInfo = getBlockInfo(TextureFormat::Enum(imageContainer.m_format) ); const uint32_t textureWidth = bx::uint32_max(blockInfo.blockWidth, imageContainer.m_width >>startLod); const uint32_t textureHeight = bx::uint32_max(blockInfo.blockHeight, imageContainer.m_height>>startLod); + const uint16_t numLayers = imageContainer.m_numLayers; m_flags = _flags; m_width = textureWidth; @@ -3985,9 +3988,8 @@ data.NumQualityLevels = 0; } m_numMips = numMips; - const uint16_t numSides = imageContainer.m_cubeMap ? 6 : 1; - - uint32_t numSrd = numMips*numSides; + const uint16_t numSides = numLayers * (imageContainer.m_cubeMap ? 6 : 1); + const uint32_t numSrd = numSides * numMips; D3D12_SUBRESOURCE_DATA* srd = (D3D12_SUBRESOURCE_DATA*)alloca(numSrd*sizeof(D3D12_SUBRESOURCE_DATA) ); uint32_t kk = 0; @@ -4185,15 +4187,63 @@ data.NumQualityLevels = 0; switch (m_type) { case Texture2D: + case TextureCube: resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - m_srvd.ViewDimension = 1 < msaa.Count ? D3D12_SRV_DIMENSION_TEXTURE2DMS : D3D12_SRV_DIMENSION_TEXTURE2D; - m_srvd.Texture2D.MostDetailedMip = 0; - m_srvd.Texture2D.MipLevels = numMips; - m_srvd.Texture2D.ResourceMinLODClamp = 0.0f; + if (imageContainer.m_cubeMap) + { + if (1 < numLayers) + { + m_srvd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY; + m_srvd.TextureCubeArray.MostDetailedMip = 0; + m_srvd.TextureCubeArray.MipLevels = numMips; + m_srvd.TextureCubeArray.ResourceMinLODClamp = 0.0f; + m_srvd.TextureCubeArray.NumCubes = numLayers; + } + else + { + m_srvd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE; + m_srvd.TextureCube.MostDetailedMip = 0; + m_srvd.TextureCube.MipLevels = numMips; + m_srvd.TextureCube.ResourceMinLODClamp = 0.0f; + } + } + else + { + if (1 < numLayers) + { + m_srvd.ViewDimension = 1 < msaa.Count + ? D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY + : D3D12_SRV_DIMENSION_TEXTURE2DARRAY + ; + m_srvd.Texture2DArray.MostDetailedMip = 0; + m_srvd.Texture2DArray.MipLevels = numMips; + m_srvd.Texture2DArray.ResourceMinLODClamp = 0.0f; + m_srvd.Texture2DArray.ArraySize = numLayers; + } + else + { + m_srvd.ViewDimension = 1 < msaa.Count + ? D3D12_SRV_DIMENSION_TEXTURE2DMS + : D3D12_SRV_DIMENSION_TEXTURE2D + ; + m_srvd.Texture2D.MostDetailedMip = 0; + m_srvd.Texture2D.MipLevels = numMips; + m_srvd.Texture2D.ResourceMinLODClamp = 0.0f; + } + } - m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - m_uavd.Texture2D.MipSlice = 0; - m_uavd.Texture2D.PlaneSlice = 0; + if (1 < numLayers) + { + m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; + m_uavd.Texture2DArray.MipSlice = 0; + m_uavd.Texture2DArray.PlaneSlice = 0; + } + else + { + m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; + m_uavd.Texture2D.MipSlice = 0; + m_uavd.Texture2D.PlaneSlice = 0; + } break; case Texture3D: @@ -4208,18 +4258,6 @@ data.NumQualityLevels = 0; m_uavd.Texture3D.FirstWSlice = 0; m_uavd.Texture3D.WSize = 0; break; - - case TextureCube: - resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - m_srvd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE; - m_srvd.TextureCube.MostDetailedMip = 0; - m_srvd.TextureCube.MipLevels = numMips; - m_srvd.TextureCube.ResourceMinLODClamp = 0.0f; - - m_uavd.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - m_uavd.Texture2D.MipSlice = 0; - m_uavd.Texture2D.PlaneSlice = 0; - break; } m_ptr = createCommittedResource(device, HeapProperty::Default, &resourceDesc, clearValue);