=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: ddraw: Set the viewport after changing the render target.

Alexandre Julliard julliard at winehq.org
Fri Sep 2 13:13:37 CDT 2011


Module: wine
Branch: master
Commit: e0db367aefb85a2defca983a59a7165c8fe3f7dc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e0db367aefb85a2defca983a59a7165c8fe3f7dc

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sun Aug 28 16:48:52 2011 +0200

ddraw: Set the viewport after changing the render target.

---

 dlls/ddraw/tests/visual.c |   32 +++++++++++++++++++++-----------
 1 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index acefb67..9026f97 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -210,16 +210,24 @@ out:
     return ret;
 }
 
-/*
- * Helper function to get and set the viewport - needed on geforce 8800 on XP - driver bug?
- * This is needed after IDirect3DDevice7_SetRenderTarget in combination with offscreen to backbuffer rendering.
- */
-static void set_the_same_viewport_again(IDirect3DDevice7 *device)
+static void set_viewport_size(IDirect3DDevice7 *device)
 {
     D3DVIEWPORT7 vp = {0};
+    DDSURFACEDESC2 ddsd;
     HRESULT hr;
-    hr = IDirect3DDevice7_GetViewport(device,&vp);
-    ok(hr == D3D_OK && vp.dwWidth == 640 && vp.dwHeight == 480, "IDirect3DDevice7_SetViewport returned %08x\n", hr);
+    IDirectDrawSurface7 *target;
+
+    hr = IDirect3DDevice7_GetRenderTarget(device, &target);
+    ok(hr == D3D_OK, "IDirect3DDevice7_GetRenderTarget returned %08x\n", hr);
+
+    memset(&ddsd, 0, sizeof(ddsd));
+    ddsd.dwSize = sizeof(ddsd);
+    IDirectDrawSurface7_GetSurfaceDesc(target, &ddsd);
+    ok(hr == D3D_OK, "IDirectDrawSurface7_GetSurfaceDesc returned %08x\n", hr);
+    IDirectDrawSurface7_Release(target);
+
+    vp.dwWidth = ddsd.dwWidth;
+    vp.dwHeight = ddsd.dwHeight;
     hr = IDirect3DDevice7_SetViewport(device, &vp);
     ok(hr == D3D_OK, "IDirect3DDevice7_SetViewport returned %08x\n", hr);
     return;
@@ -831,6 +839,7 @@ static void offscreen_test(IDirect3DDevice7 *device)
     if(IDirect3DDevice7_BeginScene(device) == D3D_OK) {
         hr = IDirect3DDevice7_SetRenderTarget(device, offscreen, 0);
         ok(hr == D3D_OK, "SetRenderTarget failed, hr = %08x\n", hr);
+        set_viewport_size(device);
         hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0);
         ok(hr == D3D_OK, "Clear failed, hr = %08x\n", hr);
 
@@ -840,7 +849,7 @@ static void offscreen_test(IDirect3DDevice7 *device)
 
         hr = IDirect3DDevice7_SetRenderTarget(device, backbuffer, 0);
         ok(hr == D3D_OK, "SetRenderTarget failed, hr = %08x\n", hr);
-        set_the_same_viewport_again(device);
+        set_viewport_size(device);
 
         hr = IDirect3DDevice7_SetTexture(device, 0, offscreen);
         ok(hr == D3D_OK, "SetTexture failed, %08x\n", hr);
@@ -987,7 +996,8 @@ static void alpha_test(IDirect3DDevice7 *device)
          * vertices
          */
         hr = IDirect3DDevice7_SetRenderTarget(device, offscreen, 0);
-        ok(hr == D3D_OK, "Can't get back buffer, hr = %08x\n", hr);
+        ok(hr == D3D_OK, "IDirect3DDevice7_SetRenderTarget failed, hr = %08x\n", hr);
+        set_viewport_size(device);
         hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0x80ff0000, 0.0, 0);
         ok(hr == D3D_OK, "Clear failed, hr = %08x\n", hr);
 
@@ -1006,8 +1016,8 @@ static void alpha_test(IDirect3DDevice7 *device)
         ok(hr == D3D_OK, "DrawPrimitive failed, hr = %08x\n", hr);
 
         hr = IDirect3DDevice7_SetRenderTarget(device, backbuffer, 0);
-        ok(hr == D3D_OK, "Can't get back buffer, hr = %08x\n", hr);
-        set_the_same_viewport_again(device);
+        ok(hr == D3D_OK, "IDirect3DDevice7_SetRenderTarget failed, hr = %08x\n", hr);
+        set_viewport_size(device);
 
         /* Render the offscreen texture onto the frame buffer to be able to compare it regularly.
          * Disable alpha blending for the final composition




More information about the wine-cvs mailing list