1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Added critical section to all user-mode display driver functions

Fixes crashes and frozen screen issues in Laghaim Online (issue #58)
This commit is contained in:
narzoul 2019-11-02 22:55:55 +01:00
parent a49a19c448
commit 6aaf12b0a4

View File

@ -6,6 +6,7 @@
#include "Common/Log.h"
#include "Common/VtableVisitor.h"
#include "Config/Config.h"
#include "D3dDdi/ScopedCriticalSection.h"
namespace D3dDdi
{
@ -31,6 +32,35 @@ namespace D3dDdi
static Vtable*& s_origVtablePtr;
private:
template <int instanceId>
class Visitor
{
public:
Visitor(Vtable& compatVtable)
: m_compatVtable(compatVtable)
{
}
template <typename MemberDataPtr, MemberDataPtr ptr>
void visit(const char* /*funcName*/)
{
if (!(m_compatVtable.*ptr))
{
m_compatVtable.*ptr = &threadSafeFunc<MemberDataPtr, ptr>;
}
}
private:
template <typename MemberDataPtr, MemberDataPtr ptr, typename Result, typename... Params>
static Result APIENTRY threadSafeFunc(Params... params)
{
D3dDdi::ScopedCriticalSection lock;
return (CompatVtableInstance<Vtable, instanceId>::s_origVtable.*ptr)(params...);
}
Vtable& m_compatVtable;
};
template <int instanceId> struct InstanceId {};
template <int instanceId>
@ -45,6 +75,11 @@ namespace D3dDdi
Vtable compatVtable = {};
Compat::setCompatVtable(compatVtable);
#ifndef DEBUGLOGS
Visitor<instanceId> visitor(compatVtable);
forEach<Vtable>(visitor);
#endif
isHooked = true;
CompatVtableInstance<Vtable, instanceId>::hookVtable(vtable, compatVtable);
return CompatVtableInstance<Vtable, instanceId>::s_origVtable;