[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