From 6d70f3c23787045e97e1a5a5a3678d3d0f189cb4 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 24 Jan 2016 00:30:00 +0100 Subject: [PATCH] d3d12: Compare mipmap/depth count when checking texture compatibility. d3d12: Check for depth in texture cache. Fix Resogun crash when loading a level. --- rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp | 4 ++-- rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h | 9 +++++---- rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp index 02ce53395a..c97e8e47f8 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp @@ -4,10 +4,10 @@ #include "D3D12MemoryHelpers.h" -void data_cache::store_and_protect_data(u64 key, u32 start, size_t size, u8 format, size_t w, size_t h, size_t m, ComPtr data) +void data_cache::store_and_protect_data(u64 key, u32 start, size_t size, u8 format, size_t w, size_t h, size_t d, size_t m, ComPtr data) { std::lock_guard lock(m_mut); - m_address_to_data[key] = std::make_pair(texture_entry(format, w, h, m), data); + m_address_to_data[key] = std::make_pair(texture_entry(format, w, h, d, m), data); protect_data(key, start, size); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h index 3e9af2d640..73d263ccdb 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h @@ -134,16 +134,17 @@ struct texture_entry size_t m_width; size_t m_height; size_t m_mipmap; + size_t m_depth; - texture_entry() : m_format(0), m_width(0), m_height(0), m_is_dirty(true) + texture_entry() : m_format(0), m_width(0), m_height(0), m_depth(0), m_is_dirty(true) {} - texture_entry(u8 f, size_t w, size_t h, size_t m) : m_format(f), m_width(w), m_height(h), m_is_dirty(false) + texture_entry(u8 f, size_t w, size_t h, size_t d, size_t m) : m_format(f), m_width(w), m_height(h), m_depth(d), m_is_dirty(false), m_mipmap(m) {} bool operator==(const texture_entry &other) { - return (m_format == other.m_format && m_width == other.m_width && m_height == other.m_height); + return (m_format == other.m_format && m_width == other.m_width && m_height == other.m_height && m_mipmap == other.m_mipmap && m_depth == other.m_depth); } }; @@ -163,7 +164,7 @@ private: std::unordered_map> > m_address_to_data; // Storage std::list > m_protected_ranges; // address, start of protected range, size of protected range public: - void store_and_protect_data(u64 key, u32 start, size_t size, u8 format, size_t w, size_t h, size_t m, ComPtr data); + void store_and_protect_data(u64 key, u32 start, size_t size, u8 format, size_t w, size_t h, size_t d, size_t m, ComPtr data); /** * Make memory from start to start + size write protected. diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index 1d183d4042..669248f229 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -193,7 +193,7 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_ { is_depth_stencil_texture = true; } - else if (cached_texture != nullptr && (cached_texture->first == texture_entry(format, w, h, textures[i].mipmap()))) + else if (cached_texture != nullptr && (cached_texture->first == texture_entry(format, w, h, textures[i].depth(), textures[i].mipmap()))) { if (cached_texture->first.m_is_dirty) { @@ -210,7 +210,7 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_ std::wstring name = L"texture_@" + std::to_wstring(texaddr); tex->SetName(name.c_str()); vram_texture = tex.Get(); - m_texture_cache.store_and_protect_data(texaddr, texaddr, get_texture_size(textures[i]), format, w, h, textures[i].mipmap(), tex); + m_texture_cache.store_and_protect_data(texaddr, texaddr, get_texture_size(textures[i]), format, w, h, textures[i].depth(), textures[i].mipmap(), tex); } D3D12_SHADER_RESOURCE_VIEW_DESC shared_resource_view_desc = {};