wined3d: Consider WINED3D_LOCATION_CLEARED to be a GPU location for GPU-accessible textures.

When blitting from a staging texture in SYSMEM to an as-yet uninitialized GPU
texture, we want to avoid ever loading the source texture into TEXTURE_RGB, or
loading the destination texture into SYSMEM.

This isn't really a proper fix for the relevant tests; it just manages to avoid
the problematic code path.

This manages to fix test_yv12_overlay because it causes those blits to use the
upload path (whereas currently they go through the raw blitter, and before
1632b8e7a4 they would go through the CPU blitter), and
wined3d_texture_gl_upload_data() is one of the only functions to correctly
handle planar YUV formats.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52684
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2022-04-26 23:52:32 -05:00 committed by Alexandre Julliard
parent bdfa18eccc
commit 27e84c2897
7 changed files with 26 additions and 16 deletions

View File

@ -5925,7 +5925,7 @@ static void add_dirty_rect_test(void)
ok(hr == D3D_OK, "Failed to copy rects, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
todo_wine ok(color_match(color, 0x00ff0000, 1), "Got unexpected colour 0x%08x.\n", color);
ok(color_match(color, 0x00ff0000, 1), "Got unexpected colour 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "Failed to present, hr %#x.\n", hr);

View File

@ -19776,7 +19776,7 @@ static void add_dirty_rect_test(void)
ok(hr == D3D_OK, "Failed to copy rects, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
todo_wine ok(color_match(color, 0x00ff0000, 1), "Got unexpected colour 0x%08x.\n", color);
ok(color_match(color, 0x00ff0000, 1), "Got unexpected colour 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "Failed to present, hr %#x.\n", hr);

View File

@ -10100,9 +10100,9 @@ static void test_yv12_overlay(void)
base = desc.lpSurface;
ok(base[0] == 0x10, "Got unexpected Y data 0x%02x.\n", base[0]);
base += desc.dwHeight * U1(desc).lPitch;
todo_wine ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
base += desc.dwHeight / 4 * U1(desc).lPitch;
todo_wine ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
hr = IDirectDrawSurface_Unlock(dst_surface, NULL);
ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x.\n", hr);

View File

@ -10930,9 +10930,9 @@ static void test_yv12_overlay(void)
base = desc.lpSurface;
ok(base[0] == 0x10, "Got unexpected Y data 0x%02x.\n", base[0]);
base += desc.dwHeight * U1(desc).lPitch;
todo_wine ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
base += desc.dwHeight / 4 * U1(desc).lPitch;
todo_wine ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
hr = IDirectDrawSurface_Unlock(dst_surface, NULL);
ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x.\n", hr);

View File

@ -12886,9 +12886,9 @@ static void test_yv12_overlay(void)
base = desc.lpSurface;
ok(base[0] == 0x10, "Got unexpected Y data 0x%02x.\n", base[0]);
base += desc.dwHeight * U1(desc).lPitch;
todo_wine ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
base += desc.dwHeight / 4 * U1(desc).lPitch;
todo_wine ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
hr = IDirectDrawSurface4_Unlock(dst_surface, NULL);
ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x.\n", hr);

View File

@ -12879,9 +12879,9 @@ static void test_yv12_overlay(void)
base = desc.lpSurface;
ok(base[0] == 0x10, "Got unexpected Y data 0x%02x.\n", base[0]);
base += desc.dwHeight * U1(desc).lPitch;
todo_wine ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
ok(base[0] == 0x20, "Got unexpected V data 0x%02x.\n", base[0]);
base += desc.dwHeight / 4 * U1(desc).lPitch;
todo_wine ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
ok(base[0] == 0x30, "Got unexpected U data 0x%02x.\n", base[0]);
hr = IDirectDrawSurface7_Unlock(dst_surface, NULL);
ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x.\n", hr);

View File

@ -31,9 +31,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
static const DWORD surface_simple_locations = WINED3D_LOCATION_SYSMEM
| WINED3D_LOCATION_BUFFER | WINED3D_LOCATION_CLEARED;
/* Works correctly only for <= 4 bpp formats. */
static void get_color_masks(const struct wined3d_format *format, uint32_t *masks)
{
@ -1481,6 +1478,19 @@ static bool wined3d_is_colour_blit(enum wined3d_blit_op blit_op)
}
}
static bool sub_resource_is_on_cpu(const struct wined3d_texture *texture, unsigned int sub_resource_idx)
{
DWORD locations = texture->sub_resources[sub_resource_idx].locations;
if (locations & (WINED3D_LOCATION_BUFFER | WINED3D_LOCATION_SYSMEM))
return true;
if (!(texture->resource.access & WINED3D_RESOURCE_ACCESS_GPU) && (locations & WINED3D_LOCATION_CLEARED))
return true;
return false;
}
HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
const struct wined3d_box *dst_box, struct wined3d_texture *src_texture, unsigned int src_sub_resource_idx,
const struct wined3d_box *src_box, DWORD flags, const struct wined3d_blt_fx *fx,
@ -1641,8 +1651,8 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
{
blit_op = WINED3D_BLIT_OP_COLOR_BLIT_ALPHATEST;
}
else if ((src_sub_resource->locations & surface_simple_locations)
&& !(dst_sub_resource->locations & surface_simple_locations)
else if (sub_resource_is_on_cpu(src_texture, src_sub_resource_idx)
&& !sub_resource_is_on_cpu(dst_texture, dst_sub_resource_idx)
&& (dst_texture->resource.access & WINED3D_RESOURCE_ACCESS_GPU))
{
/* Upload */
@ -1666,7 +1676,7 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
return WINED3D_OK;
}
}
else if (!(src_sub_resource->locations & surface_simple_locations)
else if (!sub_resource_is_on_cpu(src_texture, src_sub_resource_idx)
&& (dst_sub_resource->locations & dst_texture->resource.map_binding)
&& !(dst_texture->resource.access & WINED3D_RESOURCE_ACCESS_GPU))
{