CVS: winex/dlls/quartz vidren.c, 1.9, 1.10 vidren.h, 1.3, 1.4
[email protected] 30 Mar 2007 21:42:40 -0000
Newsgroups
gmane.comp.emulators.winex.cvs
Message-ID
<[email protected] >
Subject: winex/dlls/quartz vidren.c,1.9,1.10 vidren.h,1.3,1.4Update of /var/lib/cvsd/cvsroot/winex/dlls/quartz
In directory agravaine:/tmp/cvs-serv26035/dlls/quartz
Modified Files:
vidren.c vidren.h
Log Message:
The DirectDraw renderer now grabs a backbuffer, blits to it, and flips,
rather than blitting straight to the frontbuffer, to minimize artifacts.
Index: vidren.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/quartz/vidren.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- vidren.c 30 Mar 2007 21:36:48 -0000 1.9
+++ vidren.c 30 Mar 2007 21:42:38 -0000 1.10
@@ -134,14 +134,17 @@
{
HRESULT hr;
- if (This->m_pDDSFront)
- IDirectDrawSurface_Release(This->m_pDDSFront);
-
if (This->m_pDDSSource)
IDirectDrawSurface_Release(This->m_pDDSSource);
+ This->m_pDDSSource = NULL;
+
+ if (This->m_pDDSBack)
+ IDirectDrawSurface_Release(This->m_pDDSBack);
+ This->m_pDDSBack = NULL;
+ if (This->m_pDDSFront)
+ IDirectDrawSurface_Release(This->m_pDDSFront);
This->m_pDDSFront = NULL;
- This->m_pDDSSource = NULL;
if (This->m_lpddraw && (hr = IDirectDraw_SetCooperativeLevel(This->m_lpddraw, 0, DDSCL_NORMAL)))
{
@@ -157,6 +160,7 @@
{
HRESULT hr;
DDSURFACEDESC ddsd;
+ DDSCAPS caps;
if (This->m_lpddraw == NULL)
return(DDERR_UNSUPPORTED);
@@ -180,13 +184,21 @@
/* fields will contain valid values */
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- ddsd.dwFlags = DDSD_CAPS;
+ ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ ddsd.dwBackBufferCount = 1;
hr = IDirectDraw_CreateSurface(This->m_lpddraw, &ddsd, &This->m_pDDSFront, NULL);
if (hr != S_OK)
return hr;
- TRACE("Created %p\n", This->m_pDDSFront);
+ TRACE("Created primary surface: %p\n", This->m_pDDSFront);
+
+ caps.dwCaps = DDSCAPS_BACKBUFFER;
+ hr = IDirectDrawSurface_GetAttachedSurface(This->m_pDDSFront, &caps, &This->m_pDDSBack);
+ if (hr != S_OK)
+ return hr;
+
+ TRACE("Backbuffer: %p\n", This->m_pDDSBack);
/* -- Create the source surface */
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
@@ -222,7 +234,8 @@
SetRect(&rcSrc, 0, 0, movW, movH); /* movie size */
SetRect(&rcDst, left, top, right, bottom); /* screen size */
- hr = IDirectDrawSurface_Blt(This->m_pDDSFront, &rcDst, This->m_pDDSSource, &rcSrc, DDBLT_WAIT, NULL);
+ hr = IDirectDrawSurface_Blt(This->m_pDDSBack, &rcDst, This->m_pDDSSource, &rcSrc, DDBLT_WAIT, NULL);
+ hr = IDirectDrawSurface_Flip(This->m_pDDSFront, NULL, DDFLIP_WAIT);
TRACE("ok\n");
}
@@ -1239,6 +1252,7 @@
This->m_numFrames = 0;
This->m_skipFrames = 0;
This->m_pDDSFront = NULL;
+ This->m_pDDSBack = NULL;
This->m_pDDSSource = NULL;
This->m_lpddraw = NULL;
Index: vidren.h
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/quartz/vidren.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- vidren.h 30 Mar 2007 21:36:49 -0000 1.3
+++ vidren.h 30 Mar 2007 21:42:38 -0000 1.4
@@ -71,6 +71,7 @@
IDirectDraw *m_lpddraw;
IDirectDrawSurface *m_pDDSFront;
+ IDirectDrawSurface *m_pDDSBack;
IDirectDrawSurface *m_pDDSSource;
int m_UseDirectDraw;
int m_Width;