On Mon, 9 Mar 2020 at 14:08, Paul Gofman <gofmanp(a)gmail.com> wrote:
@@ -188,9 +194,14 @@ void texture2d_blt_fbo(struct wined3d_device *device, struct wined3d_context *co * the purpose of loading the destination surface.) */ wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, src_location); if (!texture2d_is_full_rect(dst_texture, dst_sub_resource_idx % dst_texture->level_count, dst_rect)) + { wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, dst_location); + } else + { wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, dst_location); + wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, dst_location); + } ... - if (dst_location == WINED3D_LOCATION_DRAWABLE && dst_texture->swapchain->front_buffer == dst_texture) + if (dst_location != orig_dst_location) + { + wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~dst_location); + wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, orig_dst_location); + }
As a general rule, it's not ideal to manipulate the valid locations here, for various reasons. It would probably be best to do any resolving in fbo_blitter_blit() instead of texture2d_blt_fbo(), and then return the valid locations to the caller. (Compare e.g. cpu_blitter_blit().)