From 905d69e77b2b7e8285c6d2cb35962555ee04a516 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 17 Jan 2020 11:54:41 +0100 Subject: [PATCH] [d3d9] Don't pass format mapping to D3D9CommonTexture Instead, infer it from the format. This is basically being done already, however the mapping we pass in is not correct if the image format is Unknown. --- src/d3d9/d3d9_common_texture.cpp | 15 +++++++------- src/d3d9/d3d9_common_texture.h | 6 ++---- src/d3d9/d3d9_device.cpp | 35 +++++++++++++------------------- src/d3d9/d3d9_surface.cpp | 5 ++--- src/d3d9/d3d9_surface.h | 3 +-- src/d3d9/d3d9_swapchain.cpp | 4 +--- src/d3d9/d3d9_texture.cpp | 15 ++++++-------- src/d3d9/d3d9_texture.h | 14 +++++-------- src/d3d9/d3d9_volume.cpp | 5 ++--- src/d3d9/d3d9_volume.h | 3 +-- 10 files changed, 41 insertions(+), 64 deletions(-) diff --git a/src/d3d9/d3d9_common_texture.cpp b/src/d3d9/d3d9_common_texture.cpp index 386cf29d..fac10888 100644 --- a/src/d3d9/d3d9_common_texture.cpp +++ b/src/d3d9/d3d9_common_texture.cpp @@ -10,14 +10,15 @@ namespace dxvk { D3D9CommonTexture::D3D9CommonTexture( D3D9DeviceEx* pDevice, const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3DRESOURCETYPE ResourceType, - D3D9_VK_FORMAT_MAPPING Mapping) - : m_device(pDevice), m_desc(*pDesc), m_type(ResourceType), m_mapping(Mapping) { + D3DRESOURCETYPE ResourceType) + : m_device(pDevice), m_desc(*pDesc), m_type(ResourceType) { if (m_desc.Format == D3D9Format::Unknown) m_desc.Format = (m_desc.Usage & D3DUSAGE_DEPTHSTENCIL) ? D3D9Format::D32 : D3D9Format::X8R8G8B8; + m_mapping = pDevice->LookupFormat(m_desc.Format); + auto pxSize = m_mapping.VideoFormatInfo.MacroPixelSize; m_adjustedExtent = VkExtent3D{ m_desc.Width / pxSize.width, m_desc.Height / pxSize.height, m_desc.Depth }; @@ -71,14 +72,12 @@ namespace dxvk { HRESULT D3D9CommonTexture::NormalizeTextureProperties( D3D9DeviceEx* pDevice, - D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING* pMapping) { + D3D9_COMMON_TEXTURE_DESC* pDesc) { auto* options = pDevice->GetOptions(); ////////////////////// // Mapping Validation - - *pMapping = pDevice->LookupFormat(pDesc->Format); + auto mapping = pDevice->LookupFormat(pDesc->Format); // Handle DisableA8RT hack for The Sims 2 if (pDesc->Format == D3D9Format::A8 && @@ -92,7 +91,7 @@ namespace dxvk { // SCRATCH textures can still be made if the device does not support // the format at all. - if (!pMapping->IsValid() && pDesc->Format != D3D9Format::NULL_FORMAT) { + if (!mapping.IsValid() && pDesc->Format != D3D9Format::NULL_FORMAT) { auto info = pDevice->UnsupportedFormatInfo(pDesc->Format); if (pDesc->Pool != D3DPOOL_SCRATCH || info.elementSize == 0) diff --git a/src/d3d9/d3d9_common_texture.h b/src/d3d9/d3d9_common_texture.h index e08ff64b..828fb2aa 100644 --- a/src/d3d9/d3d9_common_texture.h +++ b/src/d3d9/d3d9_common_texture.h @@ -93,8 +93,7 @@ namespace dxvk { D3D9CommonTexture( D3D9DeviceEx* pDevice, const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3DRESOURCETYPE ResourceType, - D3D9_VK_FORMAT_MAPPING Mapping); + D3DRESOURCETYPE ResourceType); ~D3D9CommonTexture(); @@ -203,8 +202,7 @@ namespace dxvk { */ static HRESULT NormalizeTextureProperties( D3D9DeviceEx* pDevice, - D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING* pMapping); + D3D9_COMMON_TEXTURE_DESC* pDesc); /** * \brief Lock Flags diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 7db26d82..2fd5bb5e 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -398,12 +398,11 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com texture = new D3D9Texture2D(this, &desc, mapping); + const Com texture = new D3D9Texture2D(this, &desc); void* initialData = nullptr; @@ -454,12 +453,11 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com texture = new D3D9Texture3D(this, &desc, mapping); + const Com texture = new D3D9Texture3D(this, &desc); m_initializer->InitTexture(texture->GetCommonTexture()); *ppVolumeTexture = texture.ref(); @@ -500,12 +498,11 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com texture = new D3D9TextureCube(this, &desc, mapping); + const Com texture = new D3D9TextureCube(this, &desc); m_initializer->InitTexture(texture->GetCommonTexture()); *ppCubeTexture = texture.ref(); @@ -3293,12 +3290,11 @@ namespace dxvk { desc.MultiSample = MultiSample; desc.MultisampleQuality = MultisampleQuality; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com surface = new D3D9Surface(this, &desc, mapping); + const Com surface = new D3D9Surface(this, &desc); m_initializer->InitTexture(surface->GetCommonTexture()); *ppSurface = surface.ref(); return D3D_OK; @@ -3337,12 +3333,11 @@ namespace dxvk { desc.MultiSample = D3DMULTISAMPLE_NONE; desc.MultisampleQuality = 0; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com surface = new D3D9Surface(this, &desc, mapping); + const Com surface = new D3D9Surface(this, &desc); m_initializer->InitTexture(surface->GetCommonTexture()); *ppSurface = surface.ref(); return D3D_OK; @@ -3383,12 +3378,11 @@ namespace dxvk { desc.MultiSample = MultiSample; desc.MultisampleQuality = MultisampleQuality; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_INVALIDCALL; try { - const Com surface = new D3D9Surface(this, &desc, mapping); + const Com surface = new D3D9Surface(this, &desc); m_initializer->InitTexture(surface->GetCommonTexture()); *ppSurface = surface.ref(); return D3D_OK; @@ -6523,11 +6517,10 @@ namespace dxvk { desc.MultiSample = pPresentationParameters->MultiSampleType; desc.MultisampleQuality = pPresentationParameters->MultiSampleQuality; - D3D9_VK_FORMAT_MAPPING mapping; - if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc, &mapping))) + if (FAILED(D3D9CommonTexture::NormalizeTextureProperties(this, &desc))) return D3DERR_NOTAVAILABLE; - m_autoDepthStencil = new D3D9Surface(this, &desc, mapping); + m_autoDepthStencil = new D3D9Surface(this, &desc); m_initializer->InitTexture(m_autoDepthStencil->GetCommonTexture()); SetDepthStencilSurface(m_autoDepthStencil.ptr()); } diff --git a/src/d3d9/d3d9_surface.cpp b/src/d3d9/d3d9_surface.cpp index 86472cb7..f4189d5d 100644 --- a/src/d3d9/d3d9_surface.cpp +++ b/src/d3d9/d3d9_surface.cpp @@ -7,11 +7,10 @@ namespace dxvk { D3D9Surface::D3D9Surface( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping) + const D3D9_COMMON_TEXTURE_DESC* pDesc) : D3D9SurfaceBase( pDevice, - new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_TEXTURE, Mapping ), + new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_TEXTURE), 0, 0, nullptr) { } diff --git a/src/d3d9/d3d9_surface.h b/src/d3d9/d3d9_surface.h index 7161c3a9..6e68bbae 100644 --- a/src/d3d9/d3d9_surface.h +++ b/src/d3d9/d3d9_surface.h @@ -19,8 +19,7 @@ namespace dxvk { D3D9Surface( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping); + const D3D9_COMMON_TEXTURE_DESC* pDesc); D3D9Surface( D3D9DeviceEx* pDevice, diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index 9eea9ea6..b7c53ebe 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -890,10 +890,8 @@ namespace dxvk { desc.Usage = D3DUSAGE_RENDERTARGET; desc.Discard = FALSE; - auto mapping = m_parent->LookupFormat(desc.Format); - for (uint32_t i = 0; i < NumBackBuffers; i++) - m_backBuffers[i] = new D3D9Surface(m_parent, &desc, mapping); + m_backBuffers[i] = new D3D9Surface(m_parent, &desc); m_swapImage = m_backBuffers[0]->GetCommonTexture()->GetImage(); diff --git a/src/d3d9/d3d9_texture.cpp b/src/d3d9/d3d9_texture.cpp index 33aaef25..6331e8c0 100644 --- a/src/d3d9/d3d9_texture.cpp +++ b/src/d3d9/d3d9_texture.cpp @@ -8,9 +8,8 @@ namespace dxvk { D3D9Texture2D::D3D9Texture2D( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping) - : D3D9Texture2DBase( pDevice, pDesc, D3DRTYPE_TEXTURE, Mapping ) { } + const D3D9_COMMON_TEXTURE_DESC* pDesc) + : D3D9Texture2DBase( pDevice, pDesc, D3DRTYPE_TEXTURE ) { } HRESULT STDMETHODCALLTYPE D3D9Texture2D::QueryInterface(REFIID riid, void** ppvObject) { @@ -87,9 +86,8 @@ namespace dxvk { D3D9Texture3D::D3D9Texture3D( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping) - : D3D9Texture3DBase( pDevice, pDesc, D3DRTYPE_VOLUMETEXTURE, Mapping ) { } + const D3D9_COMMON_TEXTURE_DESC* pDesc) + : D3D9Texture3DBase( pDevice, pDesc, D3DRTYPE_VOLUMETEXTURE ) { } HRESULT STDMETHODCALLTYPE D3D9Texture3D::QueryInterface(REFIID riid, void** ppvObject) { @@ -166,9 +164,8 @@ namespace dxvk { D3D9TextureCube::D3D9TextureCube( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping) - : D3D9TextureCubeBase( pDevice, pDesc, D3DRTYPE_CUBETEXTURE, Mapping ) { } + const D3D9_COMMON_TEXTURE_DESC* pDesc) + : D3D9TextureCubeBase( pDevice, pDesc, D3DRTYPE_CUBETEXTURE ) { } HRESULT STDMETHODCALLTYPE D3D9TextureCube::QueryInterface(REFIID riid, void** ppvObject) { diff --git a/src/d3d9/d3d9_texture.h b/src/d3d9/d3d9_texture.h index 187b19ac..eead55fe 100644 --- a/src/d3d9/d3d9_texture.h +++ b/src/d3d9/d3d9_texture.h @@ -22,10 +22,9 @@ namespace dxvk { D3D9BaseTexture( D3D9DeviceEx* pDevice, const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3DRESOURCETYPE ResourceType, - D3D9_VK_FORMAT_MAPPING Mapping) + D3DRESOURCETYPE ResourceType) : D3D9Resource ( pDevice ) - , m_texture ( pDevice, pDesc, ResourceType, Mapping ) + , m_texture ( pDevice, pDesc, ResourceType ) , m_lod ( 0 ) , m_autogenFilter ( D3DTEXF_LINEAR ) { const uint32_t arraySlices = m_texture.Desc()->ArraySize; @@ -117,8 +116,7 @@ namespace dxvk { D3D9Texture2D( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping); + const D3D9_COMMON_TEXTURE_DESC* pDesc); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject); @@ -143,8 +141,7 @@ namespace dxvk { D3D9Texture3D( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping); + const D3D9_COMMON_TEXTURE_DESC* pDesc); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject); @@ -169,8 +166,7 @@ namespace dxvk { D3D9TextureCube( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping); + const D3D9_COMMON_TEXTURE_DESC* pDesc); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject); diff --git a/src/d3d9/d3d9_volume.cpp b/src/d3d9/d3d9_volume.cpp index 46fb89d7..b52b35b4 100644 --- a/src/d3d9/d3d9_volume.cpp +++ b/src/d3d9/d3d9_volume.cpp @@ -7,11 +7,10 @@ namespace dxvk { D3D9Volume::D3D9Volume( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping) + const D3D9_COMMON_TEXTURE_DESC* pDesc) : D3D9VolumeBase( pDevice, - new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_VOLUMETEXTURE, Mapping ), + new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_VOLUMETEXTURE ), 0, 0, nullptr) { } diff --git a/src/d3d9/d3d9_volume.h b/src/d3d9/d3d9_volume.h index c74e8e49..9c33a788 100644 --- a/src/d3d9/d3d9_volume.h +++ b/src/d3d9/d3d9_volume.h @@ -13,8 +13,7 @@ namespace dxvk { D3D9Volume( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc, - D3D9_VK_FORMAT_MAPPING Mapping); + const D3D9_COMMON_TEXTURE_DESC* pDesc); D3D9Volume( D3D9DeviceEx* pDevice,