From bc84d6930b8ae009d53c51417d791726655c5d08 Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 9 Dec 2015 06:25:11 +0000 Subject: [PATCH] fix DD display method bombing when using high prescale and magnification filter levels --- desmume/src/windows/main.cpp | 51 +++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 0fe9e6063..64aca5990 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -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;