wined3d: Simplify texture target handling in surface_blt_to_drawable().

Henri Verbeet hverbeet at codeweavers.com
Wed Oct 15 06:35:32 CDT 2008


---
 dlls/wined3d/surface.c |  192 +++++++++++++++++++++---------------------------
 1 files changed, 84 insertions(+), 108 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 6f0c107..72f7537 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4132,6 +4132,7 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
     IWineD3DBaseTexture *texture = NULL;
     HRESULT hr;
     IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+    GLenum bind_target;
 
     if(rect_in) {
         rect = *rect_in;
@@ -4142,121 +4143,100 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
         rect.bottom = This->currentDesc.Height;
     }
 
-    ActivateContext(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
-    ENTER_GL();
-
-    if(This->glDescription.target == GL_TEXTURE_RECTANGLE_ARB) {
-        glEnable(GL_TEXTURE_RECTANGLE_ARB);
-        checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");
-        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, This->glDescription.textureName);
-        checkGLcall("GL_TEXTURE_RECTANGLE_ARB, This->glDescription.textureName)");
-        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
-        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
-
-        coords[0].x = rect.left;
-        coords[0].z = 0;
-
-        coords[1].x = rect.left;
-        coords[1].z = 0;
+    switch(This->glDescription.target)
+    {
+        case GL_TEXTURE_2D:
+            bind_target = GL_TEXTURE_2D;
 
-        coords[2].x = rect.right;
-        coords[2].z = 0;
+            coords[0].x = (float)rect.left / This->pow2Width;
+            coords[0].y = (float)rect.top / This->pow2Height;
+            coords[0].z = 0;
 
-        coords[3].x = rect.right;
-        coords[3].z = 0;
+            coords[1].x = (float)rect.left / This->pow2Width;
+            coords[1].y = (float)rect.bottom / This->pow2Height;
+            coords[1].z = 0;
 
-        coords[0].y = rect.top;
-        coords[1].y = rect.bottom;
-        coords[2].y = rect.bottom;
-        coords[3].y = rect.top;
-    } else if(This->glDescription.target == GL_TEXTURE_2D) {
-        glEnable(GL_TEXTURE_2D);
-        checkGLcall("glEnable(GL_TEXTURE_2D)");
-        glBindTexture(GL_TEXTURE_2D, This->glDescription.textureName);
-        checkGLcall("GL_TEXTURE_2D, This->glDescription.textureName)");
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
+            coords[2].x = (float)rect.right / This->pow2Width;
+            coords[2].y = (float)rect.bottom / This->pow2Height;
+            coords[2].z = 0;
 
-        coords[0].x = (float)rect.left   / This->pow2Width;
-        coords[0].z = 0;
-
-        coords[1].x = (float)rect.left   / This->pow2Width;
-        coords[1].z = 0;
+            coords[3].x = (float)rect.right / This->pow2Width;
+            coords[3].y = (float)rect.top / This->pow2Height;
+            coords[3].z = 0;
+            break;
 
-        coords[2].x = (float)rect.right  / This->pow2Width;
-        coords[2].z = 0;
+        case GL_TEXTURE_RECTANGLE_ARB:
+            bind_target = GL_TEXTURE_RECTANGLE_ARB;
+            coords[0].x = rect.left;    coords[0].y = rect.top;     coords[0].z = 0;
+            coords[1].x = rect.left;    coords[1].y = rect.bottom;  coords[1].z = 0;
+            coords[2].x = rect.right;   coords[2].y = rect.bottom;  coords[2].z = 0;
+            coords[3].x = rect.right;   coords[3].y = rect.top;     coords[3].z = 0;
+            break;
 
-        coords[3].x = (float)rect.right  / This->pow2Width;
-        coords[3].z = 0;
+        case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x =  1;   coords[0].y = -1;   coords[0].z =  1;
+            coords[1].x =  1;   coords[1].y =  1;   coords[1].z =  1;
+            coords[2].x =  1;   coords[2].y =  1;   coords[2].z = -1;
+            coords[3].x =  1;   coords[3].y = -1;   coords[3].z = -1;
+            break;
 
-        coords[0].y = (float)rect.top    / This->pow2Height;
-        coords[1].y = (float)rect.bottom / This->pow2Height;
-        coords[2].y = (float)rect.bottom / This->pow2Height;
-        coords[3].y = (float)rect.top    / This->pow2Height;
-    } else {
-        /* Must be a cube map */
-        glEnable(GL_TEXTURE_CUBE_MAP_ARB);
-        checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");
-        glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, This->glDescription.textureName);
-        checkGLcall("GL_TEXTURE_CUBE_MAP_ARB, This->glDescription.textureName)");
-        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
-        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        checkGLcall("glTexParameteri");
+        case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
+            coords[1].x = -1;   coords[1].y =  1;   coords[1].z =  1;
+            coords[2].x = -1;   coords[2].y =  1;   coords[2].z = -1;
+            coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
+            break;
 
-        switch(This->glDescription.target) {
-            case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
-                coords[0].x =  1;   coords[0].y = -1;   coords[0].z =  1;
-                coords[1].x =  1;   coords[1].y =  1;   coords[1].z =  1;
-                coords[2].x =  1;   coords[2].y =  1;   coords[2].z = -1;
-                coords[3].x =  1;   coords[3].y = -1;   coords[3].z = -1;
-                break;
+        case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x = -1;   coords[0].y =  1;   coords[0].z =  1;
+            coords[1].x =  1;   coords[1].y =  1;   coords[1].z =  1;
+            coords[2].x =  1;   coords[2].y =  1;   coords[2].z = -1;
+            coords[3].x = -1;   coords[3].y =  1;   coords[3].z = -1;
+            break;
 
-            case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
-                coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
-                coords[1].x = -1;   coords[1].y =  1;   coords[1].z =  1;
-                coords[2].x = -1;   coords[2].y =  1;   coords[2].z = -1;
-                coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
-                break;
+        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
+            coords[1].x =  1;   coords[1].y = -1;   coords[1].z =  1;
+            coords[2].x =  1;   coords[2].y = -1;   coords[2].z = -1;
+            coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
+            break;
 
-            case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
-                coords[0].x = -1;   coords[0].y =  1;   coords[0].z =  1;
-                coords[1].x =  1;   coords[1].y =  1;   coords[1].z =  1;
-                coords[2].x =  1;   coords[2].y =  1;   coords[2].z = -1;
-                coords[3].x = -1;   coords[3].y =  1;   coords[3].z = -1;
-                break;
+        case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
+            coords[1].x =  1;   coords[1].y = -1;   coords[1].z =  1;
+            coords[2].x =  1;   coords[2].y = -1;   coords[2].z =  1;
+            coords[3].x = -1;   coords[3].y = -1;   coords[3].z =  1;
+            break;
 
-            case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
-                coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
-                coords[1].x =  1;   coords[1].y = -1;   coords[1].z =  1;
-                coords[2].x =  1;   coords[2].y = -1;   coords[2].z = -1;
-                coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
-                break;
+        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+            bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+            coords[0].x = -1;   coords[0].y = -1;   coords[0].z = -1;
+            coords[1].x =  1;   coords[1].y = -1;   coords[1].z = -1;
+            coords[2].x =  1;   coords[2].y = -1;   coords[2].z = -1;
+            coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
+            break;
 
-            case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
-                coords[0].x = -1;   coords[0].y = -1;   coords[0].z =  1;
-                coords[1].x =  1;   coords[1].y = -1;   coords[1].z =  1;
-                coords[2].x =  1;   coords[2].y = -1;   coords[2].z =  1;
-                coords[3].x = -1;   coords[3].y = -1;   coords[3].z =  1;
-                break;
+        default:
+            ERR("Unexpected texture target %#x\n", This->glDescription.target);
+            return;
+    }
 
-            case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
-                coords[0].x = -1;   coords[0].y = -1;   coords[0].z = -1;
-                coords[1].x =  1;   coords[1].y = -1;   coords[1].z = -1;
-                coords[2].x =  1;   coords[2].y = -1;   coords[2].z = -1;
-                coords[3].x = -1;   coords[3].y = -1;   coords[3].z = -1;
-                break;
+    ActivateContext(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
+    ENTER_GL();
 
-            default:
-                ERR("Unexpected texture target\n");
-                LEAVE_GL();
-                return;
-        }
-    }
+    glEnable(bind_target);
+    checkGLcall("glEnable(bind_target)");
+    glBindTexture(bind_target, This->glDescription.textureName);
+    checkGLcall("bind_target, This->glDescription.textureName)");
+    glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    checkGLcall("glTexParameteri");
+    glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    checkGLcall("glTexParameteri");
 
     glBegin(GL_QUADS);
     glTexCoord3fv(&coords[0].x);
@@ -4273,13 +4253,9 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
     glEnd();
     checkGLcall("glEnd");
 
-    if(This->glDescription.target != GL_TEXTURE_2D) {
-        glDisable(GL_TEXTURE_CUBE_MAP_ARB);
-        checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
-    } else {
-        glDisable(GL_TEXTURE_2D);
-        checkGLcall("glDisable(GL_TEXTURE_2D)");
-    }
+    glDisable(bind_target);
+    checkGLcall("glDisable(bind_target)");
+
     LEAVE_GL();
 
     hr = IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DSwapChain, (void **) &swapchain);
-- 
1.5.6.4



--------------040909080306020100040104--



More information about the wine-patches mailing list