mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Removed the GetDDInterface override
Fixes a crash in UEFA Challenge (issue #50).
This commit is contained in:
parent
bb6092e0bd
commit
9b24a9b306
@ -384,7 +384,7 @@ namespace D3dDdi
|
|||||||
{
|
{
|
||||||
lastDisplaySettingsUniqueness = currentDisplaySettingsUniqueness;
|
lastDisplaySettingsUniqueness = currentDisplaySettingsUniqueness;
|
||||||
CompatPtr<IUnknown> ddUnk;
|
CompatPtr<IUnknown> ddUnk;
|
||||||
primary.get()->lpVtbl->GetDDInterface(primary, reinterpret_cast<void**>(&ddUnk.getRef()));
|
primary->GetDDInterface(primary, reinterpret_cast<void**>(&ddUnk.getRef()));
|
||||||
CompatPtr<IDirectDraw7> dd7(ddUnk);
|
CompatPtr<IDirectDraw7> dd7(ddUnk);
|
||||||
|
|
||||||
DDDEVICEIDENTIFIER2 di = {};
|
DDDEVICEIDENTIFIER2 di = {};
|
||||||
|
@ -7,17 +7,6 @@
|
|||||||
|
|
||||||
namespace DDraw
|
namespace DDraw
|
||||||
{
|
{
|
||||||
template <typename TDirectDraw>
|
|
||||||
void* getDdObject(TDirectDraw& dd)
|
|
||||||
{
|
|
||||||
return reinterpret_cast<void**>(&dd)[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
template void* getDdObject(IDirectDraw&);
|
|
||||||
template void* getDdObject(IDirectDraw2&);
|
|
||||||
template void* getDdObject(IDirectDraw4&);
|
|
||||||
template void* getDdObject(IDirectDraw7&);
|
|
||||||
|
|
||||||
DDSURFACEDESC2 getDisplayMode(CompatRef<IDirectDraw7> dd)
|
DDSURFACEDESC2 getDisplayMode(CompatRef<IDirectDraw7> dd)
|
||||||
{
|
{
|
||||||
DDSURFACEDESC2 dm = {};
|
DDSURFACEDESC2 dm = {};
|
||||||
|
@ -9,9 +9,6 @@
|
|||||||
|
|
||||||
namespace DDraw
|
namespace DDraw
|
||||||
{
|
{
|
||||||
template <typename TDirectDraw>
|
|
||||||
void* getDdObject(TDirectDraw& dd);
|
|
||||||
|
|
||||||
DDSURFACEDESC2 getDisplayMode(CompatRef<IDirectDraw7> dd);
|
DDSURFACEDESC2 getDisplayMode(CompatRef<IDirectDraw7> dd);
|
||||||
DDPIXELFORMAT getRgbPixelFormat(DWORD bpp);
|
DDPIXELFORMAT getRgbPixelFormat(DWORD bpp);
|
||||||
void suppressEmulatedDirectDraw(GUID*& guid);
|
void suppressEmulatedDirectDraw(GUID*& guid);
|
||||||
|
@ -70,19 +70,6 @@ namespace DDraw
|
|||||||
SET_COMPAT_METHOD(Restore);
|
SET_COMPAT_METHOD(Restore);
|
||||||
SET_COMPAT_METHOD(SetPalette);
|
SET_COMPAT_METHOD(SetPalette);
|
||||||
SET_COMPAT_METHOD(Unlock);
|
SET_COMPAT_METHOD(Unlock);
|
||||||
|
|
||||||
setCompatVtable2(vtable);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TSurface>
|
|
||||||
void DirectDrawSurface<TSurface>::setCompatVtable2(Vtable<TSurface>& vtable)
|
|
||||||
{
|
|
||||||
SET_COMPAT_METHOD(GetDDInterface);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
void DirectDrawSurface<IDirectDrawSurface>::setCompatVtable2(Vtable<IDirectDrawSurface>&)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template DirectDrawSurface<IDirectDrawSurface>;
|
template DirectDrawSurface<IDirectDrawSurface>;
|
||||||
|
@ -31,9 +31,6 @@ namespace DDraw
|
|||||||
typedef typename Types<TSurface>::TSurfaceDesc TSurfaceDesc;
|
typedef typename Types<TSurface>::TSurfaceDesc TSurfaceDesc;
|
||||||
|
|
||||||
static void setCompatVtable(Vtable<TSurface>& vtable);
|
static void setCompatVtable(Vtable<TSurface>& vtable);
|
||||||
|
|
||||||
private:
|
|
||||||
static void setCompatVtable2(Vtable<TSurface>& vtable);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,11 +110,11 @@ namespace DDraw
|
|||||||
|
|
||||||
void PrimarySurface::createImpl()
|
void PrimarySurface::createImpl()
|
||||||
{
|
{
|
||||||
m_impl.reset(new PrimarySurfaceImpl<IDirectDrawSurface>());
|
m_impl.reset(new PrimarySurfaceImpl<IDirectDrawSurface>(this));
|
||||||
m_impl2.reset(new PrimarySurfaceImpl<IDirectDrawSurface2>());
|
m_impl2.reset(new PrimarySurfaceImpl<IDirectDrawSurface2>(this));
|
||||||
m_impl3.reset(new PrimarySurfaceImpl<IDirectDrawSurface3>());
|
m_impl3.reset(new PrimarySurfaceImpl<IDirectDrawSurface3>(this));
|
||||||
m_impl4.reset(new PrimarySurfaceImpl<IDirectDrawSurface4>());
|
m_impl4.reset(new PrimarySurfaceImpl<IDirectDrawSurface4>(this));
|
||||||
m_impl7.reset(new PrimarySurfaceImpl<IDirectDrawSurface7>());
|
m_impl7.reset(new PrimarySurfaceImpl<IDirectDrawSurface7>(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT PrimarySurface::flipToGdiSurface()
|
HRESULT PrimarySurface::flipToGdiSurface()
|
||||||
|
@ -73,6 +73,12 @@ namespace
|
|||||||
|
|
||||||
namespace DDraw
|
namespace DDraw
|
||||||
{
|
{
|
||||||
|
template <typename TSurface>
|
||||||
|
PrimarySurfaceImpl<TSurface>::PrimarySurfaceImpl(Surface* data)
|
||||||
|
: SurfaceImpl(data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TSurface>
|
template <typename TSurface>
|
||||||
HRESULT PrimarySurfaceImpl<TSurface>::Blt(
|
HRESULT PrimarySurfaceImpl<TSurface>::Blt(
|
||||||
TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
||||||
|
@ -13,6 +13,8 @@ namespace DDraw
|
|||||||
class PrimarySurfaceImpl : public SurfaceImpl<TSurface>
|
class PrimarySurfaceImpl : public SurfaceImpl<TSurface>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
PrimarySurfaceImpl(Surface* data);
|
||||||
|
|
||||||
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
||||||
DWORD dwFlags, LPDDBLTFX lpDDBltFx) override;
|
DWORD dwFlags, LPDDBLTFX lpDDBltFx) override;
|
||||||
virtual HRESULT BltFast(TSurface* This, DWORD dwX, DWORD dwY,
|
virtual HRESULT BltFast(TSurface* This, DWORD dwX, DWORD dwY,
|
||||||
|
@ -3,11 +3,9 @@
|
|||||||
#include "Common/CompatPtr.h"
|
#include "Common/CompatPtr.h"
|
||||||
#include "D3dDdi/Device.h"
|
#include "D3dDdi/Device.h"
|
||||||
#include "D3dDdi/Resource.h"
|
#include "D3dDdi/Resource.h"
|
||||||
#include "DDraw/DirectDraw.h"
|
|
||||||
#include "DDraw/DirectDrawSurface.h"
|
#include "DDraw/DirectDrawSurface.h"
|
||||||
#include "DDraw/Surfaces/Surface.h"
|
#include "DDraw/Surfaces/Surface.h"
|
||||||
#include "DDraw/Surfaces/SurfaceImpl.h"
|
#include "DDraw/Surfaces/SurfaceImpl.h"
|
||||||
#include "Win32/DisplayMode.h"
|
|
||||||
|
|
||||||
// {C62D8849-DFAC-4454-A1E8-DA67446426BA}
|
// {C62D8849-DFAC-4454-A1E8-DA67446426BA}
|
||||||
DEFINE_GUID(IID_CompatSurfacePrivateData,
|
DEFINE_GUID(IID_CompatSurfacePrivateData,
|
||||||
@ -36,8 +34,7 @@ namespace DDraw
|
|||||||
}
|
}
|
||||||
|
|
||||||
Surface::Surface(Surface* rootSurface)
|
Surface::Surface(Surface* rootSurface)
|
||||||
: m_ddObject(nullptr)
|
: m_refCount(0)
|
||||||
, m_refCount(0)
|
|
||||||
, m_rootSurface(rootSurface ? rootSurface : this)
|
, m_rootSurface(rootSurface ? rootSurface : this)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -83,20 +80,8 @@ namespace DDraw
|
|||||||
if (SUCCEEDED(dds->SetPrivateData(&dds, IID_CompatSurfacePrivateData,
|
if (SUCCEEDED(dds->SetPrivateData(&dds, IID_CompatSurfacePrivateData,
|
||||||
privateData.get(), sizeof(privateData.get()), DDSPD_IUNKNOWNPOINTER)))
|
privateData.get(), sizeof(privateData.get()), DDSPD_IUNKNOWNPOINTER)))
|
||||||
{
|
{
|
||||||
CompatPtr<IUnknown> ddUnk;
|
|
||||||
dds.get().lpVtbl->GetDDInterface(&dds, reinterpret_cast<void**>(&ddUnk.getRef()));
|
|
||||||
CompatPtr<IDirectDraw7> dd(ddUnk);
|
|
||||||
|
|
||||||
privateData->createImpl();
|
privateData->createImpl();
|
||||||
privateData->m_impl->m_data = privateData.get();
|
|
||||||
privateData->m_impl2->m_data = privateData.get();
|
|
||||||
privateData->m_impl3->m_data = privateData.get();
|
|
||||||
privateData->m_impl4->m_data = privateData.get();
|
|
||||||
privateData->m_impl7->m_data = privateData.get();
|
|
||||||
|
|
||||||
privateData->m_surface = &dds;
|
privateData->m_surface = &dds;
|
||||||
privateData->m_ddObject = DDraw::getDdObject(*dd);
|
|
||||||
|
|
||||||
privateData.release();
|
privateData.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,11 +166,11 @@ namespace DDraw
|
|||||||
|
|
||||||
void Surface::createImpl()
|
void Surface::createImpl()
|
||||||
{
|
{
|
||||||
m_impl.reset(new SurfaceImpl<IDirectDrawSurface>());
|
m_impl.reset(new SurfaceImpl<IDirectDrawSurface>(this));
|
||||||
m_impl2.reset(new SurfaceImpl<IDirectDrawSurface2>());
|
m_impl2.reset(new SurfaceImpl<IDirectDrawSurface2>(this));
|
||||||
m_impl3.reset(new SurfaceImpl<IDirectDrawSurface3>());
|
m_impl3.reset(new SurfaceImpl<IDirectDrawSurface3>(this));
|
||||||
m_impl4.reset(new SurfaceImpl<IDirectDrawSurface4>());
|
m_impl4.reset(new SurfaceImpl<IDirectDrawSurface4>(this));
|
||||||
m_impl7.reset(new SurfaceImpl<IDirectDrawSurface7>());
|
m_impl7.reset(new SurfaceImpl<IDirectDrawSurface7>(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
@ -6,21 +6,14 @@
|
|||||||
#include "DDraw/Surfaces/Surface.h"
|
#include "DDraw/Surfaces/Surface.h"
|
||||||
#include "DDraw/Surfaces/SurfaceImpl.h"
|
#include "DDraw/Surfaces/SurfaceImpl.h"
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
struct DirectDrawInterface
|
|
||||||
{
|
|
||||||
const void* vtable;
|
|
||||||
void* ddObject;
|
|
||||||
DirectDrawInterface* next;
|
|
||||||
DWORD refCount;
|
|
||||||
DWORD unknown1;
|
|
||||||
DWORD unknown2;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace DDraw
|
namespace DDraw
|
||||||
{
|
{
|
||||||
|
template <typename TSurface>
|
||||||
|
SurfaceImpl<TSurface>::SurfaceImpl(Surface* data)
|
||||||
|
: m_data(data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TSurface>
|
template <typename TSurface>
|
||||||
SurfaceImpl<TSurface>::~SurfaceImpl()
|
SurfaceImpl<TSurface>::~SurfaceImpl()
|
||||||
{
|
{
|
||||||
@ -83,16 +76,6 @@ namespace DDraw
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TSurface>
|
|
||||||
HRESULT SurfaceImpl2<TSurface>::GetDDInterface(TSurface* /*This*/, LPVOID* lplpDD)
|
|
||||||
{
|
|
||||||
DirectDrawInterface dd = {};
|
|
||||||
dd.vtable = static_cast<const void*>(CompatVtable<IDirectDraw7Vtbl>::s_origVtablePtr);
|
|
||||||
dd.ddObject = m_data->m_ddObject;
|
|
||||||
return CompatVtable<IDirectDrawVtbl>::s_origVtable.QueryInterface(
|
|
||||||
reinterpret_cast<IDirectDraw*>(&dd), IID_IDirectDraw, lplpDD);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TSurface>
|
template <typename TSurface>
|
||||||
HRESULT SurfaceImpl<TSurface>::GetFlipStatus(TSurface* This, DWORD dwFlags)
|
HRESULT SurfaceImpl<TSurface>::GetFlipStatus(TSurface* This, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
|
@ -12,27 +12,14 @@ namespace DDraw
|
|||||||
class Surface;
|
class Surface;
|
||||||
|
|
||||||
template <typename TSurface>
|
template <typename TSurface>
|
||||||
class SurfaceImpl2
|
class SurfaceImpl
|
||||||
{
|
|
||||||
public:
|
|
||||||
SurfaceImpl2() : m_data(nullptr) {}
|
|
||||||
|
|
||||||
virtual HRESULT GetDDInterface(TSurface* This, LPVOID* lplpDD);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
friend class Surface;
|
|
||||||
|
|
||||||
Surface* m_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename TSurface>
|
|
||||||
class SurfaceImpl : public SurfaceImpl2<TSurface>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename Types<TSurface>::TSurfaceDesc TSurfaceDesc;
|
typedef typename Types<TSurface>::TSurfaceDesc TSurfaceDesc;
|
||||||
typedef typename Types<TSurface>::TDdsCaps TDdsCaps;
|
typedef typename Types<TSurface>::TDdsCaps TDdsCaps;
|
||||||
typedef typename Types<TSurface>::TUnlockParam TUnlockParam;
|
typedef typename Types<TSurface>::TUnlockParam TUnlockParam;
|
||||||
|
|
||||||
|
SurfaceImpl(Surface* data);
|
||||||
virtual ~SurfaceImpl();
|
virtual ~SurfaceImpl();
|
||||||
|
|
||||||
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
|
||||||
@ -58,5 +45,7 @@ namespace DDraw
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool waitForFlip(TSurface* This, DWORD flags, DWORD waitFlag, DWORD doNotWaitFlag);
|
bool waitForFlip(TSurface* This, DWORD flags, DWORD waitFlag, DWORD doNotWaitFlag);
|
||||||
|
|
||||||
|
Surface* m_data;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ namespace Gdi
|
|||||||
|
|
||||||
auto primary(DDraw::PrimarySurface::getPrimary());
|
auto primary(DDraw::PrimarySurface::getPrimary());
|
||||||
CompatPtr<IUnknown> ddUnk;
|
CompatPtr<IUnknown> ddUnk;
|
||||||
primary.get()->lpVtbl->GetDDInterface(primary, reinterpret_cast<void**>(&ddUnk.getRef()));
|
primary->GetDDInterface(primary, reinterpret_cast<void**>(&ddUnk.getRef()));
|
||||||
CompatPtr<IDirectDraw7> dd(ddUnk);
|
CompatPtr<IDirectDraw7> dd(ddUnk);
|
||||||
|
|
||||||
CompatPtr<IDirectDrawSurface7> surface;
|
CompatPtr<IDirectDrawSurface7> surface;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user