[PATCH 4/6] wined3d: Store the power-of-two dimensions in the texture.

Henri Verbeet hverbeet at codeweavers.com
Wed Apr 13 12:09:54 CDT 2016


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/surface.c         | 21 ++-------------------
 dlls/wined3d/texture.c         | 18 +++++++++++-------
 dlls/wined3d/wined3d_private.h | 14 ++++++++++++++
 3 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index cbaa14f..de82dda 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4501,25 +4501,6 @@ HRESULT wined3d_surface_init(struct wined3d_surface *surface, struct wined3d_tex
     unsigned int resource_size;
     HRESULT hr;
 
-    if (container->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
-    {
-        unsigned int pow2_width = 1, pow2_height = 1;
-
-        /* Find the nearest pow2 match. */
-        while (pow2_width < desc->width)
-            pow2_width <<= 1;
-        while (pow2_height < desc->height)
-            pow2_height <<= 1;
-
-        surface->pow2Width = pow2_width;
-        surface->pow2Height = pow2_height;
-    }
-    else
-    {
-        surface->pow2Width = desc->width;
-        surface->pow2Height = desc->height;
-    }
-
     /* Quick lockable sanity check.
      * TODO: remove this after surfaces, usage and lockability have been debugged properly
      * this function is too deep to need to care about things like this.
@@ -4564,6 +4545,8 @@ HRESULT wined3d_surface_init(struct wined3d_surface *surface, struct wined3d_tex
     }
 
     surface->container = container;
+    surface->pow2Width = wined3d_texture_get_level_pow2_width(container, level);
+    surface->pow2Height = wined3d_texture_get_level_pow2_height(container, level);
     surface->texture_target = target;
     surface->texture_level = level;
     surface->texture_layer = layer;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index e1d60cb..2ca94c0 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -899,18 +899,20 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
             && !gl_info->supported[ARB_TEXTURE_RECTANGLE] && !gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT])
     {
         texture->flags |= WINED3D_TEXTURE_COND_NP2_EMULATED;
-        surface->pow2Width = surface->pow2Height = 1;
-        while (surface->pow2Width < width)
-            surface->pow2Width <<= 1;
-        while (surface->pow2Height < height)
-            surface->pow2Height <<= 1;
+        texture->pow2_width = texture->pow2_height = 1;
+        while (texture->pow2_width < width)
+            texture->pow2_width <<= 1;
+        while (texture->pow2_height < height)
+            texture->pow2_height <<= 1;
     }
     else
     {
         texture->flags &= ~WINED3D_TEXTURE_COND_NP2_EMULATED;
-        surface->pow2Width = width;
-        surface->pow2Height = height;
+        texture->pow2_width = width;
+        texture->pow2_height = height;
     }
+    surface->pow2Width = texture->pow2_width;
+    surface->pow2Height = texture->pow2_height;
 
     sub_resource->locations = 0;
 
@@ -1556,6 +1558,8 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
             texture->flags |= WINED3D_TEXTURE_COND_NP2_EMULATED;
         }
     }
+    texture->pow2_width = pow2_width;
+    texture->pow2_height = pow2_height;
 
     if ((pow2_width > gl_info->limits.texture_size || pow2_height > gl_info->limits.texture_size)
             && (desc->usage & WINED3DUSAGE_TEXTURE))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 967f39e..d74f143 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2449,6 +2449,8 @@ struct wined3d_texture
     const struct wined3d_texture_ops *texture_ops;
     struct gl_texture texture_rgb, texture_srgb;
     struct wined3d_swapchain *swapchain;
+    unsigned int pow2_width;
+    unsigned int pow2_height;
     UINT layer_count;
     UINT level_count;
     unsigned int download_count;
@@ -2521,6 +2523,18 @@ static inline unsigned int wined3d_texture_get_level_depth(const struct wined3d_
     return max(1, texture->resource.depth >> level);
 }
 
+static inline unsigned int wined3d_texture_get_level_pow2_width(const struct wined3d_texture *texture,
+        unsigned int level)
+{
+    return max(1, texture->pow2_width >> level);
+}
+
+static inline unsigned int wined3d_texture_get_level_pow2_height(const struct wined3d_texture *texture,
+        unsigned int level)
+{
+    return max(1, texture->pow2_height >> level);
+}
+
 void wined3d_texture_apply_sampler_desc(struct wined3d_texture *texture,
         const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context) DECLSPEC_HIDDEN;
 void wined3d_texture_bind(struct wined3d_texture *texture,
-- 
2.1.4




More information about the wine-patches mailing list