Cache vertexes based on frames not draws.

This commit is contained in:
Unknown W. Brackets 2013-02-10 12:27:43 -08:00
parent 5f3f3b8716
commit 634b9112e4
2 changed files with 18 additions and 7 deletions

View file

@ -922,7 +922,7 @@ void TransformDrawEngine::Flush() {
u32 dataHash = ComputeHash();
vai->hash = dataHash;
vai->status = VertexArrayInfo::VAI_HASHING;
vai->drawsUntilNextFullHash = 0;
vai->framesUntilNextFullHash = 0;
DecodeVerts(); // writes to indexGen
goto rotateVBO;
}
@ -932,12 +932,15 @@ void TransformDrawEngine::Flush() {
case VertexArrayInfo::VAI_HASHING:
{
vai->numDraws++;
if (vai->drawsUntilNextFullHash == 0) {
if (vai->lastFrame != gpuStats.numFrames) {
vai->numFrames++;
}
if (vai->framesUntilNextFullHash == 0) {
u32 newHash = ComputeHash();
// exponential backoff up to 16 frames
vai->drawsUntilNextFullHash = std::min(16, vai->numDraws);
vai->framesUntilNextFullHash = std::min(16, vai->numFrames);
// TODO: tweak
//if (vai->numDraws > 1000) {
//if (vai->numFrames > 1000) {
// vai->status = VertexArrayInfo::VAI_RELIABLE;
//}
if (newHash != vai->hash) {
@ -954,7 +957,7 @@ void TransformDrawEngine::Flush() {
goto rotateVBO;
}
} else {
vai->drawsUntilNextFullHash--;
vai->framesUntilNextFullHash--;
// TODO: "mini-hashing" the first 32 bytes of the vertex/index data or something.
}
@ -997,6 +1000,9 @@ void TransformDrawEngine::Flush() {
case VertexArrayInfo::VAI_RELIABLE:
{
vai->numDraws++;
if (vai->lastFrame != gpuStats.numFrames) {
vai->numFrames++;
}
gpuStats.numCachedDrawCalls++;
gpuStats.numCachedVertsDrawn += vai->numVerts;
vbo = vai->vbo;
@ -1012,6 +1018,9 @@ void TransformDrawEngine::Flush() {
case VertexArrayInfo::VAI_UNRELIABLE:
{
vai->numDraws++;
if (vai->lastFrame != gpuStats.numFrames) {
vai->numFrames++;
}
DecodeVerts();
goto rotateVBO;
}

View file

@ -55,9 +55,10 @@ public:
numDCs = 0;
prim = -1;
numDraws = 0;
numFrames = 0;
lastFrame = gpuStats.numFrames;
numVerts = 0;
drawsUntilNextFullHash = 0;
framesUntilNextFullHash = 0;
}
~VertexArrayInfo();
enum Status {
@ -84,8 +85,9 @@ public:
// ID information
u8 numDCs;
int numDraws;
int numFrames;
int lastFrame; // So that we can forget.
u16 drawsUntilNextFullHash;
u16 framesUntilNextFullHash;
};