This commit is contained in:
Aaron Robinson 2003-10-07 05:20:35 +00:00
parent 7fbefb2607
commit d55db893be
3 changed files with 112 additions and 155 deletions

View File

@ -1,9 +1,5 @@
Cxbx Todo (* denotes high priority, + denotes medium priority)
* For Vertex buffer locks, if tesselation has occurred, the original
pointer should be returned, and a flag set to know that the next time
the vertex buffer is used it should be re-registered (retesselated)
* Stella has a memory leak in the game's list screen..
* SetPushBufferSize -> 0x184CC0 (Halo)..too small to detect?

View File

@ -55,10 +55,10 @@ typedef signed short sint16;
typedef signed long sint32;
// define this to trace intercepted function calls
#define _DEBUG_TRACE
//#define _DEBUG_TRACE
// define this to trace warnings
#define _DEBUG_WARNINGS
//#define _DEBUG_WARNINGS
// version information
#ifndef _DEBUG_TRACE

View File

@ -50,10 +50,10 @@
#include "Emu.h"
// initialize direct3d
extern void EmuD3DInit(Xbe::Header *XbeHeader, uint32 XbeHeaderSize);
extern VOID EmuD3DInit(Xbe::Header *XbeHeader, uint32 XbeHeaderSize);
// cleanup direct3d
extern void EmuD3DCleanup();
extern VOID EmuD3DCleanup();
// fixup xbox extensions to be compatible with PC direct3d
extern UINT EmuFixupVerticesA
@ -76,108 +76,18 @@ extern VOID EmuFixupVerticesB
XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8
);
// special resource data flags
#define X_D3DRESOURCE_DATA_FLAG_BASE (0xEFFFFFFE)
#define X_D3DRESOURCE_DATA_FLAG_SURFACE (X_D3DRESOURCE_DATA_FLAG_BASE - 1)
// Todo: Fill out this enumeration table for convienance
// TODO: Fill out these enumeration tables for convienance
typedef DWORD X_D3DFORMAT;
/**
// Oops: Well, heres PC->Xbox if you ever need it... :]
// ******************************************************************
// * Convert from PC D3D to Xbox D3D enumeration
// ******************************************************************
// TODO: XDK-Specific Tables? So far they are the same
if((uint32)State < 4)
State = (D3DTRANSFORMSTATETYPE)(State - 2);
else if((uint32)State < 20)
State = (D3DTRANSFORMSTATETYPE)(State - 14);
else if((uint32)State > 255)
State = (D3DTRANSFORMSTATETYPE)(State - 250);
else
EmuCleanup("Unknown Transform State Type (%d)", State);
*/
// ******************************************************************
// * func: EmuXB2PC_D3DTS
// ******************************************************************
inline D3DTRANSFORMSTATETYPE EmuXB2PC_D3DTS(D3DTRANSFORMSTATETYPE State)
{
if((uint32)State < 2)
return (D3DTRANSFORMSTATETYPE)(State + 2);
else if((uint32)State < 6)
return (D3DTRANSFORMSTATETYPE)(State + 14);
else if((uint32)State < 10)
return D3DTS_WORLDMATRIX(State-6);
EmuCleanup("Unknown Transform State Type (%d)", State);
return State;
}
// Todo: Fill out this enumeration tabel for convienance
typedef DWORD X_D3DBLENDOP;
// ******************************************************************
// * func: EmuXB2PC_D3DBLENDOP
// ******************************************************************
inline D3DBLENDOP EmuXB2PC_D3DBLENDOP(X_D3DBLENDOP Value)
{
switch(Value)
{
case 0x8006:
return D3DBLENDOP_ADD;
}
EmuCleanup("Unknown D3DBLENDOP (0x%.08X)", Value);
return (D3DBLENDOP)Value;
}
// Todo: Fill out this enumeration table for convienance
typedef DWORD X_D3DBLEND;
// ******************************************************************
// * func: EmuXB2PC_D3DBLEND
// ******************************************************************
inline D3DBLEND EmuXB2PC_D3DBLEND(X_D3DBLEND Value)
{
if(Value < 2)
return (D3DBLEND)(Value + 1);
else if(Value < 0x309)
return (D3DBLEND)((Value & 0xF) + 3);
EmuCleanup("Unknown Xbox D3DBLEND Extension (0x%.08X)", Value);
return (D3DBLEND)Value;
}
// Todo: Fill out this enumeration table for convienance
typedef DWORD X_D3DCMPFUNC;
// ******************************************************************
// * func: EmuXB2PC_D3DCMPFUNC
// ******************************************************************
inline D3DCMPFUNC EmuXB2PC_D3DCMPFUNC(X_D3DCMPFUNC Value)
{
return (D3DCMPFUNC)((Value & 0xF) + 1);
}
// Todo: Fill out this enumeration table for convienance
typedef DWORD X_D3DFILLMODE;
typedef DWORD X_D3DPRIMITIVETYPE;
// ******************************************************************
// * func: EmuXB2PC_D3DFILLMODE
// ******************************************************************
inline D3DFILLMODE EmuXB2PC_D3DFILLMODE(X_D3DFILLMODE Value)
{
return (D3DFILLMODE)((Value & 0xF) + 1);
}
// NOTE: HACK: These enumerations are not equivalent when > 7!
typedef D3DRESOURCETYPE X_D3DRESOURCETYPE;
// ******************************************************************
// * func: EmuXB2PC_D3DFormat
// ******************************************************************
// convert from xbox to pc color formats
inline D3DFORMAT EmuXB2PC_D3DFormat(X_D3DFORMAT Format)
{
switch(Format)
@ -197,7 +107,7 @@ inline D3DFORMAT EmuXB2PC_D3DFormat(X_D3DFORMAT Format)
return D3DFMT_A8R8G8B8;
case 0x3F: // Linear (X_D3DFMT_LIN_A8B8G8R8)
return D3DFMT_A8R8G8B8; // Note: Warning: R<->B Swapped!
return D3DFMT_A8R8G8B8; // NOTE: HACK: R<->B Swapped!
case 0x1E: // Linear (X_D3DFMT_LIN_X8R8G8B8)
case 0x07: // Swizzled (X_D3DFMT_X8R8G8B8)
@ -232,9 +142,7 @@ inline D3DFORMAT EmuXB2PC_D3DFormat(X_D3DFORMAT Format)
return (D3DFORMAT)Format;
}
// ******************************************************************
// * func: EmuPC2XB_D3DFormat
// ******************************************************************
// convert from pc to xbox color formats
inline X_D3DFORMAT EmuPC2XB_D3DFormat(D3DFORMAT Format)
{
switch(Format)
@ -258,11 +166,75 @@ inline X_D3DFORMAT EmuPC2XB_D3DFormat(D3DFORMAT Format)
return Format;
}
/**
// Oops: Well, heres PC->Xbox if you ever need it... :]
// ******************************************************************
// * X_D3DRESOURCETYPE
// * Convert from PC D3D to Xbox D3D enumeration
// ******************************************************************
// NOTE: HACK: These enumerations are not equivalent when > 7!
typedef D3DRESOURCETYPE X_D3DRESOURCETYPE;
// TODO: XDK-Specific Tables? So far they are the same
if((uint32)State < 4)
State = (D3DTRANSFORMSTATETYPE)(State - 2);
else if((uint32)State < 20)
State = (D3DTRANSFORMSTATETYPE)(State - 14);
else if((uint32)State > 255)
State = (D3DTRANSFORMSTATETYPE)(State - 250);
else
EmuCleanup("Unknown Transform State Type (%d)", State);
//*/
// convert from xbox to pc texture transform state types
inline D3DTRANSFORMSTATETYPE EmuXB2PC_D3DTS(D3DTRANSFORMSTATETYPE State)
{
if((uint32)State < 2)
return (D3DTRANSFORMSTATETYPE)(State + 2);
else if((uint32)State < 6)
return (D3DTRANSFORMSTATETYPE)(State + 14);
else if((uint32)State < 10)
return D3DTS_WORLDMATRIX(State-6);
EmuCleanup("Unknown Transform State Type (%d)", State);
return State;
}
// convert from xbox to pc blend ops
inline D3DBLENDOP EmuXB2PC_D3DBLENDOP(X_D3DBLENDOP Value)
{
switch(Value)
{
case 0x8006:
return D3DBLENDOP_ADD;
}
EmuCleanup("Unknown D3DBLENDOP (0x%.08X)", Value);
return (D3DBLENDOP)Value;
}
// convert from xbox to pc blend types
inline D3DBLEND EmuXB2PC_D3DBLEND(X_D3DBLEND Value)
{
if(Value < 2)
return (D3DBLEND)(Value + 1);
else if(Value < 0x309)
return (D3DBLEND)((Value & 0xF) + 3);
EmuCleanup("Unknown Xbox D3DBLEND Extension (0x%.08X)", Value);
return (D3DBLEND)Value;
}
// convert from xbox to pc comparison functions
inline D3DCMPFUNC EmuXB2PC_D3DCMPFUNC(X_D3DCMPFUNC Value)
{
return (D3DCMPFUNC)((Value & 0xF) + 1);
}
// convert from xbox to pc fill modes
inline D3DFILLMODE EmuXB2PC_D3DFILLMODE(X_D3DFILLMODE Value)
{
return (D3DFILLMODE)((Value & 0xF) + 1);
}
// ******************************************************************
// * X_D3DDISPLAYMODE
@ -331,38 +303,6 @@ struct X_D3DVertexShader
DWORD UnknownC[0x59];
};
// ******************************************************************
// * D3DResource "Common" Masks
// ******************************************************************
#define X_D3DCOMMON_REFCOUNT_MASK 0x0000FFFF
#define X_D3DCOMMON_TYPE_MASK 0x00070000
#define X_D3DCOMMON_TYPE_SHIFT 16
#define X_D3DCOMMON_TYPE_VERTEXBUFFER 0x00000000
#define X_D3DCOMMON_TYPE_INDEXBUFFER 0x00010000
#define X_D3DCOMMON_TYPE_PUSHBUFFER 0x00020000
#define X_D3DCOMMON_TYPE_PALETTE 0x00030000
#define X_D3DCOMMON_TYPE_TEXTURE 0x00040000
#define X_D3DCOMMON_TYPE_SURFACE 0x00050000
#define X_D3DCOMMON_TYPE_FIXUP 0x00060000
#define X_D3DCOMMON_INTREFCOUNT_MASK 0x00780000
#define X_D3DCOMMON_INTREFCOUNT_SHIFT 19
#define X_D3DCOMMON_D3DCREATED 0x01000000
#define X_D3DCOMMON_UNUSED_MASK 0xFE000000
#define X_D3DCOMMON_UNUSED_SHIFT 25
// ******************************************************************
// * D3DTexture "Size" Masks
// ******************************************************************
#define X_D3DSIZE_WIDTH_MASK 0x00000FFF // Width (Texels - 1)
#define X_D3DSIZE_HEIGHT_MASK 0x00FFF000 // Height (Texels - 1)
#define X_D3DSIZE_HEIGHT_SHIFT 12
#define X_D3DSIZE_PITCH_MASK 0xFF000000 // Pitch / 64 - 1
#define X_D3DSIZE_PITCH_SHIFT 24
// ******************************************************************
// * X_D3DResource
// ******************************************************************
@ -385,6 +325,26 @@ struct X_D3DResource
};
};
// d3d resource "common" masks
#define X_D3DCOMMON_REFCOUNT_MASK 0x0000FFFF
#define X_D3DCOMMON_TYPE_MASK 0x00070000
#define X_D3DCOMMON_TYPE_SHIFT 16
#define X_D3DCOMMON_TYPE_VERTEXBUFFER 0x00000000
#define X_D3DCOMMON_TYPE_INDEXBUFFER 0x00010000
#define X_D3DCOMMON_TYPE_PUSHBUFFER 0x00020000
#define X_D3DCOMMON_TYPE_PALETTE 0x00030000
#define X_D3DCOMMON_TYPE_TEXTURE 0x00040000
#define X_D3DCOMMON_TYPE_SURFACE 0x00050000
#define X_D3DCOMMON_TYPE_FIXUP 0x00060000
#define X_D3DCOMMON_INTREFCOUNT_MASK 0x00780000
#define X_D3DCOMMON_INTREFCOUNT_SHIFT 19
#define X_D3DCOMMON_D3DCREATED 0x01000000
#define X_D3DCOMMON_UNUSED_MASK 0xFE000000
#define X_D3DCOMMON_UNUSED_SHIFT 25
// special resource data flags
#define X_D3DRESOURCE_DATA_FLAG_SURFACE 0xEFFFFFFF
// ******************************************************************
// * X_D3DVertexBuffer
// ******************************************************************
@ -431,10 +391,16 @@ typedef enum _X_D3DPALETTESIZE
X_D3DPALETTESIZE;
// ******************************************************************
// * X_D3DPixelContainer "Format" Masks
// * X_D3DPixelContainer
// ******************************************************************
struct X_D3DPixelContainer : public X_D3DResource
{
X_D3DFORMAT Format;
DWORD Size;
};
// pixel container "format" masks
#define X_D3DFORMAT_RESERVED1_MASK 0x00000003 // Must be zero
#define X_D3DFORMAT_DMACHANNEL_MASK 0x00000003
#define X_D3DFORMAT_DMACHANNEL_A 0x00000001 // DMA channel A - the default for all system memory
#define X_D3DFORMAT_DMACHANNEL_B 0x00000002 // DMA channel B - unused
@ -453,14 +419,12 @@ X_D3DPALETTESIZE;
#define X_D3DFORMAT_PSIZE_MASK 0xF0000000 // Log 2 of the P size of the base texture
#define X_D3DFORMAT_PSIZE_SHIFT 28
// ******************************************************************
// * X_D3DPixelContainer
// ******************************************************************
struct X_D3DPixelContainer : public X_D3DResource
{
X_D3DFORMAT Format;
DWORD Size;
};
// pixel container "size" masks
#define X_D3DSIZE_WIDTH_MASK 0x00000FFF // Width (Texels - 1)
#define X_D3DSIZE_HEIGHT_MASK 0x00FFF000 // Height (Texels - 1)
#define X_D3DSIZE_HEIGHT_SHIFT 12
#define X_D3DSIZE_PITCH_MASK 0xFF000000 // Pitch / 64 - 1
#define X_D3DSIZE_PITCH_SHIFT 24
// ******************************************************************
// * X_D3DBaseTexture
@ -515,9 +479,6 @@ struct X_D3DTILE
DWORD ZOffset;
};
// Todo: Fill out this enumeration table for convienance
typedef DWORD X_D3DPRIMITIVETYPE;
// ******************************************************************
// * EmuD3DVertexToPrimitive
// ******************************************************************