|
|
@@ -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);
|