Ensure stuff run on every prim are inlined.

These both get a ton of calls and show up on profiles.
This commit is contained in:
Unknown W. Brackets 2014-03-29 21:51:53 -07:00
parent 466a5418d2
commit e7639f666c
4 changed files with 42 additions and 34 deletions

View file

@ -660,7 +660,7 @@ void FramebufferManager::DestroyFramebuf(VirtualFramebuffer *v) {
delete v; delete v;
} }
void FramebufferManager::SetRenderFrameBuffer() { void FramebufferManager::DoSetRenderFrameBuffer() {
if (!gstate_c.framebufChanged && currentRenderVfb_) { if (!gstate_c.framebufChanged && currentRenderVfb_) {
currentRenderVfb_->last_frame_render = gpuStats.numFlips; currentRenderVfb_->last_frame_render = gpuStats.numFlips;
currentRenderVfb_->dirtyAfterDisplay = true; currentRenderVfb_->dirtyAfterDisplay = true;

View file

@ -135,7 +135,18 @@ public:
void Resized(); void Resized();
void DeviceLost(); void DeviceLost();
void CopyDisplayToOutput(); void CopyDisplayToOutput();
void SetRenderFrameBuffer(); // Uses parameters computed from gstate void DoSetRenderFrameBuffer(); // Uses parameters computed from gstate
void SetRenderFrameBuffer() {
// Inlining this part since it's so frequent.
if (!gstate_c.framebufChanged && currentRenderVfb_) {
currentRenderVfb_->last_frame_render = gpuStats.numFlips;
currentRenderVfb_->dirtyAfterDisplay = true;
if (!gstate_c.skipDrawReason)
currentRenderVfb_->reallyDirtyAfterDisplay = true;
return;
}
DoSetRenderFrameBuffer();
}
void UpdateFromMemory(u32 addr, int size, bool safe); void UpdateFromMemory(u32 addr, int size, bool safe);
void SetLineWidth(); void SetLineWidth();

View file

@ -267,35 +267,6 @@ void TransformDrawEngine::SetupVertexDecoder(u32 vertType) {
} }
} }
int TransformDrawEngine::EstimatePerVertexCost() {
// TODO: This is transform cost, also account for rasterization cost somehow... although it probably
// runs in parallel with transform.
// Also, this is all pure guesswork. If we can find a way to do measurements, that would be great.
// GTA wants a low value to run smooth, GoW wants a high value (otherwise it thinks things
// went too fast and starts doing all the work over again).
int cost = 20;
if (gstate.isLightingEnabled()) {
cost += 10;
for (int i = 0; i < 4; i++) {
if (gstate.isLightChanEnabled(i))
cost += 10;
}
}
if (gstate.getUVGenMode() != GE_TEXMAP_TEXTURE_COORDS) {
cost += 20;
}
if (dec_ && dec_->morphcount > 1) {
cost += 5 * dec_->morphcount;
}
return cost;
}
void TransformDrawEngine::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, int vertexCount, u32 vertType, int *bytesRead) { void TransformDrawEngine::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, int vertexCount, u32 vertType, int *bytesRead) {
if (vertexCount == 0) if (vertexCount == 0)
return; // we ignore zero-sized draw calls. return; // we ignore zero-sized draw calls.

View file

@ -21,6 +21,7 @@
#include "GPU/Common/GPUDebugInterface.h" #include "GPU/Common/GPUDebugInterface.h"
#include "GPU/Common/IndexGenerator.h" #include "GPU/Common/IndexGenerator.h"
#include "GPU/GLES/VertexDecoder.h"
#include "gfx/gl_common.h" #include "gfx/gl_common.h"
#include "gfx/gl_lost_manager.h" #include "gfx/gl_lost_manager.h"
@ -28,8 +29,6 @@ class LinkedShader;
class ShaderManager; class ShaderManager;
class TextureCache; class TextureCache;
class FramebufferManager; class FramebufferManager;
class VertexDecoder;
class VertexDecoderJitCache;
struct TransformedVertex; struct TransformedVertex;
struct DecVtxFormat; struct DecVtxFormat;
@ -127,7 +126,34 @@ public:
void SetupVertexDecoder(u32 vertType); void SetupVertexDecoder(u32 vertType);
// This requires a SetupVertexDecoder call first. // This requires a SetupVertexDecoder call first.
int EstimatePerVertexCost(); int EstimatePerVertexCost() {
// TODO: This is transform cost, also account for rasterization cost somehow... although it probably
// runs in parallel with transform.
// Also, this is all pure guesswork. If we can find a way to do measurements, that would be great.
// GTA wants a low value to run smooth, GoW wants a high value (otherwise it thinks things
// went too fast and starts doing all the work over again).
int cost = 20;
if (gstate.isLightingEnabled()) {
cost += 10;
for (int i = 0; i < 4; i++) {
if (gstate.isLightChanEnabled(i))
cost += 10;
}
}
if (gstate.getUVGenMode() != GE_TEXMAP_TEXTURE_COORDS) {
cost += 20;
}
if (dec_ && dec_->morphcount > 1) {
cost += 5 * dec_->morphcount;
}
return cost;
}
// So that this can be inlined // So that this can be inlined
void Flush() { void Flush() {