From: Masanori Kakura Subject: [v6 PATCH 3/3] wined3d: Update only dirty regions in wined3d_cs_exec_update_texture(). Message-Id: <20170528141047.24496-3-kakurasan@gmail.com> Date: Sun, 28 May 2017 23:10:47 +0900 In-Reply-To: <20170528141047.24496-1-kakurasan@gmail.com> References: <20170528141047.24496-1-kakurasan@gmail.com> Fixes https://bugs.winehq.org/show_bug.cgi?id=35205 v6 - Fix position calculation in wined3d_cs_exec_update_texture() - Try to be less redundant Signed-off-by: Masanori Kakura --- dlls/d3d8/tests/visual.c | 2 +- dlls/d3d9/tests/visual.c | 2 +- dlls/wined3d/context.c | 2 +- dlls/wined3d/cs.c | 146 +++++++++++++++++++++++++---------------- dlls/wined3d/device.c | 4 +- dlls/wined3d/surface.c | 38 +++++------ dlls/wined3d/swapchain.c | 8 +-- dlls/wined3d/texture.c | 29 ++++---- dlls/wined3d/view.c | 2 +- dlls/wined3d/wined3d_private.h | 5 +- 10 files changed, 137 insertions(+), 101 deletions(-) diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index b074d9c661..9113ceb21c 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -5383,7 +5383,7 @@ static void add_dirty_rect_test(void) ok(color_match(color, 0x0000ff00, 1), "Expected color 0x0000ff00, got 0x%08x.\n", color); color = getPixelColor(device, 1, 1); - todo_wine ok(color_match(color, 0x00ff0000, 1), + ok(color_match(color, 0x00ff0000, 1), "Expected color 0x00ff0000, got 0x%08x.\n", color); hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index a23ba32a20..14196dbe29 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -17504,7 +17504,7 @@ static void add_dirty_rect_test(void) ok(color_match(color, 0x0000ff00, 1), "Expected color 0x0000ff00, got 0x%08x.\n", color); color = getPixelColor(device, 1, 1); - todo_wine ok(color_match(color, 0x00ff0000, 1), + ok(color_match(color, 0x00ff0000, 1), "Expected color 0x00ff0000, got 0x%08x.\n", color); hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 49b9186645..8027f2b9e2 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -2736,7 +2736,7 @@ static void context_validate_onscreen_formats(struct wined3d_context *context, /* The currently active context is the necessary context to access the swapchain's onscreen buffers */ if (!(wined3d_texture_load_location(context->current_rt.texture, context->current_rt.sub_resource_idx, - context, WINED3D_LOCATION_TEXTURE_RGB))) + context, NULL, WINED3D_LOCATION_TEXTURE_RGB))) ERR("Failed to load location.\n"); swapchain->render_to_fbo = TRUE; swapchain_update_draw_bindings(swapchain); diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 0132894cd9..04b6e7f3eb 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2021,7 +2021,7 @@ static void wined3d_cs_exec_blt_sub_resource(struct wined3d_cs *cs, const void * context = context_acquire(cs->device, NULL, 0); if (!wined3d_texture_load_location(src_texture, op->src_sub_resource_idx, - context, src_texture->resource.map_binding)) + context, NULL, src_texture->resource.map_binding)) { ERR("Failed to load source sub-resource into %s.\n", wined3d_debug_location(src_texture->resource.map_binding)); @@ -2037,7 +2037,7 @@ static void wined3d_cs_exec_blt_sub_resource(struct wined3d_cs *cs, const void * wined3d_texture_prepare_texture(dst_texture, context, FALSE); } else if (!wined3d_texture_load_location(dst_texture, op->dst_sub_resource_idx, - context, WINED3D_LOCATION_TEXTURE_RGB)) + context, NULL, WINED3D_LOCATION_TEXTURE_RGB)) { ERR("Failed to load destination sub-resource.\n"); context_release(context); @@ -2140,7 +2140,7 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi && box->right == width && box->bottom == height && box->back == depth) wined3d_texture_prepare_texture(texture, context, FALSE); else - wined3d_texture_load_location(texture, op->sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_load_location(texture, op->sub_resource_idx, context, NULL, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_bind_and_dirtify(texture, context, FALSE); wined3d_texture_upload_data(texture, op->sub_resource_idx, context, @@ -2188,7 +2188,7 @@ static void wined3d_cs_exec_update_texture(struct wined3d_cs *cs, const void *da unsigned int src_level_count = op->src_level_count; unsigned int dst_level_count = op->dst_level_count; unsigned int src_skip_levels = op->src_skip_levels; - unsigned int i, j; + unsigned int i, j, k; unsigned int width, height, depth; UINT src_dirty_layers = 0; @@ -2213,73 +2213,107 @@ static void wined3d_cs_exec_update_texture(struct wined3d_cs *cs, const void *da if (dst_resource->type == WINED3D_RTYPE_TEXTURE_2D) { - RECT rect; struct wined3d_surface *dst_surface, *src_surface; dst_surface = dst_texture->sub_resources[dst_sub_resource_idx].u.surface; src_surface = src_texture->sub_resources[src_sub_resource_idx].u.surface; - SetRect(&rect, 0, 0, width, height); - - TRACE("src_texture %p, dst_texture %p, level %u, layer %u, " - "src_sub_resource_idx %u, dst_sub_resource_idx %u, rect %s.\n", - src_texture, dst_texture, i, j, - src_sub_resource_idx, dst_sub_resource_idx, wine_dbgstr_rect(&rect)); - if (FAILED(wined3d_surface_blt(dst_surface, &rect, src_surface, - &rect, 0, NULL, WINED3D_TEXF_POINT))) - FIXME("Blit failed.\n"); + for (k = 0; k < src_texture->async.dirty_regions_count[j]; ++k) + { + const struct wined3d_box *dirty_box = &src_texture->async.dirty_regions[j][k]; + RECT rect; + + SetRect(&rect, + dirty_box->left >> i, dirty_box->top >> i, + dirty_box->right >> i, dirty_box->bottom >> i); + if (rect.right << i != dirty_box->right) + rect.right += 1; + rect.right = max(1, min(rect.right, width)); + if (rect.bottom << i != dirty_box->bottom) + rect.bottom += 1; + rect.bottom = max(1, min(rect.bottom, height)); + + TRACE("src_texture %p, dst_texture %p, level %u, layer %u, " + "src_sub_resource_idx %u, dst_sub_resource_idx %u, rect %s.\n", + src_texture, dst_texture, i, j, + src_sub_resource_idx, dst_sub_resource_idx, wine_dbgstr_rect(&rect)); + + if (FAILED(wined3d_surface_blt(dst_surface, &rect, src_surface, + &rect, 0, NULL, WINED3D_TEXF_POINT))) + FIXME("Blit failed.\n"); + } } else if (dst_resource->type == WINED3D_RTYPE_TEXTURE_3D) { - struct wined3d_box box; unsigned int row_pitch, slice_pitch; struct wined3d_context *context; struct wined3d_bo_address addr; - wined3d_box_set(&box, 0, 0, width, height, 0, depth); - - TRACE("src_texture %p, dst_texture %p, level %u, layer %u, " - "src_sub_resource_idx %u, dst_sub_resource_idx %u, box %s.\n", - src_texture, dst_texture, i, j, - src_sub_resource_idx, dst_sub_resource_idx, debug_box(&box)); - - if (box.left || box.top || box.front) - { - FIXME("Source box %s not supported for %s resources.\n", - debug_box(&box), debug_d3dresourcetype(dst_resource->type)); - continue; - } - context = context_acquire(cs->device, NULL, 0); - if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, - context, src_texture->resource.map_binding)) - { - ERR("Failed to load source sub-resource into %s.\n", - wined3d_debug_location(src_texture->resource.map_binding)); - goto release_context; - } - - if (box.right - box.left == width - && box.bottom - box.top == height - && box.back - box.front == depth) + for (k = 0; k < src_texture->async.dirty_regions_count[j]; ++k) { - wined3d_texture_prepare_texture(dst_texture, context, FALSE); + const struct wined3d_box *dirty_box = &src_texture->async.dirty_regions[j][k]; + struct wined3d_box box; + + wined3d_box_set(&box, + dirty_box->left >> i, dirty_box->top >> i, + dirty_box->right >> i, dirty_box->bottom >> i, + dirty_box->front >> i, dirty_box->back >> i); + if (box.right << i != dirty_box->right) + box.right += 1; + box.right = max(1, min(box.right, width)); + if (box.bottom << i != dirty_box->bottom) + box.bottom += 1; + box.bottom = max(1, min(box.bottom, height)); + if (box.back << i != dirty_box->back) + box.back += 1; + box.back = max(1, min(box.back, depth)); + + TRACE("src_texture %p, dst_texture %p, level %u, layer %u, " + "src_sub_resource_idx %u, dst_sub_resource_idx %u, box %s.\n", + src_texture, dst_texture, i, j, + src_sub_resource_idx, dst_sub_resource_idx, debug_box(&box)); + + if (box.left || box.top || box.front) + { + FIXME("Source box %s not supported for %s resources.\n", + debug_box(&box), debug_d3dresourcetype(dst_resource->type)); + goto release_context; + } + + if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, + context, &box, src_texture->resource.map_binding)) + { + ERR("Failed to load source sub-resource into %s.\n", + wined3d_debug_location(src_texture->resource.map_binding)); + goto release_context; + } + + if (box.right - box.left == width + && box.bottom - box.top == height + && box.back - box.front == depth) + { + wined3d_texture_prepare_texture(dst_texture, context, FALSE); + } + else if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, + context, &box, WINED3D_LOCATION_TEXTURE_RGB)) + { + ERR("Failed to load destination sub-resource.\n"); + goto release_context; + } + + if (k == 0) + { + wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &addr, src_texture->resource.map_binding); + wined3d_texture_get_pitch(src_texture, src_sub_resource_idx % src_texture->level_count, + &row_pitch, &slice_pitch); + + wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE); + } + wined3d_texture_upload_data(dst_texture, dst_sub_resource_idx, context, &box, + wined3d_const_bo_address(&addr), row_pitch, slice_pitch); } - else if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, - context, WINED3D_LOCATION_TEXTURE_RGB)) - { - ERR("Failed to load destination sub-resource.\n"); - goto release_context; - } - - wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &addr, src_texture->resource.map_binding); - wined3d_texture_get_pitch(src_texture, src_sub_resource_idx % src_texture->level_count, - &row_pitch, &slice_pitch); - - wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE); - wined3d_texture_upload_data(dst_texture, dst_sub_resource_idx, context, &box, - wined3d_const_bo_address(&addr), row_pitch, slice_pitch); wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB); @@ -2337,7 +2371,7 @@ static void wined3d_cs_exec_add_dirty_texture_region(struct wined3d_cs *cs, cons sub_resource_idx = op->layer * texture->level_count; for (i = 0; i < texture->level_count; ++i, ++sub_resource_idx) { - if (wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding)) + if (wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, texture->resource.map_binding)) wined3d_texture_invalidate_location(texture, sub_resource_idx, ~texture->resource.map_binding); else ERR("Failed to load location %s.\n", wined3d_debug_location(texture->resource.map_binding)); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 42ddbb389b..d837df7f8d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -268,7 +268,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c struct wined3d_texture *rt = wined3d_texture_from_resource(rtv->resource); if (flags & WINED3DCLEAR_TARGET && !is_full_clear(target, draw_rect, rect_count ? clear_rect : NULL)) - wined3d_texture_load_location(rt, rtv->sub_resource_idx, context, rtv->resource->draw_binding); + wined3d_texture_load_location(rt, rtv->sub_resource_idx, context, NULL, rtv->resource->draw_binding); else wined3d_texture_prepare_location(rt, rtv->sub_resource_idx, context, rtv->resource->draw_binding); } @@ -297,7 +297,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c DWORD location = render_offscreen ? dsv->resource->draw_binding : WINED3D_LOCATION_DRAWABLE; wined3d_texture_load_location(depth_stencil->container, - dsv->sub_resource_idx, context, location); + dsv->sub_resource_idx, context, NULL, location); } if (!context_apply_clear_state(context, state, rt_count, fb)) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index abdeb9cac0..e72c40dcdb 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -305,9 +305,9 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, /* Make sure the locations are up-to-date. Loading the destination * surface isn't required if the entire surface is overwritten. */ - wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, src_location); + wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, NULL, src_location); if (!surface_is_full_rect(dst_surface, dst_rect)) - wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, dst_location); + wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, NULL, dst_location); else wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, dst_location); @@ -402,9 +402,9 @@ static void surface_blt_fbo(const struct wined3d_device *device, * surface isn't required if the entire surface is overwritten. (And is * in fact harmful if we're being called by surface_load_location() with * the purpose of loading the destination surface.) */ - wined3d_texture_load_location(src_texture, src_sub_resource_idx, old_ctx, src_location); + wined3d_texture_load_location(src_texture, src_sub_resource_idx, old_ctx, NULL, src_location); if (!surface_is_full_rect(dst_surface, &dst_rect)) - wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, old_ctx, dst_location); + wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, old_ctx, NULL, dst_location); else wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, old_ctx, dst_location); @@ -887,7 +887,7 @@ static HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, && update_h == wined3d_texture_get_level_height(dst_texture, dst_surface->texture_level)) wined3d_texture_prepare_texture(dst_texture, context, FALSE); else - wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, NULL, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE); wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &data, @@ -1296,7 +1296,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr } map_binding = src_texture->resource.map_binding; - if (!wined3d_texture_load_location(src_texture, sub_resource_idx, context, map_binding)) + if (!wined3d_texture_load_location(src_texture, sub_resource_idx, context, NULL, map_binding)) ERR("Failed to load the source sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_get_pitch(src_texture, texture_level, &src_row_pitch, &src_slice_pitch); wined3d_texture_get_memory(src_texture, sub_resource_idx, &src_data, map_binding); @@ -1309,7 +1309,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr BYTE *dst; map_binding = dst_texture->resource.map_binding; - if (!wined3d_texture_load_location(dst_texture, 0, context, map_binding)) + if (!wined3d_texture_load_location(dst_texture, 0, context, NULL, map_binding)) ERR("Failed to load the destination sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_get_pitch(dst_texture, 0, &dst_row_pitch, &dst_slice_pitch); wined3d_texture_get_memory(dst_texture, 0, &dst_data, map_binding); @@ -2081,7 +2081,7 @@ static BOOL surface_load_sysmem(struct wined3d_surface *surface, wined3d_texture_prepare_location(texture, sub_resource_idx, context, dst_location); if (sub_resource->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) - wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, WINED3D_LOCATION_TEXTURE_RGB); /* Download the surface to system memory. */ if (sub_resource->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) @@ -2140,7 +2140,7 @@ static BOOL surface_load_drawable(struct wined3d_surface *surface, SetRect(&r, 0, 0, wined3d_texture_get_level_width(texture, surface->texture_level), wined3d_texture_get_level_height(texture, surface->texture_level)); - wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, WINED3D_LOCATION_TEXTURE_RGB); device->blitter->ops->blitter_blit(device->blitter, WINED3D_BLIT_OP_COLOR_BLIT, context, surface, WINED3D_LOCATION_TEXTURE_RGB, &r, surface, WINED3D_LOCATION_DRAWABLE, &r, @@ -2227,7 +2227,7 @@ static BOOL surface_load_texture(struct wined3d_surface *surface, == WINED3D_LOCATION_TEXTURE_RGB) { FIXME_(d3d_perf)("Downloading RGB surface %p to reload it as sRGB.\n", surface); - wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, texture->resource.map_binding); } } else @@ -2236,7 +2236,7 @@ static BOOL surface_load_texture(struct wined3d_surface *surface, == WINED3D_LOCATION_TEXTURE_SRGB) { FIXME_(d3d_perf)("Downloading sRGB surface %p to reload it as RGB.\n", surface); - wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, texture->resource.map_binding); } } @@ -2244,7 +2244,7 @@ static BOOL surface_load_texture(struct wined3d_surface *surface, { WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); /* Lets hope we get it from somewhere... */ - wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_SYSMEM); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, WINED3D_LOCATION_SYSMEM); } wined3d_texture_prepare_texture(texture, context, srgb); @@ -2262,7 +2262,7 @@ static BOOL surface_load_texture(struct wined3d_surface *surface, { TRACE("Removing the pbo attached to surface %p.\n", surface); - wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_SYSMEM); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, WINED3D_LOCATION_SYSMEM); wined3d_texture_set_map_binding(texture, WINED3D_LOCATION_SYSMEM); } @@ -2907,7 +2907,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int map_binding = dst_texture->resource.map_binding; texture_level = dst_sub_resource_idx % dst_texture->level_count; - if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, map_binding)) + if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, NULL, map_binding)) ERR("Failed to load the destination sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~map_binding); wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch); @@ -2944,7 +2944,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int map_binding = src_texture->resource.map_binding; texture_level = src_sub_resource_idx % src_texture->level_count; - if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, map_binding)) + if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, NULL, map_binding)) ERR("Failed to load the source sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_get_pitch(src_texture, texture_level, &src_map.row_pitch, &src_map.slice_pitch); wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &src_data, map_binding); @@ -2953,7 +2953,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int map_binding = dst_texture->resource.map_binding; texture_level = dst_sub_resource_idx % dst_texture->level_count; - if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, map_binding)) + if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, NULL, map_binding)) ERR("Failed to load the destination sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~map_binding); wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch); @@ -3386,7 +3386,7 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view, texture = texture_from_resource(view->resource); map_binding = texture->resource.map_binding; - if (!wined3d_texture_load_location(texture, view->sub_resource_idx, context, map_binding)) + if (!wined3d_texture_load_location(texture, view->sub_resource_idx, context, NULL, map_binding)) ERR("Failed to load the sub-resource into %s.\n", wined3d_debug_location(map_binding)); wined3d_texture_invalidate_location(texture, view->sub_resource_idx, ~map_binding); wined3d_texture_get_pitch(texture, view->sub_resource_idx % texture->level_count, @@ -3530,7 +3530,7 @@ static void cpu_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ if (FAILED(surface_cpu_blt(dst_texture, dst_sub_resource_idx, &dst_box, src_texture, src_sub_resource_idx, &src_box, flags, &fx, filter))) ERR("Failed to blit.\n"); - wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, dst_location); + wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, NULL, dst_location); } static const struct wined3d_blitter_ops cpu_blitter_ops = @@ -3726,7 +3726,7 @@ HRESULT wined3d_surface_blt(struct wined3d_surface *dst_surface, const RECT *dst { context = context_acquire(device, dst_texture, dst_sub_resource_idx); wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, - context, dst_texture->resource.draw_binding); + context, NULL, dst_texture->resource.draw_binding); context_release(context); } return WINED3D_OK; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index e23e99b67b..712089b38b 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -361,7 +361,7 @@ static void wined3d_swapchain_rotate(struct wined3d_swapchain *swapchain, struct sub_resource = &texture->sub_resources[0]; if (!(sub_resource->locations & supported_locations)) - wined3d_texture_load_location(texture, 0, context, texture->resource.draw_binding); + wined3d_texture_load_location(texture, 0, context, NULL, texture->resource.draw_binding); texture_prev->texture_rgb = texture->texture_rgb; texture_prev->rb_multisample = texture->rb_multisample; @@ -458,14 +458,14 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, */ if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - wined3d_texture_load_location(back_buffer, 0, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_load_location(back_buffer, 0, context, NULL, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_invalidate_location(back_buffer, 0, WINED3D_LOCATION_DRAWABLE); swapchain->render_to_fbo = TRUE; swapchain_update_draw_bindings(swapchain); } else { - wined3d_texture_load_location(back_buffer, 0, context, back_buffer->resource.draw_binding); + wined3d_texture_load_location(back_buffer, 0, context, NULL, back_buffer->resource.draw_binding); } if (swapchain->render_to_fbo) @@ -535,7 +535,7 @@ static void swapchain_gl_frontbuffer_updated(struct wined3d_swapchain *swapchain struct wined3d_context *context; context = context_acquire(swapchain->device, front_buffer, 0); - wined3d_texture_load_location(front_buffer, 0, context, front_buffer->resource.draw_binding); + wined3d_texture_load_location(front_buffer, 0, context, NULL, front_buffer->resource.draw_binding); context_release(context); SetRectEmpty(&swapchain->front_buffer_update); } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index e520979c90..5c5f1709e4 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -222,15 +222,16 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture /* Context activation is done by the caller. Context may be NULL in * WINED3D_NO3D mode. */ BOOL wined3d_texture_load_location(struct wined3d_texture *texture, - unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) + unsigned int sub_resource_idx, struct wined3d_context *context, + const struct wined3d_box *box, DWORD location) { static const DWORD sysmem_locations = WINED3D_LOCATION_SYSMEM | WINED3D_LOCATION_USER_MEMORY | WINED3D_LOCATION_BUFFER; DWORD current = texture->sub_resources[sub_resource_idx].locations; BOOL ret; - TRACE("texture %p, sub_resource_idx %u, context %p, location %s.\n", - texture, sub_resource_idx, context, wined3d_debug_location(location)); + TRACE("texture %p, sub_resource_idx %u, context %p, location %s, box %s.\n", + texture, sub_resource_idx, context, wined3d_debug_location(location), debug_box(box)); TRACE("Current resource location %s.\n", wined3d_debug_location(current)); @@ -263,13 +264,13 @@ BOOL wined3d_texture_load_location(struct wined3d_texture *texture, ERR("Sub-resource %u of texture %p does not have any up to date location.\n", sub_resource_idx, texture); wined3d_texture_validate_location(texture, sub_resource_idx, WINED3D_LOCATION_DISCARDED); - return wined3d_texture_load_location(texture, sub_resource_idx, context, location); + return wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, location); } if ((location & sysmem_locations) && (current & sysmem_locations)) ret = wined3d_texture_copy_sysmem_location(texture, sub_resource_idx, context, location); else - ret = texture->texture_ops->texture_load_location(texture, sub_resource_idx, context, location); + ret = texture->texture_ops->texture_load_location(texture, sub_resource_idx, context, box, location); if (ret) wined3d_texture_validate_location(texture, sub_resource_idx, location); @@ -427,7 +428,7 @@ static void wined3d_texture_update_map_binding(struct wined3d_texture *texture) for (i = 0; i < sub_count; ++i) { if (texture->sub_resources[i].locations == texture->resource.map_binding - && !wined3d_texture_load_location(texture, i, context, map_binding)) + && !wined3d_texture_load_location(texture, i, context, NULL, map_binding)) ERR("Failed to load location %s.\n", wined3d_debug_location(map_binding)); if (texture->resource.map_binding == WINED3D_LOCATION_BUFFER) wined3d_texture_remove_buffer_object(texture, i, context->gl_info); @@ -1001,7 +1002,7 @@ void wined3d_texture_load(struct wined3d_texture *texture, TRACE("Reloading because of color key value change.\n"); for (i = 0; i < sub_count; i++) { - if (!wined3d_texture_load_location(texture, i, context, texture->resource.map_binding)) + if (!wined3d_texture_load_location(texture, i, context, NULL, texture->resource.map_binding)) ERR("Failed to load location %s.\n", wined3d_debug_location(texture->resource.map_binding)); else wined3d_texture_invalidate_location(texture, i, ~texture->resource.map_binding); @@ -1019,7 +1020,7 @@ void wined3d_texture_load(struct wined3d_texture *texture, /* Reload the surfaces if the texture is marked dirty. */ for (i = 0; i < sub_count; ++i) { - if (!wined3d_texture_load_location(texture, i, context, + if (!wined3d_texture_load_location(texture, i, context, NULL, srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB)) ERR("Failed to load location (srgb %#x).\n", srgb); } @@ -1211,7 +1212,7 @@ static void texture2d_create_dc(void *object) if (device->d3d_initialized) context = context_acquire(device, NULL, 0); - wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, texture->resource.map_binding); wined3d_texture_invalidate_location(texture, sub_resource_idx, ~texture->resource.map_binding); wined3d_texture_get_pitch(texture, surface->texture_level, &row_pitch, &slice_pitch); wined3d_texture_get_memory(texture, sub_resource_idx, &data, texture->resource.map_binding); @@ -1661,7 +1662,7 @@ static void texture2d_upload_data(struct wined3d_texture *texture, unsigned int } static BOOL texture2d_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, - struct wined3d_context *context, DWORD location) + struct wined3d_context *context, const struct wined3d_box *box, DWORD location) { return surface_load_location(texture->sub_resources[sub_resource_idx].u.surface, context, location); } @@ -1811,7 +1812,7 @@ static void wined3d_texture_unload(struct wined3d_resource *resource) struct wined3d_texture_sub_resource *sub_resource = &texture->sub_resources[i]; if (resource->pool != WINED3D_POOL_DEFAULT - && wined3d_texture_load_location(texture, i, context, resource->map_binding)) + && wined3d_texture_load_location(texture, i, context, NULL, resource->map_binding)) { wined3d_texture_invalidate_location(texture, i, ~resource->map_binding); } @@ -1915,7 +1916,7 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour { if (resource->usage & WINED3DUSAGE_DYNAMIC) WARN_(d3d_perf)("Mapping a dynamic texture without WINED3D_MAP_DISCARD.\n"); - ret = wined3d_texture_load_location(texture, sub_resource_idx, context, resource->map_binding); + ret = wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, resource->map_binding); } if (!ret) @@ -2451,7 +2452,7 @@ static void texture3d_srgb_transfer(struct wined3d_texture *texture, unsigned in /* Context activation is done by the caller. */ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, - struct wined3d_context *context, DWORD location) + struct wined3d_context *context, const struct wined3d_box *box, DWORD location) { struct wined3d_texture_sub_resource *sub_resource = &texture->sub_resources[sub_resource_idx]; unsigned int row_pitch, slice_pitch; @@ -2470,7 +2471,7 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in wined3d_texture_bind_and_dirtify(texture, context, location == WINED3D_LOCATION_TEXTURE_SRGB); wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch); - texture3d_upload_data(texture, sub_resource_idx, context, NULL, &data, row_pitch, slice_pitch); + texture3d_upload_data(texture, sub_resource_idx, context, box, &data, row_pitch, slice_pitch); } else if (sub_resource->locations & WINED3D_LOCATION_BUFFER) { diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c index adb43dd374..c452387777 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -461,7 +461,7 @@ void wined3d_rendertarget_view_load_location(struct wined3d_rendertarget_view *v sub_resource_idx = view->sub_resource_idx; layer_count = resource->type != WINED3D_RTYPE_TEXTURE_3D ? view->layer_count : 1; for (i = 0; i < layer_count; ++i, sub_resource_idx += texture->level_count) - wined3d_texture_load_location(texture, sub_resource_idx, context, location); + wined3d_texture_load_location(texture, sub_resource_idx, context, NULL, location); } void wined3d_rendertarget_view_validate_location(struct wined3d_rendertarget_view *view, DWORD location) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 7ba1c2f839..6fe7c8fb81 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2941,7 +2941,7 @@ struct wined3d_texture_ops const struct wined3d_context *context, const struct wined3d_box *box, const struct wined3d_const_bo_address *data, unsigned int row_pitch, unsigned int slice_pitch); BOOL (*texture_load_location)(struct wined3d_texture *texture, unsigned int sub_resource_idx, - struct wined3d_context *context, DWORD location); + struct wined3d_context *context, const struct wined3d_box *box, DWORD location); void (*texture_prepare_texture)(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb); void (*texture_cleanup_sub_resources)(struct wined3d_texture *texture); @@ -3086,7 +3086,8 @@ void wined3d_texture_invalidate_location(struct wined3d_texture *texture, void wined3d_texture_load(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; BOOL wined3d_texture_load_location(struct wined3d_texture *texture, - unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + unsigned int sub_resource_idx, struct wined3d_context *context, + const struct wined3d_box *box, 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, -- 2.11.0