Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/cs.c | 5 ++-- dlls/wined3d/surface.c | 11 +++++---- dlls/wined3d/texture.c | 54 +++++++++++++++++++++++------------------- dlls/wined3d/view.c | 2 +- dlls/wined3d/wined3d_private.h | 4 ++-- 5 files changed, 41 insertions(+), 35 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 05d39038843..8413d0f3c05 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2228,7 +2228,8 @@ static void wined3d_cs_exec_blt_sub_resource(struct wined3d_cs *cs, const void * && update_h == wined3d_texture_get_level_height(dst_texture, level) && update_d == wined3d_texture_get_level_depth(dst_texture, level)) { - wined3d_texture_prepare_texture(dst_texture, context, FALSE); + wined3d_texture_prepare_location(dst_texture, op->dst_sub_resource_idx, + context, WINED3D_LOCATION_TEXTURE_RGB); } else if (!wined3d_texture_load_location(dst_texture, op->dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB)) @@ -2337,7 +2338,7 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi /* Only load the sub-resource for partial updates. */ if (!box->left && !box->top && !box->front && box->right == width && box->bottom == height && box->back == depth) - wined3d_texture_prepare_texture(texture, context, FALSE); + wined3d_texture_prepare_location(texture, op->sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); else wined3d_texture_load_location(texture, op->sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 0b6104d475b..291ae845254 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -693,7 +693,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
TRACE("Using upload conversion.\n");
- wined3d_texture_prepare_texture(dst_texture, context, FALSE); + wined3d_texture_prepare_location(dst_texture, 0, context, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(dst_texture), wined3d_context_gl(context), FALSE); wined3d_texture_upload_data(dst_texture, 0, context, src_format, &src_box, wined3d_const_bo_address(&src_data), src_row_pitch, src_slice_pitch, 0, 0, 0, FALSE); @@ -868,7 +868,7 @@ void texture2d_load_fb_texture(struct wined3d_texture_gl *texture_gl, gl_info = context->gl_info; device_invalidate_state(device, STATE_FRAMEBUFFER);
- wined3d_texture_prepare_texture(&texture_gl->t, context, srgb); + wined3d_texture_gl_prepare_texture(texture_gl, context_gl, srgb); wined3d_texture_gl_bind_and_dirtify(texture_gl, context_gl, srgb);
TRACE("Reading back offscreen render target %p, %u.\n", texture_gl, sub_resource_idx); @@ -1529,6 +1529,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re struct wined3d_context *context, BOOL srgb) { unsigned int width, height, level, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch; + struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture); struct wined3d_context_gl *context_gl = wined3d_context_gl(context); const struct wined3d_gl_info *gl_info = context->gl_info; struct wined3d_device *device = texture->resource.device; @@ -1547,7 +1548,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re && wined3d_resource_is_offscreen(&texture->resource) && (sub_resource->locations & WINED3D_LOCATION_DRAWABLE)) { - texture2d_load_fb_texture(wined3d_texture_gl(texture), sub_resource_idx, srgb, context); + texture2d_load_fb_texture(texture_gl, sub_resource_idx, srgb, context);
return TRUE; } @@ -1621,8 +1622,8 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_SYSMEM); }
- wined3d_texture_prepare_texture(texture, context, srgb); - wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), wined3d_context_gl(context), srgb); + wined3d_texture_gl_prepare_texture(texture_gl, context_gl, srgb); + wined3d_texture_gl_bind_and_dirtify(texture_gl, context_gl, srgb); wined3d_texture_get_pitch(texture, level, &src_row_pitch, &src_slice_pitch);
format = texture->resource.format; diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 5e84a82138a..8b27e59bc30 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1715,52 +1715,53 @@ static void wined3d_texture_force_reload(struct wined3d_texture *texture) }
/* Context activation is done by the caller. */ -void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) +void wined3d_texture_gl_prepare_texture(struct wined3d_texture_gl *texture_gl, + struct wined3d_context_gl *context_gl, BOOL srgb) { DWORD alloc_flag = srgb ? WINED3D_TEXTURE_SRGB_ALLOCATED : WINED3D_TEXTURE_RGB_ALLOCATED; - const struct wined3d_d3d_info *d3d_info = context->d3d_info; - const struct wined3d_gl_info *gl_info = context->gl_info; - struct wined3d_resource *resource = &texture->resource; + const struct wined3d_d3d_info *d3d_info = context_gl->c.d3d_info; + const struct wined3d_gl_info *gl_info = context_gl->c.gl_info; + struct wined3d_resource *resource = &texture_gl->t.resource; const struct wined3d_device *device = resource->device; const struct wined3d_format *format = resource->format; const struct wined3d_color_key_conversion *conversion; const struct wined3d_format_gl *format_gl; GLenum internal;
- TRACE("texture %p, context %p, format %s.\n", texture, context, debug_d3dformat(format->id)); + TRACE("texture_gl %p, context_gl %p, format %s.\n", texture_gl, context_gl, debug_d3dformat(format->id));
if (!d3d_info->shader_color_key - && !(texture->async.flags & WINED3D_TEXTURE_ASYNC_COLOR_KEY) - != !(texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT)) + && !(texture_gl->t.async.flags & WINED3D_TEXTURE_ASYNC_COLOR_KEY) + != !(texture_gl->t.async.color_key_flags & WINED3D_CKEY_SRC_BLT)) { - wined3d_texture_force_reload(texture); + wined3d_texture_force_reload(&texture_gl->t);
- if (texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) - texture->async.flags |= WINED3D_TEXTURE_ASYNC_COLOR_KEY; + if (texture_gl->t.async.color_key_flags & WINED3D_CKEY_SRC_BLT) + texture_gl->t.async.flags |= WINED3D_TEXTURE_ASYNC_COLOR_KEY; }
- if (texture->flags & alloc_flag) + if (texture_gl->t.flags & alloc_flag) return;
if (resource->format_flags & WINED3DFMT_FLAG_DECOMPRESS) { TRACE("WINED3DFMT_FLAG_DECOMPRESS set.\n"); - texture->flags |= WINED3D_TEXTURE_CONVERTED; + texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED; format = wined3d_resource_get_decompress_format(resource); } else if (format->conv_byte_count) { - texture->flags |= WINED3D_TEXTURE_CONVERTED; + texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED; } - else if ((conversion = wined3d_format_get_color_key_conversion(texture, TRUE))) + else if ((conversion = wined3d_format_get_color_key_conversion(&texture_gl->t, TRUE))) { - texture->flags |= WINED3D_TEXTURE_CONVERTED; + texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED; format = wined3d_get_format(device->adapter, conversion->dst_format, resource->bind_flags); TRACE("Using format %s for color key conversion.\n", debug_d3dformat(format->id)); } format_gl = wined3d_format_gl(format);
- wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), wined3d_context_gl(context), srgb); + wined3d_texture_gl_bind_and_dirtify(texture_gl, context_gl, srgb);
if (srgb) internal = format_gl->srgb_internal; @@ -1774,11 +1775,11 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
TRACE("internal %#x, format %#x, type %#x.\n", internal, format_gl->format, format_gl->type);
- if (wined3d_texture_use_immutable_storage(texture, gl_info)) - wined3d_texture_gl_allocate_immutable_storage(wined3d_texture_gl(texture), internal, gl_info); + if (wined3d_texture_use_immutable_storage(&texture_gl->t, gl_info)) + wined3d_texture_gl_allocate_immutable_storage(texture_gl, internal, gl_info); else - wined3d_texture_gl_allocate_mutable_storage(wined3d_texture_gl(texture), internal, format_gl, gl_info); - texture->flags |= alloc_flag; + wined3d_texture_gl_allocate_mutable_storage(texture_gl, internal, format_gl, gl_info); + texture_gl->t.flags |= alloc_flag; }
static void wined3d_texture_gl_prepare_rb(struct wined3d_texture_gl *texture_gl, @@ -1822,6 +1823,9 @@ static void wined3d_texture_gl_prepare_rb(struct wined3d_texture_gl *texture_gl, BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) { + struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture); + struct wined3d_context_gl *context_gl = wined3d_context_gl(context); + switch (location) { case WINED3D_LOCATION_SYSMEM: @@ -1842,11 +1846,11 @@ BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned return TRUE;
case WINED3D_LOCATION_TEXTURE_RGB: - wined3d_texture_prepare_texture(texture, context, FALSE); + wined3d_texture_gl_prepare_texture(texture_gl, context_gl, FALSE); return TRUE;
case WINED3D_LOCATION_TEXTURE_SRGB: - wined3d_texture_prepare_texture(texture, context, TRUE); + wined3d_texture_gl_prepare_texture(texture_gl, context_gl, TRUE); return TRUE;
case WINED3D_LOCATION_DRAWABLE: @@ -1855,11 +1859,11 @@ BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned return TRUE;
case WINED3D_LOCATION_RB_MULTISAMPLE: - wined3d_texture_gl_prepare_rb(wined3d_texture_gl(texture), context->gl_info, TRUE); + wined3d_texture_gl_prepare_rb(texture_gl, context->gl_info, TRUE); return TRUE;
case WINED3D_LOCATION_RB_RESOLVED: - wined3d_texture_gl_prepare_rb(wined3d_texture_gl(texture), context->gl_info, FALSE); + wined3d_texture_gl_prepare_rb(texture_gl, context->gl_info, FALSE); return TRUE;
default: @@ -3844,7 +3848,7 @@ void wined3d_texture_upload_from_texture(struct wined3d_texture *dst_texture, un if (update_w == wined3d_texture_get_level_width(dst_texture, dst_level) && update_h == wined3d_texture_get_level_height(dst_texture, dst_level) && update_d == wined3d_texture_get_level_depth(dst_texture, dst_level)) - wined3d_texture_prepare_texture(dst_texture, context, FALSE); + wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); else wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(dst_texture), wined3d_context_gl(context), FALSE); diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c index bd32b88e0eb..e0ac57e761e 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -190,7 +190,7 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target return; }
- wined3d_texture_prepare_texture(&texture_gl->t, context, FALSE); + wined3d_texture_gl_prepare_texture(texture_gl, context_gl, FALSE); texture_name = wined3d_texture_gl_get_texture_name(texture_gl, context, FALSE);
level_idx = desc->u.texture.level_idx; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 04f160e9815..9617a44b32d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3550,8 +3550,6 @@ BOOL wined3d_texture_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; -void wined3d_texture_prepare_texture(struct wined3d_texture *texture, - struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; void wined3d_texture_set_map_binding(struct wined3d_texture *texture, DWORD map_binding) DECLSPEC_HIDDEN; void wined3d_texture_set_swapchain(struct wined3d_texture *texture, struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; @@ -3625,6 +3623,8 @@ void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; void wined3d_texture_gl_bind_and_dirtify(struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb) DECLSPEC_HIDDEN; +void wined3d_texture_gl_prepare_texture(struct wined3d_texture_gl *texture_gl, + struct wined3d_context_gl *context_gl, BOOL srgb) DECLSPEC_HIDDEN; void wined3d_texture_gl_set_compatible_renderbuffer(struct wined3d_texture_gl *texture_gl, struct wined3d_context *context, unsigned int level, const struct wined3d_rendertarget_info *rt) DECLSPEC_HIDDEN;