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

Fixed flashing screen in Glover

See issue #295.
This commit is contained in:
narzoul 2024-04-20 10:56:19 +02:00
parent 53b0265138
commit c54c45a773
8 changed files with 45 additions and 7 deletions

View File

@ -1274,8 +1274,7 @@ namespace D3dDdi
m_device.flushPrimitives();
if (srcResource->m_lockResource)
{
if (srcResource->m_lockData[data.SrcSubResourceIndex].isSysMemUpToDate &&
!srcResource->m_origData.Flags.RenderTarget)
if (srcResource->m_lockData[data.SrcSubResourceIndex].isSysMemUpToDate)
{
srcResource->m_lockData[data.SrcSubResourceIndex].isVidMemUpToDate = false;
srcResource->m_lockData[data.SrcSubResourceIndex].isMsaaResolvedUpToDate = false;
@ -1488,11 +1487,9 @@ namespace D3dDdi
void Resource::setAsPrimary()
{
D3dDdi::ScopedCriticalSection lock;
if (!m_isPrimary)
{
m_isPrimary = true;
updateConfig();
}
m_isPrimary = true;
m_origData.Flags.RenderTarget = DDraw::PrimarySurface::getOrigCaps() & DDSCAPS_3DDEVICE ? 1 : 0;
updateConfig();
}
void Resource::setFormatOverride(D3DDDIFORMAT format)

View File

@ -59,6 +59,7 @@ namespace
constexpr void setCompatVtable(Vtable& vtable)
{
typedef GetSurfaceType<Vtable>::Type TSurface;
SET_COMPAT_METHOD(AddAttachedSurface);
SET_COMPAT_METHOD(Blt);
SET_COMPAT_METHOD(BltFast);
SET_COMPAT_METHOD(Flip);

View File

@ -84,6 +84,11 @@ namespace DDraw
desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
desc.ddpfPixelFormat = DirectDraw::getRgbPixelFormat(g_monitorInfo.bpp);
if (!(desc.dwFlags & DDSD_BACKBUFFERCOUNT))
{
desc.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE;
}
result = Surface::create(dd, desc, surface, std::move(privateData));
if (FAILED(result))
{
@ -277,6 +282,16 @@ namespace DDraw
Surface::restore();
}
void PrimarySurface::setAsRenderTarget()
{
g_origCaps |= DDSCAPS_3DDEVICE;
auto resource = D3dDdi::Device::findResource(DDraw::DirectDrawSurface::getDriverResourceHandle(*g_primarySurface));
if (resource)
{
resource->setAsPrimary();
}
}
void PrimarySurface::updateFrontResource()
{
g_frontResource = DirectDrawSurface::getDriverResourceHandle(*g_primarySurface);

View File

@ -28,6 +28,7 @@ namespace DDraw
static HANDLE getGdiResource();
static DWORD getOrigCaps();
static void onLost();
static void setAsRenderTarget();
static void updatePalette();
template <typename TSurface>

View File

@ -84,6 +84,22 @@ namespace DDraw
{
}
template <typename TSurface>
HRESULT PrimarySurfaceImpl<TSurface>::AddAttachedSurface(TSurface* This, TSurface* lpDDSAttachedSurface)
{
HRESULT result = getOrigVtable(This).AddAttachedSurface(This, lpDDSAttachedSurface);
if (SUCCEEDED(result) && !(PrimarySurface::getOrigCaps() & DDSCAPS_3DDEVICE))
{
TDdsCaps caps = {};
getOrigVtable(This).GetCaps(lpDDSAttachedSurface, &caps);
if (caps.dwCaps & DDSCAPS_3DDEVICE)
{
PrimarySurface::setAsRenderTarget();
}
}
return result;
}
template <typename TSurface>
HRESULT PrimarySurfaceImpl<TSurface>::Blt(
TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,

View File

@ -15,6 +15,7 @@ namespace DDraw
public:
PrimarySurfaceImpl(Surface* data);
virtual HRESULT AddAttachedSurface(TSurface* This, TSurface* lpDDSAttachedSurface) override;
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
DWORD dwFlags, LPDDBLTFX lpDDBltFx) override;
virtual HRESULT BltFast(TSurface* This, DWORD dwX, DWORD dwY,

View File

@ -122,6 +122,12 @@ namespace DDraw
{
}
template <typename TSurface>
HRESULT SurfaceImpl<TSurface>::AddAttachedSurface(TSurface* This, TSurface* lpDDSAttachedSurface)
{
return getOrigVtable(This).AddAttachedSurface(This, lpDDSAttachedSurface);
}
template <typename TSurface>
HRESULT SurfaceImpl<TSurface>::Blt(
TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,

View File

@ -24,6 +24,7 @@ namespace DDraw
SurfaceImpl(Surface* data);
virtual ~SurfaceImpl();
virtual HRESULT AddAttachedSurface(TSurface* This, TSurface* lpDDSAttachedSurface);
virtual HRESULT Blt(TSurface* This, LPRECT lpDestRect, TSurface* lpDDSrcSurface, LPRECT lpSrcRect,
DWORD dwFlags, LPDDBLTFX lpDDBltFx);
virtual HRESULT BltFast(TSurface* This, DWORD dwX, DWORD dwY,