d3d12: Compare mipmap/depth count when checking texture compatibility.

d3d12: Check for depth in texture cache.

Fix Resogun crash when loading a level.
This commit is contained in:
Vincent Lejeune 2016-01-24 00:30:00 +01:00
commit 6d70f3c237
3 changed files with 9 additions and 8 deletions

View file

@ -4,10 +4,10 @@
#include "D3D12MemoryHelpers.h" #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<ID3D12Resource> 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<ID3D12Resource> data)
{ {
std::lock_guard<std::mutex> lock(m_mut); std::lock_guard<std::mutex> 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); protect_data(key, start, size);
} }

View file

@ -134,16 +134,17 @@ struct texture_entry
size_t m_width; size_t m_width;
size_t m_height; size_t m_height;
size_t m_mipmap; 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) 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<u64, std::pair<texture_entry, ComPtr<ID3D12Resource>> > m_address_to_data; // Storage std::unordered_map<u64, std::pair<texture_entry, ComPtr<ID3D12Resource>> > m_address_to_data; // Storage
std::list <std::tuple<u64, u32, u32> > m_protected_ranges; // address, start of protected range, size of protected range std::list <std::tuple<u64, u32, u32> > m_protected_ranges; // address, start of protected range, size of protected range
public: 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<ID3D12Resource> 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<ID3D12Resource> data);
/** /**
* Make memory from start to start + size write protected. * Make memory from start to start + size write protected.

View file

@ -193,7 +193,7 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_
{ {
is_depth_stencil_texture = true; 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) 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); std::wstring name = L"texture_@" + std::to_wstring(texaddr);
tex->SetName(name.c_str()); tex->SetName(name.c_str());
vram_texture = tex.Get(); 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 = {}; D3D12_SHADER_RESOURCE_VIEW_DESC shared_resource_view_desc = {};