[PATCH 4/5] wined3d: Get rid of the redundant texture_name and texture_name_srgb fields in struct wined3d_surface.

Henri Verbeet hverbeet at codeweavers.com
Wed Nov 20 03:04:32 CST 2013


---
 dlls/wined3d/context.c         |    6 ++---
 dlls/wined3d/surface.c         |   54 +++++++++----------------------------
 dlls/wined3d/swapchain.c       |    2 +-
 dlls/wined3d/texture.c         |   57 +++++++++++++---------------------------
 dlls/wined3d/wined3d_private.h |    5 +---
 5 files changed, 36 insertions(+), 88 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 07f81e5..9603d69 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -146,7 +146,7 @@ static void context_attach_depth_stencil_fbo(struct wined3d_context *context,
                     if (format_flags & WINED3DFMT_FLAG_DEPTH)
                     {
                         gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT,
-                                depth_stencil->texture_target, depth_stencil->texture_name,
+                                depth_stencil->texture_target, depth_stencil->container->texture_rgb.name,
                                 depth_stencil->texture_level);
                         checkGLcall("glFramebufferTexture2D()");
                     }
@@ -154,7 +154,7 @@ static void context_attach_depth_stencil_fbo(struct wined3d_context *context,
                     if (format_flags & WINED3DFMT_FLAG_STENCIL)
                     {
                         gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT,
-                                depth_stencil->texture_target, depth_stencil->texture_name,
+                                depth_stencil->texture_target, depth_stencil->container->texture_rgb.name,
                                 depth_stencil->texture_level);
                         checkGLcall("glFramebufferTexture2D()");
                     }
@@ -2939,7 +2939,7 @@ static void context_setup_target(struct wined3d_context *context, struct wined3d
                 && old_render_offscreen && context->current_rt != target)
         {
             /* Read the back buffer of the old drawable into the destination texture. */
-            if (context->current_rt->texture_name_srgb)
+            if (context->current_rt->container->texture_srgb.name)
                 surface_internal_preload(context->current_rt, context, SRGB_SRGB);
             surface_internal_preload(context->current_rt, context, SRGB_RGB);
             surface_invalidate_location(context->current_rt, SFLAG_INDRAWABLE);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index c1714c1..1536908 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -42,9 +42,8 @@ static void surface_cleanup(struct wined3d_surface *surface)
 
     TRACE("surface %p.\n", surface);
 
-    if (surface->texture_name || (surface->flags & SFLAG_PBO)
-             || surface->rb_multisample || surface->rb_resolved
-             || !list_empty(&surface->renderbuffers))
+    if ((surface->flags & SFLAG_PBO) || surface->rb_multisample
+            || surface->rb_resolved || !list_empty(&surface->renderbuffers))
     {
         struct wined3d_renderbuffer_entry *entry, *entry2;
         const struct wined3d_gl_info *gl_info;
@@ -53,12 +52,6 @@ static void surface_cleanup(struct wined3d_surface *surface)
         context = context_acquire(surface->resource.device, NULL);
         gl_info = context->gl_info;
 
-        if (surface->texture_name)
-        {
-            TRACE("Deleting texture %u.\n", surface->texture_name);
-            gl_info->gl_ops.gl.p_glDeleteTextures(1, &surface->texture_name);
-        }
-
         if (surface->flags & SFLAG_PBO)
         {
             TRACE("Deleting PBO %u.\n", surface->pbo);
@@ -341,7 +334,7 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3
     gl_info->gl_ops.gl.p_glEnable(info.bind_target);
     checkGLcall("glEnable(bind_target)");
 
-    context_bind_texture(context, info.bind_target, src_surface->texture_name);
+    context_bind_texture(context, info.bind_target, texture->texture_rgb.name);
 
     /* Filtering for StretchRect */
     gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAG_FILTER,
@@ -644,13 +637,13 @@ static void surface_release_client_storage(struct wined3d_surface *surface)
     struct wined3d_context *context = context_acquire(surface->resource.device, NULL);
     const struct wined3d_gl_info *gl_info = context->gl_info;
 
-    if (surface->texture_name)
+    if (surface->container->texture_rgb.name)
     {
         surface_bind_and_dirtify(surface, context, FALSE);
         gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level,
                 GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
     }
-    if (surface->texture_name_srgb)
+    if (surface->container->texture_srgb.name)
     {
         surface_bind_and_dirtify(surface, context, TRUE);
         gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level,
@@ -671,7 +664,6 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface)
 
     TRACE("surface %p.\n", surface);
 
-    surface->texture_name = 0;
     surface->texture_target = GL_TEXTURE_2D;
 
     /* Non-power2 support */
@@ -1642,18 +1634,6 @@ static const struct wined3d_surface_ops gdi_surface_ops =
     gdi_surface_unmap,
 };
 
-void surface_set_texture_name(struct wined3d_surface *surface, GLuint name, BOOL srgb)
-{
-    TRACE("surface %p, name %u, srgb %#x.\n", surface, name, srgb);
-
-    if (srgb)
-        surface->texture_name_srgb = name;
-    else
-        surface->texture_name = name;
-
-    surface_force_reload(surface);
-}
-
 void surface_set_texture_target(struct wined3d_surface *surface, GLenum target, GLint level)
 {
     TRACE("surface %p, target %#x.\n", surface, target);
@@ -4251,14 +4231,6 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back)
     {
         GLuint tmp;
 
-        tmp = back->texture_name;
-        back->texture_name = front->texture_name;
-        front->texture_name = tmp;
-
-        tmp = back->texture_name_srgb;
-        back->texture_name_srgb = front->texture_name_srgb;
-        front->texture_name_srgb = tmp;
-
         tmp = back->rb_multisample;
         back->rb_multisample = front->rb_multisample;
         front->rb_multisample = tmp;
@@ -4306,7 +4278,7 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc
     surface_internal_preload(dst_surface, context, SRGB_RGB);
 
     /* Bind the target texture */
-    context_bind_texture(context, dst_surface->container->target, dst_surface->texture_name);
+    context_bind_texture(context, dst_surface->container->target, dst_surface->container->texture_rgb.name);
     if (surface_is_offscreen(src_surface))
     {
         TRACE("Reading from an offscreen target\n");
@@ -4415,7 +4387,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
 
     src_offscreen = surface_is_offscreen(src_surface);
     noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
-    if (!noBackBufferBackup && !src_surface->texture_name)
+    if (!noBackBufferBackup && !src_surface->container->texture_rgb.name)
     {
         /* Get it a description */
         surface_internal_preload(src_surface, context, SRGB_RGB);
@@ -4448,7 +4420,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
          * we are reading from the back buffer, the backup can be used as source texture
          */
         texture_target = src_surface->texture_target;
-        context_bind_texture(context, texture_target, src_surface->texture_name);
+        context_bind_texture(context, texture_target, src_surface->container->texture_rgb.name);
         gl_info->gl_ops.gl.p_glEnable(texture_target);
         checkGLcall("glEnable(texture_target)");
 
@@ -4492,7 +4464,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
 
     if (!src_surface->swapchain || src_surface == src_surface->swapchain->back_buffers[0])
     {
-        src = backup ? backup : src_surface->texture_name;
+        src = backup ? backup : src_surface->container->texture_rgb.name;
     }
     else
     {
@@ -4584,7 +4556,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 */
-    context_bind_texture(context, texture_target, dst_surface->texture_name);
+    context_bind_texture(context, texture_target, dst_surface->container->texture_rgb.name);
     gl_info->gl_ops.gl.p_glCopyTexSubImage2D(texture_target,
                         0,
                         dst_rect.left, dst_rect.top, /* xoffset, yoffset */
@@ -4613,7 +4585,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
                 gl_info->gl_ops.gl.p_glEnable(src_surface->texture_target);
                 texture_target = src_surface->texture_target;
             }
-            context_bind_texture(context, src_surface->texture_target, src_surface->texture_name);
+            context_bind_texture(context, src_surface->texture_target, src_surface->container->texture_rgb.name);
         }
 
         gl_info->gl_ops.gl.p_glBegin(GL_QUADS);
@@ -4639,7 +4611,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
     checkGLcall("glDisable(texture_target)");
 
     /* Cleanup */
-    if (src != src_surface->texture_name && src != backup)
+    if (src != src_surface->container->texture_rgb.name && src != backup)
     {
         gl_info->gl_ops.gl.p_glDeleteTextures(1, &src);
         checkGLcall("glDeleteTextures(1, &src)");
@@ -5174,7 +5146,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co
 
         context_apply_fbo_state_blit(context, GL_FRAMEBUFFER,
                 context->swapchain->front_buffer, NULL, SFLAG_INDRAWABLE);
-        surface_depth_blt(surface, context, surface->texture_name,
+        surface_depth_blt(surface, context, surface->container->texture_rgb.name,
                 0, surface->pow2Height - h, w, h, surface->texture_target);
         checkGLcall("depth_blt");
 
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 23c1c4d..c483961 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -352,7 +352,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
             gl_filter = GL_NEAREST;
 
         context_apply_fbo_state_blit(context2, GL_FRAMEBUFFER, swapchain->front_buffer, NULL, SFLAG_INDRAWABLE);
-        context_bind_texture(context2, backbuffer->texture_target, backbuffer->texture_name);
+        context_bind_texture(context2, backbuffer->texture_target, backbuffer->container->texture_rgb.name);
 
         /* Set up the texture. The surface is not in a wined3d_texture
          * container, so there are no D3D texture settings to dirtify. */
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index a6a9dbf..b7c2451 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -610,21 +610,12 @@ static HRESULT texture2d_bind(struct wined3d_texture *texture,
 
     TRACE("texture %p, context %p, srgb %#x.\n", texture, context, srgb);
 
-    hr = wined3d_texture_bind(texture, context, srgb, &set_gl_texture_desc);
-    if (set_gl_texture_desc && SUCCEEDED(hr))
+    if (SUCCEEDED(hr = wined3d_texture_bind(texture, context, srgb, &set_gl_texture_desc))
+            && set_gl_texture_desc && (texture->flags & WINED3D_TEXTURE_COND_NP2))
     {
-        UINT sub_count = texture->level_count * texture->layer_count;
-        BOOL srgb_tex = texture->flags & WINED3D_TEXTURE_IS_SRGB;
-        struct gl_texture *gl_tex;
-        UINT i;
-
-        gl_tex = wined3d_texture_get_gl_texture(texture, srgb_tex);
-
-        for (i = 0; i < sub_count; ++i)
-        {
-            struct wined3d_surface *surface = surface_from_resource(texture->sub_resources[i]);
-            surface_set_texture_name(surface, gl_tex->name, srgb_tex);
-        }
+        struct gl_texture *gl_tex = wined3d_texture_get_gl_texture(texture,
+                texture->flags & WINED3D_TEXTURE_IS_SRGB);
+        GLenum target = texture->target;
 
         /* Conditinal non power of two textures use a different clamping
          * default. If we're using the GL_WINE_normalized_texrect partial
@@ -634,24 +625,19 @@ static HRESULT texture2d_bind(struct wined3d_texture *texture,
          * state. The same applies to filtering. Even if the texture has only
          * one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW
          * fallback on macos. */
-        if (texture->flags & WINED3D_TEXTURE_COND_NP2)
-        {
-            GLenum target = texture->target;
-
-            gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)");
-            gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)");
-            gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)");
-            gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
-            gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3D_TADDRESS_CLAMP;
-            gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3D_TADDRESS_CLAMP;
-            gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3D_TEXF_POINT;
-            gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3D_TEXF_POINT;
-            gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3D_TEXF_NONE;
-        }
+        gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)");
+        gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)");
+        gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        checkGLcall("glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)");
+        gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
+        gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3D_TADDRESS_CLAMP;
+        gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3D_TADDRESS_CLAMP;
+        gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3D_TEXF_POINT;
+        gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3D_TEXF_POINT;
+        gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3D_TEXF_NONE;
     }
 
     return hr;
@@ -717,10 +703,6 @@ static void texture2d_sub_resource_cleanup(struct wined3d_resource *sub_resource
 {
     struct wined3d_surface *surface = surface_from_resource(sub_resource);
 
-    /* Clean out the texture name we gave to the surface so that the
-     * surface doesn't try and release it. */
-    surface_set_texture_name(surface, 0, TRUE);
-    surface_set_texture_name(surface, 0, FALSE);
     surface_set_texture_target(surface, 0, 0);
     surface_set_container(surface, NULL);
     wined3d_surface_decref(surface);
@@ -737,11 +719,8 @@ static void texture2d_unload(struct wined3d_resource *resource)
     for (i = 0; i < sub_count; ++i)
     {
         struct wined3d_resource *sub_resource = texture->sub_resources[i];
-        struct wined3d_surface *surface = surface_from_resource(sub_resource);
 
         sub_resource->resource_ops->resource_unload(sub_resource);
-        surface_set_texture_name(surface, 0, FALSE); /* Delete RGB name */
-        surface_set_texture_name(surface, 0, TRUE); /* Delete sRGB name */
     }
 
     wined3d_texture_unload(texture);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8e922fc..a220de9 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2198,8 +2198,6 @@ struct wined3d_surface
     GLuint                    pbo;
     GLuint rb_multisample;
     GLuint rb_resolved;
-    GLuint texture_name;
-    GLuint texture_name_srgb;
     GLint texture_level;
     GLenum texture_target;
 
@@ -2241,7 +2239,7 @@ static inline GLuint surface_get_texture_name(const struct wined3d_surface *surf
         const struct wined3d_gl_info *gl_info, BOOL srgb)
 {
     return srgb && !gl_info->supported[EXT_TEXTURE_SRGB_DECODE]
-            ? surface->texture_name_srgb : surface->texture_name;
+            ? surface->container->texture_srgb.name : surface->container->texture_rgb.name;
 }
 
 void surface_add_dirty_rect(struct wined3d_surface *surface, const struct wined3d_box *dirty_rect) DECLSPEC_HIDDEN;
@@ -2266,7 +2264,6 @@ void surface_set_compatible_renderbuffer(struct wined3d_surface *surface,
         const struct wined3d_surface *rt) DECLSPEC_HIDDEN;
 void surface_set_container(struct wined3d_surface *surface, struct wined3d_texture *container) DECLSPEC_HIDDEN;
 void surface_set_swapchain(struct wined3d_surface *surface, struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
-void surface_set_texture_name(struct wined3d_surface *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
 void surface_set_texture_target(struct wined3d_surface *surface, GLenum target, GLint level) DECLSPEC_HIDDEN;
 void surface_translate_drawable_coords(const struct wined3d_surface *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN;
 void surface_update_draw_binding(struct wined3d_surface *surface) DECLSPEC_HIDDEN;
-- 
1.7.10.4




More information about the wine-patches mailing list