[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