[PATCH 1/5] wined3d: Keep track of the current texture type for each texture unit.

Matteo Bruni mbruni at codeweavers.com
Thu Aug 25 18:12:26 CDT 2011


Again, I based the patch series onto Henri's patches. This time it is actually
needed as we're changing the same area of wined3d_private.h (patch 5/5). That
also means that probably the testbot will complain...

---
 dlls/wined3d/arb_program_shader.c |    2 +-
 dlls/wined3d/context.c            |   10 +++++++++
 dlls/wined3d/device.c             |    3 +-
 dlls/wined3d/state.c              |    3 +-
 dlls/wined3d/surface.c            |   40 +++++++++++++------------------------
 dlls/wined3d/texture.c            |    6 +---
 dlls/wined3d/wined3d_private.h    |    6 +++-
 7 files changed, 33 insertions(+), 37 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index da4b944..43789c6 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7234,7 +7234,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter,
     ENTER_GL();
 
     /* Draw a textured quad */
-    draw_textured_quad(src_surface, src_rect, &dst_rect, filter);
+    draw_textured_quad(src_surface, context, src_rect, &dst_rect, filter);
 
     LEAVE_GL();
 
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index af11618..2bef879 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1909,6 +1909,16 @@ void context_active_texture(struct wined3d_context *context, const struct wined3
     context->active_texture = unit;
 }
 
+void context_bind_texture(struct wined3d_context *context, GLenum target, GLuint name)
+{
+    glBindTexture(target, name);
+    checkGLcall("glBindTexture");
+    if (name)
+        context->texture_type[context->active_texture] = target;
+    else
+        context->texture_type[context->active_texture] = GL_NONE;
+}
+
 static void context_set_render_offscreen(struct wined3d_context *context, BOOL offscreen)
 {
     if (context->render_offscreen == offscreen) return;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ab9f657..6b1a48a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5281,8 +5281,7 @@ HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device
             /* Create a new cursor texture */
             glGenTextures(1, &device->cursorTexture);
             checkGLcall("glGenTextures");
-            glBindTexture(GL_TEXTURE_2D, device->cursorTexture);
-            checkGLcall("glBindTexture");
+            context_bind_texture(context, GL_TEXTURE_2D, device->cursorTexture);
             /* Copy the bitmap memory into the cursor texture */
             glTexImage2D(GL_TEXTURE_2D, 0, intfmt, width, height, 0, gl_format, type, mem);
             checkGLcall("glTexImage2D");
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index b3d1205..b777432 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3578,8 +3578,7 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
                 state_alpha(context, state, WINED3DRS_COLORKEYENABLE);
             }
         } /* Otherwise tex_colorop disables the stage */
-        glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler]);
-        checkGLcall("glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler])");
+        context_bind_texture(context, GL_TEXTURE_2D, device->dummyTextureName[sampler]);
     }
 }
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 821ef9d..ed047f2 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -311,8 +311,8 @@ static void surface_get_rect(const struct wined3d_surface *surface, const RECT *
 }
 
 /* GL locking and context activation is done by the caller */
-void draw_textured_quad(const struct wined3d_surface *src_surface, const RECT *src_rect,
-        const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter)
+void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context,
+        const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter)
 {
     struct blt_info info;
 
@@ -321,9 +321,7 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, const RECT *s
     glEnable(info.bind_target);
     checkGLcall("glEnable(bind_target)");
 
-    /* Bind the texture */
-    glBindTexture(info.bind_target, src_surface->texture_name);
-    checkGLcall("glBindTexture");
+    context_bind_texture(context, info.bind_target, src_surface->texture_name);
 
     /* Filtering for StretchRect */
     glTexParameteri(info.bind_target, GL_TEXTURE_MAG_FILTER,
@@ -353,8 +351,7 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, const RECT *s
     glEnd();
 
     /* Unbind the texture */
-    glBindTexture(info.bind_target, 0);
-    checkGLcall("glBindTexture(info->bind_target, 0)");
+    context_bind_texture(context, info.bind_target, 0);
 
     /* We changed the filtering settings on the texture. Inform the
      * container about this to get the filters reset properly next draw. */
@@ -2275,8 +2272,7 @@ void surface_bind(struct wined3d_surface *surface, struct wined3d_context *conte
 
             TRACE("Surface %p given name %u.\n", surface, surface->texture_name);
 
-            glBindTexture(surface->texture_target, surface->texture_name);
-            checkGLcall("glBindTexture");
+            context_bind_texture(context, surface->texture_target, surface->texture_name);
             glTexParameteri(surface->texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
             glTexParameteri(surface->texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
             glTexParameteri(surface->texture_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
@@ -2286,8 +2282,7 @@ void surface_bind(struct wined3d_surface *surface, struct wined3d_context *conte
         }
         else
         {
-            glBindTexture(surface->texture_target, surface->texture_name);
-            checkGLcall("glBindTexture");
+            context_bind_texture(context, surface->texture_target, surface->texture_name);
         }
 
         LEAVE_GL();
@@ -4867,8 +4862,7 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc
     ENTER_GL();
 
     /* Bind the target texture */
-    glBindTexture(dst_surface->texture_target, dst_surface->texture_name);
-    checkGLcall("glBindTexture");
+    context_bind_texture(context, dst_surface->texture_target, dst_surface->texture_name);
     if (surface_is_offscreen(src_surface))
     {
         TRACE("Reading from an offscreen target\n");
@@ -5002,16 +4996,14 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
     if(noBackBufferBackup) {
         glGenTextures(1, &backup);
         checkGLcall("glGenTextures");
-        glBindTexture(GL_TEXTURE_2D, backup);
-        checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
+        context_bind_texture(context, GL_TEXTURE_2D, backup);
         texture_target = GL_TEXTURE_2D;
     } else {
         /* Backup the back buffer and copy the source buffer into a texture to draw an upside down stretched quad. If
          * we are reading from the back buffer, the backup can be used as source texture
          */
         texture_target = src_surface->texture_target;
-        glBindTexture(texture_target, src_surface->texture_name);
-        checkGLcall("glBindTexture(texture_target, src_surface->texture_name)");
+        context_bind_texture(context, texture_target, src_surface->texture_name);
         glEnable(texture_target);
         checkGLcall("glEnable(texture_target)");
 
@@ -5070,8 +5062,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
 
         glGenTextures(1, &src);
         checkGLcall("glGenTextures(1, &src)");
-        glBindTexture(GL_TEXTURE_2D, src);
-        checkGLcall("glBindTexture(GL_TEXTURE_2D, src)");
+        context_bind_texture(context, GL_TEXTURE_2D, src);
 
         /* TODO: Only copy the part that will be read. Use src_rect->left, src_rect->bottom as origin, but with the width watch
          * out for power of 2 sizes
@@ -5157,8 +5148,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
     }
 
     /* Now read the stretched and upside down image into the destination texture */
-    glBindTexture(texture_target, dst_surface->texture_name);
-    checkGLcall("glBindTexture");
+    context_bind_texture(context, texture_target, dst_surface->texture_name);
     glCopyTexSubImage2D(texture_target,
                         0,
                         dst_rect.left, dst_rect.top, /* xoffset, yoffset */
@@ -5174,8 +5164,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
                 glEnable(GL_TEXTURE_2D);
                 texture_target = GL_TEXTURE_2D;
             }
-            glBindTexture(GL_TEXTURE_2D, backup);
-            checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
+            context_bind_texture(context, GL_TEXTURE_2D, backup);
         }
         else
         {
@@ -5185,8 +5174,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
                 glEnable(src_surface->texture_target);
                 texture_target = src_surface->texture_target;
             }
-            glBindTexture(src_surface->texture_target, src_surface->texture_name);
-            checkGLcall("glBindTexture(src_surface->texture_target, src_surface->texture_name)");
+            context_bind_texture(context, src_surface->texture_target, src_surface->texture_name);
         }
 
         glBegin(GL_QUADS);
@@ -5311,7 +5299,7 @@ static void surface_blt_to_drawable(struct wined3d_device *device,
         checkGLcall("glDisable(GL_ALPHA_TEST)");
     }
 
-    draw_textured_quad(src_surface, &src_rect, &dst_rect, filter);
+    draw_textured_quad(src_surface, context, &src_rect, &dst_rect, filter);
 
     if (color_key)
     {
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index dfb2f77..2e72588 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -189,8 +189,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
             /* This means double binding the texture at creation, but keeps
              * the code simpler all in all, and the run-time path free from
              * additional checks. */
-            glBindTexture(target, gl_tex->name);
-            checkGLcall("glBindTexture");
+            context_bind_texture(context, target, gl_tex->name);
             glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
             checkGLcall("glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE)");
         }
@@ -202,8 +201,7 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
 
     if (gl_tex->name)
     {
-        glBindTexture(target, gl_tex->name);
-        checkGLcall("glBindTexture");
+        context_bind_texture(context, target, gl_tex->name);
         if (new_texture)
         {
             /* For a new texture we have to set the texture levels after
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 19ee56c..0fe5712 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1089,6 +1089,7 @@ struct wined3d_context
     UINT                    blit_w, blit_h;
     enum fogsource          fog_source;
     DWORD active_texture;
+    DWORD texture_type[MAX_COMBINED_SAMPLERS];
 
     char                    *vshader_const_dirty, *pshader_const_dirty;
 
@@ -1237,6 +1238,7 @@ void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target
         struct wined3d_surface *render_target, struct wined3d_surface *depth_stencil, DWORD location) DECLSPEC_HIDDEN;
 void context_active_texture(struct wined3d_context *context, const struct wined3d_gl_info *gl_info,
         unsigned int unit) DECLSPEC_HIDDEN;
+void context_bind_texture(struct wined3d_context *context, GLenum target, GLuint name) DECLSPEC_HIDDEN;
 void context_check_fbo_status(const struct wined3d_context *context, GLenum target) DECLSPEC_HIDDEN;
 struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, struct wined3d_surface *target,
         const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
@@ -2098,8 +2100,8 @@ void get_drawable_size_swapchain(const struct wined3d_context *context, UINT *wi
 void get_drawable_size_backbuffer(const struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
 void get_drawable_size_fbo(const struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
 
-void draw_textured_quad(const struct wined3d_surface *src_surface, const RECT *src_rect,
-        const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN;
+void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context,
+        const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN;
 void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN;
 
 /* Surface flags: */
-- 
1.7.3.4




More information about the wine-patches mailing list