Henri Verbeet : wined3d: Add some initial access checking for resources.
Alexandre Julliard
julliard at winehq.org
Fri May 6 13:43:59 CDT 2011
Module: wine
Branch: master
Commit: f9f83fc88495244a683dd10a0a1004c39a36c2e1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9f83fc88495244a683dd10a0a1004c39a36c2e1
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu May 5 20:56:07 2011 +0200
wined3d: Add some initial access checking for resources.
Just print a WARN in surface_load_location() for the moment. We currently
pretend all resources are managed, strictly enforcing pool restrictions would
just break a lot of things.
---
dlls/wined3d/resource.c | 25 +++++++++++++++++++++++++
dlls/wined3d/surface.c | 26 ++++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 7 +++++++
3 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 3807e89..253fc52 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -43,6 +43,28 @@ struct private_data
DWORD size;
};
+static DWORD resource_access_from_pool(WINED3DPOOL pool)
+{
+ switch (pool)
+ {
+ case WINED3DPOOL_DEFAULT:
+ return WINED3D_RESOURCE_ACCESS_GPU;
+
+ case WINED3DPOOL_MANAGED:
+ return WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU;
+
+ case WINED3DPOOL_SYSTEMMEM:
+ return WINED3D_RESOURCE_ACCESS_CPU;
+
+ case WINED3DPOOL_SCRATCH:
+ return WINED3D_RESOURCE_ACCESS_SCRATCH;
+
+ default:
+ FIXME("Unhandled pool %#x.\n", pool);
+ return 0;
+ }
+}
+
HRESULT resource_init(struct wined3d_resource *resource, IWineD3DDeviceImpl *device,
WINED3DRESOURCETYPE resource_type, const struct wined3d_format *format,
WINED3DMULTISAMPLE_TYPE multisample_type, UINT multisample_quality,
@@ -58,6 +80,9 @@ HRESULT resource_init(struct wined3d_resource *resource, IWineD3DDeviceImpl *dev
resource->multisample_quality = multisample_quality;
resource->usage = usage;
resource->pool = pool;
+ resource->access_flags = resource_access_from_pool(pool);
+ if (usage & WINED3DUSAGE_DYNAMIC)
+ resource->access_flags |= WINED3D_RESOURCE_ACCESS_CPU;
resource->width = width;
resource->height = height;
resource->depth = depth;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index f5245cc..ff84102 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -5846,6 +5846,24 @@ void surface_modify_location(struct wined3d_surface *surface, DWORD flag, BOOL p
}
}
+static DWORD resource_access_from_location(DWORD location)
+{
+ switch (location)
+ {
+ case SFLAG_INSYSMEM:
+ return WINED3D_RESOURCE_ACCESS_CPU;
+
+ case SFLAG_INDRAWABLE:
+ case SFLAG_INSRGBTEX:
+ case SFLAG_INTEXTURE:
+ return WINED3D_RESOURCE_ACCESS_GPU;
+
+ default:
+ FIXME("Unhandled location %#x.\n", location);
+ return 0;
+ }
+}
+
HRESULT surface_load_location(struct wined3d_surface *surface, DWORD flag, const RECT *rect)
{
IWineD3DDeviceImpl *device = surface->resource.device;
@@ -5902,6 +5920,14 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD flag, const
return WINED3D_OK;
}
+ if (WARN_ON(d3d_surface))
+ {
+ DWORD required_access = resource_access_from_location(flag);
+ if ((surface->resource.access_flags & required_access) != required_access)
+ WARN("Operation requires %#x access, but surface only has %#x.\n",
+ required_access, surface->resource.access_flags);
+ }
+
if (!(surface->flags & SFLAG_LOCATIONS))
{
ERR("Surface %p does not have any up to date location.\n", surface);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 199d7ef..549f827 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1798,6 +1798,12 @@ static inline BOOL isStateDirty(struct wined3d_context *context, DWORD state)
return context->isStateDirty[idx] & (1 << shift);
}
+#define WINED3D_RESOURCE_ACCESS_GPU 0x1
+#define WINED3D_RESOURCE_ACCESS_CPU 0x2
+/* SCRATCH is mostly the same as CPU, but can't be used by the GPU at all,
+ * not even for resource uploads. */
+#define WINED3D_RESOURCE_ACCESS_SCRATCH 0x4
+
struct wined3d_resource_ops
{
void (*resource_unload)(struct wined3d_resource *resource);
@@ -1813,6 +1819,7 @@ struct wined3d_resource
UINT multisample_quality;
DWORD usage;
WINED3DPOOL pool;
+ DWORD access_flags;
UINT width;
UINT height;
UINT depth;
More information about the wine-cvs
mailing list