Преглед изворни кода

D3D12: Added support for texture array.

Branimir Karadžić пре 9 година
родитељ
комит
f5ec9cae37
1 измењених фајлова са 61 додато и 23 уклоњено
  1. 61 23
      src/renderer_d3d12.cpp

+ 61 - 23
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;
-
-				m_uavd.ViewDimension        = D3D12_UAV_DIMENSION_TEXTURE2D;
-				m_uavd.Texture2D.MipSlice   = 0;
-				m_uavd.Texture2D.PlaneSlice = 0;
+				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;
+					}
+				}
+
+				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);