mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-16 01:55:21 +03:00
feat(gx): create d3d device in d3d backend
This commit is contained in:
parent
c05ac69273
commit
f6d768ac59
@ -20,6 +20,7 @@ class CGxFormat {
|
||||
};
|
||||
|
||||
// Member variables
|
||||
bool hwTnL;
|
||||
int8_t window;
|
||||
int32_t maximize;
|
||||
Format depthFormat;
|
||||
@ -27,6 +28,7 @@ class CGxFormat {
|
||||
uint32_t sampleCount;
|
||||
Format colorFormat;
|
||||
uint32_t refreshRate;
|
||||
uint32_t vsync;
|
||||
C2iVector pos;
|
||||
};
|
||||
|
||||
|
@ -1,5 +1,16 @@
|
||||
#include "gx/d3d/CGxDeviceD3d.hpp"
|
||||
|
||||
D3DFORMAT CGxDeviceD3d::s_GxFormatToD3dFormat[] = {
|
||||
D3DFMT_R5G6B5, // Fmt_Rgb565
|
||||
D3DFMT_X8R8G8B8, // Fmt_ArgbX888
|
||||
D3DFMT_A8R8G8B8, // Fmt_Argb8888
|
||||
D3DFMT_A2R10G10B10, // Fmt_Argb2101010
|
||||
D3DFMT_D16, // Fmt_Ds160
|
||||
D3DFMT_D24X8, // Fmt_Ds24X
|
||||
D3DFMT_D24S8, // Fmt_Ds248
|
||||
D3DFMT_D32, // Fmt_Ds320
|
||||
};
|
||||
|
||||
ATOM WindowClassCreate() {
|
||||
auto instance = GetModuleHandle(nullptr);
|
||||
|
||||
@ -155,7 +166,28 @@ int32_t CGxDeviceD3d::ICreateD3d() {
|
||||
}
|
||||
|
||||
int32_t CGxDeviceD3d::ICreateD3dDevice(const CGxFormat& format) {
|
||||
// TODO
|
||||
// TODO stereoscopic setup
|
||||
|
||||
auto hwTnL = format.hwTnL;
|
||||
if (hwTnL && (this->m_d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0) {
|
||||
hwTnL = false;
|
||||
}
|
||||
this->m_d3dIsHwDevice = hwTnL;
|
||||
|
||||
D3DPRESENT_PARAMETERS d3dpp;
|
||||
this->ISetPresentParms(d3dpp, format);
|
||||
|
||||
uint32_t behaviorFlags = hwTnL
|
||||
? D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE
|
||||
: D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE;
|
||||
|
||||
if (this->m_d3d->CreateDevice(0, D3DDEVTYPE_HAL, this->m_hwnd, behaviorFlags, &d3dpp, &this->m_d3dDevice) >= S_OK) {
|
||||
// TODO
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
this->m_d3dDevice = nullptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -217,6 +249,72 @@ void CGxDeviceD3d::IRsSendToHw(EGxRenderState rs) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void CGxDeviceD3d::ISetPresentParms(D3DPRESENT_PARAMETERS& d3dpp, const CGxFormat& format) {
|
||||
memset(&d3dpp, 0, sizeof(d3dpp));
|
||||
|
||||
if (format.window) {
|
||||
D3DDISPLAYMODE currentMode;
|
||||
D3DFORMAT backBufferFormat;
|
||||
if (this->m_d3d->GetAdapterDisplayMode(0, ¤tMode) >= S_OK) {
|
||||
backBufferFormat = currentMode.Format;
|
||||
} else {
|
||||
backBufferFormat = this->m_desktopDisplayMode.Format;
|
||||
}
|
||||
|
||||
auto& windowRect = this->DeviceCurWindow();
|
||||
|
||||
d3dpp.Windowed = true;
|
||||
d3dpp.BackBufferWidth = windowRect.maxX;
|
||||
d3dpp.BackBufferHeight = windowRect.maxY;
|
||||
d3dpp.BackBufferFormat = backBufferFormat;
|
||||
|
||||
if (format.vsync) {
|
||||
// TODO d3dpp.BackBufferCount = format.int1C;
|
||||
d3dpp.BackBufferCount = 1;
|
||||
} else {
|
||||
d3dpp.BackBufferCount = 1;
|
||||
}
|
||||
|
||||
d3dpp.FullScreen_RefreshRateInHz = 0;
|
||||
} else {
|
||||
d3dpp.BackBufferWidth = format.size.x;
|
||||
d3dpp.BackBufferHeight = format.size.y;
|
||||
d3dpp.BackBufferFormat = CGxDeviceD3d::s_GxFormatToD3dFormat[format.colorFormat];
|
||||
d3dpp.FullScreen_RefreshRateInHz = format.refreshRate;
|
||||
}
|
||||
|
||||
d3dpp.hDeviceWindow = this->m_hwnd;
|
||||
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
d3dpp.EnableAutoDepthStencil = true;
|
||||
d3dpp.AutoDepthStencilFormat = CGxDeviceD3d::s_GxFormatToD3dFormat[format.depthFormat];
|
||||
|
||||
switch (format.vsync) {
|
||||
case 1:
|
||||
d3dpp.PresentationInterval = 1;
|
||||
break;
|
||||
case 2:
|
||||
d3dpp.PresentationInterval = format.window ? 1 : 2;
|
||||
break;
|
||||
case 3:
|
||||
d3dpp.PresentationInterval = format.window ? 1 : 4;
|
||||
break;
|
||||
case 4:
|
||||
d3dpp.PresentationInterval = format.window ? 1 : 8;
|
||||
break;
|
||||
default:
|
||||
d3dpp.PresentationInterval = CW_USEDEFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (format.sampleCount <= 1) {
|
||||
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
|
||||
} else {
|
||||
d3dpp.MultiSampleType = static_cast<D3DMULTISAMPLE_TYPE>(format.sampleCount);
|
||||
|
||||
// TODO MultiSampleQuality
|
||||
}
|
||||
}
|
||||
|
||||
void CGxDeviceD3d::IShaderCreate(CGxShader* shader) {
|
||||
// TODO
|
||||
}
|
||||
|
@ -8,6 +8,9 @@
|
||||
|
||||
class CGxDeviceD3d : public CGxDevice {
|
||||
public:
|
||||
// Static variables
|
||||
static D3DFORMAT s_GxFormatToD3dFormat[];
|
||||
|
||||
// Static functions
|
||||
static int32_t ILoadD3dLib(HINSTANCE& d3dLib, LPDIRECT3D9& d3d);
|
||||
static void IUnloadD3dLib(HINSTANCE& d3dLib, LPDIRECT3D9& d3d);
|
||||
@ -21,6 +24,7 @@ class CGxDeviceD3d : public CGxDevice {
|
||||
LPDIRECT3D9 m_d3d = nullptr;
|
||||
LPDIRECT3DDEVICE9 m_d3dDevice = nullptr;
|
||||
D3DCAPS9 m_d3dCaps;
|
||||
int32_t m_d3dIsHwDevice = 0;
|
||||
D3DDISPLAYMODE m_desktopDisplayMode;
|
||||
|
||||
// Virtual member functions
|
||||
@ -38,6 +42,7 @@ class CGxDeviceD3d : public CGxDevice {
|
||||
int32_t ICreateD3d();
|
||||
int32_t ICreateD3dDevice(const CGxFormat& format);
|
||||
bool ICreateWindow(CGxFormat& format);
|
||||
void ISetPresentParms(D3DPRESENT_PARAMETERS& d3dpp, const CGxFormat& format);
|
||||
void IDestroyD3d();
|
||||
void IDestroyD3dDevice();
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user