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