On 22 August 2013 00:30, Stefan Dösinger <ste...@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.