CreateDevice

This commit is contained in:
disinvite 2025-04-18 23:52:06 -04:00
parent 1170cca8ea
commit 7e425c67c9
2 changed files with 72 additions and 16 deletions

View File

@ -128,6 +128,8 @@ class RendererImpl : public Renderer {
int paletteEntryCount, int paletteEntryCount,
const PaletteEntry* pEntries const PaletteEntry* pEntries
); );
inline Result CreateDevice(const DeviceDirect3DCreateData& rCreateData, DeviceImpl& rDevice);
inline Result CreateDevice(const DeviceDirectDrawCreateData& rCreateData, DeviceImpl& rDevice);
private: private:
RendererDataType m_data; RendererDataType m_data;
@ -186,7 +188,7 @@ class DeviceImpl : public Device {
// FUNCTION: BETA10 0x101708e0 // FUNCTION: BETA10 0x101708e0
const DeviceDataType& ImplementationData() const { return m_data; } const DeviceDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x100d95 // FUNCTION: BETA10 0x100d9540
DeviceDataType& ImplementationData() { return m_data; } DeviceDataType& ImplementationData() { return m_data; }
void SetImplementationData(IDirect3DRMDevice2* device) { m_data = device; } void SetImplementationData(IDirect3DRMDevice2* device) { m_data = device; }

View File

@ -36,38 +36,92 @@ Result RendererImpl::Create()
return (m_data != NULL) ? Success : Error; return (m_data != NULL) ? Success : Error;
} }
// FUNCTION: BETA10 0x1016cf00
inline Result RendererCreateDevice(
IDirect3DRM2* pD3DRM,
const DeviceDirect3DCreateData& rCreateData,
IDirect3DRMDevice2*& rpDevice
)
{
Result result =
ResultVal(pD3DRM->CreateDeviceFromD3D(rCreateData.m_pDirect3D, rCreateData.m_pDirect3DDevice, &rpDevice));
return result;
}
// FUNCTION: BETA10 0x1016ce60
inline Result RendererImpl::CreateDevice(const DeviceDirect3DCreateData& rCreateData, DeviceImpl& rDevice)
{
assert(m_data);
assert(!rDevice.ImplementationData());
return RendererCreateDevice(m_data, rCreateData, rDevice.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1830 // FUNCTION: LEGO1 0x100a1830
// FUNCTION: BETA10 0x10169d90
Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data) Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data)
{ {
assert(m_data);
DeviceImpl* device = new DeviceImpl(); DeviceImpl* device = new DeviceImpl();
HRESULT result = m_data->CreateDeviceFromD3D(data.m_pDirect3D, data.m_pDirect3DDevice, &device->m_data);
if (!SUCCEEDED(result)) { if (!CreateDevice(data, *device)) {
delete device; delete device;
device = NULL; device = NULL;
} }
return device; return device;
} }
// FUNCTION: BETA10 0x1016cfe0
inline Result RendererCreateDevice(
IDirect3DRM2* pD3DRM,
const DeviceDirectDrawCreateData& rCreateData,
IDirect3DRMDevice2*& rpDevice
)
{
Result result = ResultVal(pD3DRM->CreateDeviceFromSurface(
const_cast<GUID*>(rCreateData.m_driverGUID),
rCreateData.m_pDirectDraw,
rCreateData.m_pBackBuffer,
&rpDevice
));
if (Succeeded(result)) {
if (rCreateData.m_pBackBuffer) {
// GLOBAL: LEGO1 0x10101040
// GLOBAL: BETA10 0x102055f4
static int g_setBufferCount = 1;
if (g_setBufferCount) {
Result result2 = ResultVal(rpDevice->SetBufferCount(2));
assert(Succeeded(result));
}
}
}
return result;
}
// FUNCTION: BETA10 0x1016cf40
inline Result RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& rCreateData, DeviceImpl& rDevice)
{
assert(m_data);
assert(!rDevice.ImplementationData());
return RendererCreateDevice(m_data, rCreateData, rDevice.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1900 // FUNCTION: LEGO1 0x100a1900
// FUNCTION: BETA10 0x10169ea0
Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data) Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data)
{ {
// at LEGO1 0x10101040, needs no annotation assert(m_data);
static int g_SetBufferCount = 1;
DeviceImpl* device = new DeviceImpl(); DeviceImpl* device = new DeviceImpl();
HRESULT result = m_data->CreateDeviceFromSurface(
const_cast<LPGUID>(data.m_driverGUID), if (!CreateDevice(data, *device)) {
data.m_pDirectDraw,
data.m_pBackBuffer,
&device->m_data
);
if (SUCCEEDED(result) && data.m_pBackBuffer && g_SetBufferCount) {
device->m_data->SetBufferCount(2);
}
if (!SUCCEEDED(result)) {
delete device; delete device;
device = NULL; device = NULL;
} }
return device; return device;
} }