[PATCH 7/7] wined3d: Use immutable storage for 3D textures.

Józef Kucia jkucia at codeweavers.com
Wed May 25 17:08:28 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/texture.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 26ddda7..bdb8807 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2072,24 +2072,35 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in
 
 static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
 {
-    unsigned int sub_count = texture->level_count * texture->layer_count;
     const struct wined3d_format *format = texture->resource.format;
+    GLenum internal = srgb ? format->glGammaInternal : format->glInternal;
+    unsigned int sub_count = texture->level_count * texture->layer_count;
     const struct wined3d_gl_info *gl_info = context->gl_info;
     unsigned int i;
 
     wined3d_texture_bind_and_dirtify(texture, context, srgb);
 
-    for (i = 0; i < sub_count; ++i)
+    if (wined3d_texture_use_immutable_storage(texture, gl_info))
     {
-        struct wined3d_volume *volume = texture->sub_resources[i].u.volume;
+        GL_EXTCALL(glTexStorage3D(GL_TEXTURE_3D, texture->level_count, internal,
+                wined3d_texture_get_level_width(texture, 0),
+                wined3d_texture_get_level_height(texture, 0),
+                wined3d_texture_get_level_depth(texture, 0)));
+        checkGLcall("glTexStorage3D");
+    }
+    else
+    {
+        for (i = 0; i < sub_count; ++i)
+        {
+            struct wined3d_volume *volume = texture->sub_resources[i].u.volume;
 
-        GL_EXTCALL(glTexImage3D(GL_TEXTURE_3D, volume->texture_level,
-                srgb ? format->glGammaInternal : format->glInternal,
-                wined3d_texture_get_level_width(texture, volume->texture_level),
-                wined3d_texture_get_level_height(texture, volume->texture_level),
-                wined3d_texture_get_level_depth(texture, volume->texture_level),
-                0, format->glFormat, format->glType, NULL));
-        checkGLcall("glTexImage3D");
+            GL_EXTCALL(glTexImage3D(GL_TEXTURE_3D, volume->texture_level, internal,
+                    wined3d_texture_get_level_width(texture, volume->texture_level),
+                    wined3d_texture_get_level_height(texture, volume->texture_level),
+                    wined3d_texture_get_level_depth(texture, volume->texture_level),
+                    0, format->glFormat, format->glType, NULL));
+            checkGLcall("glTexImage3D");
+        }
     }
 }
 
-- 
2.7.3




More information about the wine-patches mailing list