mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-18 02:52:47 +03:00
302 lines
9.3 KiB
C++
302 lines
9.3 KiB
C++
#ifndef GX_D3D_C_GX_DEVICE_D3D_HPP
|
|
#define GX_D3D_C_GX_DEVICE_D3D_HPP
|
|
|
|
#include "gx/CGxDevice.hpp"
|
|
#include <cstdint>
|
|
#include <d3d9.h>
|
|
#include <windows.h>
|
|
|
|
class CGxDeviceD3d : public CGxDevice {
|
|
public:
|
|
// Types
|
|
enum EDeviceState {
|
|
Ds_SrcBlend,
|
|
Ds_DstBlend,
|
|
Ds_TssMagFilter0,
|
|
Ds_TssMagFilter1,
|
|
Ds_TssMagFilter2,
|
|
Ds_TssMagFilter3,
|
|
Ds_TssMagFilter4,
|
|
Ds_TssMagFilter5,
|
|
Ds_TssMagFilter6,
|
|
Ds_TssMagFilter7,
|
|
Ds_TssMagFilter8,
|
|
Ds_TssMagFilter9,
|
|
Ds_TssMagFilter10,
|
|
Ds_TssMagFilter11,
|
|
Ds_TssMagFilter12,
|
|
Ds_TssMagFilter13,
|
|
Ds_TssMagFilter14,
|
|
Ds_TssMagFilter15,
|
|
Ds_TssMinFilter0,
|
|
Ds_TssMinFilter1,
|
|
Ds_TssMinFilter2,
|
|
Ds_TssMinFilter3,
|
|
Ds_TssMinFilter4,
|
|
Ds_TssMinFilter5,
|
|
Ds_TssMinFilter6,
|
|
Ds_TssMinFilter7,
|
|
Ds_TssMinFilter8,
|
|
Ds_TssMinFilter9,
|
|
Ds_TssMinFilter10,
|
|
Ds_TssMinFilter11,
|
|
Ds_TssMinFilter12,
|
|
Ds_TssMinFilter13,
|
|
Ds_TssMinFilter14,
|
|
Ds_TssMinFilter15,
|
|
Ds_TssMipFilter0,
|
|
Ds_TssMipFilter1,
|
|
Ds_TssMipFilter2,
|
|
Ds_TssMipFilter3,
|
|
Ds_TssMipFilter4,
|
|
Ds_TssMipFilter5,
|
|
Ds_TssMipFilter6,
|
|
Ds_TssMipFilter7,
|
|
Ds_TssMipFilter8,
|
|
Ds_TssMipFilter9,
|
|
Ds_TssMipFilter10,
|
|
Ds_TssMipFilter11,
|
|
Ds_TssMipFilter12,
|
|
Ds_TssMipFilter13,
|
|
Ds_TssMipFilter14,
|
|
Ds_TssMipFilter15,
|
|
Ds_TssWrapU0,
|
|
Ds_TssWrapU1,
|
|
Ds_TssWrapU2,
|
|
Ds_TssWrapU3,
|
|
Ds_TssWrapU4,
|
|
Ds_TssWrapU5,
|
|
Ds_TssWrapU6,
|
|
Ds_TssWrapU7,
|
|
Ds_TssWrapU8,
|
|
Ds_TssWrapU9,
|
|
Ds_TssWrapU10,
|
|
Ds_TssWrapU11,
|
|
Ds_TssWrapU12,
|
|
Ds_TssWrapU13,
|
|
Ds_TssWrapU14,
|
|
Ds_TssWrapU15,
|
|
Ds_TssWrapV0,
|
|
Ds_TssWrapV1,
|
|
Ds_TssWrapV2,
|
|
Ds_TssWrapV3,
|
|
Ds_TssWrapV4,
|
|
Ds_TssWrapV5,
|
|
Ds_TssWrapV6,
|
|
Ds_TssWrapV7,
|
|
Ds_TssWrapV8,
|
|
Ds_TssWrapV9,
|
|
Ds_TssWrapV10,
|
|
Ds_TssWrapV11,
|
|
Ds_TssWrapV12,
|
|
Ds_TssWrapV13,
|
|
Ds_TssWrapV14,
|
|
Ds_TssWrapV15,
|
|
Ds_TssTTF0,
|
|
Ds_TssTTF1,
|
|
Ds_TssTTF2,
|
|
Ds_TssTTF3,
|
|
Ds_TssTTF4,
|
|
Ds_TssTTF5,
|
|
Ds_TssTTF6,
|
|
Ds_TssTTF7,
|
|
Ds_TssMaxAnisotropy0,
|
|
Ds_TssMaxAnisotropy1,
|
|
Ds_TssMaxAnisotropy2,
|
|
Ds_TssMaxAnisotropy3,
|
|
Ds_TssMaxAnisotropy4,
|
|
Ds_TssMaxAnisotropy5,
|
|
Ds_TssMaxAnisotropy6,
|
|
Ds_TssMaxAnisotropy7,
|
|
Ds_TssMaxAnisotropy8,
|
|
Ds_TssMaxAnisotropy9,
|
|
Ds_TssMaxAnisotropy10,
|
|
Ds_TssMaxAnisotropy11,
|
|
Ds_TssMaxAnisotropy12,
|
|
Ds_TssMaxAnisotropy13,
|
|
Ds_TssMaxAnisotropy14,
|
|
Ds_TssMaxAnisotropy15,
|
|
Ds_TssTexCoordIndex0,
|
|
Ds_TssTexCoordIndex1,
|
|
Ds_TssTexCoordIndex2,
|
|
Ds_TssTexCoordIndex3,
|
|
Ds_TssTexCoordIndex4,
|
|
Ds_TssTexCoordIndex5,
|
|
Ds_TssTexCoordIndex6,
|
|
Ds_TssTexCoordIndex7,
|
|
Ds_TssColorOp0,
|
|
Ds_TssColorOp1,
|
|
Ds_TssColorOp2,
|
|
Ds_TssColorOp3,
|
|
Ds_TssColorOp4,
|
|
Ds_TssColorOp5,
|
|
Ds_TssColorOp6,
|
|
Ds_TssColorOp7,
|
|
Ds_TssAlphaOp0,
|
|
Ds_TssAlphaOp1,
|
|
Ds_TssAlphaOp2,
|
|
Ds_TssAlphaOp3,
|
|
Ds_TssAlphaOp4,
|
|
Ds_TssAlphaOp5,
|
|
Ds_TssAlphaOp6,
|
|
Ds_TssAlphaOp7,
|
|
Ds_TssColorArg10,
|
|
Ds_TssColorArg11,
|
|
Ds_TssColorArg12,
|
|
Ds_TssColorArg13,
|
|
Ds_TssColorArg14,
|
|
Ds_TssColorArg15,
|
|
Ds_TssColorArg16,
|
|
Ds_TssColorArg17,
|
|
Ds_TssColorArg20,
|
|
Ds_TssColorArg21,
|
|
Ds_TssColorArg22,
|
|
Ds_TssColorArg23,
|
|
Ds_TssColorArg24,
|
|
Ds_TssColorArg25,
|
|
Ds_TssColorArg26,
|
|
Ds_TssColorArg27,
|
|
Ds_TssAlphaArg10,
|
|
Ds_TssAlphaArg11,
|
|
Ds_TssAlphaArg12,
|
|
Ds_TssAlphaArg13,
|
|
Ds_TssAlphaArg14,
|
|
Ds_TssAlphaArg15,
|
|
Ds_TssAlphaArg16,
|
|
Ds_TssAlphaArg17,
|
|
Ds_TssAlphaArg20,
|
|
Ds_TssAlphaArg21,
|
|
Ds_TssAlphaArg22,
|
|
Ds_TssAlphaArg23,
|
|
Ds_TssAlphaArg24,
|
|
Ds_TssAlphaArg25,
|
|
Ds_TssAlphaArg26,
|
|
Ds_TssAlphaArg27,
|
|
Ds_AmbientMaterialSource,
|
|
Ds_DiffuseMaterialSource,
|
|
Ds_SpecularMaterialSource,
|
|
Ds_EmissiveMaterialSource,
|
|
Ds_Ambient,
|
|
Ds_AlphaBlendEnable,
|
|
Ds_AlphaTestEnable,
|
|
Ds_AlphaRef,
|
|
Ds_FogEnable,
|
|
Ds_ZWriteEnable,
|
|
Ds_ColorWriteEnable,
|
|
Ds_Lighting,
|
|
Ds_SpecularEnable,
|
|
Ds_CullMode,
|
|
Ds_ClipPlaneEnable,
|
|
Ds_ZFunc,
|
|
Ds_PointScaleA,
|
|
Ds_PointScaleB,
|
|
Ds_PointScaleC,
|
|
Ds_PointScaleEnable,
|
|
DeviceStates_Last,
|
|
};
|
|
|
|
// Static variables
|
|
static int32_t s_clientAdjustWidth;
|
|
static int32_t s_clientAdjustHeight;
|
|
static D3DCMPFUNC s_cmpFunc[];
|
|
static D3DCULL s_cullMode[];
|
|
static D3DBLEND s_dstBlend[];
|
|
static D3DCUBEMAP_FACES s_faceTypes[];
|
|
static D3DTEXTUREFILTERTYPE s_filterModes[GxTexFilters_Last][3];
|
|
static uint32_t s_gxAttribToD3dAttribSize[];
|
|
static D3DDECLTYPE s_gxAttribToD3dAttribType[];
|
|
static D3DDECLUSAGE s_gxAttribToD3dAttribUsage[];
|
|
static uint32_t s_gxAttribToD3dAttribUsageIndex[];
|
|
static D3DFORMAT s_GxFormatToD3dFormat[];
|
|
static D3DFORMAT s_GxTexFmtToD3dFmt[];
|
|
static EGxTexFormat s_GxTexFmtToUse[];
|
|
static D3DPRIMITIVETYPE s_primitiveConversion[];
|
|
static D3DBLEND s_srcBlend[];
|
|
static EGxTexFormat s_tolerableTexFmtMapping[];
|
|
static D3DTEXTUREADDRESS s_wrapModes[];
|
|
|
|
// Static functions
|
|
static int32_t ILoadD3dLib(HINSTANCE& d3dLib, LPDIRECT3D9& d3d);
|
|
static void IUnloadD3dLib(HINSTANCE& d3dLib, LPDIRECT3D9& d3d);
|
|
static LRESULT WindowProcD3d(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
// Member variables
|
|
HWND m_hwnd = nullptr;
|
|
ATOM m_hwndClass;
|
|
int32_t m_ownhwnd;
|
|
HINSTANCE m_d3dLib = nullptr;
|
|
LPDIRECT3D9 m_d3d = nullptr;
|
|
LPDIRECT3DDEVICE9 m_d3dDevice = nullptr;
|
|
D3DCAPS9 m_d3dCaps;
|
|
int32_t m_d3dIsHwDevice = 0;
|
|
LPDIRECT3DVERTEXDECLARATION9 m_d3dVertexDecl[GxVertexBufferFormats_Last] = { 0 };
|
|
D3DDISPLAYMODE m_desktopDisplayMode;
|
|
int32_t m_inScene;
|
|
D3DFORMAT m_devAdapterFormat;
|
|
LPDIRECT3DSURFACE9 m_defColorSurface = nullptr;
|
|
LPDIRECT3DSURFACE9 m_defDepthSurface = nullptr;
|
|
LPDIRECT3DVERTEXDECLARATION9 m_d3dCurrentVertexDecl;
|
|
LPDIRECT3DINDEXBUFFER9 m_d3dCurrentIndexBuf;
|
|
LPDIRECT3DVERTEXBUFFER9 m_d3dVertexStreamBuf[8];
|
|
uint32_t m_d3dVertexStreamOfs[8];
|
|
uint32_t m_d3dVertexStreamStride[8];
|
|
uint32_t m_deviceStates[DeviceStates_Last];
|
|
|
|
// Virtual member functions
|
|
virtual void ITexMarkAsUpdated(CGxTex* texId);
|
|
virtual void IRsSendToHw(EGxRenderState which);
|
|
virtual int32_t DeviceCreate(int32_t (*windowProc)(void* window, uint32_t message, uintptr_t wparam, intptr_t lparam), const CGxFormat& format);
|
|
virtual int32_t DeviceSetFormat(const CGxFormat& format);
|
|
virtual void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2);
|
|
virtual void CapsWindowSize(CRect& dst);
|
|
virtual void CapsWindowSizeInScreenCoords(CRect& dst);
|
|
virtual void ScenePresent();
|
|
virtual void SceneClear(uint32_t mask, CImVector color);
|
|
virtual void XformSetProjection(const C44Matrix& matrix);
|
|
virtual void Draw(CGxBatch* batch, int32_t indexed);
|
|
virtual void PoolSizeSet(CGxPool* pool, uint32_t size);
|
|
virtual char* BufLock(CGxBuf* buf);
|
|
virtual int32_t BufUnlock(CGxBuf* buf, uint32_t size);
|
|
virtual void IShaderCreate(CGxShader* shader);
|
|
virtual void ShaderCreate(CGxShader* shaders[], EGxShTarget target, const char* a4, const char* a5, int32_t permutations);
|
|
virtual int32_t StereoEnabled();
|
|
|
|
// Member functions
|
|
CGxDeviceD3d();
|
|
int32_t CreatePoolAPI(CGxPool* pool);
|
|
void DsSet(EDeviceState state, uint32_t val);
|
|
char* IBufLock(CGxBuf* buf);
|
|
void IBufUnlock(CGxBuf* buf);
|
|
int32_t ICreateD3d();
|
|
int32_t ICreateD3dDevice(const CGxFormat& format);
|
|
LPDIRECT3DINDEXBUFFER9 ICreateD3dIB(EGxPoolUsage usage, uint32_t size);
|
|
LPDIRECT3DVERTEXBUFFER9 ICreateD3dVB(EGxPoolUsage usage, uint32_t size);
|
|
LPDIRECT3DVERTEXDECLARATION9 ICreateD3dVertexDecl(D3DVERTEXELEMENT9 elements[], uint32_t count);
|
|
bool ICreateWindow(CGxFormat& format);
|
|
void ISetPresentParms(D3DPRESENT_PARAMETERS& d3dpp, const CGxFormat& format);
|
|
void IDestroyD3d();
|
|
void IDestroyD3dDevice();
|
|
void IReleaseD3dPools(int32_t a2);
|
|
void IReleaseD3dResources(int32_t a2);
|
|
void ISceneBegin();
|
|
void ISceneEnd();
|
|
void ISetCaps(const CGxFormat& format);
|
|
void ISetTexture(uint32_t tmu, CGxTex* texId);
|
|
void ISetVertexBuffer(uint32_t stream, LPDIRECT3DVERTEXBUFFER9 buffer, uint32_t offset, uint32_t stride);
|
|
void IShaderBindPixel(CGxShader* shader);
|
|
void IShaderBindVertex(CGxShader* shader);
|
|
void IShaderConstantsFlush();
|
|
void IShaderCreatePixel(CGxShader* shader);
|
|
void IShaderCreateVertex(CGxShader* shader);
|
|
void IStateSetD3dDefaults();
|
|
void IStateSync();
|
|
void IStateSyncEnables();
|
|
void IStateSyncIndexPtr();
|
|
void IStateSyncVertexPtrs();
|
|
void ITexCreate(CGxTex* texId);
|
|
void ITexUpload(CGxTex* texId);
|
|
void IXformSetProjection(const C44Matrix& matrix);
|
|
};
|
|
|
|
#endif
|