feat(d3d): clean up hardware cursor stuff

This commit is contained in:
superp00t 2025-04-01 12:43:55 -04:00
parent f4e9f86ca6
commit 8adf3a0061
2 changed files with 37 additions and 26 deletions

View File

@ -336,7 +336,7 @@ LRESULT CGxDeviceD3d::WindowProcD3d(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
if (device) {
if (device->m_d3dDevice && LOWORD(lParam) == HTCLIENT) {
SetCursor(nullptr);
BOOL show = device->m_cursorVisible && device->m_hardwareCursor ? TRUE : FALSE;
BOOL show = device->m_cursorVisible && device->m_hwCursor ? TRUE : FALSE;
device->m_d3dDevice->ShowCursor(show);
return 1;
}
@ -487,15 +487,7 @@ int32_t CGxDeviceD3d::DeviceSetFormat(const CGxFormat& format) {
CGxFormat createFormat = format;
if (this->ICreateWindow(createFormat) && this->ICreateD3dDevice(createFormat) && this->CGxDevice::DeviceSetFormat(format)) {
this->intF64 = 1;
this->m_hwCursorNeedsUpdate = 1;
if (this->m_format.window == 0) {
RECT windowRect;
GetWindowRect(this->m_hwnd, &windowRect);
ClipCursor(&windowRect);
}
this->ICursorClip(1);
return 1;
} else {
CGxDevice::Log("CGxDeviceD3d::DeviceSetFormat(): unable to set format!");
@ -1015,6 +1007,20 @@ bool CGxDeviceD3d::ICreateWindow(CGxFormat& format) {
return this->m_hwnd != nullptr;
}
void CGxDeviceD3d::ICursorClip(int32_t a1) {
this->intF64 = a1;
if (a1) {
this->m_hwCursorNeedsUpdate = 1;
if (this->m_format.window) {
RECT windowRect;
GetWindowRect(this->m_hwnd, &windowRect);
ClipCursor(&windowRect);
}
}
}
void CGxDeviceD3d::IDestroyD3d() {
this->IDestroyD3dDevice();
CGxDeviceD3d::IUnloadD3dLib(this->m_d3dLib, this->m_d3d);
@ -1220,7 +1226,7 @@ void CGxDeviceD3d::IRsSendToHw(EGxRenderState which) {
void CGxDeviceD3d::ICursorCreate(const CGxFormat& format) {
CGxDevice::ICursorCreate(format);
if (this->m_hardwareCursor && this->m_hwCursorTexture == nullptr) {
if (this->m_hwCursor && this->m_hwCursorTexture == nullptr) {
this->m_d3dDevice->CreateTexture(
32,
32,
@ -1257,7 +1263,7 @@ void CGxDeviceD3d::ICursorDestroy() {
void CGxDeviceD3d::CursorSetVisible(int32_t visible) {
CGxDevice::CursorSetVisible(visible);
if (this->m_hardwareCursor && this->m_context) {
if (this->m_hwCursor && this->m_context) {
POINT point;
RECT rect;
GetCursorPos(&point);
@ -1276,15 +1282,15 @@ void CGxDeviceD3d::CursorUnlock(uint32_t x, uint32_t y) {
}
void CGxDeviceD3d::ICursorDraw() {
if (!this->m_hardwareCursor) {
if (!this->m_hwCursor) {
this->ISceneBegin();
}
CGxDevice::ICursorDraw();
if (!this->m_hardwareCursor) {
if (!this->m_hwCursor) {
this->ISceneEnd();
if (!this->m_hardwareCursor) {
if (!this->m_hwCursor) {
return;
}
}
@ -1312,16 +1318,19 @@ void CGxDeviceD3d::ICursorDraw() {
void CGxDeviceD3d::ISceneBegin() {
if (!this->m_context) {
auto result = this->m_d3dDevice->TestCooperativeLevel();
if (result == D3DERR_DEVICENOTRESET) {
this->IReleaseD3dResources(0);
if (this->m_d3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) {
D3DPRESENT_PARAMETERS d3dpp;
this->IReleaseD3dResources(0);
this->ISetPresentParms(d3dpp, this->m_format);
result = this->m_d3dDevice->Reset(&d3dpp);
if (result == D3D_OK) {
if (this->m_d3dDevice->Reset(&d3dpp) == D3D_OK) {
this->IStateSetD3dDefaults();
// TODO: CGxDeviceD3d::ICursorClip
// TODO: this->NotifyOnDeviceRestored()
this->ICursorClip(1);
this->m_context = 1;
// TODO
// this->intF5C = 0;
// this->unk3ACC = 1;
// this->NotifyOnDeviceRestored();
}
}
}
@ -1427,7 +1436,7 @@ void CGxDeviceD3d::ISetCaps(const CGxFormat& format) {
// Detect hardware cursor
this->m_caps.m_hardwareCursor = this->m_d3dCaps.CursorCaps & D3DCURSORCAPS_COLOR;
this->m_caps.m_hwCursor = this->m_d3dCaps.CursorCaps & D3DCURSORCAPS_COLOR;
// Texture formats
@ -2191,8 +2200,9 @@ void CGxDeviceD3d::ShaderCreate(CGxShader* shaders[], EGxShTarget target, const
}
int32_t CGxDeviceD3d::StereoEnabled() {
// TODO
return 0;
CGxDevice::CursorUnlock(x, y);
this->m_hwCursorNeedsUpdate = 1;
}
void CGxDeviceD3d::XformSetProjection(const C44Matrix& matrix) {

View File

@ -252,7 +252,6 @@ class CGxDeviceD3d : public CGxDevice {
virtual void ICursorDestroy();
virtual void ICursorDraw();
virtual void CursorSetVisible(int32_t visible);
virtual void CursorUnlock(uint32_t x, uint32_t y);
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* DeviceWindow();
@ -270,6 +269,7 @@ class CGxDeviceD3d : public CGxDevice {
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();
virtual void CursorUnlock(uint32_t x, uint32_t y);
// Member functions
CGxDeviceD3d();
@ -283,6 +283,7 @@ class CGxDeviceD3d : public CGxDevice {
LPDIRECT3DVERTEXBUFFER9 ICreateD3dVB(EGxPoolUsage usage, uint32_t size);
LPDIRECT3DVERTEXDECLARATION9 ICreateD3dVertexDecl(D3DVERTEXELEMENT9 elements[], uint32_t count);
bool ICreateWindow(CGxFormat& format);
void ICursorClip(int32_t a1);
void ISetPresentParms(D3DPRESENT_PARAMETERS& d3dpp, const CGxFormat& format);
void IDestroyD3d();
void IDestroyD3dDevice();