[PATCH 5/5] wined3d: Implement basic volume location management

Henri Verbeet hverbeet at gmail.com
Thu Aug 22 02:11:46 CDT 2013


On 22 August 2013 00:30, Stefan Dösinger <stefan at codeweavers.com> wrote:
> +const char *wined3d_debug_location(DWORD location)
> +{
> +    char buf[238];
That number looks a bit arbitrary, although I suppose it's at least
large enough.

> +    if (volume->resource.pool == WINED3D_POOL_SYSTEM_MEM
> +            || volume->resource.pool == WINED3D_POOL_SCRATCH)
> +    {
> +        if (location & ~WINED3D_LOCATION_SYSMEM)
> +        {
> +            ERR("Trying to load a sysmem or scratch volume into %s.\n",
> +                    wined3d_debug_location(location));
> +            return;
> +        }
> +    }
In principle we have resource_access_from_location() and the
access_flags field in struct wined3d_resource for this. It's only a
warning in surface_load_location() because we load e.g. default pool
surfaces into sysmem for CPU fallbacks, but that doesn't apply to
volumes. The right way for surfaces would probably be to use a staging
resource for CPU fallbacks instead, or something along those lines.

> +    if (count_bits(location) > 1)
> +        FIXME("Implement loading two locations with one call\n");
> +
I don't think we really want that.

> +static void wined3d_volume_update_location(struct wined3d_volume *volume, DWORD location, BOOL keep)
> +{
> +    if (keep)
> +    {
> +        TRACE("Volume %p, invalidating %s.\n", volume,
> +                wined3d_debug_location(volume->locations & ~location));
> +        volume->locations = location;
> +    }
> +    else
> +    {
> +        TRACE("Volume %p, invalidating %s.\n", volume, wined3d_debug_location(location));
> +        volume->locations &= ~location;
> +    }
> +}
I'm a bit unhappy with the "persistent" flag to
surface_modify_location(), and this is essentially the same thing. I
think it would be better to just have two separate functions,
wined3d_volume_invalidate_location() and
wined3d_volume_validate_location(). Perhaps
wined3d_volume_update_location() can work too, but in that case I
think it should take two location masks, one to set and one to clear.



More information about the wine-devel mailing list