[PATCH 4/4] wined3d: Remove IWineD3DBaseTexture::BindTexture() from the public interface.

Henri Verbeet hverbeet at codeweavers.com
Tue Jan 4 10:42:03 CST 2011


---
 dlls/wined3d/basetexture.c     |    7 +-
 dlls/wined3d/cubetexture.c     |   75 ++++++++++++----------
 dlls/wined3d/device.c          |    4 +-
 dlls/wined3d/state.c           |    2 +-
 dlls/wined3d/surface.c         |    8 ++-
 dlls/wined3d/texture.c         |  135 +++++++++++++++++++++-------------------
 dlls/wined3d/volume.c          |    3 +-
 dlls/wined3d/volumetexture.c   |   37 ++++++-----
 dlls/wined3d/wined3d_private.h |   14 +++-
 include/wine/wined3d.idl       |    3 -
 10 files changed, 155 insertions(+), 133 deletions(-)

diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c
index 1005e87..26beb29 100644
--- a/dlls/wined3d/basetexture.c
+++ b/dlls/wined3d/basetexture.c
@@ -27,9 +27,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
 
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
-        WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, DWORD usage,
-        const struct wined3d_format *format, WINED3DPOOL pool, void *parent,
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, const struct wined3d_texture_ops *texture_ops,
+        UINT layer_count, UINT level_count, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device,
+        DWORD usage, const struct wined3d_format *format, WINED3DPOOL pool, void *parent,
         const struct wined3d_parent_ops *parent_ops)
 {
     HRESULT hr;
@@ -42,6 +42,7 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UIN
         return hr;
     }
 
+    texture->baseTexture.texture_ops = texture_ops;
     texture->baseTexture.sub_resources = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
             level_count * layer_count * sizeof(*texture->baseTexture.sub_resources));
     if (!texture->baseTexture.sub_resources)
diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c
index f4b438e..94b414c 100644
--- a/dlls/wined3d/cubetexture.c
+++ b/dlls/wined3d/cubetexture.c
@@ -27,8 +27,36 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
 
+/* Context activation is done by the caller. */
+static HRESULT cubetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb)
+{
+    BOOL set_gl_texture_desc;
+    HRESULT hr;
+
+    TRACE("texture %p, srgb %#x.\n", texture, srgb);
+
+    hr = basetexture_bind(texture, srgb, &set_gl_texture_desc);
+    if (set_gl_texture_desc && SUCCEEDED(hr))
+    {
+        UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count;
+        UINT i;
+
+        for (i = 0; i < sub_count; ++i)
+        {
+            IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[i];
+
+            if (texture->baseTexture.is_srgb)
+                surface_set_texture_name(surface, texture->baseTexture.texture_srgb.name, TRUE);
+            else
+                surface_set_texture_name(surface, texture->baseTexture.texture_rgb.name, FALSE);
+        }
+    }
+
+    return hr;
+}
+
 /* Do not call while under the GL lock. */
-static void cubetexture_internal_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
+static void cubetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
 {
     UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count;
     IWineD3DDeviceImpl *device = texture->resource.device;
@@ -46,7 +74,7 @@ static void cubetexture_internal_preload(IWineD3DBaseTextureImpl *texture, enum
             break;
 
         case SRGB_BOTH:
-            cubetexture_internal_preload(texture, SRGB_RGB);
+            cubetexture_preload(texture, SRGB_RGB);
             /* Fallthrough */
 
         case SRGB_SRGB:
@@ -108,6 +136,12 @@ static void cubetexture_internal_preload(IWineD3DBaseTextureImpl *texture, enum
     if (context) context_release(context);
 }
 
+static const struct wined3d_texture_ops cubetexture_ops =
+{
+    cubetexture_bind,
+    cubetexture_preload,
+};
+
 static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This)
 {
     UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
@@ -203,7 +237,7 @@ static DWORD WINAPI IWineD3DCubeTextureImpl_GetPriority(IWineD3DCubeTexture *ifa
 /* Do not call while under the GL lock. */
 static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface)
 {
-    cubetexture_internal_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
+    cubetexture_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
 }
 
 /* Do not call while under the GL lock. */
@@ -274,34 +308,6 @@ static void WINAPI IWineD3DCubeTextureImpl_GenerateMipSubLevels(IWineD3DCubeText
     basetexture_generate_mipmaps((IWineD3DBaseTextureImpl *)iface);
 }
 
-/* Context activation is done by the caller. */
-static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *iface, BOOL srgb) {
-    IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
-    BOOL set_gl_texture_desc;
-    HRESULT hr;
-
-    TRACE("(%p) : relay to BaseTexture\n", This);
-
-    hr = basetexture_bind((IWineD3DBaseTextureImpl *)iface, srgb, &set_gl_texture_desc);
-    if (set_gl_texture_desc && SUCCEEDED(hr))
-    {
-        UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
-        UINT i;
-
-        for (i = 0; i < sub_count; ++i)
-        {
-            IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
-
-            if (This->baseTexture.is_srgb)
-                surface_set_texture_name(surface, This->baseTexture.texture_srgb.name, TRUE);
-            else
-                surface_set_texture_name(surface, This->baseTexture.texture_rgb.name, FALSE);
-        }
-    }
-
-    return hr;
-}
-
 static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface)
 {
     TRACE("iface %p.\n", iface);
@@ -433,7 +439,6 @@ static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl =
     IWineD3DCubeTextureImpl_SetAutoGenFilterType,
     IWineD3DCubeTextureImpl_GetAutoGenFilterType,
     IWineD3DCubeTextureImpl_GenerateMipSubLevels,
-    IWineD3DCubeTextureImpl_BindTexture,
     IWineD3DCubeTextureImpl_IsCondNP2,
     /* IWineD3DCubeTexture */
     IWineD3DCubeTextureImpl_GetLevelDesc,
@@ -493,8 +498,9 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
 
     texture->lpVtbl = &IWineD3DCubeTexture_Vtbl;
 
-    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 6, levels,
-            WINED3DRTYPE_CUBETEXTURE, device, usage, format, pool, parent, parent_ops);
+    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, &cubetexture_ops,
+            6, levels, WINED3DRTYPE_CUBETEXTURE, device, usage, format, pool,
+            parent, parent_ops);
     if (FAILED(hr))
     {
         WARN("Failed to initialize basetexture, returning %#x\n", hr);
@@ -559,7 +565,6 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
         }
         tmp_w = max(1, tmp_w >> 1);
     }
-    texture->baseTexture.internal_preload = cubetexture_internal_preload;
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index f470d45..45b64d7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -460,7 +460,7 @@ static void device_preload_texture(const struct wined3d_state *state, unsigned i
 
     if (!(texture = state->textures[idx])) return;
     srgb = state->sampler_states[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
-    texture->baseTexture.internal_preload(texture, srgb);
+    texture->baseTexture.texture_ops->texture_preload(texture, srgb);
 }
 
 void device_preload_textures(IWineD3DDeviceImpl *device)
@@ -5062,7 +5062,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateTexture(IWineD3DDevice *iface,
     }
 
     /* Make sure that the destination texture is loaded. */
-    ((IWineD3DBaseTextureImpl *)dst_texture)->baseTexture.internal_preload(
+    ((IWineD3DBaseTextureImpl *)dst_texture)->baseTexture.texture_ops->texture_preload(
             (IWineD3DBaseTextureImpl *)dst_texture, SRGB_RGB);
 
     /* Update every surface level of the texture. */
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 0df1597..843541f 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3646,7 +3646,7 @@ static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct w
         IWineD3DBaseTextureImpl *texture = state->textures[sampler];
         BOOL srgb = state->sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE];
 
-        IWineD3DBaseTexture_BindTexture((IWineD3DBaseTexture *)texture, srgb);
+        texture->baseTexture.texture_ops->texture_bind(texture, srgb);
         basetexture_apply_state_changes(texture,
                 state->sampler_states[sampler], gl_info);
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 96b897a..29d98ee 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1072,7 +1072,7 @@ void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srg
         IWineD3DBaseTextureImpl *texture = surface->container.u.texture;
 
         TRACE("Passing to container (%p).\n", texture);
-        texture->baseTexture.internal_preload(texture, srgb);
+        texture->baseTexture.texture_ops->texture_preload(texture, srgb);
     }
     else
     {
@@ -2503,8 +2503,10 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
 
     if (This->container.type == WINED3D_CONTAINER_TEXTURE)
     {
-        TRACE("Passing to container.\n");
-        IWineD3DBaseTexture_BindTexture((IWineD3DBaseTexture *)This->container.u.texture, srgb);
+        IWineD3DBaseTextureImpl *texture = This->container.u.texture;
+
+        TRACE("Passing to container (%p).\n", texture);
+        texture->baseTexture.texture_ops->texture_bind(texture, srgb);
     }
     else
     {
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 083d389..1722b3b 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -27,8 +27,66 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
 
+/* Context activation is done by the caller. */
+static HRESULT texture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb)
+{
+    BOOL set_gl_texture_desc;
+    HRESULT hr;
+
+    TRACE("texture %p, srgb %#x.\n", texture, srgb);
+
+    hr = basetexture_bind(texture, srgb, &set_gl_texture_desc);
+    if (set_gl_texture_desc && SUCCEEDED(hr))
+    {
+        UINT i;
+        struct gl_texture *gl_tex;
+
+        if (texture->baseTexture.is_srgb)
+            gl_tex = &texture->baseTexture.texture_srgb;
+        else
+            gl_tex = &texture->baseTexture.texture_rgb;
+
+        for (i = 0; i < texture->baseTexture.level_count; ++i)
+        {
+            IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[i];
+            surface_set_texture_name(surface, gl_tex->name, texture->baseTexture.is_srgb);
+        }
+
+        /* Conditinal non power of two textures use a different clamping
+         * default. If we're using the GL_WINE_normalized_texrect partial
+         * driver emulation, we're dealing with a GL_TEXTURE_2D texture which
+         * has the address mode set to repeat - something that prevents us
+         * from hitting the accelerated codepath. Thus manually set the GL
+         * 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 (IWineD3DBaseTexture_IsCondNP2((IWineD3DBaseTexture *)texture))
+        {
+            GLenum target = texture->baseTexture.target;
+
+            ENTER_GL();
+            glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)");
+            glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)");
+            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+            checkGLcall("glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)");
+            glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+            checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
+            LEAVE_GL();
+            gl_tex->states[WINED3DTEXSTA_ADDRESSU]      = WINED3DTADDRESS_CLAMP;
+            gl_tex->states[WINED3DTEXSTA_ADDRESSV]      = WINED3DTADDRESS_CLAMP;
+            gl_tex->states[WINED3DTEXSTA_MAGFILTER]     = WINED3DTEXF_POINT;
+            gl_tex->states[WINED3DTEXSTA_MINFILTER]     = WINED3DTEXF_POINT;
+            gl_tex->states[WINED3DTEXSTA_MIPFILTER]     = WINED3DTEXF_NONE;
+        }
+    }
+
+    return hr;
+}
+
 /* Do not call while under the GL lock. */
-static void texture_internal_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
+static void texture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
 {
     IWineD3DDeviceImpl *device = texture->resource.device;
     struct wined3d_context *context = NULL;
@@ -45,7 +103,7 @@ static void texture_internal_preload(IWineD3DBaseTextureImpl *texture, enum WINE
             break;
 
         case SRGB_BOTH:
-            texture_internal_preload(texture, SRGB_RGB);
+            texture_preload(texture, SRGB_RGB);
             /* Fallthrough */
 
         case SRGB_SRGB:
@@ -102,6 +160,12 @@ static void texture_internal_preload(IWineD3DBaseTextureImpl *texture, enum WINE
     *dirty = FALSE;
 }
 
+static const struct wined3d_texture_ops texture_ops =
+{
+    texture_bind,
+    texture_preload,
+};
+
 static void texture_cleanup(IWineD3DTextureImpl *This)
 {
     unsigned int i;
@@ -198,7 +262,7 @@ static DWORD WINAPI IWineD3DTextureImpl_GetPriority(IWineD3DTexture *iface) {
 /* Do not call while under the GL lock. */
 static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface)
 {
-    texture_internal_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
+    texture_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
 }
 
 /* Do not call while under the GL lock. */
@@ -265,64 +329,6 @@ static void WINAPI IWineD3DTextureImpl_GenerateMipSubLevels(IWineD3DTexture *ifa
     basetexture_generate_mipmaps((IWineD3DBaseTextureImpl *)iface);
 }
 
-/* Context activation is done by the caller. */
-static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BOOL srgb) {
-    IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
-    BOOL set_gl_texture_desc;
-    HRESULT hr;
-
-    TRACE("(%p) : relay to BaseTexture\n", This);
-
-    hr = basetexture_bind((IWineD3DBaseTextureImpl *)iface, srgb, &set_gl_texture_desc);
-    if (set_gl_texture_desc && SUCCEEDED(hr)) {
-        UINT i;
-        struct gl_texture *gl_tex;
-
-        if(This->baseTexture.is_srgb) {
-            gl_tex = &This->baseTexture.texture_srgb;
-        } else {
-            gl_tex = &This->baseTexture.texture_rgb;
-        }
-
-        for (i = 0; i < This->baseTexture.level_count; ++i)
-        {
-            IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
-            surface_set_texture_name(surface, gl_tex->name, This->baseTexture.is_srgb);
-        }
-
-        /* Conditinal non power of two textures use a different clamping
-         * default. If we're using the GL_WINE_normalized_texrect partial
-         * driver emulation, we're dealing with a GL_TEXTURE_2D texture which
-         * has the address mode set to repeat - something that prevents us
-         * from hitting the accelerated codepath. Thus manually set the GL
-         * 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 (IWineD3DBaseTexture_IsCondNP2(iface))
-        {
-            GLenum target = This->baseTexture.target;
-
-            ENTER_GL();
-            glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)");
-            glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)");
-            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)");
-            glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-            checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
-            LEAVE_GL();
-            gl_tex->states[WINED3DTEXSTA_ADDRESSU]      = WINED3DTADDRESS_CLAMP;
-            gl_tex->states[WINED3DTEXSTA_ADDRESSV]      = WINED3DTADDRESS_CLAMP;
-            gl_tex->states[WINED3DTEXSTA_MAGFILTER]     = WINED3DTEXF_POINT;
-            gl_tex->states[WINED3DTEXSTA_MINFILTER]     = WINED3DTEXF_POINT;
-            gl_tex->states[WINED3DTEXSTA_MIPFILTER]     = WINED3DTEXF_NONE;
-        }
-    }
-
-    return hr;
-}
-
 static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) {
     IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
     TRACE("(%p)\n", This);
@@ -448,7 +454,6 @@ static const IWineD3DTextureVtbl IWineD3DTexture_Vtbl =
     IWineD3DTextureImpl_SetAutoGenFilterType,
     IWineD3DTextureImpl_GetAutoGenFilterType,
     IWineD3DTextureImpl_GenerateMipSubLevels,
-    IWineD3DTextureImpl_BindTexture,
     IWineD3DTextureImpl_IsCondNP2,
     /* IWineD3DTexture */
     IWineD3DTextureImpl_GetLevelDesc,
@@ -526,8 +531,9 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
 
     texture->lpVtbl = &IWineD3DTexture_Vtbl;
 
-    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
-            WINED3DRTYPE_TEXTURE, device, usage, format, pool, parent, parent_ops);
+    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, &texture_ops,
+            1, levels, WINED3DRTYPE_TEXTURE, device, usage, format, pool,
+            parent, parent_ops);
     if (FAILED(hr))
     {
         WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -616,7 +622,6 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
         tmp_w = max(1, tmp_w >> 1);
         tmp_h = max(1, tmp_h >> 1);
     }
-    texture->baseTexture.internal_preload = texture_internal_preload;
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 719fddc..48e2c7b 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -30,6 +30,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
 static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
     IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
     const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
+    IWineD3DBaseTextureImpl *container = (IWineD3DBaseTextureImpl *)This->container;
     DWORD active_sampler;
 
     /* We don't need a specific texture unit, but after binding the texture the current unit is dirty.
@@ -59,7 +60,7 @@ static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
         IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_SAMPLER(active_sampler));
     }
 
-    IWineD3DVolumeTexture_BindTexture((IWineD3DVolumeTexture *)This->container, FALSE);
+    container->baseTexture.texture_ops->texture_bind(container, FALSE);
 }
 
 void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box)
diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c
index 03410dc..a47801e 100644
--- a/dlls/wined3d/volumetexture.c
+++ b/dlls/wined3d/volumetexture.c
@@ -26,8 +26,18 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
 
+/* Context activation is done by the caller. */
+static HRESULT volumetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb)
+{
+    BOOL dummy;
+
+    TRACE("texture %p, srgb %#x.\n", texture, srgb);
+
+    return basetexture_bind(texture, srgb, &dummy);
+}
+
 /* Do not call while under the GL lock. */
-static void volumetexture_internal_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
+static void volumetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb)
 {
     IWineD3DDeviceImpl *device = texture->resource.device;
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
@@ -76,6 +86,12 @@ static void volumetexture_internal_preload(IWineD3DBaseTextureImpl *texture, enu
     texture->baseTexture.texture_rgb.dirty = FALSE;
 }
 
+const struct wined3d_texture_ops volumetexture_ops =
+{
+    volumetexture_bind,
+    volumetexture_preload,
+};
+
 static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This)
 {
     unsigned int i;
@@ -165,7 +181,7 @@ static DWORD WINAPI IWineD3DVolumeTextureImpl_GetPriority(IWineD3DVolumeTexture
 
 static void WINAPI IWineD3DVolumeTextureImpl_PreLoad(IWineD3DVolumeTexture *iface)
 {
-    volumetexture_internal_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
+    volumetexture_preload((IWineD3DBaseTextureImpl *)iface, SRGB_ANY);
 }
 
 /* Do not call while under the GL lock. */
@@ -229,16 +245,6 @@ static void WINAPI IWineD3DVolumeTextureImpl_GenerateMipSubLevels(IWineD3DVolume
     basetexture_generate_mipmaps((IWineD3DBaseTextureImpl *)iface);
 }
 
-/* Context activation is done by the caller. */
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_BindTexture(IWineD3DVolumeTexture *iface, BOOL srgb)
-{
-    BOOL dummy;
-
-    TRACE("iface %p, srgb %#x.\n", iface, srgb);
-
-    return basetexture_bind((IWineD3DBaseTextureImpl *)iface, srgb, &dummy);
-}
-
 static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *iface)
 {
     TRACE("iface %p.\n", iface);
@@ -365,7 +371,6 @@ static const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl =
     IWineD3DVolumeTextureImpl_GetAutoGenFilterType,
     IWineD3DVolumeTextureImpl_GenerateMipSubLevels,
     /* not in d3d */
-    IWineD3DVolumeTextureImpl_BindTexture,
     IWineD3DVolumeTextureImpl_IsCondNP2,
     /* volume texture */
     IWineD3DVolumeTextureImpl_GetLevelDesc,
@@ -424,8 +429,9 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
 
     texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl;
 
-    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
-            WINED3DRTYPE_VOLUMETEXTURE, device, usage, format, pool, parent, parent_ops);
+    hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, &volumetexture_ops,
+            1, levels, WINED3DRTYPE_VOLUMETEXTURE, device, usage, format, pool,
+            parent, parent_ops);
     if (FAILED(hr))
     {
         WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -467,7 +473,6 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
         tmp_h = max(1, tmp_h >> 1);
         tmp_d = max(1, tmp_d >> 1);
     }
-    texture->baseTexture.internal_preload = volumetexture_internal_preload;
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index aa43df6..7562101 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1879,11 +1879,18 @@ struct gl_texture
     GLuint                  name;
 };
 
+struct wined3d_texture_ops
+{
+    HRESULT (*texture_bind)(struct IWineD3DBaseTextureImpl *texture, BOOL srgb);
+    void (*texture_preload)(struct IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb);
+};
+
 /*****************************************************************************
  * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl)
  */
 typedef struct IWineD3DBaseTextureClass
 {
+    const struct wined3d_texture_ops *texture_ops;
     struct gl_texture       texture_rgb, texture_srgb;
     IWineD3DResourceImpl **sub_resources;
     UINT layer_count;
@@ -1898,7 +1905,6 @@ typedef struct IWineD3DBaseTextureClass
     const struct min_lookup *minMipLookup;
     const GLenum            *magLookup;
     GLenum target;
-    void                    (*internal_preload)(struct IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb);
 } IWineD3DBaseTextureClass;
 
 typedef struct IWineD3DBaseTextureImpl
@@ -1921,9 +1927,9 @@ DWORD basetexture_get_level_count(IWineD3DBaseTextureImpl *texture) DECLSPEC_HID
 DWORD basetexture_get_lod(IWineD3DBaseTextureImpl *texture) DECLSPEC_HIDDEN;
 IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *texture,
         UINT sub_resource_idx) DECLSPEC_HIDDEN;
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
-        WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, DWORD usage,
-        const struct wined3d_format *format, WINED3DPOOL pool, void *parent,
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, const struct wined3d_texture_ops *texture_ops,
+        UINT layer_count, UINT level_count, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device,
+        DWORD usage, const struct wined3d_format *format, WINED3DPOOL pool, void *parent,
         const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
 HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTextureImpl *texture,
         WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index 45e4143..3fea495 100644
--- a/include/wine/wined3d.idl
+++ b/include/wine/wined3d.idl
@@ -2525,9 +2525,6 @@ interface IWineD3DBaseTexture : IWineD3DResource
     );
     void GenerateMipSubLevels(
     );
-    HRESULT BindTexture(
-        [in] BOOL srgb
-    );
     BOOL IsCondNP2(
     );
 }
-- 
1.7.2.2




More information about the wine-patches mailing list