diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index e5bbb91aaa6..e451a67f488 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -2797,7 +2797,7 @@ static void context_preload_texture(struct wined3d_context *context, return; srgb = state->sampler_states[idx][WINED3D_SAMP_SRGB_TEXTURE] ? SRGB_SRGB : SRGB_RGB; - texture->texture_ops->texture_preload(texture, context, srgb); + wined3d_texture_load(texture, context, srgb); } /* Context activation is done by the caller. */ diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f28ce27c7d1..ed5e61c6a35 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3402,7 +3402,7 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, /* Make sure that the destination texture is loaded. */ context = context_acquire(device, NULL); - dst_texture->texture_ops->texture_preload(dst_texture, context, SRGB_RGB); + wined3d_texture_load(dst_texture, context, SRGB_RGB); context_release(context); /* Update every surface level of the texture. */ diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 1523d5c6101..d3a0b132ea5 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -3455,7 +3455,7 @@ void surface_internal_preload(struct wined3d_surface *surface, TRACE("iface %p, srgb %#x.\n", surface, srgb); - texture->texture_ops->texture_preload(texture, context, srgb); + wined3d_texture_load(texture, context, srgb); } /* Read the framebuffer back into the surface */ diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 08638a5e0c0..755335ffd2d 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -508,11 +508,60 @@ DWORD CDECL wined3d_texture_get_priority(const struct wined3d_texture *texture) return resource_get_priority(&texture->resource); } +/* Context activation is done by the caller */ +void wined3d_texture_load(struct wined3d_texture *texture, + struct wined3d_context *context, enum WINED3DSRGB srgb) +{ + UINT sub_count = texture->level_count * texture->layer_count; + const struct wined3d_gl_info *gl_info = context->gl_info; + BOOL srgb_mode; + DWORD flag; + UINT i; + + TRACE("texture %p, srgb %#x.\n", texture, srgb); + + if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) + srgb = SRGB_RGB; + + switch (srgb) + { + case SRGB_RGB: + srgb_mode = FALSE; + break; + + case SRGB_SRGB: + srgb_mode = TRUE; + break; + + default: + srgb_mode = texture->flags & WINED3D_TEXTURE_IS_SRGB; + break; + } + + if (srgb_mode) + flag = WINED3D_TEXTURE_SRGB_VALID; + else + flag = WINED3D_TEXTURE_RGB_VALID; + + if (texture->flags & flag) + { + TRACE("Texture %p not dirty, nothing to do.\n", texture); + return; + } + + /* Reload the surfaces if the texture is marked dirty. */ + for (i = 0; i < sub_count; ++i) + { + texture->texture_ops->texture_sub_resource_load(texture->sub_resources[i], context, srgb_mode); + } + texture->flags |= flag; +} + void CDECL wined3d_texture_preload(struct wined3d_texture *texture) { struct wined3d_context *context; context = context_acquire(texture->resource.device, NULL); - texture->texture_ops->texture_preload(texture, context, SRGB_ANY); + wined3d_texture_load(texture, context, SRGB_ANY); context_release(context); } @@ -631,54 +680,10 @@ HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture, return WINED3D_OK; } -static BOOL texture_srgb_mode(const struct wined3d_texture *texture, enum WINED3DSRGB srgb) +static void texture2d_sub_resource_load(struct wined3d_resource *sub_resource, + struct wined3d_context *context, BOOL srgb) { - switch (srgb) - { - case SRGB_RGB: - return FALSE; - - case SRGB_SRGB: - return TRUE; - - default: - return texture->flags & WINED3D_TEXTURE_IS_SRGB; - } -} - -/* Context activation is done by the caller */ -static void texture2d_preload(struct wined3d_texture *texture, - struct wined3d_context *context, enum WINED3DSRGB srgb) -{ - UINT sub_count = texture->level_count * texture->layer_count; - const struct wined3d_gl_info *gl_info = context->gl_info; - BOOL srgb_mode; - DWORD flag; - UINT i; - - TRACE("texture %p, srgb %#x.\n", texture, srgb); - - if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) - srgb = SRGB_RGB; - - srgb_mode = texture_srgb_mode(texture, srgb); - if (srgb_mode) - flag = WINED3D_TEXTURE_SRGB_VALID; - else - flag = WINED3D_TEXTURE_RGB_VALID; - - if (texture->flags & flag) - { - TRACE("Texture %p not dirty, nothing to do.\n", texture); - return; - } - - /* Reload the surfaces if the texture is marked dirty. */ - for (i = 0; i < sub_count; ++i) - { - surface_load(surface_from_resource(texture->sub_resources[i]), srgb_mode); - } - texture->flags |= flag; + surface_load(surface_from_resource(sub_resource), srgb); } static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource, @@ -698,7 +703,7 @@ static void texture2d_sub_resource_cleanup(struct wined3d_resource *sub_resource static const struct wined3d_texture_ops texture2d_ops = { - texture2d_preload, + texture2d_sub_resource_load, texture2d_sub_resource_add_dirty_region, texture2d_sub_resource_cleanup, }; @@ -998,39 +1003,10 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 return WINED3D_OK; } -/* Context activation is done by the caller. */ -static void texture3d_preload(struct wined3d_texture *texture, - struct wined3d_context *context, enum WINED3DSRGB srgb) +static void texture3d_sub_resource_load(struct wined3d_resource *sub_resource, + struct wined3d_context *context, BOOL srgb) { - UINT sub_count = texture->level_count * texture->layer_count; - const struct wined3d_gl_info *gl_info = context->gl_info; - BOOL srgb_mode; - DWORD flag; - UINT i; - - TRACE("texture %p, srgb %#x.\n", texture, srgb); - - if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) - srgb = SRGB_RGB; - - srgb_mode = texture_srgb_mode(texture, srgb); - if (srgb_mode) - flag = WINED3D_TEXTURE_SRGB_VALID; - else - flag = WINED3D_TEXTURE_RGB_VALID; - - if (texture->flags & flag) - { - TRACE("Texture %p not dirty, nothing to do.\n", texture); - return; - } - - /* Reload the surfaces if the texture is marked dirty. */ - for (i = 0; i < sub_count; ++i) - { - wined3d_volume_load(volume_from_resource(texture->sub_resources[i]), context, srgb_mode); - } - texture->flags |= flag; + wined3d_volume_load(volume_from_resource(sub_resource), context, srgb); } static void texture3d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource, @@ -1049,7 +1025,7 @@ static void texture3d_sub_resource_cleanup(struct wined3d_resource *sub_resource static const struct wined3d_texture_ops texture3d_ops = { - texture3d_preload, + texture3d_sub_resource_load, texture3d_sub_resource_add_dirty_region, texture3d_sub_resource_cleanup, }; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e8bc18b45ca..ff50aec11c0 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2058,8 +2058,8 @@ struct gl_texture struct wined3d_texture_ops { - void (*texture_preload)(struct wined3d_texture *texture, struct wined3d_context *context, - enum WINED3DSRGB srgb); + void (*texture_sub_resource_load)(struct wined3d_resource *sub_resource, + struct wined3d_context *context, BOOL srgb); void (*texture_sub_resource_add_dirty_region)(struct wined3d_resource *sub_resource, const struct wined3d_box *dirty_region); void (*texture_sub_resource_cleanup)(struct wined3d_resource *sub_resource); @@ -2107,6 +2107,8 @@ void wined3d_texture_bind(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; +void wined3d_texture_load(struct wined3d_texture *texture, + struct wined3d_context *context, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; void wined3d_texture_set_dirty(struct wined3d_texture *texture) DECLSPEC_HIDDEN; #define WINED3D_VFLAG_ALLOCATED 0x00000001