fix DD display method bombing when using high prescale and magnification filter levels
This commit is contained in:
parent
a738364416
commit
bc84d6930b
|
@ -357,6 +357,7 @@ struct DDRAW
|
|||
u32 create(HWND hwnd);
|
||||
bool release();
|
||||
bool createSurfaces(HWND hwnd);
|
||||
bool createBackSurface(int width, int height);
|
||||
bool lock();
|
||||
bool unlock();
|
||||
bool blt(LPRECT dst, LPRECT src);
|
||||
|
@ -1751,6 +1752,11 @@ static void DD_DoDisplay()
|
|||
if (!ddraw.lock()) return;
|
||||
char* buffer = (char*)ddraw.surfDescBack.lpSurface;
|
||||
|
||||
if(ddraw.surfDescBack.dwWidth != video.width || ddraw.surfDescBack.dwHeight != video.height)
|
||||
{
|
||||
ddraw.createBackSurface(video.width,video.height);
|
||||
}
|
||||
|
||||
switch(ddraw.surfDescBack.ddpfPixelFormat.dwRGBBitCount)
|
||||
{
|
||||
case 32:
|
||||
|
@ -5820,7 +5826,6 @@ DOKEYDOWN:
|
|||
Lock lock (win_backbuffer_sync);
|
||||
SetStyle((GetStyle()&~DWS_DISPMETHODS) | DWS_OPENGL);
|
||||
WritePrivateProfileInt("Video","Display Method", DISPMETHOD_OPENGL, IniName);
|
||||
ddraw.createSurfaces(hwnd);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -7216,27 +7221,15 @@ bool DDRAW::release()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool DDRAW::createSurfaces(HWND hwnd)
|
||||
bool DDRAW::createBackSurface(int width, int height)
|
||||
{
|
||||
if (!handle) return true;
|
||||
|
||||
if (clip) { clip->Release(); clip = NULL; }
|
||||
if (surface.back) { surface.back->Release(); surface.back = NULL; }
|
||||
if (surface.primary) { surface.primary->Release(); surface.primary = NULL; }
|
||||
|
||||
bool hw = (GetStyle()&DWS_DDRAW_HW)!=0;
|
||||
bool sw = (GetStyle()&DWS_DDRAW_SW)!=0;
|
||||
|
||||
if(!hw && !sw) return true;
|
||||
|
||||
// primary
|
||||
memset(&surfDesc, 0, sizeof(surfDesc));
|
||||
surfDesc.dwSize = sizeof(surfDesc);
|
||||
surfDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||||
surfDesc.dwFlags = DDSD_CAPS;
|
||||
if (FAILED(handle->CreateSurface(&surfDesc, &surface.primary, NULL)))
|
||||
return false;
|
||||
|
||||
memset(&surfDescBack, 0, sizeof(surfDescBack));
|
||||
surfDescBack.dwSize = sizeof(surfDescBack);
|
||||
surfDescBack.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
|
||||
|
@ -7247,10 +7240,36 @@ bool DDRAW::createSurfaces(HWND hwnd)
|
|||
else
|
||||
surfDescBack.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
|
||||
|
||||
surfDescBack.dwWidth = 384 * 5;
|
||||
surfDescBack.dwHeight = 384 * 5;
|
||||
|
||||
surfDescBack.dwWidth = width;
|
||||
surfDescBack.dwHeight = height;
|
||||
|
||||
if (FAILED(handle->CreateSurface(&surfDescBack, &surface.back, NULL))) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DDRAW::createSurfaces(HWND hwnd)
|
||||
{
|
||||
if (!handle) return true;
|
||||
|
||||
if (clip) { clip->Release(); clip = NULL; }
|
||||
if (surface.back) { surface.back->Release(); surface.back = NULL; }
|
||||
if (surface.primary) { surface.primary->Release(); surface.primary = NULL; }
|
||||
|
||||
|
||||
// primary
|
||||
memset(&surfDesc, 0, sizeof(surfDesc));
|
||||
surfDesc.dwSize = sizeof(surfDesc);
|
||||
surfDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||||
surfDesc.dwFlags = DDSD_CAPS;
|
||||
if (FAILED(handle->CreateSurface(&surfDesc, &surface.primary, NULL)))
|
||||
return false;
|
||||
|
||||
//default doesnt matter much, itll get adjusted later
|
||||
if(!createBackSurface(256,384))
|
||||
return false;
|
||||
|
||||
if (FAILED(handle->CreateClipper(0, &clip, NULL))) return false;
|
||||
if (FAILED(clip->SetHWnd(0, hwnd))) return false;
|
||||
if (FAILED(surface.primary->SetClipper(clip))) return false;
|
||||
|
|
Loading…
Reference in New Issue