Remove EmuD3DRenderStateSimpleEncoded, use DxbxRenderStateInfo instead
This code is easier to maintain, easier to extend, and removes more legacy cruft from original Cxbx.
This commit is contained in:
parent
f6c2544c22
commit
11daaac408
|
@ -6006,7 +6006,7 @@ VOID __fastcall XTL::EMUPATCH(D3DDevice_SetRenderState_Simple)
|
|||
(
|
||||
DWORD Method,
|
||||
DWORD Value
|
||||
)
|
||||
)
|
||||
{
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(Method)
|
||||
|
@ -6079,140 +6079,84 @@ VOID __fastcall XTL::EMUPATCH(D3DDevice_SetRenderState_Simple)
|
|||
case NV2A_TX_SHADER_PREVIOUS: TemporaryPixelShaderRenderStates[X_D3DRS_PSINPUTTEXTURE] = Value; return;
|
||||
}
|
||||
|
||||
// Fallback to non-shader render state handling
|
||||
int State = -1;
|
||||
|
||||
// Todo: make this faster and more elegant
|
||||
for (int v = 0; v<174; v++)
|
||||
{
|
||||
if (EmuD3DRenderStateSimpleEncoded[v] == Method)
|
||||
{
|
||||
State = v;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (State == -1) {
|
||||
// Attempt to determine renderstate name for unsupported types
|
||||
std::string name = "Unknown";
|
||||
// Fetch the RenderState conversion info for the given input
|
||||
int XboxRenderStateIndex = -1;
|
||||
for (int i = 0; i <= X_D3DRS_DONOTCULLUNCOMPRESSED; i++) {
|
||||
if (DxbxRenderStateInfo[i].M == (Method & 0x00001FFC)) {
|
||||
name = DxbxRenderStateInfo[i].S;
|
||||
break;
|
||||
XboxRenderStateIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
EmuLog(LOG_LEVEL::WARNING, "RenderState_Simple(0x%.08X (%s), 0x%.08X) is unsupported!", Method, name.c_str(), Value);
|
||||
// If we could not map it, log and return
|
||||
if (XboxRenderStateIndex == -1) {
|
||||
EmuLog(LOG_LEVEL::WARNING, "RenderState_Simple(0x%.08X (%s), 0x%.08X) could not be found in RenderState table", Method, DxbxRenderStateInfo[XboxRenderStateIndex].S, Value);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(State)
|
||||
{
|
||||
case D3DRS_COLORWRITEENABLE:
|
||||
{
|
||||
|
||||
DBG_PRINTF("RenderState_Simple: %s = 0x%08X", DxbxRenderStateInfo[XboxRenderStateIndex].S, Value);
|
||||
|
||||
// Perform Conversion
|
||||
switch (XboxRenderStateIndex) {
|
||||
case X_D3DRS_COLORWRITEENABLE: {
|
||||
DWORD OrigValue = Value;
|
||||
|
||||
Value = 0;
|
||||
|
||||
if(OrigValue & (1L<<16))
|
||||
if (OrigValue & (1L << 16)) {
|
||||
Value |= D3DCOLORWRITEENABLE_RED;
|
||||
if(OrigValue & (1L<<8))
|
||||
}
|
||||
|
||||
if (OrigValue & (1L << 8)) {
|
||||
Value |= D3DCOLORWRITEENABLE_GREEN;
|
||||
if(OrigValue & (1L<<0))
|
||||
}
|
||||
|
||||
if (OrigValue & (1L << 0)) {
|
||||
Value |= D3DCOLORWRITEENABLE_BLUE;
|
||||
if(OrigValue & (1L<<24))
|
||||
}
|
||||
|
||||
if (OrigValue & (1L << 24)) {
|
||||
Value |= D3DCOLORWRITEENABLE_ALPHA;
|
||||
|
||||
DBG_PRINTF("D3DRS_COLORWRITEENABLE := 0x%.08X\n", Value);
|
||||
}
|
||||
break;
|
||||
|
||||
case D3DRS_SHADEMODE:
|
||||
} break;
|
||||
case X_D3DRS_SHADEMODE:
|
||||
Value = EmuXB2PC_D3DSHADEMODE(Value);
|
||||
DBG_PRINTF("D3DRS_SHADEMODE := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_BLENDOP:
|
||||
case X_D3DRS_BLENDOP:
|
||||
Value = EmuXB2PC_D3DBLENDOP(Value);
|
||||
DBG_PRINTF("D3DRS_BLENDOP := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_SRCBLEND:
|
||||
case X_D3DRS_SRCBLEND:
|
||||
case X_D3DRS_DESTBLEND:
|
||||
Value = EmuXB2PC_D3DBLEND(Value);
|
||||
DBG_PRINTF("D3DRS_SRCBLEND := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_DESTBLEND:
|
||||
Value = EmuXB2PC_D3DBLEND(Value);
|
||||
DBG_PRINTF("D3DRS_DESTBLEND := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_ZFUNC:
|
||||
case X_D3DRS_ZFUNC:
|
||||
case X_D3DRS_ALPHAFUNC:
|
||||
case X_D3DRS_STENCILFUNC:
|
||||
Value = EmuXB2PC_D3DCMPFUNC(Value);
|
||||
DBG_PRINTF("D3DRS_ZFUNC := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_ALPHAFUNC:
|
||||
Value = EmuXB2PC_D3DCMPFUNC(Value);
|
||||
DBG_PRINTF("D3DRS_ALPHAFUNC := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_ALPHATESTENABLE:
|
||||
DBG_PRINTF("D3DRS_ALPHATESTENABLE := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_ALPHABLENDENABLE:
|
||||
DBG_PRINTF("D3DRS_ALPHABLENDENABLE := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_ALPHAREF:
|
||||
DBG_PRINTF("D3DRS_ALPHAREF := %lf\n", DWtoF(Value));
|
||||
break;
|
||||
|
||||
case D3DRS_ZWRITEENABLE:
|
||||
DBG_PRINTF("D3DRS_ZWRITEENABLE := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_DITHERENABLE:
|
||||
DBG_PRINTF("D3DRS_DITHERENABLE := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILZFAIL:
|
||||
case X_D3DRS_STENCILZFAIL:
|
||||
case X_D3DRS_STENCILPASS:
|
||||
Value = EmuXB2PC_D3DSTENCILOP(Value);
|
||||
DBG_PRINTF("D3DRS_STENCILZFAIL := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILPASS:
|
||||
Value = EmuXB2PC_D3DSTENCILOP(Value);
|
||||
DBG_PRINTF("D3DRS_STENCILPASS := 0x%.08X\n", Value);
|
||||
case X_D3DRS_SWATHWIDTH:
|
||||
// X_D3DRS_SWATHWIDTH safely ignored as it has no visible behavior:
|
||||
// It simply changes the fill-rate for performance tweaking
|
||||
// Just log and return
|
||||
EmuLog(LOG_LEVEL::DEBUG, "RenderState_Simple(0x%.08X (%s), 0x%.08X) was ignored!", Method, DxbxRenderStateInfo[XboxRenderStateIndex].S, Value);
|
||||
return;
|
||||
case X_D3DRS_ALPHATESTENABLE: case X_D3DRS_ALPHABLENDENABLE:
|
||||
case X_D3DRS_ALPHAREF: case X_D3DRS_ZWRITEENABLE:
|
||||
case X_D3DRS_DITHERENABLE: case X_D3DRS_STENCILREF:
|
||||
case X_D3DRS_STENCILMASK: case X_D3DRS_STENCILWRITEMASK:
|
||||
// These render states require no conversion, so we simply
|
||||
// allow SetRenderState to be called with no changes
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILFUNC:
|
||||
Value = EmuXB2PC_D3DCMPFUNC(Value);
|
||||
DBG_PRINTF("D3DRS_STENCILFUNC := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILREF:
|
||||
DBG_PRINTF("D3DRS_STENCILREF := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILMASK:
|
||||
DBG_PRINTF("D3DRS_STENCILMASK := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
case D3DRS_STENCILWRITEMASK:
|
||||
DBG_PRINTF("D3DRS_STENCILWRITEMASK := 0x%.08X\n", Value);
|
||||
break;
|
||||
|
||||
default:
|
||||
CxbxKrnlCleanup("Unsupported RenderState (0x%.08X)", State);
|
||||
break;
|
||||
};
|
||||
|
||||
// TODO: verify these params as you add support for them!
|
||||
HRESULT hRet = g_pD3DDevice->SetRenderState((D3DRENDERSTATETYPE)State, Value);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetRenderState");
|
||||
// RenderState is unsupported/unimplemented, report and return
|
||||
EmuLog(LOG_LEVEL::WARNING, "RenderState_Simple(0x%.08X (%s), 0x%.08X) is unsupported!", Method, DxbxRenderStateInfo[XboxRenderStateIndex].S, Value);
|
||||
return;
|
||||
}
|
||||
|
||||
HRESULT hRet = g_pD3DDevice->SetRenderState((D3DRENDERSTATETYPE)(DxbxRenderStateInfo[XboxRenderStateIndex].PC), Value);
|
||||
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetRenderState");
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -1215,101 +1215,6 @@ XTL::D3DPRIMITIVETYPE XTL::EmuPrimitiveTypeLookup[] =
|
|||
/* D3DPT_MAX = 11, */ (XTL::D3DPRIMITIVETYPE)11
|
||||
};
|
||||
|
||||
// render state conversion table
|
||||
CONST DWORD XTL::EmuD3DRenderStateSimpleEncoded[174] =
|
||||
{
|
||||
// WARNING: This lookup table strongly binds us to an SDK with these
|
||||
// specific #define values for D3DRS_*. Make VERY sure that you have
|
||||
// the correct lookup values;
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 0
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 2
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 4
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 6
|
||||
X_D3DRSSE_UNK, 0x0004037c, // 8 - , D3DRS_SHADEMODE
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 10
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 12
|
||||
0x0004035c, 0x00040300, // 14 - D3DRS_ZWRITEENABLE, D3DRS_ALPHATESTENABLE
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 16
|
||||
X_D3DRSSE_UNK, 0x00040344, // 18 - , D3DRS_SRCBLEND
|
||||
0x00040348, X_D3DRSSE_UNK, // 20 - D3DRS_DESTBLEND
|
||||
X_D3DRSSE_UNK, 0x00040354, // 22 - , D3DRS_ZFUNC
|
||||
0x00040340, 0x0004033c, // 24 - D3DRS_ALPHAREF, D3DRS_ALPHAFUNC
|
||||
0x00040310, 0x00040304, // 26 - D3DRS_DITHERENABLE, D3DRS_ALPHABLENDENABLE
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 28
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 30
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 32
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 34
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 36
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 38
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 40
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 42
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 44
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 46
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 48
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 50
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 52
|
||||
0x00040374, 0x00040378, // 54 - D3DRS_STENCILZFAIL, D3DRS_STENCILPASS
|
||||
0x00040364, 0x00040368, // 56 - D3DRS_STENCILFUNC, D3DRS_STENCILREF
|
||||
0x0004036c, 0x00040360, // 58 - D3DRS_STENCILMASK, D3DRS_STENCILWRITEMASK
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 60
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 62
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 64
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 66
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 68
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 70
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 72
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 74
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 76
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 78
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 80
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 82
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 84
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 86
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 88
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 90
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 92
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 94
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 96
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 98
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 100
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 102
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 104
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 106
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 108
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 110
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 112
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 114
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 116
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 118
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 120
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 122
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 124
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 126
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 128
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 130
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 132
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 134
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 136
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 138
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 140
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 142
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 144
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 146
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 148
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 150
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 152
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 154
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 156
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 158
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 160
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 162
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 164
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 166
|
||||
0x00040358, X_D3DRSSE_UNK, // 168 - D3DRS_COLORWRITEENABLE
|
||||
X_D3DRSSE_UNK, 0x00040350, // 170
|
||||
X_D3DRSSE_UNK, X_D3DRSSE_UNK, // 172
|
||||
};
|
||||
|
||||
void XTL::EmuUnswizzleBox
|
||||
(
|
||||
CONST PVOID pSrcBuff,
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
|
||||
// simple render state encoding lookup table
|
||||
#define X_D3DRSSE_UNK 0x7fffffff
|
||||
extern CONST DWORD EmuD3DRenderStateSimpleEncoded[174];
|
||||
|
||||
typedef void(*FormatToARGBRow)(const uint8_t* src, uint8_t* dst_argb, int width);
|
||||
|
||||
|
|
Loading…
Reference in New Issue