CVS: winex/dlls/quartz vidren.c, 1.9, 1.10 vidren.h, 1.3, 1.4

[email protected]
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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.