[PATCH 1/7] wined3d: Introduce wined3d_device_map_sub_resource().
Józef Kucia
jkucia at codeweavers.com
Sun Nov 1 21:17:02 CST 2015
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/buffer.c | 21 +++++++++++++++++++++
dlls/wined3d/device.c | 18 ++++++++++++++++++
dlls/wined3d/resource.c | 10 ++++++++++
dlls/wined3d/surface.c | 7 +++++++
dlls/wined3d/texture.c | 24 +++++++++---------------
dlls/wined3d/volume.c | 7 +++++++
dlls/wined3d/wined3d.spec | 1 +
dlls/wined3d/wined3d_private.h | 7 +++++--
include/wine/wined3d.h | 3 +++
9 files changed, 81 insertions(+), 17 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 19df398..6a6156b 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1123,11 +1123,32 @@ static ULONG buffer_resource_decref(struct wined3d_resource *resource)
return wined3d_buffer_decref(buffer_from_resource(resource));
}
+static HRESULT buffer_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc,
+ const struct wined3d_box *box, DWORD flags)
+{
+ struct wined3d_buffer *buffer = buffer_from_resource(resource);
+ UINT offset, size;
+
+ if (box)
+ {
+ offset = box->left;
+ size = box->right - box->left;
+ }
+ else
+ {
+ offset = size = 0;
+ }
+
+ map_desc->row_pitch = map_desc->slice_pitch = buffer->desc.byte_width;
+ return wined3d_buffer_map(buffer, offset, size, (BYTE **)&map_desc->data, flags);
+}
+
static const struct wined3d_resource_ops buffer_resource_ops =
{
buffer_resource_incref,
buffer_resource_decref,
buffer_unload,
+ buffer_resource_map,
};
static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index d00f263..1c63444 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4019,6 +4019,24 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
surface_invalidate_location(surface, ~WINED3D_LOCATION_TEXTURE_RGB);
}
+HRESULT CDECL wined3d_device_map_sub_resource(struct wined3d_device *device,
+ struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
+{
+ struct wined3d_resource *sub_resource;
+
+ TRACE("device %p, resource %p, sub_resource_idx %u, map_desc %p, box %p, flags %#x.\n",
+ device, resource, sub_resource_idx, map_desc, box, flags);
+
+ if (!(sub_resource = sub_resource_from_resource(resource, sub_resource_idx)))
+ {
+ WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
+ return E_INVALIDARG;
+ }
+
+ return sub_resource->resource_ops->resource_map(sub_resource, map_desc, box, flags);
+}
+
HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *device,
struct wined3d_rendertarget_view *view, const RECT *rect, const struct wined3d_color *color)
{
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 1891165..f03f383 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -414,3 +414,13 @@ void wined3d_resource_update_draw_binding(struct wined3d_resource *resource)
else
resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB;
}
+
+struct wined3d_resource *sub_resource_from_resource(struct wined3d_resource *resource, unsigned int sub_resource_idx)
+{
+ if (resource->type == WINED3D_RTYPE_TEXTURE)
+ return wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), sub_resource_idx);
+ else if (!sub_resource_idx)
+ return resource;
+ else
+ return NULL;
+}
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index e1633fc..9322b01 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1200,11 +1200,18 @@ static void surface_unload(struct wined3d_resource *resource)
resource_unload(resource);
}
+static HRESULT surface_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc,
+ const struct wined3d_box *box, DWORD flags)
+{
+ return wined3d_surface_map(surface_from_resource(resource), map_desc, box, flags);
+}
+
static const struct wined3d_resource_ops surface_resource_ops =
{
surface_resource_incref,
surface_resource_decref,
surface_unload,
+ surface_resource_map,
};
static const struct wined3d_surface_ops surface_ops =
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index f8ebfff..8a77b89 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -919,12 +919,6 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi
}
}
-static HRESULT texture2d_sub_resource_map(struct wined3d_resource *sub_resource,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
-{
- return wined3d_surface_map(surface_from_resource(sub_resource), map_desc, box, flags);
-}
-
static HRESULT texture2d_sub_resource_unmap(struct wined3d_resource *sub_resource)
{
return wined3d_surface_unmap(surface_from_resource(sub_resource));
@@ -938,7 +932,6 @@ static const struct wined3d_texture_ops texture2d_ops =
texture2d_sub_resource_invalidate_location,
texture2d_sub_resource_validate_location,
texture2d_sub_resource_upload_data,
- texture2d_sub_resource_map,
texture2d_sub_resource_unmap,
texture2d_prepare_texture,
};
@@ -972,11 +965,19 @@ static void wined3d_texture_unload(struct wined3d_resource *resource)
wined3d_texture_unload_gl_texture(texture);
}
+static HRESULT texture_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc,
+ const struct wined3d_box *box, DWORD flags)
+{
+ ERR("Texture resource cannot be mapped.\n");
+ return WINED3DERR_INVALIDCALL;
+}
+
static const struct wined3d_resource_ops texture_resource_ops =
{
texture_resource_incref,
texture_resource_decref,
wined3d_texture_unload,
+ texture_resource_map,
};
static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc,
@@ -1307,12 +1308,6 @@ static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wi
}
}
-static HRESULT texture3d_sub_resource_map(struct wined3d_resource *sub_resource,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
-{
- return wined3d_volume_map(volume_from_resource(sub_resource), map_desc, box, flags);
-}
-
static HRESULT texture3d_sub_resource_unmap(struct wined3d_resource *sub_resource)
{
return wined3d_volume_unmap(volume_from_resource(sub_resource));
@@ -1326,7 +1321,6 @@ static const struct wined3d_texture_ops texture3d_ops =
texture3d_sub_resource_invalidate_location,
texture3d_sub_resource_validate_location,
texture3d_sub_resource_upload_data,
- texture3d_sub_resource_map,
texture3d_sub_resource_unmap,
texture3d_prepare_texture,
};
@@ -1531,7 +1525,7 @@ HRESULT CDECL wined3d_texture_map(struct wined3d_texture *texture, unsigned int
if (!(sub_resource = wined3d_texture_get_sub_resource(texture, sub_resource_idx)))
return WINED3DERR_INVALIDCALL;
- return texture->texture_ops->texture_sub_resource_map(sub_resource, map_desc, box, flags);
+ return sub_resource->resource_ops->resource_map(sub_resource, map_desc, box, flags);
}
HRESULT CDECL wined3d_texture_unmap(struct wined3d_texture *texture, unsigned int sub_resource_idx)
diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 41264e8..d0a7e25 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -700,11 +700,18 @@ static ULONG volume_resource_decref(struct wined3d_resource *resource)
return wined3d_texture_decref(volume->container);
}
+static HRESULT volume_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc,
+ const struct wined3d_box *box, DWORD flags)
+{
+ return wined3d_volume_map(volume_from_resource(resource), map_desc, box, flags);
+}
+
static const struct wined3d_resource_ops volume_resource_ops =
{
volume_resource_incref,
volume_resource_decref,
volume_unload,
+ volume_resource_map,
};
static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture *container,
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 219c190..fcf2f71 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -102,6 +102,7 @@
@ cdecl wined3d_device_incref(ptr)
@ cdecl wined3d_device_init_3d(ptr ptr)
@ cdecl wined3d_device_init_gdi(ptr ptr)
+@ cdecl wined3d_device_map_sub_resource(ptr ptr long ptr ptr long)
@ cdecl wined3d_device_multiply_transform(ptr long ptr)
@ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long)
@ cdecl wined3d_device_release_focus_window(ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index fd7bbc8..fb296b1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2156,6 +2156,8 @@ struct wined3d_resource_ops
ULONG (*resource_incref)(struct wined3d_resource *resource);
ULONG (*resource_decref)(struct wined3d_resource *resource);
void (*resource_unload)(struct wined3d_resource *resource);
+ HRESULT (*resource_map)(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc,
+ const struct wined3d_box *box, DWORD flags);
};
struct wined3d_resource
@@ -2214,6 +2216,9 @@ BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_H
DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
+struct wined3d_resource *sub_resource_from_resource(struct wined3d_resource *resource,
+ unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
+
/* Tests show that the start address of resources is 32 byte aligned */
#define RESOURCE_ALIGNMENT 16
@@ -2235,8 +2240,6 @@ struct wined3d_texture_ops
void (*texture_sub_resource_validate_location)(struct wined3d_resource *sub_resource, DWORD location);
void (*texture_sub_resource_upload_data)(struct wined3d_resource *sub_resource,
const struct wined3d_context *context, const struct wined3d_sub_resource_data *data);
- HRESULT (*texture_sub_resource_map)(struct wined3d_resource *sub_resource,
- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags);
HRESULT (*texture_sub_resource_unmap)(struct wined3d_resource *sub_resource);
void (*texture_prepare_texture)(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 9cc1e1c..ebb839c 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2227,6 +2227,9 @@ struct wined3d_sampler * __cdecl wined3d_device_get_vs_sampler(const struct wine
ULONG __cdecl wined3d_device_incref(struct wined3d_device *device);
HRESULT __cdecl wined3d_device_init_3d(struct wined3d_device *device, struct wined3d_swapchain_desc *swapchain_desc);
HRESULT __cdecl wined3d_device_init_gdi(struct wined3d_device *device, struct wined3d_swapchain_desc *swapchain_desc);
+HRESULT __cdecl wined3d_device_map_sub_resource(struct wined3d_device *device,
+ struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags);
void __cdecl wined3d_device_multiply_transform(struct wined3d_device *device,
enum wined3d_transform_state state, const struct wined3d_matrix *matrix);
HRESULT __cdecl wined3d_device_process_vertices(struct wined3d_device *device,
--
2.4.10
More information about the wine-patches
mailing list