MxDirect3D::SetDevice to 100% (#1396)

This commit is contained in:
MS
2025-02-27 22:02:17 -05:00
committed by GitHub
parent 92f20e7f7b
commit 8b7182f9db

View File

@@ -1,5 +1,7 @@
#include "mxdirect3d.h" #include "mxdirect3d.h"
#include <assert.h>
DECOMP_SIZE_ASSERT(MxDirect3D, 0x894) DECOMP_SIZE_ASSERT(MxDirect3D, 0x894)
#if !defined(MXDIRECTX_FOR_CONFIG) #if !defined(MXDIRECTX_FOR_CONFIG)
@@ -234,81 +236,72 @@ BOOL MxDirect3D::SetDevice(MxDeviceEnumerate& p_deviceEnumerate, MxDriver* p_dri
m_pCurrentDeviceModesList = NULL; m_pCurrentDeviceModesList = NULL;
} }
MxAssignedDevice* assignedDevice = new MxAssignedDevice; MxAssignedDevice* d = new MxAssignedDevice;
assert(d);
int i = 0; int i = 0;
for (list<MxDriver>::iterator it = p_deviceEnumerate.m_list.begin(); it != p_deviceEnumerate.m_list.end(); it++) { for (list<MxDriver>::iterator it = p_deviceEnumerate.m_list.begin(); it != p_deviceEnumerate.m_list.end();
it++, i++) {
MxDriver& driver = *it; MxDriver& driver = *it;
if (&driver == p_driver) { if (&driver == p_driver) {
assignedDevice->m_deviceInfo = new DeviceModesInfo; d->m_deviceInfo = new DeviceModesInfo;
if (driver.m_guid) { if (driver.m_guid) {
assignedDevice->m_deviceInfo->m_guid = new GUID; d->m_deviceInfo->m_guid = new GUID;
memcpy(assignedDevice->m_deviceInfo->m_guid, driver.m_guid, sizeof(GUID)); *d->m_deviceInfo->m_guid = *driver.m_guid;
} }
assignedDevice->m_deviceInfo->m_count = driver.m_displayModes.size(); d->m_deviceInfo->m_count = driver.m_displayModes.size();
if (assignedDevice->m_deviceInfo->m_count > 0) {
assignedDevice->m_deviceInfo->m_modeArray =
new DeviceModesInfo::Mode[assignedDevice->m_deviceInfo->m_count];
if (d->m_deviceInfo->m_count > 0) {
int j = 0; int j = 0;
d->m_deviceInfo->m_modeArray = new DeviceModesInfo::Mode[d->m_deviceInfo->m_count];
for (list<MxDisplayMode>::iterator it2 = driver.m_displayModes.begin(); for (list<MxDisplayMode>::iterator it2 = driver.m_displayModes.begin();
it2 != driver.m_displayModes.end(); it2 != driver.m_displayModes.end();
it2++) { it2++, j++) {
assignedDevice->m_deviceInfo->m_modeArray[j].width = (*it2).m_width; d->m_deviceInfo->m_modeArray[j].width = (*it2).m_width;
assignedDevice->m_deviceInfo->m_modeArray[j].height = (*it2).m_height; d->m_deviceInfo->m_modeArray[j].height = (*it2).m_height;
assignedDevice->m_deviceInfo->m_modeArray[j].bitsPerPixel = (*it2).m_bitsPerPixel; d->m_deviceInfo->m_modeArray[j].bitsPerPixel = (*it2).m_bitsPerPixel;
j++;
} }
} }
memcpy( d->m_deviceInfo->m_ddcaps = driver.m_ddCaps;
&assignedDevice->m_deviceInfo->m_ddcaps,
&driver.m_ddCaps,
sizeof(assignedDevice->m_deviceInfo->m_ddcaps)
);
if (i == 0) { if (i == 0) {
assignedDevice->m_flags |= MxAssignedDevice::c_primaryDevice; d->m_flags |= MxAssignedDevice::c_primaryDevice;
} }
for (list<Direct3DDeviceInfo>::iterator it2 = driver.m_devices.begin(); it2 != driver.m_devices.end(); for (list<Direct3DDeviceInfo>::iterator it2 = driver.m_devices.begin(); it2 != driver.m_devices.end();
it2++) { it2++) {
Direct3DDeviceInfo& device = *it2; Direct3DDeviceInfo& device = *it2;
if (&device != p_device) { if (&device == p_device) {
continue; memcpy(&d->m_guid, device.m_guid, sizeof(d->m_guid));
}
memcpy(&assignedDevice->m_guid, device.m_guid, sizeof(assignedDevice->m_guid)); if (device.m_HWDesc.dcmColorModel) {
d->m_flags |= MxAssignedDevice::c_hardwareMode;
d->m_desc = device.m_HWDesc;
}
else {
d->m_desc = device.m_HELDesc;
}
D3DDEVICEDESC* desc; m_assignedDevice = d;
if (device.m_HWDesc.dcmColorModel) { m_pCurrentDeviceModesList = d->m_deviceInfo;
assignedDevice->m_flags |= MxAssignedDevice::c_hardwareMode; break;
desc = &device.m_HWDesc;
} }
else {
desc = &device.m_HELDesc;
}
memcpy(&assignedDevice->m_desc, desc, sizeof(assignedDevice->m_desc));
m_assignedDevice = assignedDevice;
m_pCurrentDeviceModesList = assignedDevice->m_deviceInfo;
break;
} }
} }
i++;
} }
if (!m_assignedDevice) { if (!m_assignedDevice) {
delete assignedDevice; delete d;
return FALSE; return FALSE;
} }
else {
return TRUE; return TRUE;
}
} }
#endif #endif