[PATCH 5/5] wined3d: Separate volume allocation and loading

Stefan Dösinger stefan at codeweavers.com
Tue Aug 20 05:07:59 CDT 2013


---
 dlls/wined3d/volume.c          | 30 ++++++++++++++++++++++++++----
 dlls/wined3d/wined3d_private.h |  3 ++-
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 613a17c..24d8667 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -78,7 +78,20 @@ void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture
 }
 
 /* Context activation is done by the caller. */
-void wined3d_volume_load(const struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode)
+static void wined3d_volume_allocate_texture(const struct wined3d_volume *volume,
+        const struct wined3d_context *context)
+{
+    const struct wined3d_gl_info *gl_info = context->gl_info;
+    const struct wined3d_format *format = volume->resource.format;
+
+    GL_EXTCALL(glTexImage3DEXT(GL_TEXTURE_3D, volume->texture_level, format->glInternal,
+            volume->resource.width, volume->resource.height, volume->resource.depth,
+            0, format->glFormat, format->glType, NULL));
+    checkGLcall("glTexImage3D");
+}
+
+/* Context activation is done by the caller. */
+void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode)
 {
     const struct wined3d_gl_info *gl_info = context->gl_info;
     const struct wined3d_format *format = volume->resource.format;
@@ -89,19 +102,28 @@ void wined3d_volume_load(const struct wined3d_volume *volume, struct wined3d_con
 
     volume_bind_and_dirtify(volume, context);
 
-    GL_EXTCALL(glTexImage3DEXT(GL_TEXTURE_3D, volume->texture_level, format->glInternal,
+    if (!(volume->flags & WINED3D_VFLAG_ALLOCATED))
+    {
+        wined3d_volume_allocate_texture(volume, context);
+        volume->flags |= WINED3D_VFLAG_ALLOCATED;
+    }
+
+    GL_EXTCALL(glTexSubImage3DEXT(GL_TEXTURE_3D, volume->texture_level, 0, 0, 0,
             volume->resource.width, volume->resource.height, volume->resource.depth,
-            0, format->glFormat, format->glType, volume->resource.allocatedMemory));
-    checkGLcall("glTexImage3D");
+            format->glFormat, format->glType, volume->resource.allocatedMemory));
+    checkGLcall("glTexSubImage3D");
 }
 
 /* Do not call while under the GL lock. */
 static void volume_unload(struct wined3d_resource *resource)
 {
+    struct wined3d_volume *volume = volume_from_resource(resource);
+
     TRACE("texture %p.\n", resource);
 
     /* The whole content is shadowed on This->resource.allocatedMemory, and
      * the texture name is managed by the VolumeTexture container. */
+    volume->flags &= ~WINED3D_VFLAG_ALLOCATED;
 
     resource_unload(resource);
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7f28c42..c4a798f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2051,6 +2051,7 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
 void wined3d_texture_set_dirty(struct wined3d_texture *texture, BOOL dirty) DECLSPEC_HIDDEN;
 
 #define WINED3D_VFLAG_LOCKED            0x00000001
+#define WINED3D_VFLAG_ALLOCATED         0x00000002
 
 struct wined3d_volume
 {
@@ -2070,7 +2071,7 @@ static inline struct wined3d_volume *volume_from_resource(struct wined3d_resourc
 }
 
 void volume_add_dirty_box(struct wined3d_volume *volume, const struct wined3d_box *dirty_box) DECLSPEC_HIDDEN;
-void wined3d_volume_load(const struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode) DECLSPEC_HIDDEN;
+void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode) DECLSPEC_HIDDEN;
 void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture *container) DECLSPEC_HIDDEN;
 
 struct wined3d_surface_dib
-- 
1.8.1.5




More information about the wine-patches mailing list