Module: wine Branch: master Commit: a32872870271083a0bd5caa55771be4ff1b2fff2 URL: https://gitlab.winehq.org/wine/wine/-/commit/a32872870271083a0bd5caa55771be4...
Author: Zebediah Figura zfigura@codeweavers.com Date: Wed Nov 8 17:45:07 2023 -0600
wined3d: Record a dirty rect in wined3d_texture_create_dc().
---
dlls/d3d9/tests/visual.c | 4 +-- dlls/wined3d/texture.c | 66 +++++++++++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 33 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 51848cecbf6..bb8381cde3d 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -19760,7 +19760,7 @@ static void add_dirty_rect_test(void) ok(SUCCEEDED(hr), "Failed to update texture, hr %#lx.\n", hr); add_dirty_rect_test_draw(device); color = getPixelColor(device, 320, 240); - todo_wine ok(color_match(color, 0x00000080, 1), "Got unexpected color 0x%08x.\n", color); + ok(color_match(color, 0x00000080, 1), "Got unexpected color 0x%08x.\n", color); hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
@@ -19897,7 +19897,7 @@ static void add_dirty_rect_test(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); add_dirty_rect_test_draw(device); color = getPixelColor(device, 320, 240); - todo_wine ok(color_match(color, 0x00000080, 1), "Got unexpected color 0x%08x.\n", color); + ok(color_match(color, 0x00000080, 1), "Got unexpected color 0x%08x.\n", color); hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index a89fad97ed8..1f4c4b80d3c 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1088,6 +1088,37 @@ static void wined3d_texture_gl_allocate_immutable_storage(struct wined3d_texture checkGLcall("allocate immutable storage"); }
+static void wined3d_texture_dirty_region_add(struct wined3d_texture *texture, + unsigned int layer, const struct wined3d_box *box) +{ + struct wined3d_dirty_regions *regions; + unsigned int count; + + if (!texture->dirty_regions) + return; + + regions = &texture->dirty_regions[layer]; + count = regions->box_count + 1; + if (count >= WINED3D_MAX_DIRTY_REGION_COUNT || !box + || (!box->left && !box->top && !box->front + && box->right == texture->resource.width + && box->bottom == texture->resource.height + && box->back == texture->resource.depth)) + { + regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT; + return; + } + + if (!wined3d_array_reserve((void **)®ions->boxes, ®ions->boxes_size, count, sizeof(*regions->boxes))) + { + ERR("Failed to grow boxes array, marking entire texture dirty.\n"); + regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT; + return; + } + + regions->boxes[regions->box_count++] = *box; +} + void wined3d_texture_sub_resources_destroyed(struct wined3d_texture *texture) { unsigned int sub_count = texture->level_count * texture->layer_count; @@ -1150,6 +1181,10 @@ static void wined3d_texture_create_dc(void *object) context = context_acquire(device, NULL, 0); wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding); } + + if (texture->dirty_regions) + wined3d_texture_dirty_region_add(texture, sub_resource_idx / texture->level_count, NULL); + wined3d_texture_invalidate_location(texture, sub_resource_idx, ~texture->resource.map_binding); wined3d_texture_get_pitch(texture, level, &row_pitch, &slice_pitch); wined3d_texture_get_bo_address(texture, sub_resource_idx, &data, texture->resource.map_binding); @@ -2123,37 +2158,6 @@ static struct wined3d_texture_sub_resource *wined3d_texture_get_sub_resource(str return &texture->sub_resources[sub_resource_idx]; }
-static void wined3d_texture_dirty_region_add(struct wined3d_texture *texture, - unsigned int layer, const struct wined3d_box *box) -{ - struct wined3d_dirty_regions *regions; - unsigned int count; - - if (!texture->dirty_regions) - return; - - regions = &texture->dirty_regions[layer]; - count = regions->box_count + 1; - if (count >= WINED3D_MAX_DIRTY_REGION_COUNT || !box - || (!box->left && !box->top && !box->front - && box->right == texture->resource.width - && box->bottom == texture->resource.height - && box->back == texture->resource.depth)) - { - regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT; - return; - } - - if (!wined3d_array_reserve((void **)®ions->boxes, ®ions->boxes_size, count, sizeof(*regions->boxes))) - { - WARN("Failed to grow boxes array, marking entire texture dirty.\n"); - regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT; - return; - } - - regions->boxes[regions->box_count++] = *box; -} - HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture, UINT layer, const struct wined3d_box *dirty_region) {