mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Assume ddsCaps is valid even if DDSD_CAPS is not set
DirectDraw seems to assume the DDSD_CAPS flag is always set in CreateSurface. This flag even has a comment in ddraw.h mentioning it's "default". Some games set ddsCaps members without explicitly setting the DDSD_CAPS flag, which causes DDrawCompat to incorrectly detect some capabilities. These checks now always assume the ddsCaps member is valid even if DDSD_CAPS is not set. Fixes a crash when launching Rogue Spear, mentioned in issue #2.
This commit is contained in:
parent
b9b4a2aafd
commit
78bc5c0ee3
@ -107,7 +107,6 @@ HRESULT STDMETHODCALLTYPE CompatDirectDraw<TDirectDraw>::CreateSurface(
|
|||||||
HRESULT result = DD_OK;
|
HRESULT result = DD_OK;
|
||||||
|
|
||||||
const bool isPrimary = lpDDSurfaceDesc &&
|
const bool isPrimary = lpDDSurfaceDesc &&
|
||||||
(lpDDSurfaceDesc->dwFlags & DDSD_CAPS) &&
|
|
||||||
(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE);
|
(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE);
|
||||||
|
|
||||||
if (isPrimary)
|
if (isPrimary)
|
||||||
@ -120,8 +119,7 @@ HRESULT STDMETHODCALLTYPE CompatDirectDraw<TDirectDraw>::CreateSurface(
|
|||||||
if (lpDDSurfaceDesc &&
|
if (lpDDSurfaceDesc &&
|
||||||
(lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) &&
|
(lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) &&
|
||||||
(lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT) &&
|
(lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT) &&
|
||||||
!((lpDDSurfaceDesc->dwFlags & DDSD_CAPS) &&
|
!(lpDDSurfaceDesc->ddsCaps.dwCaps & (DDSCAPS_ALPHA | DDSCAPS_ZBUFFER)))
|
||||||
(lpDDSurfaceDesc->ddsCaps.dwCaps & (DDSCAPS_ALPHA | DDSCAPS_ZBUFFER))))
|
|
||||||
{
|
{
|
||||||
CompatPtr<IDirectDraw7> dd(Compat::queryInterface<IDirectDraw7>(This));
|
CompatPtr<IDirectDraw7> dd(Compat::queryInterface<IDirectDraw7>(This));
|
||||||
auto dm = CompatDisplayMode::getDisplayMode(*dd);
|
auto dm = CompatDisplayMode::getDisplayMode(*dd);
|
||||||
@ -132,9 +130,8 @@ HRESULT STDMETHODCALLTYPE CompatDirectDraw<TDirectDraw>::CreateSurface(
|
|||||||
desc.dwFlags |= DDSD_PIXELFORMAT;
|
desc.dwFlags |= DDSD_PIXELFORMAT;
|
||||||
desc.ddpfPixelFormat = dm.ddpfPixelFormat;
|
desc.ddpfPixelFormat = dm.ddpfPixelFormat;
|
||||||
}
|
}
|
||||||
if (!((desc.dwFlags & DDSD_CAPS) &&
|
if (!(desc.ddsCaps.dwCaps & (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_OVERLAY | DDSCAPS_TEXTURE |
|
||||||
(desc.ddsCaps.dwCaps & (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_OVERLAY | DDSCAPS_TEXTURE |
|
DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)))
|
||||||
DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))))
|
|
||||||
{
|
{
|
||||||
desc.dwFlags |= DDSD_CAPS;
|
desc.dwFlags |= DDSD_CAPS;
|
||||||
desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
|
desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
|
||||||
|
@ -21,8 +21,7 @@ namespace
|
|||||||
|
|
||||||
void fixSurfacePtr(CompatRef<IDirectDrawSurface7> surface, const DDSURFACEDESC2& desc)
|
void fixSurfacePtr(CompatRef<IDirectDrawSurface7> surface, const DDSURFACEDESC2& desc)
|
||||||
{
|
{
|
||||||
if ((desc.dwFlags & DDSD_CAPS) && (desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) ||
|
if ((desc.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) || 0 == desc.dwWidth || 0 == desc.dwHeight)
|
||||||
0 == desc.dwWidth || 0 == desc.dwHeight)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user