From: Toni Wilen Date: Wed, 27 Aug 2014 18:01:43 +0000 (+0300) Subject: Screenshot was always non-filtered when d3d + shader filter enabled. X-Git-Tag: 3000~80 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=ad02e87da671aef4615c277e28b01eb9168dee03;p=francis%2Fwinuae.git Screenshot was always non-filtered when d3d + shader filter enabled. --- diff --git a/od-win32/screenshot.cpp b/od-win32/screenshot.cpp index da5dabcc..2b48c55b 100644 --- a/od-win32/screenshot.cpp +++ b/od-win32/screenshot.cpp @@ -211,8 +211,12 @@ static int screenshot_prepare (int imagemode, struct vidbuffer *vb) dst -= dpitch; } } - if (WIN32GFX_IsPicassoScreen () && !vb) - freertgbuffer (mem); + if (!vb) { + if (WIN32GFX_IsPicassoScreen ()) + freertgbuffer (mem); + else + freefilterbuffer(mem); + } } else { donormal: diff --git a/od-win32/win32_scaler.cpp b/od-win32/win32_scaler.cpp index fdb7adc0..8dff364e 100644 --- a/od-win32/win32_scaler.cpp +++ b/od-win32/win32_scaler.cpp @@ -650,6 +650,15 @@ end: } +void freefilterbuffer(uae_u8 *buf) +{ + struct vidbuffer *vb = gfxvidinfo.outbuffer; + + if (usedfilter == NULL) { + unlockscr3d(vb); + } +} + uae_u8 *getfilterbuffer (int *widthp, int *heightp, int *pitch, int *depth) { struct vidbuffer *vb = gfxvidinfo.outbuffer; @@ -657,8 +666,11 @@ uae_u8 *getfilterbuffer (int *widthp, int *heightp, int *pitch, int *depth) *widthp = 0; *heightp = 0; *depth = amiga_depth; - if (usedfilter == NULL) - return NULL; + if (usedfilter == NULL) { + if (!lockscr3d(vb)) { + return NULL; + } + } *widthp = vb->outwidth; *heightp = vb->outheight; if (pitch) diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 5e6172a3..59bb6ca7 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1108,6 +1108,27 @@ static uae_u8 *ddraw_dolock (void) return gfxvidinfo.outbuffer->bufmem; } +bool lockscr3d(struct vidbuffer *vb) +{ + if (currentmode->flags & DM_D3D) { + if (!(currentmode->flags & DM_SWSCALE)) { + vb->bufmem = D3D_locktexture(&vb->rowbytes, NULL, false); + if (vb->bufmem) + return true; + } + } + return false; +} + +void unlockscr3d(struct vidbuffer *vb) +{ + if (currentmode->flags & DM_D3D) { + if (!(currentmode->flags & DM_SWSCALE)) { + D3D_unlocktexture(); + } + } +} + int lockscr (struct vidbuffer *vb, bool fullupdate) { int ret = 0; diff --git a/od-win32/win32gfx.h b/od-win32/win32gfx.h index 15965b00..63ff292f 100644 --- a/od-win32/win32gfx.h +++ b/od-win32/win32gfx.h @@ -38,6 +38,9 @@ extern int is3dmode (void); extern void gfx_lock (void); extern void gfx_unlock (void); +extern bool lockscr3d(struct vidbuffer *vb); +extern void unlockscr3d(struct vidbuffer *vb); + void DX_Fill (int dstx, int dsty, int width, int height, uae_u32 color); void DX_Blit (int x, int y, int w, int h); void centerdstrect (RECT *);