[PATCH 1/2] wined3d: Make (wined3d_)surface_depth_blt_fbo handle locations other than SFLAG_INTEXTURE.

Henri Verbeet hverbeet at gmail.com
Sun Feb 17 15:26:44 CST 2013


On 17 February 2013 18:10, Matteo Bruni <mbruni at codeweavers.com> wrote:
> @@ -6168,18 +6172,10 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
>
>      if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
>      {
> -        if (location == SFLAG_INTEXTURE)
> -        {
> -            struct wined3d_context *context = context_acquire(device, NULL);
> -            surface_load_ds_location(surface, context, location);
> -            context_release(context);
> -            return WINED3D_OK;
> -        }
> -        else
> -        {
> -            FIXME("Unimplemented location %s for depth/stencil buffers.\n", debug_surflocation(location));
> -            return WINED3DERR_INVALIDCALL;
> -        }
> +        struct wined3d_context *context = context_acquire(device, NULL);
> +        surface_load_ds_location(surface, context, location);
> +        context_release(context);
> +        return WINED3D_OK;
>      }
This is probably wrong (and the original code is probably questionable
too), surface_load_ds_location() is only really meant for onscreen <->
offscreen blits. The original code is meant for the case where
AlwaysOffscreen is disabled and a depth stencil is used as texture.
The implication there is that the only possible locations are
SFLAG_INTEXTURE and SFLAG_INDRAWABLE, it doesn't really work with
multisampling. Fortunately you can't directly texture from
multisampled depth stencil surfaces either.

In principle we could make surface_load_ds_location() the generic
function for depth / stencil location transfers, but currently it
isn't. If you're hitting it with the RESZ code it probably only works
by accident.



More information about the wine-devel mailing list