summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/DXTexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/D3D/DXTexture.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/DXTexture.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/Source/Core/VideoBackends/D3D/DXTexture.cpp b/Source/Core/VideoBackends/D3D/DXTexture.cpp
index 7a260eae4a..5d791b5246 100644
--- a/Source/Core/VideoBackends/D3D/DXTexture.cpp
+++ b/Source/Core/VideoBackends/D3D/DXTexture.cpp
@@ -45,9 +45,10 @@ std::unique_ptr<DXTexture> DXTexture::Create(const TextureConfig& config, std::s
if (config.IsComputeImage())
bindflags |= D3D11_BIND_UNORDERED_ACCESS;
- CD3D11_TEXTURE2D_DESC desc(tex_format, config.width, config.height, config.layers, config.levels,
- bindflags, D3D11_USAGE_DEFAULT, 0, config.samples, 0,
- config.IsCubeMap() ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0);
+ CD3D11_TEXTURE2D_DESC desc(
+ tex_format, config.width, config.height, config.layers, config.levels, bindflags,
+ D3D11_USAGE_DEFAULT, 0, config.samples, 0,
+ config.type == AbstractTextureType::Texture_CubeMap ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0);
ComPtr<ID3D11Texture2D> d3d_texture;
HRESULT hr = D3D::device->CreateTexture2D(&desc, nullptr, d3d_texture.GetAddressOf());
if (FAILED(hr))
@@ -72,7 +73,8 @@ std::unique_ptr<DXTexture> DXTexture::CreateAdopted(ComPtr<ID3D11Texture2D> text
// Convert to our texture config format.
TextureConfig config(desc.Width, desc.Height, desc.MipLevels, desc.ArraySize,
desc.SampleDesc.Count,
- D3DCommon::GetAbstractFormatForDXGIFormat(desc.Format), 0);
+ D3DCommon::GetAbstractFormatForDXGIFormat(desc.Format), 0,
+ AbstractTextureType::Texture_2DArray);
if (desc.BindFlags & D3D11_BIND_RENDER_TARGET)
config.flags |= AbstractTextureFlag_RenderTarget;
if (desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS)
@@ -89,13 +91,33 @@ std::unique_ptr<DXTexture> DXTexture::CreateAdopted(ComPtr<ID3D11Texture2D> text
bool DXTexture::CreateSRV()
{
+ D3D_SRV_DIMENSION dimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY;
+ if (m_config.type == AbstractTextureType::Texture_2DArray)
+ {
+ if (m_config.IsMultisampled())
+ dimension = D3D_SRV_DIMENSION_TEXTURE2DMSARRAY;
+ else
+ dimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY;
+ }
+ else if (m_config.type == AbstractTextureType::Texture_2D)
+ {
+ if (m_config.IsMultisampled())
+ dimension = D3D_SRV_DIMENSION_TEXTURE2DMS;
+ else
+ dimension = D3D_SRV_DIMENSION_TEXTURE2D;
+ }
+ else if (m_config.type == AbstractTextureType::Texture_CubeMap)
+ {
+ dimension = D3D_SRV_DIMENSION_TEXTURECUBE;
+ }
+ else
+ {
+ PanicAlertFmt("Failed to create D3D SRV - unhandled type");
+ return false;
+ }
const CD3D11_SHADER_RESOURCE_VIEW_DESC desc(
- m_texture.Get(),
- m_config.IsCubeMap() ? D3D11_SRV_DIMENSION_TEXTURECUBE :
- m_config.IsMultisampled() ? D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY :
- D3D11_SRV_DIMENSION_TEXTURE2DARRAY,
- D3DCommon::GetSRVFormatForAbstractFormat(m_config.format), 0, m_config.levels, 0,
- m_config.layers);
+ m_texture.Get(), dimension, D3DCommon::GetSRVFormatForAbstractFormat(m_config.format), 0,
+ m_config.levels, 0, m_config.layers);
DEBUG_ASSERT(!m_srv);
HRESULT hr = D3D::device->CreateShaderResourceView(m_texture.Get(), &desc, m_srv.GetAddressOf());
if (FAILED(hr))