From b1c0ea1ba0e729bac89d5302724f2be564ff4d6c Mon Sep 17 00:00:00 2001 From: WinterSnowfall Date: Fri, 7 Mar 2025 11:28:46 +0200 Subject: [PATCH] [d3d8] Minor static analysis nits --- src/d3d8/d3d8_batch.h | 8 ++++---- src/d3d8/d3d8_device.cpp | 27 +++++++++++++++------------ src/d3d8/d3d8_interface.cpp | 7 +++---- src/d3d8/d3d8_resource.h | 4 ++-- src/d3d8/d3d8_state_block.cpp | 9 ++++++--- src/d3d8/d3d8_surface.cpp | 2 +- src/d3d8/d3d8_texture.h | 16 +++++++++------- src/d3d8/d3d8_wrapped_object.h | 8 ++++---- 8 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/d3d8/d3d8_batch.h b/src/d3d8/d3d8_batch.h index d9120a49c..125e33e65 100644 --- a/src/d3d8/d3d8_batch.h +++ b/src/d3d8/d3d8_batch.h @@ -33,16 +33,16 @@ namespace dxvk { UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, - DWORD Flags) { + DWORD Flags) final { *ppbData = m_data.data() + OffsetToLock; return D3D_OK; } - HRESULT STDMETHODCALLTYPE Unlock() { + HRESULT STDMETHODCALLTYPE Unlock() final { return D3D_OK; } - HRESULT STDMETHODCALLTYPE GetDesc(D3DVERTEXBUFFER_DESC* pDesc) { + HRESULT STDMETHODCALLTYPE GetDesc(D3DVERTEXBUFFER_DESC* pDesc) final { if (unlikely(pDesc == nullptr)) return D3DERR_INVALIDCALL; @@ -56,7 +56,7 @@ namespace dxvk { return D3D_OK; } - void STDMETHODCALLTYPE PreLoad() { + void STDMETHODCALLTYPE PreLoad() final { } const void* GetPtr(UINT byteOffset = 0) const { diff --git a/src/d3d8/d3d8_device.cpp b/src/d3d8/d3d8_device.cpp index 799fc6c2f..8ef956309 100644 --- a/src/d3d8/d3d8_device.cpp +++ b/src/d3d8/d3d8_device.cpp @@ -47,7 +47,7 @@ namespace dxvk { , m_behaviorFlags(BehaviorFlags) , m_multithread(BehaviorFlags & D3DCREATE_MULTITHREADED) { // Get the bridge interface to D3D9. - if (FAILED(GetD3D9()->QueryInterface(__uuidof(IDxvkD3D8Bridge), (void**)&m_bridge))) { + if (FAILED(GetD3D9()->QueryInterface(__uuidof(IDxvkD3D8Bridge), reinterpret_cast(&m_bridge)))) { throw DxvkError("D3D8Device: ERROR! Failed to get D3D9 Bridge. d3d9.dll might not be DXVK!"); } @@ -578,11 +578,11 @@ namespace dxvk { bool compressed = isDXT(srcDesc.Format); res = src->LockRect(&srcLocked, &srcRect, D3DLOCK_READONLY); - if (FAILED(res)) + if (unlikely(FAILED(res))) return res; res = dst->LockRect(&dstLocked, &dstRect, 0); - if (FAILED(res)) { + if (unlikely(FAILED(res))) { src->UnlockRect(); return res; } @@ -629,8 +629,8 @@ namespace dxvk { size_t srcOffset = 0, dstOffset = 0; for (auto i = 0; i < rows; i++) { std::memcpy( - (uint8_t*)dstLocked.pBits + dstOffset, - (uint8_t*)srcLocked.pBits + srcOffset, + reinterpret_cast(dstLocked.pBits) + dstOffset, + reinterpret_cast(srcLocked.pBits) + srcOffset, amplitude); srcOffset += srcLocked.Pitch; dstOffset += dstLocked.Pitch; @@ -638,7 +638,13 @@ namespace dxvk { } res = dst->UnlockRect(); + if (unlikely(FAILED(res))) { + src->UnlockRect(); + return res; + } + res = src->UnlockRect(); + return res; } @@ -1559,7 +1565,7 @@ namespace dxvk { } HRESULT STDMETHODCALLTYPE D3D8Device::GetVertexShaderConstant(DWORD Register, void* pConstantData, DWORD ConstantCount) { - return GetD3D9()->GetVertexShaderConstantF(Register, (float*)pConstantData, ConstantCount); + return GetD3D9()->GetVertexShaderConstantF(Register, reinterpret_cast(pConstantData), ConstantCount); } HRESULT STDMETHODCALLTYPE D3D8Device::SetStreamSource( @@ -1657,7 +1663,7 @@ namespace dxvk { } HRESULT STDMETHODCALLTYPE D3D8Device::GetPixelShaderConstant(DWORD Register, void* pConstantData, DWORD ConstantCount) { - return GetD3D9()->GetPixelShaderConstantF(Register, (float*)pConstantData, ConstantCount); + return GetD3D9()->GetPixelShaderConstantF(Register, reinterpret_cast(pConstantData), ConstantCount); } HRESULT STDMETHODCALLTYPE D3D8Device::SetPixelShaderConstant( @@ -1967,11 +1973,8 @@ namespace dxvk { if (!info) return D3DERR_INVALIDCALL; - if (info->pVertexDecl != nullptr) - info->pVertexDecl = nullptr; - if (info->pVertexShader != nullptr) - info->pVertexShader = nullptr; - + info->pVertexDecl = nullptr; + info->pVertexShader = nullptr; info->declaration.clear(); info->function.clear(); diff --git a/src/d3d8/d3d8_interface.cpp b/src/d3d8/d3d8_interface.cpp index 8825773a7..1b76de980 100644 --- a/src/d3d8/d3d8_interface.cpp +++ b/src/d3d8/d3d8_interface.cpp @@ -7,11 +7,10 @@ namespace dxvk { - D3D8Interface::D3D8Interface() { - m_d3d9 = d3d9::Direct3DCreate9(D3D_SDK_VERSION); - + D3D8Interface::D3D8Interface() + : m_d3d9(d3d9::Direct3DCreate9(D3D_SDK_VERSION)) { // Get the bridge interface to D3D9. - if (FAILED(m_d3d9->QueryInterface(__uuidof(IDxvkD3D8InterfaceBridge), (void**)&m_bridge))) { + if (FAILED(m_d3d9->QueryInterface(__uuidof(IDxvkD3D8InterfaceBridge), reinterpret_cast(&m_bridge)))) { throw DxvkError("D3D8Interface: ERROR! Failed to get D3D9 Bridge. d3d9.dll might not be DXVK!"); } diff --git a/src/d3d8/d3d8_resource.h b/src/d3d8/d3d8_resource.h index 0299b0bf7..4966adec1 100644 --- a/src/d3d8/d3d8_resource.h +++ b/src/d3d8/d3d8_resource.h @@ -96,11 +96,11 @@ namespace dxvk { virtual IUnknown* GetInterface(REFIID riid) override try { return D3D8DeviceChild::GetInterface(riid); - } catch (HRESULT err) { + } catch (const DxvkError& e) { if (riid == __uuidof(IDirect3DResource8)) return this; - throw err; + throw e; } protected: diff --git a/src/d3d8/d3d8_state_block.cpp b/src/d3d8/d3d8_state_block.cpp index 9a0e07f99..c95b6b56d 100644 --- a/src/d3d8/d3d8_state_block.cpp +++ b/src/d3d8/d3d8_state_block.cpp @@ -71,8 +71,11 @@ namespace dxvk { m_indices = m_device->m_indices.ptr(); } - if (m_capture.swvp) - m_device->GetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, (DWORD*)&m_isSWVP); + if (m_capture.swvp) { + DWORD swvpState; + m_device->GetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, &swvpState); + m_isSWVP = static_cast(swvpState); + } return m_stateBlock->Capture(); } @@ -101,7 +104,7 @@ namespace dxvk { // This was a very easy footgun for D3D8 applications. if (m_capture.swvp) - m_device->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, m_isSWVP); + m_device->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, static_cast(m_isSWVP)); return res; } diff --git a/src/d3d8/d3d8_surface.cpp b/src/d3d8/d3d8_surface.cpp index 7f8b14b79..4307ab576 100644 --- a/src/d3d8/d3d8_surface.cpp +++ b/src/d3d8/d3d8_surface.cpp @@ -70,7 +70,7 @@ namespace dxvk { NULL); if (FAILED(res)) - throw new DxvkError("D3D8: Failed to create blit image"); + throw DxvkError("D3D8: Failed to create blit image"); return image; } diff --git a/src/d3d8/d3d8_texture.h b/src/d3d8/d3d8_texture.h index 0cc8ba713..8d4750e27 100644 --- a/src/d3d8/d3d8_texture.h +++ b/src/d3d8/d3d8_texture.h @@ -30,17 +30,16 @@ namespace dxvk { ~D3D8BaseTexture() { for (size_t i = 0; i < m_subresources.size(); i++) - if (m_subresources[i] != nullptr) - m_subresources[i] = nullptr; + m_subresources[i] = nullptr; } virtual IUnknown* GetInterface(REFIID riid) final override try { return D3D8Resource::GetInterface(riid); - } catch (HRESULT err) { + } catch (const DxvkError& e) { if (riid == __uuidof(IDirect3DBaseTexture8)) return this; - throw err; + throw e; } void STDMETHODCALLTYPE PreLoad() final { @@ -76,8 +75,9 @@ namespace dxvk { // Cache the subresource m_subresources[Index] = new SubresourceType(this->m_parent, this->m_pool, this, std::move(subresource)); - } catch (HRESULT res) { - return res; + } catch (const DxvkError& e) { + Logger::warn(e.message()); + return D3DERR_INVALIDCALL; } } @@ -97,8 +97,10 @@ namespace dxvk { } else if constexpr (std::is_same_v) { res = this->GetD3D9()->GetCubeMapSurface(d3d9::D3DCUBEMAP_FACES(Index % CUBE_FACES), Index / CUBE_FACES, &ptr); } + if (FAILED(res)) - throw res; + throw DxvkError(str::format("D3D8BaseTexture::GetSubresource: Failed to retrieve index ", Index)); + return ptr; } diff --git a/src/d3d8/d3d8_wrapped_object.h b/src/d3d8/d3d8_wrapped_object.h index 9eba95f75..22234cd1c 100644 --- a/src/d3d8/d3d8_wrapped_object.h +++ b/src/d3d8/d3d8_wrapped_object.h @@ -39,7 +39,7 @@ namespace dxvk { if (riid == __uuidof(D3D8)) return this; - throw E_NOINTERFACE; + throw DxvkError("D3D8WrappedObject::QueryInterface: Unknown interface query"); } HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) final { @@ -51,10 +51,10 @@ namespace dxvk { try { *ppvObject = ref(this->GetInterface(riid)); return S_OK; - } catch (HRESULT err) { - Logger::warn("D3D8WrappedObject::QueryInterface: Unknown interface query"); + } catch (const DxvkError& e) { + Logger::warn(e.message()); Logger::warn(str::format(riid)); - return err; + return E_NOINTERFACE; } }