mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-26 03:35:27 +00:00
Use table-driven dirtying instead of callbacks in GPU_GLES
This commit is contained in:
parent
e4cb44c243
commit
c70265d7f2
@ -187,14 +187,14 @@ static const CommandTableEntry commandTable[] = {
|
||||
{GE_CMD_ANTIALIASENABLE, FLAG_FLUSHBEFOREONCHANGE},
|
||||
|
||||
// Morph weights. TODO: Remove precomputation?
|
||||
{GE_CMD_MORPHWEIGHT0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT3, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT4, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT5, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE},
|
||||
{GE_CMD_MORPHWEIGHT0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT3, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT4, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT5, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
{GE_CMD_MORPHWEIGHT7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight},
|
||||
|
||||
// Control spline/bezier patches. Don't really require flushing as such, but meh.
|
||||
{GE_CMD_PATCHDIVISION, FLAG_FLUSHBEFOREONCHANGE},
|
||||
@ -1430,7 +1430,7 @@ void GPU_DX9::Execute_Generic(u32 op, u32 diff) {
|
||||
case GE_CMD_MORPHWEIGHT5:
|
||||
case GE_CMD_MORPHWEIGHT6:
|
||||
case GE_CMD_MORPHWEIGHT7:
|
||||
gstate_c.morphWeights[cmd - GE_CMD_MORPHWEIGHT0] = getFloat24(data);
|
||||
Execute_MorphWeight(op, diff);
|
||||
break;
|
||||
|
||||
case GE_CMD_DITH0:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -41,7 +41,6 @@ public:
|
||||
void CheckGPUFeatures();
|
||||
|
||||
void PreExecuteOp(u32 op, u32 diff) override;
|
||||
void Execute_Generic(u32 op, u32 diff);
|
||||
void ExecuteOp(u32 op, u32 diff) override;
|
||||
|
||||
void ReapplyGfxStateInternal() override;
|
||||
@ -82,7 +81,7 @@ public:
|
||||
|
||||
typedef void (GPU_GLES::*CmdFunc)(u32 op, u32 diff);
|
||||
struct CommandInfo {
|
||||
u8 flags;
|
||||
uint64_t flags;
|
||||
GPU_GLES::CmdFunc func;
|
||||
};
|
||||
|
||||
@ -91,45 +90,15 @@ public:
|
||||
void Execute_Prim(u32 op, u32 diff);
|
||||
void Execute_Bezier(u32 op, u32 diff);
|
||||
void Execute_Spline(u32 op, u32 diff);
|
||||
void Execute_LoadClut(u32 op, u32 diff);
|
||||
void Execute_VertexType(u32 op, u32 diff);
|
||||
void Execute_VertexTypeSkinning(u32 op, u32 diff);
|
||||
void Execute_Region(u32 op, u32 diff);
|
||||
void Execute_Scissor(u32 op, u32 diff);
|
||||
void Execute_FramebufType(u32 op, u32 diff);
|
||||
void Execute_ViewportType(u32 op, u32 diff);
|
||||
void Execute_ViewportZType(u32 op, u32 diff);
|
||||
|
||||
void Execute_TexScaleU(u32 op, u32 diff);
|
||||
void Execute_TexScaleV(u32 op, u32 diff);
|
||||
void Execute_TexOffsetU(u32 op, u32 diff);
|
||||
void Execute_TexOffsetV(u32 op, u32 diff);
|
||||
void Execute_TexAddr0(u32 op, u32 diff);
|
||||
void Execute_TexAddrN(u32 op, u32 diff);
|
||||
void Execute_TexBufw0(u32 op, u32 diff);
|
||||
void Execute_TexBufwN(u32 op, u32 diff);
|
||||
void Execute_TexSize0(u32 op, u32 diff);
|
||||
void Execute_TexSizeN(u32 op, u32 diff);
|
||||
void Execute_TexFormat(u32 op, u32 diff);
|
||||
void Execute_TexMapMode(u32 op, u32 diff);
|
||||
void Execute_TexParamType(u32 op, u32 diff);
|
||||
void Execute_TexEnvColor(u32 op, u32 diff);
|
||||
void Execute_TexLevel(u32 op, u32 diff);
|
||||
void Execute_LoadClut(u32 op, u32 diff);
|
||||
void Execute_ClutFormat(u32 op, u32 diff);
|
||||
void Execute_Ambient(u32 op, u32 diff);
|
||||
void Execute_MaterialDiffuse(u32 op, u32 diff);
|
||||
void Execute_MaterialEmissive(u32 op, u32 diff);
|
||||
void Execute_MaterialAmbient(u32 op, u32 diff);
|
||||
void Execute_MaterialSpecular(u32 op, u32 diff);
|
||||
void Execute_Light0Param(u32 op, u32 diff);
|
||||
void Execute_Light1Param(u32 op, u32 diff);
|
||||
void Execute_Light2Param(u32 op, u32 diff);
|
||||
void Execute_Light3Param(u32 op, u32 diff);
|
||||
void Execute_FogColor(u32 op, u32 diff);
|
||||
void Execute_FogCoef(u32 op, u32 diff);
|
||||
void Execute_ColorTestMask(u32 op, u32 diff);
|
||||
void Execute_AlphaTest(u32 op, u32 diff);
|
||||
void Execute_StencilTest(u32 op, u32 diff);
|
||||
void Execute_ColorRef(u32 op, u32 diff);
|
||||
|
||||
// Using string because it's generic - makes no assumptions on the size of the shader IDs of this backend.
|
||||
std::vector<std::string> DebugGetShaderIDs(DebugShaderType shader) override;
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "base/mutex.h"
|
||||
#include "base/timeutil.h"
|
||||
#include "Common/ColorConv.h"
|
||||
#include "Core/Reporting.h"
|
||||
#include "GPU/GeDisasm.h"
|
||||
#include "GPU/GPU.h"
|
||||
#include "GPU/GPUCommon.h"
|
||||
@ -1421,6 +1422,10 @@ void GPUCommon::Execute_BoneMtxData(u32 op, u32 diff) {
|
||||
gstate.boneMatrixNumber = (GE_CMD_BONEMATRIXNUMBER << 24) | (num & 0x7F);
|
||||
}
|
||||
|
||||
void GPUCommon::Execute_MorphWeight(u32 op, u32 diff) {
|
||||
gstate_c.morphWeights[(op >> 24) - GE_CMD_MORPHWEIGHT0] = getFloat24(op);
|
||||
}
|
||||
|
||||
void GPUCommon::ExecuteOp(u32 op, u32 diff) {
|
||||
const u32 cmd = op >> 24;
|
||||
|
||||
@ -1463,7 +1468,89 @@ void GPUCommon::ExecuteOp(u32 op, u32 diff) {
|
||||
break;
|
||||
|
||||
default:
|
||||
DEBUG_LOG(G3D,"DL Unknown: %08x @ %08x", op, currentList == NULL ? 0 : currentList->pc);
|
||||
DEBUG_LOG(G3D, "DL Unknown: %08x @ %08x", op, currentList == NULL ? 0 : currentList->pc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GPUCommon::Execute_Unknown(u32 op, u32 diff) {
|
||||
switch (op >> 24) {
|
||||
case GE_CMD_VSCX:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vscx, G3D, "Unsupported Vertex Screen Coordinate X : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VSCY:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vscy, G3D, "Unsupported Vertex Screen Coordinate Y : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VSCZ:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vscz, G3D, "Unsupported Vertex Screen Coordinate Z : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VTCS:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vtcs, G3D, "Unsupported Vertex Texture Coordinate S : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VTCT:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vtct, G3D, "Unsupported Vertex Texture Coordinate T : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VTCQ:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vtcq, G3D, "Unsupported Vertex Texture Coordinate Q : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VCV:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vcv, G3D, "Unsupported Vertex Color Value : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VAP:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vap, G3D, "Unsupported Vertex Alpha and Primitive : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VFC:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vfc, G3D, "Unsupported Vertex Fog Coefficient : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_VSCV:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(vscv, G3D, "Unsupported Vertex Secondary Color Value : %06x", op);
|
||||
break;
|
||||
|
||||
case GE_CMD_UNKNOWN_03:
|
||||
case GE_CMD_UNKNOWN_0D:
|
||||
case GE_CMD_UNKNOWN_11:
|
||||
case GE_CMD_UNKNOWN_29:
|
||||
case GE_CMD_UNKNOWN_34:
|
||||
case GE_CMD_UNKNOWN_35:
|
||||
case GE_CMD_UNKNOWN_39:
|
||||
case GE_CMD_UNKNOWN_4E:
|
||||
case GE_CMD_UNKNOWN_4F:
|
||||
case GE_CMD_UNKNOWN_52:
|
||||
case GE_CMD_UNKNOWN_59:
|
||||
case GE_CMD_UNKNOWN_5A:
|
||||
case GE_CMD_UNKNOWN_B6:
|
||||
case GE_CMD_UNKNOWN_B7:
|
||||
case GE_CMD_UNKNOWN_D1:
|
||||
case GE_CMD_UNKNOWN_ED:
|
||||
case GE_CMD_UNKNOWN_EF:
|
||||
case GE_CMD_UNKNOWN_FA:
|
||||
case GE_CMD_UNKNOWN_FB:
|
||||
case GE_CMD_UNKNOWN_FC:
|
||||
case GE_CMD_UNKNOWN_FD:
|
||||
case GE_CMD_UNKNOWN_FE:
|
||||
if ((op & 0xFFFFFF) != 0)
|
||||
WARN_LOG_REPORT_ONCE(unknowncmd, G3D, "Unknown GE command : %08x ", op);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ public:
|
||||
|
||||
void ExecuteOp(u32 op, u32 diff) override;
|
||||
void PreExecuteOp(u32 op, u32 diff) override;
|
||||
|
||||
bool InterpretList(DisplayList &list) override;
|
||||
virtual bool ProcessDLQueue();
|
||||
u32 UpdateStall(int listid, u32 newstall) override;
|
||||
@ -96,6 +97,10 @@ public:
|
||||
void Execute_BoneMtxNum(u32 op, u32 diff);
|
||||
void Execute_BoneMtxData(u32 op, u32 diff);
|
||||
|
||||
void Execute_MorphWeight(u32 op, u32 diff);
|
||||
|
||||
void Execute_Unknown(u32 op, u32 diff);
|
||||
|
||||
int EstimatePerVertexCost();
|
||||
|
||||
// Note: Not virtual!
|
||||
|
@ -184,14 +184,14 @@ static const CommandTableEntry commandTable[] = {
|
||||
{ GE_CMD_ANTIALIASENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
||||
|
||||
// Morph weights. TODO: Remove precomputation?
|
||||
{ GE_CMD_MORPHWEIGHT0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT3, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT4, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT5, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE },
|
||||
{ GE_CMD_MORPHWEIGHT0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT3, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT4, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT5, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
{ GE_CMD_MORPHWEIGHT7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPUCommon::Execute_MorphWeight },
|
||||
|
||||
// Control spline/bezier patches. Don't really require flushing as such, but meh.
|
||||
{ GE_CMD_PATCHDIVISION, FLAG_FLUSHBEFOREONCHANGE },
|
||||
|
@ -17,8 +17,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
enum GECommand
|
||||
{
|
||||
enum GECommand {
|
||||
GE_CMD_NOP = 0,
|
||||
GE_CMD_VADDR = 0x1,
|
||||
GE_CMD_IADDR = 0x2,
|
||||
@ -42,13 +41,13 @@ enum GECommand
|
||||
GE_CMD_LIGHTINGENABLE = 0x17,
|
||||
GE_CMD_LIGHTENABLE0 = 0x18,
|
||||
GE_CMD_LIGHTENABLE1 = 0x19,
|
||||
GE_CMD_LIGHTENABLE2 = 0x1a,
|
||||
GE_CMD_LIGHTENABLE3 = 0x1b,
|
||||
GE_CMD_CLIPENABLE = 0x1c,
|
||||
GE_CMD_CULLFACEENABLE,
|
||||
GE_CMD_TEXTUREMAPENABLE,
|
||||
GE_CMD_FOGENABLE,
|
||||
GE_CMD_DITHERENABLE,
|
||||
GE_CMD_LIGHTENABLE2 = 0x1A,
|
||||
GE_CMD_LIGHTENABLE3 = 0x1B,
|
||||
GE_CMD_CLIPENABLE = 0x1C,
|
||||
GE_CMD_CULLFACEENABLE = 0x1D,
|
||||
GE_CMD_TEXTUREMAPENABLE = 0x1E,
|
||||
GE_CMD_FOGENABLE = 0x1F,
|
||||
GE_CMD_DITHERENABLE = 0x20,
|
||||
GE_CMD_ALPHABLENDENABLE = 0x21,
|
||||
GE_CMD_ALPHATESTENABLE = 0x22,
|
||||
GE_CMD_ZTESTENABLE = 0x23,
|
||||
@ -71,14 +70,14 @@ enum GECommand
|
||||
GE_CMD_PATCHPRIMITIVE = 0x37,
|
||||
GE_CMD_PATCHFACING = 0x38,
|
||||
GE_CMD_WORLDMATRIXNUMBER = 0x3A,
|
||||
GE_CMD_WORLDMATRIXDATA,
|
||||
GE_CMD_VIEWMATRIXNUMBER,
|
||||
GE_CMD_VIEWMATRIXDATA,
|
||||
GE_CMD_PROJMATRIXNUMBER,
|
||||
GE_CMD_PROJMATRIXDATA,
|
||||
GE_CMD_WORLDMATRIXDATA = 0x3B,
|
||||
GE_CMD_VIEWMATRIXNUMBER = 0x3C,
|
||||
GE_CMD_VIEWMATRIXDATA = 0x3D,
|
||||
GE_CMD_PROJMATRIXNUMBER = 0x3E,
|
||||
GE_CMD_PROJMATRIXDATA = 0x3F,
|
||||
GE_CMD_TGENMATRIXNUMBER = 0x40,
|
||||
GE_CMD_TGENMATRIXDATA = 0x41,
|
||||
GE_CMD_VIEWPORTXSCALE,
|
||||
GE_CMD_VIEWPORTXSCALE = 0x42,
|
||||
GE_CMD_VIEWPORTYSCALE,
|
||||
GE_CMD_VIEWPORTZSCALE,
|
||||
GE_CMD_VIEWPORTXCENTER,
|
||||
@ -93,14 +92,14 @@ enum GECommand
|
||||
GE_CMD_SHADEMODE = 0x50, // flat or gouraud
|
||||
GE_CMD_REVERSENORMAL = 0x51,
|
||||
GE_CMD_MATERIALUPDATE = 0x53,
|
||||
GE_CMD_MATERIALEMISSIVE, //not sure about these but this makes sense
|
||||
GE_CMD_MATERIALAMBIENT, //gotta try enabling lighting and check :)
|
||||
GE_CMD_MATERIALEMISSIVE = 0x54, //not sure about these but this makes sense
|
||||
GE_CMD_MATERIALAMBIENT = 0x55, //gotta try enabling lighting and check :)
|
||||
GE_CMD_MATERIALDIFFUSE = 0x56,
|
||||
GE_CMD_MATERIALSPECULAR = 0x57,
|
||||
GE_CMD_MATERIALALPHA = 0x58,
|
||||
GE_CMD_MATERIALSPECULARCOEF = 0x5B,
|
||||
GE_CMD_AMBIENTCOLOR,
|
||||
GE_CMD_AMBIENTALPHA,
|
||||
GE_CMD_AMBIENTCOLOR = 0x5C,
|
||||
GE_CMD_AMBIENTALPHA = 0x5D,
|
||||
GE_CMD_LIGHTMODE = 0x5E,
|
||||
GE_CMD_LIGHTTYPE0 = 0x5F,
|
||||
GE_CMD_LIGHTTYPE1 = 0x60,
|
||||
|
Loading…
x
Reference in New Issue
Block a user