From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d9/tests/visual.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 0ac6b58cb36..51848cecbf6 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -19507,6 +19507,7 @@ static void add_dirty_rect_test(void) ULONG refcount; DWORD *texel; HWND window; + HDC dc; D3DLOCKED_RECT locked_rect; static const RECT part_rect = {96, 96, 160, 160}; static const RECT oob_rect[] = @@ -19748,6 +19749,21 @@ static void add_dirty_rect_test(void) hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
+ /* GetDC() records a dirty rect. */ + fill_surface(surface_src_green, 0x00000080, D3DLOCK_NO_DIRTY_UPDATE); + hr = IDirect3DSurface9_GetDC(surface_src_green, &dc); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DSurface9_ReleaseDC(surface_src_green, dc); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_UpdateTexture(device, (IDirect3DBaseTexture9 *)tex_src_green, + (IDirect3DBaseTexture9 *)tex_dst2); + 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); + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr); + fill_surface(surface_src_red, 0x00ff0000, 0); fill_surface(surface_src_green, 0x0000ff00, 0);
@@ -19873,6 +19889,18 @@ static void add_dirty_rect_test(void) hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
+ /* So does GetDC(). */ + fill_surface(surface_managed0, 0x00000080, D3DLOCK_NO_DIRTY_UPDATE); + hr = IDirect3DSurface9_GetDC(surface_managed0, &dc); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DSurface9_ReleaseDC(surface_managed0, dc); + 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); + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr); + /* Tests with dynamic textures */ fill_surface(surface_dynamic, 0x0000ffff, 0); hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)tex_dynamic);
From: Zebediah Figura zfigura@codeweavers.com
--- 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) {
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=139695
Your paranoid android.
=== debian11b (64 bit WoW report) ===
uxtheme: system.c:572: Test succeeded inside todo block: OpenThemeData() should fail system.c:574: Test succeeded inside todo block: Got unexpected 0x80070490.