[PATCH 4/5] wined3d: Prevent blits to surfaces that will be converted.
Stefan Dösinger
stefan at codeweavers.com
Wed Jan 15 15:02:17 CST 2014
SFLAG_CONVERTED is set during GL texture load, which makes sense but is
too late to prevent a GL side blit to a converted texture, which we
later can't read back. This issue is hidden because ddraw sets
WINED3D_SURFACE_PIN_SYSMEM, so wined3d never discards sysmem and the
sysmem to sysmem blit optimization prevents a texture side blit.
I don't think we want to rely on a performance optimization for correct
behavior. So explicitly check the conditions that could lead to a
converted load before blitting.
---
dlls/wined3d/surface.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index ec9f586..015478f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -6032,6 +6032,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC
DWORD src_ds_flags, dst_ds_flags;
RECT src_rect, dst_rect;
BOOL scale, convert;
+ enum wined3d_conversion_type dst_convert_type;
+ struct wined3d_format dst_conv_fmt;
static const DWORD simple_blit = WINEDDBLT_ASYNC
| WINEDDBLT_COLORFILL
@@ -6146,7 +6148,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC
/* We want to avoid invalidating the sysmem location for converted
* surfaces, since otherwise we'd have to convert the data back when
* locking them. */
- if (dst_surface->flags & SFLAG_CONVERTED)
+ d3dfmt_get_conv(dst_surface, TRUE, TRUE, &dst_conv_fmt, &dst_convert_type);
+ if (dst_convert_type != WINED3D_CT_NONE || dst_conv_fmt.convert || dst_surface->flags & SFLAG_CONVERTED)
{
WARN_(d3d_perf)("Converted surface, using CPU blit.\n");
goto cpu;
--
1.8.3.2
More information about the wine-patches
mailing list