From 0386b44bad2315919aec3e5943e4266b84468284 Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Fri, 26 Aug 2011 01:12:26 +0200 Subject: [PATCH] wined3d: Keep track of the current texture type for each texture unit. --- 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 da4b9448376..43789c66108 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 af116182beb..2bef879695f 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 ab9f657e878..6b1a48a19ba 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 b3d1205467f..b777432e9b9 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 821ef9dfeb7..ed047f2b879 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 dfb2f773444..2e725881434 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 19ee56c9448..0fe57127af3 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: */