Implement/match most remaining MxDirect3D device enumeration functions

This commit is contained in:
Christian Semmler 2024-01-03 21:54:38 -05:00
parent 29facdf35f
commit 7c6af73418
3 changed files with 39 additions and 54 deletions

View File

@ -57,7 +57,7 @@ MxResult LegoVideoManager::CreateDirect3D()
MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread) MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread)
{ {
MxBool paletteCreated = FALSE; MxBool paletteCreated = FALSE;
MxDeviceEnumerateElement* deviceEnumerate = NULL; MxDriver* driver = NULL;
MxDevice* device = NULL; MxDevice* device = NULL;
MxResult result = FAILURE; MxResult result = FAILURE;
@ -91,7 +91,7 @@ MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyM
if (p_videoParam.GetDeviceName()) { if (p_videoParam.GetDeviceName()) {
deviceNum = deviceEnumerator.ParseDeviceName(p_videoParam.GetDeviceName()); deviceNum = deviceEnumerator.ParseDeviceName(p_videoParam.GetDeviceName());
if (deviceNum >= 0) { if (deviceNum >= 0) {
if ((deviceNum = deviceEnumerator.GetDevice(deviceNum, deviceEnumerate, device)) != SUCCESS) if ((deviceNum = deviceEnumerator.GetDevice(deviceNum, driver, device)) != SUCCESS)
deviceNum = -1; deviceNum = -1;
} }
} }
@ -99,12 +99,12 @@ MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyM
if (deviceNum < 0) { if (deviceNum < 0) {
deviceEnumerator.FUN_1009d210(); deviceEnumerator.FUN_1009d210();
deviceNum = deviceEnumerator.FUN_1009d0d0(); deviceNum = deviceEnumerator.FUN_1009d0d0();
deviceEnumerator.GetDevice(deviceNum, deviceEnumerate, device); deviceEnumerator.GetDevice(deviceNum, driver, device);
} }
m_direct3d->FUN_1009b5f0(deviceEnumerator, deviceEnumerate, device); m_direct3d->FUN_1009b5f0(deviceEnumerator, driver, device);
if (!deviceEnumerate->m_ddCaps.dwCaps2 && deviceEnumerate->m_ddCaps.dwSVBRops[7] != 2) if (!driver->m_ddCaps.dwCaps2 && driver->m_ddCaps.dwSVBRops[7] != 2)
p_videoParam.Flags().SetF2bit0(TRUE); p_videoParam.Flags().SetF2bit0(TRUE);
else else
p_videoParam.Flags().SetF2bit0(FALSE); p_videoParam.Flags().SetF2bit0(FALSE);

View File

@ -6,7 +6,7 @@ DECOMP_SIZE_ASSERT(MxDeviceModeFinder, 0xe4);
DECOMP_SIZE_ASSERT(MxDirect3D, 0x894); DECOMP_SIZE_ASSERT(MxDirect3D, 0x894);
DECOMP_SIZE_ASSERT(MxDevice, 0x1a4); DECOMP_SIZE_ASSERT(MxDevice, 0x1a4);
DECOMP_SIZE_ASSERT(MxDisplayMode, 0x0c); DECOMP_SIZE_ASSERT(MxDisplayMode, 0x0c);
DECOMP_SIZE_ASSERT(MxDeviceEnumerateElement, 0x190); DECOMP_SIZE_ASSERT(MxDriver, 0x190);
DECOMP_SIZE_ASSERT(MxDeviceEnumerate, 0x14); DECOMP_SIZE_ASSERT(MxDeviceEnumerate, 0x14);
// FUNCTION: LEGO1 0x1009b0a0 // FUNCTION: LEGO1 0x1009b0a0
@ -126,11 +126,7 @@ BOOL MxDirect3D::D3DSetMode()
} }
// STUB: LEGO1 0x1009b5f0 // STUB: LEGO1 0x1009b5f0
BOOL MxDirect3D::FUN_1009b5f0( BOOL MxDirect3D::FUN_1009b5f0(MxDeviceEnumerate& p_deviceEnumerator, MxDriver* p_driver, MxDevice* p_device)
MxDeviceEnumerate& p_deviceEnumerator,
MxDeviceEnumerateElement* p_deviceEnumerate,
MxDevice* p_device
)
{ {
return TRUE; return TRUE;
} }
@ -151,7 +147,7 @@ MxDeviceModeFinder::~MxDeviceModeFinder()
} }
// FUNCTION: LEGO1 0x1009ba80 // FUNCTION: LEGO1 0x1009ba80
MxDeviceEnumerateElement::MxDeviceEnumerateElement(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName) MxDriver::MxDriver(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName)
{ {
m_guid = NULL; m_guid = NULL;
m_driverDesc = NULL; m_driverDesc = NULL;
@ -162,7 +158,7 @@ MxDeviceEnumerateElement::MxDeviceEnumerateElement(LPGUID p_guid, LPSTR p_driver
} }
// FUNCTION: LEGO1 0x1009bb80 // FUNCTION: LEGO1 0x1009bb80
MxDeviceEnumerateElement::~MxDeviceEnumerateElement() MxDriver::~MxDriver()
{ {
if (m_guid) if (m_guid)
delete m_guid; delete m_guid;
@ -173,7 +169,7 @@ MxDeviceEnumerateElement::~MxDeviceEnumerateElement()
} }
// FUNCTION: LEGO1 0x1009bc30 // FUNCTION: LEGO1 0x1009bc30
void MxDeviceEnumerateElement::Init(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName) void MxDriver::Init(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName)
{ {
if (m_driverDesc) { if (m_driverDesc) {
delete[] m_driverDesc; delete[] m_driverDesc;
@ -276,7 +272,7 @@ MxDeviceEnumerate::MxDeviceEnumerate()
// FUNCTION: LEGO1 0x1009c070 // FUNCTION: LEGO1 0x1009c070
BOOL MxDeviceEnumerate::EnumDirectDrawCallback(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName) BOOL MxDeviceEnumerate::EnumDirectDrawCallback(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName)
{ {
MxDeviceEnumerateElement device(p_guid, p_driverDesc, p_driverName); MxDriver device(p_guid, p_driverDesc, p_driverName);
m_list.push_back(device); m_list.push_back(device);
// Must be zeroed because held resources are copied by pointer only // Must be zeroed because held resources are copied by pointer only
@ -288,7 +284,7 @@ BOOL MxDeviceEnumerate::EnumDirectDrawCallback(LPGUID p_guid, LPSTR p_driverDesc
LPDIRECT3D2 lpDirect3d2 = NULL; LPDIRECT3D2 lpDirect3d2 = NULL;
LPDIRECTDRAW lpDD = NULL; LPDIRECTDRAW lpDD = NULL;
MxDeviceEnumerateElement& newDevice = m_list.back(); MxDriver& newDevice = m_list.back();
HRESULT result = DirectDrawCreate(newDevice.m_guid, &lpDD, NULL); HRESULT result = DirectDrawCreate(newDevice.m_guid, &lpDD, NULL);
if (result != DD_OK) if (result != DD_OK)
@ -468,12 +464,12 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid)
GUID4 deviceGuid; GUID4 deviceGuid;
memcpy(&deviceGuid, &p_guid, sizeof(GUID4)); memcpy(&deviceGuid, &p_guid, sizeof(GUID4));
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end(); it++) { for (list<MxDriver>::iterator it = m_list.begin(); it != m_list.end(); it++) {
if (p_deviceNum >= 0 && p_deviceNum < i) if (p_deviceNum >= 0 && p_deviceNum < i)
return -1; return -1;
GUID4 compareGuid; GUID4 compareGuid;
MxDeviceEnumerateElement& deviceEnumerate = *it; MxDriver& deviceEnumerate = *it;
for (list<MxDevice>::iterator it2 = deviceEnumerate.m_devices.begin(); it2 != deviceEnumerate.m_devices.end(); for (list<MxDevice>::iterator it2 = deviceEnumerate.m_devices.begin(); it2 != deviceEnumerate.m_devices.end();
it2++) { it2++) {
memcpy(&compareGuid, (*it2).m_guid, sizeof(GUID4)); memcpy(&compareGuid, (*it2).m_guid, sizeof(GUID4));
@ -493,21 +489,15 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid)
} }
// FUNCTION: LEGO1 0x1009d030 // FUNCTION: LEGO1 0x1009d030
MxResult MxDeviceEnumerate::GetDevice( MxResult MxDeviceEnumerate::GetDevice(MxS32 p_deviceNum, MxDriver*& p_driver, MxDevice*& p_device)
MxS32 p_deviceNum,
MxDeviceEnumerateElement*& p_deviceEnumerate,
MxDevice*& p_device
)
{ {
if (p_deviceNum >= 0 && m_initialized) { if (p_deviceNum >= 0 && m_initialized) {
MxS32 i = 0; MxS32 i = 0;
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end(); it++) { for (list<MxDriver>::iterator it = m_list.begin(); it != m_list.end(); it++) {
p_deviceEnumerate = &*it; p_driver = &*it;
for (list<MxDevice>::iterator it2 = p_deviceEnumerate->m_devices.begin(); for (list<MxDevice>::iterator it2 = p_driver->m_devices.begin(); it2 != p_driver->m_devices.end(); it2++) {
it2 != p_deviceEnumerate->m_devices.end();
it2++) {
if (i == p_deviceNum) { if (i == p_deviceNum) {
p_device = &*it2; p_device = &*it2;
return SUCCESS; return SUCCESS;
@ -536,7 +526,7 @@ MxS32 MxDeviceEnumerate::FUN_1009d0d0()
MxS32 k = -1; MxS32 k = -1;
MxU32 und = FUN_1009d1a0(); MxU32 und = FUN_1009d1a0();
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin();; it++) { for (list<MxDriver>::iterator it = m_list.begin();; it++) {
if (it == m_list.end()) if (it == m_list.end())
return k; return k;
@ -575,8 +565,8 @@ MxResult MxDeviceEnumerate::FUN_1009d210()
if (!m_initialized) if (!m_initialized)
return FAILURE; return FAILURE;
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end();) { for (list<MxDriver>::iterator it = m_list.begin(); it != m_list.end();) {
MxDeviceEnumerateElement& deviceEnumerate = *it; MxDriver& deviceEnumerate = *it;
if (!FUN_1009d370(deviceEnumerate)) if (!FUN_1009d370(deviceEnumerate))
m_list.erase(it++); m_list.erase(it++);
@ -602,10 +592,9 @@ MxResult MxDeviceEnumerate::FUN_1009d210()
} }
// FUNCTION: LEGO1 0x1009d370 // FUNCTION: LEGO1 0x1009d370
MxBool MxDeviceEnumerate::FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumerate) MxBool MxDeviceEnumerate::FUN_1009d370(MxDriver& p_driver)
{ {
for (list<MxDisplayMode>::iterator it = p_deviceEnumerate.m_displayModes.begin(); for (list<MxDisplayMode>::iterator it = p_driver.m_displayModes.begin(); it != p_driver.m_displayModes.end();
it != p_deviceEnumerate.m_displayModes.end();
it++) { it++) {
if ((*it).m_width == 640 && (*it).m_height == 480) { if ((*it).m_width == 640 && (*it).m_height == 480) {
if ((*it).m_bitsPerPixel == 8 || (*it).m_bitsPerPixel == 16) if ((*it).m_bitsPerPixel == 8 || (*it).m_bitsPerPixel == 16)

View File

@ -19,7 +19,7 @@ class MxDeviceModeFinder {
}; };
class MxDeviceEnumerate; class MxDeviceEnumerate;
struct MxDeviceEnumerateElement; struct MxDriver;
struct MxDevice; struct MxDevice;
// VTABLE: LEGO1 0x100db800 // VTABLE: LEGO1 0x100db800
@ -45,11 +45,7 @@ class MxDirect3D : public MxDirectDraw {
BOOL CreateIDirect3D(); BOOL CreateIDirect3D();
BOOL D3DSetMode(); BOOL D3DSetMode();
BOOL FUN_1009b5f0( BOOL FUN_1009b5f0(MxDeviceEnumerate& p_deviceEnumerator, MxDriver* p_driver, MxDevice* p_device);
MxDeviceEnumerate& p_deviceEnumerator,
MxDeviceEnumerateElement* p_deviceEnumerate,
MxDevice* p_device
);
inline MxDeviceModeFinder* GetDeviceModeFinder() { return this->m_pDeviceModeFinder; }; inline MxDeviceModeFinder* GetDeviceModeFinder() { return this->m_pDeviceModeFinder; };
inline IDirect3D* GetDirect3D() { return this->m_pDirect3d; } inline IDirect3D* GetDirect3D() { return this->m_pDirect3d; }
@ -104,10 +100,10 @@ struct MxDisplayMode {
}; };
// SIZE 0x190 // SIZE 0x190
struct MxDeviceEnumerateElement { struct MxDriver {
MxDeviceEnumerateElement() {} MxDriver() {}
~MxDeviceEnumerateElement(); ~MxDriver();
MxDeviceEnumerateElement(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName); MxDriver(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName);
void Init(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName); void Init(LPGUID p_guid, LPSTR p_driverDesc, LPSTR p_driverName);
@ -118,8 +114,8 @@ struct MxDeviceEnumerateElement {
list<MxDevice> m_devices; // 0x178 list<MxDevice> m_devices; // 0x178
list<MxDisplayMode> m_displayModes; // 0x184 list<MxDisplayMode> m_displayModes; // 0x184
MxBool operator==(MxDeviceEnumerateElement) const { return TRUE; } MxBool operator==(MxDriver) const { return TRUE; }
MxBool operator<(MxDeviceEnumerateElement) const { return TRUE; } MxBool operator<(MxDriver) const { return TRUE; }
}; };
// clang-format off // clang-format off
@ -140,20 +136,20 @@ struct MxDeviceEnumerateElement {
// clang-format off // clang-format off
// TEMPLATE: LEGO1 0x1009bf50 // TEMPLATE: LEGO1 0x1009bf50
// list<MxDeviceEnumerateElement,allocator<MxDeviceEnumerateElement> >::~list<MxDeviceEnumerateElement,allocator<MxDeviceEnumerateElement> > // list<MxDriver,allocator<MxDriver> >::~list<MxDriver,allocator<MxDriver> >
// clang-format on // clang-format on
// TEMPLATE: LEGO1 0x1009bfc0 // TEMPLATE: LEGO1 0x1009bfc0
// List<MxDeviceEnumerateElement>::~List<MxDeviceEnumerateElement> // List<MxDriver>::~List<MxDriver>
// Compiler-generated copy ctor // Compiler-generated copy ctor
// Part of this function are two more synthetic sub-routines, // Part of this function are two more synthetic sub-routines,
// LEGO1 0x1009c400 and LEGO1 0x1009c460 // LEGO1 0x1009c400 and LEGO1 0x1009c460
// SYNTHETIC: LEGO1 0x1009c290 // SYNTHETIC: LEGO1 0x1009c290
// MxDeviceEnumerateElement::MxDeviceEnumerateElement // MxDriver::MxDriver
// SYNTHETIC: LEGO1 0x1009d450 // SYNTHETIC: LEGO1 0x1009d450
// MxDeviceEnumerateElement::`scalar deleting destructor' // MxDriver::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1009d470 // SYNTHETIC: LEGO1 0x1009d470
// MxDevice::`scalar deleting destructor' // MxDevice::`scalar deleting destructor'
@ -180,10 +176,10 @@ class MxDeviceEnumerate {
const char* EnumerateErrorToString(HRESULT p_error); const char* EnumerateErrorToString(HRESULT p_error);
MxS32 ParseDeviceName(const char* p_deviceId); MxS32 ParseDeviceName(const char* p_deviceId);
MxS32 ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid); MxS32 ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid);
MxResult GetDevice(MxS32 p_deviceNum, MxDeviceEnumerateElement*& p_deviceEnumerate, MxDevice*& p_device); MxResult GetDevice(MxS32 p_deviceNum, MxDriver*& p_driver, MxDevice*& p_device);
MxS32 FUN_1009d0d0(); MxS32 FUN_1009d0d0();
MxResult FUN_1009d210(); MxResult FUN_1009d210();
MxBool FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumerate); MxBool FUN_1009d370(MxDriver& p_driver);
MxBool FUN_1009d3d0(MxDevice& p_device); MxBool FUN_1009d3d0(MxDevice& p_device);
static void BuildErrorString(const char*, ...); static void BuildErrorString(const char*, ...);
@ -202,7 +198,7 @@ class MxDeviceEnumerate {
static undefined4 FUN_1009d1e0(); static undefined4 FUN_1009d1e0();
private: private:
list<MxDeviceEnumerateElement> m_list; // 0x04 list<MxDriver> m_list; // 0x04
MxBool m_initialized; // 0x10 MxBool m_initialized; // 0x10
}; };