Merge pull request #1994 from CookiePLMonster/resource-cache-fixup
Treat identical X_D3DResource objects with a different address as one
This commit is contained in:
commit
8d8ebd76f7
|
@ -845,7 +845,6 @@ void *GetDataFromXboxResource(xbox::X_D3DResource *pXboxResource)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
IDirect3DResource* pHostResource = nullptr;
|
IDirect3DResource* pHostResource = nullptr;
|
||||||
xbox::X_D3DResource* pXboxResource = xbox::zeroptr;
|
|
||||||
DWORD dwXboxResourceType = 0;
|
DWORD dwXboxResourceType = 0;
|
||||||
void* pXboxData = xbox::zeroptr;
|
void* pXboxData = xbox::zeroptr;
|
||||||
size_t szXboxDataSize = 0;
|
size_t szXboxDataSize = 0;
|
||||||
|
@ -1023,17 +1022,21 @@ size_t GetXboxResourceSize(xbox::X_D3DResource* pXboxResource)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HostResourceRequiresUpdate(resource_key_t key, DWORD dwSize)
|
bool HostResourceRequiresUpdate(resource_key_t key, xbox::X_D3DResource* pXboxResource, DWORD dwSize)
|
||||||
{
|
{
|
||||||
auto& ResourceCache = GetResourceCache(key);
|
if (pXboxResource == nullptr) {
|
||||||
auto it = ResourceCache.find(key);
|
|
||||||
if (it == ResourceCache.end() || !it->second.pXboxResource) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently, we only dynamically update Textures and Surfaces, so if our resource
|
// Currently, we only dynamically update Textures and Surfaces, so if our resource
|
||||||
// isn't of these types, do nothing
|
// isn't of these types, do nothing
|
||||||
if (!IsResourceAPixelContainer(it->second.pXboxResource)) {
|
if (!IsResourceAPixelContainer(pXboxResource)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& ResourceCache = GetResourceCache(key);
|
||||||
|
auto it = ResourceCache.find(key);
|
||||||
|
if (it == ResourceCache.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,7 +1047,7 @@ bool HostResourceRequiresUpdate(resource_key_t key, DWORD dwSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the resource type changed, we need to re-create it
|
// If the resource type changed, we need to re-create it
|
||||||
if (it->second.dwXboxResourceType != GetXboxCommonResourceType(it->second.pXboxResource)) {
|
if (it->second.dwXboxResourceType != GetXboxCommonResourceType(pXboxResource)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1088,7 +1091,6 @@ void SetHostResource(xbox::X_D3DResource* pXboxResource, IDirect3DResource* pHos
|
||||||
}
|
}
|
||||||
|
|
||||||
resourceInfo.pHostResource = pHostResource;
|
resourceInfo.pHostResource = pHostResource;
|
||||||
resourceInfo.pXboxResource = pXboxResource;
|
|
||||||
resourceInfo.dwXboxResourceType = GetXboxCommonResourceType(pXboxResource);
|
resourceInfo.dwXboxResourceType = GetXboxCommonResourceType(pXboxResource);
|
||||||
resourceInfo.pXboxData = GetDataFromXboxResource(pXboxResource);
|
resourceInfo.pXboxData = GetDataFromXboxResource(pXboxResource);
|
||||||
resourceInfo.szXboxDataSize = dwSize > 0 ? dwSize : GetXboxResourceSize(pXboxResource);
|
resourceInfo.szXboxDataSize = dwSize > 0 ? dwSize : GetXboxResourceSize(pXboxResource);
|
||||||
|
@ -2656,15 +2658,8 @@ static void EmuVerifyResourceIsRegistered(xbox::X_D3DResource *pResource, DWORD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//check if the same key existed in the HostResource map already. if there is a old pXboxResource in the map with the same key but different resource address, it must be freed first.
|
if (!HostResourceRequiresUpdate(key, pResource, dwSize)) {
|
||||||
|
return;
|
||||||
if (it->second.pXboxResource != pResource) {
|
|
||||||
//printf("EmuVerifyResourceIsRegistered passed in XboxResource collides HostResource map!! key : %llX , map pXboxResource : %08X , passed in pResource : %08X \n", key, it->second.pXboxResource, pResource);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!HostResourceRequiresUpdate(key, dwSize)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FreeHostResource(key);
|
FreeHostResource(key);
|
||||||
|
|
Loading…
Reference in New Issue