diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 0a7112cc64f..6a93de498a0 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -4084,16 +4084,23 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, } /* Context activation is done by the caller. */ -static void surface_multisample_resolve(struct wined3d_surface *surface, struct wined3d_context *context) +static void surface_load_renderbuffer(struct wined3d_surface *surface, struct wined3d_context *context, + DWORD dst_location) { - RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + const RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + DWORD src_location; - if (!(surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE)) - ERR("Trying to resolve multisampled surface %p, but location WINED3D_LOCATION_RB_MULTISAMPLE not current.\n", - surface); + if (surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE) + src_location = WINED3D_LOCATION_RB_MULTISAMPLE; + else if (surface->locations & WINED3D_LOCATION_RB_RESOLVED) + src_location = WINED3D_LOCATION_RB_RESOLVED; + else if (surface->locations & WINED3D_LOCATION_TEXTURE_SRGB) + src_location = WINED3D_LOCATION_TEXTURE_SRGB; + else /* surface_blt_fbo will load the source location if necessary. */ + src_location = WINED3D_LOCATION_TEXTURE_RGB; surface_blt_fbo(surface->resource.device, context, WINED3D_TEXF_POINT, - surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); + surface, src_location, &rect, surface, dst_location, &rect); } /* Context activation is done by the caller. Context may be NULL in ddraw-only mode. */ @@ -4161,7 +4168,8 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co break; case WINED3D_LOCATION_RB_RESOLVED: - surface_multisample_resolve(surface, context); + case WINED3D_LOCATION_RB_MULTISAMPLE: + surface_load_renderbuffer(surface, context, location); break; case WINED3D_LOCATION_TEXTURE_RGB: