WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
-void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture *container)
-{
- TRACE("volume %p, container %p.\n", volume, container);
-
- volume->container = container;
-}
+#define WINED3D_VFLAG_ALLOCATED 0x00000001
+#define WINED3D_VFLAG_SRGB_ALLOCATED 0x00000002
+#define WINED3D_VFLAG_CLIENT_STORAGE 0x00000004
static BOOL volume_prepare_system_memory(struct wined3d_volume *volume)
{
break;
case WINED3D_LOCATION_BUFFER:
- if (!volume->pbo || !(volume->flags & WINED3D_VFLAG_PBO))
+ if (!volume->pbo)
ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n");
if (volume->locations & WINED3D_LOCATION_DISCARDED)
context_release(context);
}
+void wined3d_volume_destroy(struct wined3d_volume *volume)
+{
+ TRACE("volume %p.\n", volume);
+
+ if (volume->pbo)
+ wined3d_volume_free_pbo(volume);
+
+ resource_cleanup(&volume->resource);
+ volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent);
+ HeapFree(GetProcessHeap(), 0, volume);
+}
+
static void volume_unload(struct wined3d_resource *resource)
{
struct wined3d_volume *volume = volume_from_resource(resource);
ULONG CDECL wined3d_volume_incref(struct wined3d_volume *volume)
{
- ULONG refcount;
-
- if (volume->container)
- {
- TRACE("Forwarding to container %p.\n", volume->container);
- return wined3d_texture_incref(volume->container);
- }
-
- refcount = InterlockedIncrement(&volume->resource.ref);
+ TRACE("Forwarding to container %p.\n", volume->container);
- TRACE("%p increasing refcount to %u.\n", volume, refcount);
-
- return refcount;
+ return wined3d_texture_incref(volume->container);
}
ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume)
{
- ULONG refcount;
-
- if (volume->container)
- {
- TRACE("Forwarding to container %p.\n", volume->container);
- return wined3d_texture_decref(volume->container);
- }
-
- refcount = InterlockedDecrement(&volume->resource.ref);
+ TRACE("Forwarding to container %p.\n", volume->container);
- TRACE("%p decreasing refcount to %u.\n", volume, refcount);
-
- if (!refcount)
- {
- if (volume->pbo)
- wined3d_volume_free_pbo(volume);
-
- resource_cleanup(&volume->resource);
- volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent);
- HeapFree(GetProcessHeap(), 0, volume);
- }
-
- return refcount;
+ return wined3d_texture_decref(volume->container);
}
void * CDECL wined3d_volume_get_parent(const struct wined3d_volume *volume)
return volume->resource.parent;
}
-DWORD CDECL wined3d_volume_set_priority(struct wined3d_volume *volume, DWORD priority)
-{
- return resource_set_priority(&volume->resource, priority);
-}
-
-DWORD CDECL wined3d_volume_get_priority(const struct wined3d_volume *volume)
-{
- return resource_get_priority(&volume->resource);
-}
-
void CDECL wined3d_volume_preload(struct wined3d_volume *volume)
{
FIXME("volume %p stub!\n", volume);
flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags);
- if (volume->flags & WINED3D_VFLAG_PBO)
+ if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER)
{
context = context_acquire(device, NULL);
gl_info = context->gl_info;
if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY)))
{
wined3d_texture_set_dirty(volume->container);
-
- if (volume->flags & WINED3D_VFLAG_PBO)
- wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_BUFFER);
- else
- wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_SYSMEM);
+ wined3d_volume_invalidate_location(volume, ~volume->resource.map_binding);
}
volume->resource.map_count++;
return WINED3DERR_INVALIDCALL;
}
- if (volume->flags & WINED3D_VFLAG_PBO)
+ if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER)
{
struct wined3d_device *device = volume->resource.device;
struct wined3d_context *context = context_acquire(device, NULL);
return WINED3D_OK;
}
+static ULONG volume_resource_incref(struct wined3d_resource *resource)
+{
+ return wined3d_volume_incref(volume_from_resource(resource));
+}
+
+static ULONG volume_resource_decref(struct wined3d_resource *resource)
+{
+ return wined3d_volume_decref(volume_from_resource(resource));
+}
+
static const struct wined3d_resource_ops volume_resource_ops =
{
+ volume_resource_incref,
+ volume_resource_decref,
volume_unload,
};
&& !format->convert)
{
wined3d_resource_free_sysmem(&volume->resource);
- volume->flags |= WINED3D_VFLAG_PBO;
+ volume->resource.map_binding = WINED3D_LOCATION_BUFFER;
}
- volume_set_container(volume, container);
+ volume->container = container;
return WINED3D_OK;
}
wined3d_texture_get_parent(container), object, &parent, &parent_ops)))
{
WARN("Failed to create volume parent, hr %#x.\n", hr);
- volume_set_container(object, NULL);
- wined3d_volume_decref(object);
+ wined3d_volume_destroy(object);
return hr;
}