mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
some fixes to dlist caching, now most of the remaining glitches should be fixed
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6970 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -67,12 +67,16 @@ struct ReferencedDataRegion
|
|||||||
start_address(NULL),
|
start_address(NULL),
|
||||||
size(0),
|
size(0),
|
||||||
MustClean(false),
|
MustClean(false),
|
||||||
|
ReferencedArray(-1),
|
||||||
|
ReferencedArrayStride(0),
|
||||||
NextRegion(NULL)
|
NextRegion(NULL)
|
||||||
{}
|
{}
|
||||||
u64 hash;
|
u64 hash;
|
||||||
u8* start_address;
|
u8* start_address;
|
||||||
u32 size;
|
u32 size;
|
||||||
bool MustClean;
|
bool MustClean;
|
||||||
|
u32 ReferencedArray;
|
||||||
|
u32 ReferencedArrayStride;
|
||||||
ReferencedDataRegion* NextRegion;
|
ReferencedDataRegion* NextRegion;
|
||||||
|
|
||||||
int IntersectsMemoryRange(u8* range_address, u32 range_size)
|
int IntersectsMemoryRange(u8* range_address, u32 range_size)
|
||||||
@ -142,7 +146,7 @@ struct CachedDisplayList
|
|||||||
BufferCount++;
|
BufferCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InsertOverlapingRegion(u8* RegionStartAddress, u32 Size)
|
void InsertOverlapingRegion(u8* RegionStartAddress, u32 Size,int referencedArray,int referencedArrayStride)
|
||||||
{
|
{
|
||||||
ReferencedDataRegion* NewRegion = FindOverlapingRegion(RegionStartAddress, Size);
|
ReferencedDataRegion* NewRegion = FindOverlapingRegion(RegionStartAddress, Size);
|
||||||
if(NewRegion)
|
if(NewRegion)
|
||||||
@ -168,6 +172,9 @@ struct CachedDisplayList
|
|||||||
NewRegion->size = Size;
|
NewRegion->size = Size;
|
||||||
NewRegion->start_address = RegionStartAddress;
|
NewRegion->start_address = RegionStartAddress;
|
||||||
NewRegion->hash = GetHash64(RegionStartAddress, Size, DL_HASH_STEPS);
|
NewRegion->hash = GetHash64(RegionStartAddress, Size, DL_HASH_STEPS);
|
||||||
|
NewRegion->ReferencedArray = referencedArray;
|
||||||
|
NewRegion->ReferencedArrayStride = referencedArrayStride;
|
||||||
|
|
||||||
InsertRegion(NewRegion);
|
InsertRegion(NewRegion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -179,6 +186,10 @@ struct CachedDisplayList
|
|||||||
{
|
{
|
||||||
if(Current->hash)
|
if(Current->hash)
|
||||||
{
|
{
|
||||||
|
if(Current->ReferencedArray != -1 && (cached_arraybases[Current->ReferencedArray] != Current->start_address || arraystrides[Current->ReferencedArray] != Current->ReferencedArrayStride))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if(Current->hash != GetHash64(Current->start_address, Current->size, DL_HASH_STEPS))
|
if(Current->hash != GetHash64(Current->start_address, Current->size, DL_HASH_STEPS))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -571,7 +582,7 @@ bool CompileAndRunDisplayList(u32 address, int size, CachedDisplayList *dl)
|
|||||||
{
|
{
|
||||||
u8* saddr = cached_arraybases[i];
|
u8* saddr = cached_arraybases[i];
|
||||||
int arraySize = arraystrides[i] * ((tc[i] == 2)? numVertices : ((numVertices < 1024)? 2 * numVertices : numVertices));
|
int arraySize = arraystrides[i] * ((tc[i] == 2)? numVertices : ((numVertices < 1024)? 2 * numVertices : numVertices));
|
||||||
dl->InsertOverlapingRegion(saddr, arraySize);
|
dl->InsertOverlapingRegion(saddr, arraySize,i,arraystrides[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user