diff --git a/src/compositor.c b/src/compositor.c
index 8694956cf41fdcf3fd8c9b0385a1e878b4563650..6d8498a66f3b2e3ad4fb4f040c238ea94242b715 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1107,16 +1107,6 @@ init_glx_extensions (ScreenInfo *screen_info)
         epoxy_has_glx_extension (myScreenGetXDisplay (screen_info),
                                  screen_info->screen,
                                  "GLX_EXT_texture_from_pixmap");
-
-    screen_info->has_texture_rectangle =
-        epoxy_has_glx_extension (myScreenGetXDisplay (screen_info),
-                                 screen_info->screen,
-                                 "GL_ARB_texture_rectangle");
-
-    screen_info->has_texture_non_power_of_two =
-        epoxy_has_glx_extension (myScreenGetXDisplay (screen_info),
-                                 screen_info->screen,
-                                 "GL_ARB_texture_non_power_of_two");
 }
 
 static gboolean
@@ -1134,6 +1124,7 @@ choose_glx_settings (ScreenInfo *screen_info)
         GLX_RENDER_TYPE,   GLX_RGBA_BIT,
         None
     };
+    GLint texture_type = 0;
     GLint texture_target = 0;
     GLint texture_format = 0;
     gboolean texture_inverted = FALSE;
@@ -1158,17 +1149,6 @@ choose_glx_settings (ScreenInfo *screen_info)
         return FALSE;
     }
 
-    if (screen_info->has_texture_rectangle)
-    {
-        DBG ("Using texture type GL_TEXTURE_RECTANGLE_ARB");
-        screen_info->texture_type = GL_TEXTURE_RECTANGLE_ARB;
-    }
-    else
-    {
-        DBG ("Using texture type GL_TEXTURE_2D");
-        screen_info->texture_type = GL_TEXTURE_2D;
-    }
-
     fb_match = FALSE;
     xvisual_id = XVisualIDFromVisual (screen_info->visual);
     for (i = 0; i < n_configs; i++)
@@ -1209,31 +1189,17 @@ choose_glx_settings (ScreenInfo *screen_info)
             continue;
         }
 
-        if (screen_info->texture_type == GL_TEXTURE_RECTANGLE_ARB)
+        if (value & GLX_TEXTURE_RECTANGLE_BIT_EXT)
         {
-            if (value & GLX_TEXTURE_RECTANGLE_BIT_EXT)
-            {
-                texture_target = GLX_TEXTURE_RECTANGLE_EXT;
-                DBG ("Using texture target GLX_TEXTURE_RECTANGLE_EXT");
-            }
-            else
-            {
-                DBG ("%i/%i: No GLX_TEXTURE_RECTANGLE_BIT_EXT, skipped", i + 1, n_configs);
-                continue;
-            }
+            DBG ("Using texture GL_TEXTURE_RECTANGLE_ARB target GLX_TEXTURE_RECTANGLE_EXT");
+            texture_type = GL_TEXTURE_RECTANGLE_ARB;
+            texture_target = GLX_TEXTURE_RECTANGLE_EXT;
         }
-        else if (screen_info->texture_type == GL_TEXTURE_2D)
+        else if (value & GLX_TEXTURE_2D_BIT_EXT)
         {
-            if (value & GLX_TEXTURE_2D_BIT_EXT)
-            {
-                texture_target = GLX_TEXTURE_2D_EXT;
-                DBG ("Using texture target GLX_TEXTURE_2D_EXT");
-            }
-            else
-            {
-                DBG ("%i/%i: No GLX_TEXTURE_2D_BIT_EXT, skipped", i + 1, n_configs);
-                continue;
-            }
+            DBG ("Using texture GL_TEXTURE_2D target GLX_TEXTURE_2D_EXT");
+            texture_type = GL_TEXTURE_2D;
+            texture_target = GLX_TEXTURE_2D_EXT;
         }
         else
         {
@@ -1247,8 +1213,8 @@ choose_glx_settings (ScreenInfo *screen_info)
                                        &value);
         if (status == Success && value == TRUE)
         {
-            texture_format = GLX_TEXTURE_FORMAT_RGBA_EXT;
             DBG ("Using texture format GLX_TEXTURE_FORMAT_RGBA_EXT");
+            texture_format = GLX_TEXTURE_FORMAT_RGBA_EXT;
         }
         else
         {
@@ -1289,8 +1255,11 @@ choose_glx_settings (ScreenInfo *screen_info)
         g_warning ("Cannot find a matching visual for the frame buffer config.");
         return FALSE;
     }
-    DBG ("Selected texture target 0x%x format 0x%x (%s)", texture_target,
-         texture_format, texture_inverted ? "inverted" : "non inverted");
+    DBG ("Selected texture type 0x%x target 0x%x format 0x%x (%s)",
+         texture_type, texture_target, texture_format,
+         texture_inverted ? "inverted" : "non inverted");
+
+    screen_info->texture_type = texture_type;
     screen_info->texture_target = texture_target;
     screen_info->texture_format = texture_format;
     screen_info->texture_inverted = texture_inverted;
@@ -1524,6 +1493,19 @@ bind_glx_texture (ScreenInfo *screen_info, Pixmap pixmap)
     check_gl_error();
 }
 
+static void
+scale_glx_texture (ScreenInfo *screen_info, gint width, gint height, double zoom)
+{
+    if (screen_info->texture_type == GL_TEXTURE_RECTANGLE_ARB)
+    {
+        glScaled ((double) width * zoom, (double) height * zoom, 1.0);
+    }
+    else
+    {
+        glScaled(1.0 * zoom, 1.0 * zoom, 1.0);
+    }
+}
+
 static void
 redraw_glx_texture (ScreenInfo *screen_info)
 {
@@ -1532,6 +1514,8 @@ redraw_glx_texture (ScreenInfo *screen_info)
     TRACE ("entering redraw_glx_texture");
     TRACE ("(Re)Drawing GLX pixmap 0x%lx/texture 0x%x",
            screen_info->glx_drawable, screen_info->rootTexture);
+
+    glMatrixMode(GL_TEXTURE);
     glPushMatrix();
 
     if (screen_info->zoomed)
@@ -1542,18 +1526,17 @@ redraw_glx_texture (ScreenInfo *screen_info)
         XFixed yp = screen_info->transform.matrix[1][2];
 
         double zoom = XFixedToDouble (zf);
-        double x = (2.0 * XFixedToDouble (xp)) / screen_info->width - (1.0 - zoom);
-        double y = (2.0 * XFixedToDouble (yp)) / screen_info->height -  (1.0 - zoom);
+        double x = XFixedToDouble (xp) / (screen_info->width * zoom);
+        double y = XFixedToDouble (yp) / (screen_info->height * zoom);
 
-        glScaled(1.0 / zoom, 1.0 / zoom, 1.0);
-        glTranslated (-x, y, 0.0);
+        scale_glx_texture (screen_info, screen_info->width, screen_info->height, zoom);
+        glTranslated (x, y, 0.0);
     }
     else
     {
-        glScaled(1.0, 1.0, 1.0);
+        scale_glx_texture (screen_info, screen_info->width, screen_info->height, 1.0);
         glTranslated (0.0, 0.0, 0.0);
     }
-
     glViewport(0, 0, screen_info->width, screen_info->height);
 
     glBegin(GL_QUADS);
diff --git a/src/screen.h b/src/screen.h
index d92f8ad1e457953071bcff117ca5fb51f2370f3a..2f19057898f9403be15d64729fcedfc84a69eaaa 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -210,8 +210,6 @@ struct _ScreenInfo
     gboolean has_glx_sync_control;
     gboolean has_glx_video_sync;
     gboolean has_texture_from_pixmap;
-    gboolean has_texture_rectangle;
-    gboolean has_texture_non_power_of_two;
     gboolean texture_inverted;
 
     GLuint rootTexture;