This broke after d58e917e2cb36c6ffcb259356c06171d8f6d4dcc in some situations, since it resulted in us calling wined3d_texture_download_from_texture() with CLEARED location. The latter was not aware of CLEARED and incorrectly assumed the source texture was in TEXTURE_SRGB.
From: Elizabeth Figura zfigura@codeweavers.com
Fixes: d58e917e2cb36c6ffcb259356c06171d8f6d4dcc --- dlls/wined3d/surface.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 4ad1e65fafb..26f130654c1 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1498,6 +1498,14 @@ 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 & WINED3D_LOCATION_CLEARED) + { + TRACE("Source is cleared.\n"); + wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, WINED3D_LOCATION_CLEARED); + wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~WINED3D_LOCATION_CLEARED); + dst_sub_resource->clear_value.colour = src_sub_resource->clear_value.colour; + return WINED3D_OK; + } 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))
From: Elizabeth Figura zfigura@codeweavers.com
Do not consider cleared textures here; wined3d_texture_download_from_texture() cannot handle them, and conceptually should not need to. This has no effect after the previous commit, but is more declarative. --- dlls/wined3d/surface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 26f130654c1..3fe47b06716 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1531,7 +1531,7 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_ return WINED3D_OK; } } - else if (!sub_resource_is_on_cpu(src_texture, src_sub_resource_idx) + else if (!(src_sub_resource->locations & (WINED3D_LOCATION_BUFFER | WINED3D_LOCATION_SYSMEM)) && !(dst_texture->resource.access & WINED3D_RESOURCE_ACCESS_GPU)) { /* Download */