Skip to content
This repository was archived by the owner on May 5, 2025. It is now read-only.

Commit 1ef3843

Browse files
committed
Remove mutex from bridge Server
- Move `IDirect3D9Ex_CreateDevice` from server module -> main (device) thread - Get rid of mutexes server-side - Get rid of `extern`ed `unordered_map`s in Server module thread
2 parents 2dd0a0e + bfac594 commit 1ef3843

File tree

3 files changed

+71
-85
lines changed

3 files changed

+71
-85
lines changed

src/client/d3d9_device_base.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ BaseDirect3DDevice9Ex_LSS::BaseDirect3DDevice9Ex_LSS(const bool bExtended,
7373

7474
UID currentUID = 0;
7575
{
76-
ModuleClientCommand c(m_ex ? Commands::IDirect3D9Ex_CreateDeviceEx : Commands::IDirect3D9Ex_CreateDevice, getId());
76+
ClientMessage c(m_ex ? Commands::IDirect3D9Ex_CreateDeviceEx : Commands::IDirect3D9Ex_CreateDevice, getId());
7777
currentUID = c.get_uid();
7878
c.send_many( createParams.AdapterOrdinal,
7979
createParams.DeviceType,
@@ -90,18 +90,18 @@ BaseDirect3DDevice9Ex_LSS::BaseDirect3DDevice9Ex_LSS(const bool bExtended,
9090
Logger::debug("...server-side D3D9 device creation command sent...");
9191

9292
Logger::debug("...waiting for create device ack response from server...");
93-
if (Result::Success != ModuleBridge::waitForCommand(Commands::Bridge_Response, 0, nullptr, true, currentUID)) {
93+
if (Result::Success != DeviceBridge::waitForCommand(Commands::Bridge_Response, 0, nullptr, true, currentUID)) {
9494
Logger::err("...server-side D3D9 device creation failed with: no response from server.");
9595
removeWinProc(getWinProcHwnd());
9696
hresultOut = D3DERR_DEVICELOST;
9797
return;
9898
}
9999
Logger::debug("...create device response received from server...");
100-
const auto header = ModuleBridge::pop_front();
100+
const auto header = DeviceBridge::pop_front();
101101

102102
// Grab hresult from server
103-
hresultOut = (HRESULT) ModuleBridge::get_data();
104-
assert(ModuleBridge::get_data_pos() == header.dataOffset);
103+
hresultOut = (HRESULT) DeviceBridge::get_data();
104+
assert(DeviceBridge::get_data_pos() == header.dataOffset);
105105

106106
if (FAILED(hresultOut)) {
107107
Logger::err(format_string("...server-side D3D9 device creation failed with %x.", hresultOut));

src/server/main.cpp

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,6 @@ std::unordered_map<uint32_t, IDirect3DSwapChain9*> gpD3DSwapChains;
134134
std::unordered_map<uint32_t, IDirect3DQuery9*> gpD3DQuery;
135135
std::unordered_map<uint32_t, void*> gMapRemixApi;
136136

137-
std::mutex gLock;
138-
139137
// Global state
140138
bool gbBridgeRunning = true;
141139
HANDLE hWait;
@@ -306,9 +304,74 @@ void ProcessDeviceCommandQueue() {
306304
Logger::info("Device Processing: " + toString(rpcHeader.command) + " UID: " + std::to_string(currentUID));
307305
}
308306
#endif
309-
std::unique_lock<std::mutex> lock(gLock);
310307
// The mother of all switch statements - every call in the D3D9 interface is mapped here...
311308
switch (rpcHeader.command) {
309+
case IDirect3D9Ex_CreateDeviceEx:
310+
{
311+
GET_HND(pHandle);
312+
PULL_U(Adapter);
313+
PULL(D3DDEVTYPE, DeviceType);
314+
PULL(uint32_t, hFocusWindow);
315+
PULL_D(BehaviorFlags);
316+
D3DDISPLAYMODEEX* pFullscreenDisplayMode = nullptr;
317+
PULL_DATA(sizeof(D3DDISPLAYMODEEX), pFullscreenDisplayMode);
318+
319+
uint32_t* rawPresentationParameters = nullptr;
320+
DeviceBridge::get_data((void**) &rawPresentationParameters);
321+
D3DPRESENT_PARAMETERS PresentationParameters = getPresParamFromRaw(rawPresentationParameters);
322+
323+
IDirect3DDevice9Ex* pD3DDevice = nullptr;
324+
const auto hresult = ((IDirect3D9Ex*) gpD3D)->CreateDeviceEx(IN Adapter, IN DeviceType, IN TRUNCATE_HANDLE(HWND, hFocusWindow), IN BehaviorFlags, IN OUT & PresentationParameters, IN pFullscreenDisplayMode, OUT & pD3DDevice);
325+
if (!SUCCEEDED(hresult)) {
326+
std::stringstream ss;
327+
ss << format_string("CreateDeviceEx() call failed with error code 0x%x", hresult) << std::endl;
328+
Logger::err(ss.str());
329+
} else {
330+
Logger::info("Server side D3D9 DeviceEx created successfully!");
331+
gpD3DDevices[pHandle] = pD3DDevice;
332+
remixapi::g_device = pD3DDevice;
333+
}
334+
335+
// Send response back to the client
336+
Logger::debug("Sending CreateDevice ack response back to client.");
337+
{
338+
ServerMessage c(Commands::Bridge_Response, currentUID);
339+
c.send_data(hresult);
340+
}
341+
break;
342+
}
343+
case IDirect3D9Ex_CreateDevice:
344+
{
345+
GET_HND(pHandle);
346+
PULL_U(Adapter);
347+
PULL(D3DDEVTYPE, DeviceType);
348+
PULL(uint32_t, hFocusWindow);
349+
PULL_D(BehaviorFlags);
350+
351+
uint32_t* rawPresentationParameters = nullptr;
352+
DeviceBridge::get_data((void**) &rawPresentationParameters);
353+
D3DPRESENT_PARAMETERS PresentationParameters = getPresParamFromRaw(rawPresentationParameters);
354+
355+
IDirect3DDevice9* pD3DDevice = nullptr;
356+
const auto hresult = gpD3D->CreateDevice(IN Adapter, IN DeviceType, IN TRUNCATE_HANDLE(HWND, hFocusWindow), IN BehaviorFlags, IN OUT & PresentationParameters, OUT & pD3DDevice);
357+
if (!SUCCEEDED(hresult)) {
358+
std::stringstream ss;
359+
ss << format_string("CreateDevice() call failed with error code 0x%x", hresult) << std::endl;
360+
Logger::err(ss.str());
361+
} else {
362+
Logger::info("Server side D3D9 Device created successfully!");
363+
gpD3DDevices[pHandle] = (IDirect3DDevice9Ex*) pD3DDevice;
364+
remixapi::g_device = (IDirect3DDevice9Ex*) pD3DDevice;
365+
}
366+
367+
// Send response back to the client
368+
Logger::debug("Sending CreateDevice ack response back to client.");
369+
{
370+
ServerMessage c(Commands::Bridge_Response, currentUID);
371+
c.send_data(hresult);
372+
}
373+
break;
374+
}
312375
case IDirect3DDevice9Ex_GetDisplayModeEx:
313376
{
314377
GET_RES(pD3DDevice, gpD3DDevices);

src/server/module_processing.cpp

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,6 @@ using namespace Commands;
1717

1818
// Mapping between client and server pointer addresses
1919
extern LPDIRECT3D9 gpD3D;
20-
extern std::unordered_map<uint32_t, IDirect3DDevice9*> gpD3DDevices;
21-
extern std::unordered_map<uint32_t, IDirect3DResource9*> gpD3DResources; // For Textures, Buffers, and Surfaces
22-
extern std::unordered_map<uint32_t, IDirect3DVolume9*> gpD3DVolumes;
23-
extern std::unordered_map<uint32_t, IDirect3DVertexDeclaration9*> gpD3DVertexDeclarations;
24-
extern std::unordered_map<uint32_t, IDirect3DStateBlock9*> gpD3DStateBlocks;
25-
extern std::unordered_map<uint32_t, IDirect3DVertexShader9*> gpD3DVertexShaders;
26-
extern std::unordered_map<uint32_t, IDirect3DPixelShader9*> gpD3DPixelShaders;
27-
extern std::unordered_map<uint32_t, IDirect3DSwapChain9*> gpD3DSwapChains;
28-
29-
extern std::mutex gLock;
3020

3121
#define PULL(type, name) const auto& name = (type)ModuleBridge::get_data()
3222
#define PULL_I(name) PULL(INT, name)
@@ -94,7 +84,6 @@ void processModuleCommandQueue(std::atomic<bool>* const pbSignalEnd) {
9484
Logger::info("Module Processing: " + toString(rpcHeader.command) + " UID: " + std::to_string(currentUID));
9585
}
9686
#endif
97-
std::unique_lock<std::mutex> lock(gLock);
9887
// The mother of all switch statements - every call in the D3D9 interface is mapped here...
9988
switch (rpcHeader.command) {
10089
/*
@@ -345,72 +334,6 @@ void processModuleCommandQueue(std::atomic<bool>* const pbSignalEnd) {
345334
}
346335
break;
347336
}
348-
case IDirect3D9Ex_CreateDeviceEx:
349-
{
350-
GET_HND(pHandle);
351-
PULL_U(Adapter);
352-
PULL(D3DDEVTYPE, DeviceType);
353-
PULL(uint32_t, hFocusWindow);
354-
PULL_D(BehaviorFlags);
355-
D3DDISPLAYMODEEX* pFullscreenDisplayMode = nullptr;
356-
PULL_DATA(sizeof(D3DDISPLAYMODEEX), pFullscreenDisplayMode);
357-
358-
uint32_t* rawPresentationParameters = nullptr;
359-
ModuleBridge::get_data((void**) &rawPresentationParameters);
360-
D3DPRESENT_PARAMETERS PresentationParameters = getPresParamFromRaw(rawPresentationParameters);
361-
362-
IDirect3DDevice9Ex* pD3DDevice = nullptr;
363-
const auto hresult = ((IDirect3D9Ex*) gpD3D)->CreateDeviceEx(IN Adapter, IN DeviceType, IN TRUNCATE_HANDLE(HWND, hFocusWindow), IN BehaviorFlags, IN OUT & PresentationParameters, IN pFullscreenDisplayMode, OUT & pD3DDevice);
364-
if (!SUCCEEDED(hresult)) {
365-
std::stringstream ss;
366-
ss << format_string("CreateDeviceEx() call failed with error code 0x%x", hresult) << std::endl;
367-
Logger::err(ss.str());
368-
} else {
369-
Logger::info("Server side D3D9 DeviceEx created successfully!");
370-
gpD3DDevices[pHandle] = pD3DDevice;
371-
remixapi::g_device = pD3DDevice;
372-
}
373-
374-
// Send response back to the client
375-
Logger::debug("Sending CreateDevice ack response back to client.");
376-
{
377-
ModuleServerCommand c(Commands::Bridge_Response, currentUID);
378-
c.send_data(hresult);
379-
}
380-
break;
381-
}
382-
case IDirect3D9Ex_CreateDevice:
383-
{
384-
GET_HND(pHandle);
385-
PULL_U(Adapter);
386-
PULL(D3DDEVTYPE, DeviceType);
387-
PULL(uint32_t, hFocusWindow);
388-
PULL_D(BehaviorFlags);
389-
390-
uint32_t* rawPresentationParameters = nullptr;
391-
ModuleBridge::get_data((void**) &rawPresentationParameters);
392-
D3DPRESENT_PARAMETERS PresentationParameters = getPresParamFromRaw(rawPresentationParameters);
393-
394-
IDirect3DDevice9* pD3DDevice = nullptr;
395-
const auto hresult = gpD3D->CreateDevice(IN Adapter, IN DeviceType, IN TRUNCATE_HANDLE(HWND, hFocusWindow), IN BehaviorFlags, IN OUT & PresentationParameters, OUT & pD3DDevice);
396-
if (!SUCCEEDED(hresult)) {
397-
std::stringstream ss;
398-
ss << format_string("CreateDevice() call failed with error code 0x%x", hresult) << std::endl;
399-
Logger::err(ss.str());
400-
} else {
401-
Logger::info("Server side D3D9 Device created successfully!");
402-
gpD3DDevices[pHandle] = (IDirect3DDevice9Ex*) pD3DDevice;
403-
remixapi::g_device = (IDirect3DDevice9Ex*) pD3DDevice;
404-
}
405-
406-
// Send response back to the client
407-
Logger::debug("Sending CreateDevice ack response back to client.");
408-
{
409-
ModuleServerCommand c(Commands::Bridge_Response, currentUID);
410-
c.send_data(hresult);
411-
}
412-
break;
413-
}
414337
}
415338
}
416339
// Check if we exited the command processing loop unexpectedly while the bridge is still enabled

0 commit comments

Comments
 (0)