Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/cs.c | 22 +++++++++++++++------- dlls/wined3d/resource.c | 4 ++-- dlls/wined3d/wined3d_private.h | 9 +++++---- 3 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 32ea900e27d..bb11851c1be 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2279,9 +2279,11 @@ static void wined3d_cs_exec_map(struct wined3d_cs *cs, const void *data) op->sub_resource_idx, op->map_desc, op->box, op->flags); }
-HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, unsigned int sub_resource_idx, - struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags) +static HRESULT wined3d_cs_map(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, + unsigned int flags) { + struct wined3d_cs *cs = wined3d_cs_from_context(context); struct wined3d_cs_map *op; HRESULT hr;
@@ -2289,7 +2291,7 @@ HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, * increasing the map count would be visible to applications. */ wined3d_not_from_cs(cs);
- op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_MAP); + op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_MAP); op->opcode = WINED3D_CS_OP_MAP; op->resource = resource; op->sub_resource_idx = sub_resource_idx; @@ -2298,7 +2300,7 @@ HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, op->flags = flags; op->hr = &hr;
- wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_MAP); + wined3d_device_context_submit(context, WINED3D_CS_QUEUE_MAP); wined3d_cs_finish(cs, WINED3D_CS_QUEUE_MAP);
return hr; @@ -2312,20 +2314,22 @@ static void wined3d_cs_exec_unmap(struct wined3d_cs *cs, const void *data) *op->hr = resource->resource_ops->resource_sub_resource_unmap(resource, op->sub_resource_idx); }
-HRESULT wined3d_cs_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource, unsigned int sub_resource_idx) +static HRESULT wined3d_cs_unmap(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx) { + struct wined3d_cs *cs = wined3d_cs_from_context(context); struct wined3d_cs_unmap *op; HRESULT hr;
wined3d_not_from_cs(cs);
- op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_MAP); + op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_MAP); op->opcode = WINED3D_CS_OP_UNMAP; op->resource = resource; op->sub_resource_idx = sub_resource_idx; op->hr = &hr;
- wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_MAP); + wined3d_device_context_submit(context, WINED3D_CS_QUEUE_MAP); wined3d_cs_finish(cs, WINED3D_CS_QUEUE_MAP);
return hr; @@ -2790,6 +2794,8 @@ static const struct wined3d_device_context_ops wined3d_cs_st_ops = wined3d_cs_st_submit, wined3d_cs_st_finish, wined3d_cs_st_push_constants, + wined3d_cs_map, + wined3d_cs_unmap, };
static BOOL wined3d_cs_queue_is_empty(const struct wined3d_cs *cs, const struct wined3d_cs_queue *queue) @@ -2911,6 +2917,8 @@ static const struct wined3d_device_context_ops wined3d_cs_mt_ops = wined3d_cs_mt_submit, wined3d_cs_mt_finish, wined3d_cs_mt_push_constants, + wined3d_cs_map, + wined3d_cs_unmap, };
static void poll_queries(struct wined3d_cs *cs) diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 8f2dc9ad095..6c937fa79b2 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -376,14 +376,14 @@ HRESULT CDECL wined3d_resource_map(struct wined3d_resource *resource, unsigned i flags = wined3d_resource_sanitise_map_flags(resource, flags); wined3d_resource_wait_idle(resource);
- return wined3d_cs_map(resource->device->cs, resource, sub_resource_idx, map_desc, box, flags); + return resource->device->cs->c.ops->map(&resource->device->cs->c, resource, sub_resource_idx, map_desc, box, flags); }
HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx) { TRACE("resource %p, sub_resource_idx %u.\n", resource, sub_resource_idx);
- return wined3d_cs_unmap(resource->device->cs, resource, sub_resource_idx); + return resource->device->cs->c.ops->unmap(&resource->device->cs->c, resource, sub_resource_idx); }
void CDECL wined3d_resource_preload(struct wined3d_resource *resource) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 34ec814685c..26d3efda24d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4686,6 +4686,11 @@ struct wined3d_device_context_ops void (*finish)(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id); void (*push_constants)(struct wined3d_device_context *context, enum wined3d_push_constants p, unsigned int start_idx, unsigned int count, const void *constants); + HRESULT (*map)(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, + unsigned int flags); + HRESULT (*unmap)(struct wined3d_device_context *context, struct wined3d_resource *resource, + unsigned int sub_resource_idx); };
struct wined3d_device_context @@ -4755,10 +4760,6 @@ void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform void wined3d_cs_emit_unload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; void wined3d_cs_init_object(struct wined3d_cs *cs, void (*callback)(void *object), void *object) DECLSPEC_HIDDEN; -HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, unsigned int sub_resource_idx, - struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags) DECLSPEC_HIDDEN; -HRESULT wined3d_cs_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource, - unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
static inline void wined3d_cs_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) {
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/device.c | 66 +++++++++++++++++++++++++++++++++++++++ dlls/wined3d/resource.c | 58 +--------------------------------- dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 3 ++ 4 files changed, 71 insertions(+), 57 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index b1f7568842e..67b1de831e3 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5250,6 +5250,72 @@ void CDECL wined3d_device_context_clear_uav_uint(struct wined3d_device_context * wined3d_device_context_emit_clear_uav_uint(context, view, clear_value); }
+static unsigned int sanitise_map_flags(const struct wined3d_resource *resource, unsigned int flags) +{ + /* Not all flags make sense together, but Windows never returns an error. + * Catch the cases that could cause issues. */ + if (flags & WINED3D_MAP_READ) + { + if (flags & WINED3D_MAP_DISCARD) + { + WARN("WINED3D_MAP_READ combined with WINED3D_MAP_DISCARD, ignoring flags.\n"); + return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); + } + if (flags & WINED3D_MAP_NOOVERWRITE) + { + WARN("WINED3D_MAP_READ combined with WINED3D_MAP_NOOVERWRITE, ignoring flags.\n"); + return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); + } + } + else if (flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) + { + if (!(resource->usage & WINED3DUSAGE_DYNAMIC)) + { + WARN("DISCARD or NOOVERWRITE map on non-dynamic buffer, ignoring.\n"); + return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); + } + if ((flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) + == (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) + { + WARN("WINED3D_MAP_NOOVERWRITE used with WINED3D_MAP_DISCARD, ignoring WINED3D_MAP_DISCARD.\n"); + flags &= ~WINED3D_MAP_DISCARD; + } + } + + return flags; +} + +HRESULT CDECL wined3d_device_context_map(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags) +{ + TRACE("context %p, resource %p, sub_resource_idx %u, map_desc %p, box %s, flags %#x.\n", + context, resource, sub_resource_idx, map_desc, debug_box(box), flags); + + if (!(flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE))) + { + WARN("No read/write flags specified.\n"); + return E_INVALIDARG; + } + + if ((flags & WINED3D_MAP_READ) && !(resource->access & WINED3D_RESOURCE_ACCESS_MAP_R)) + { + WARN("Resource does not have MAP_R access.\n"); + return E_INVALIDARG; + } + + if ((flags & WINED3D_MAP_WRITE) && !(resource->access & WINED3D_RESOURCE_ACCESS_MAP_W)) + { + WARN("Resource does not have MAP_W access.\n"); + return E_INVALIDARG; + } + + flags = sanitise_map_flags(resource, flags); + wined3d_resource_wait_idle(resource); + + return context->ops->map(context, resource, sub_resource_idx, map_desc, box, flags); +} + struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(const struct wined3d_device *device, unsigned int view_idx) { diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 6c937fa79b2..8085c0e6aee 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -314,69 +314,13 @@ void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, st desc->size = resource->size; }
-static DWORD wined3d_resource_sanitise_map_flags(const struct wined3d_resource *resource, DWORD flags) -{ - /* Not all flags make sense together, but Windows never returns an error. - * Catch the cases that could cause issues. */ - if (flags & WINED3D_MAP_READ) - { - if (flags & WINED3D_MAP_DISCARD) - { - WARN("WINED3D_MAP_READ combined with WINED3D_MAP_DISCARD, ignoring flags.\n"); - return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); - } - if (flags & WINED3D_MAP_NOOVERWRITE) - { - WARN("WINED3D_MAP_READ combined with WINED3D_MAP_NOOVERWRITE, ignoring flags.\n"); - return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); - } - } - else if (flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) - { - if (!(resource->usage & WINED3DUSAGE_DYNAMIC)) - { - WARN("DISCARD or NOOVERWRITE map on non-dynamic buffer, ignoring.\n"); - return flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE); - } - if ((flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) - == (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) - { - WARN("WINED3D_MAP_NOOVERWRITE used with WINED3D_MAP_DISCARD, ignoring WINED3D_MAP_DISCARD.\n"); - flags &= ~WINED3D_MAP_DISCARD; - } - } - - return flags; -} - HRESULT CDECL wined3d_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) { TRACE("resource %p, sub_resource_idx %u, map_desc %p, box %s, flags %#x.\n", resource, sub_resource_idx, map_desc, debug_box(box), flags);
- if (!(flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE))) - { - WARN("No read/write flags specified.\n"); - return E_INVALIDARG; - } - - if ((flags & WINED3D_MAP_READ) && !(resource->access & WINED3D_RESOURCE_ACCESS_MAP_R)) - { - WARN("Resource does not have MAP_R access.\n"); - return E_INVALIDARG; - } - - if ((flags & WINED3D_MAP_WRITE) && !(resource->access & WINED3D_RESOURCE_ACCESS_MAP_W)) - { - WARN("Resource does not have MAP_W access.\n"); - return E_INVALIDARG; - } - - flags = wined3d_resource_sanitise_map_flags(resource, flags); - wined3d_resource_wait_idle(resource); - - return resource->device->cs->c.ops->map(&resource->device->cs->c, resource, sub_resource_idx, map_desc, box, flags); + return wined3d_device_context_map(&resource->device->cs->c, resource, sub_resource_idx, map_desc, box, flags); }
HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx) diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index cff4fd86b1a..874b0a9dfc7 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -171,6 +171,7 @@ @ cdecl wined3d_device_context_dispatch(ptr long long long) @ cdecl wined3d_device_context_dispatch_indirect(ptr ptr long) @ cdecl wined3d_device_context_generate_mipmaps(ptr ptr) +@ cdecl wined3d_device_context_map(ptr ptr long ptr ptr long) @ cdecl wined3d_device_context_resolve_sub_resource(ptr ptr long ptr long long) @ cdecl wined3d_device_context_set_blend_state(ptr ptr ptr long) @ cdecl wined3d_device_context_set_constant_buffer(ptr long long ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index c6c97da4fbe..a0c5a876ad7 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2566,6 +2566,9 @@ void __cdecl wined3d_device_context_draw_indirect(struct wined3d_device_context struct wined3d_buffer *buffer, unsigned int offset, bool indexed); void __cdecl wined3d_device_context_generate_mipmaps(struct wined3d_device_context *context, struct wined3d_shader_resource_view *view); +HRESULT __cdecl wined3d_device_context_map(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags); void __cdecl wined3d_device_context_resolve_sub_resource(struct wined3d_device_context *context, struct wined3d_resource *dst_resource, unsigned int dst_sub_resource_idx, struct wined3d_resource *src_resource, unsigned int src_sub_resource_idx, enum wined3d_format_id format_id);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d11/device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 9845f93eebf..6944c479e60 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -603,6 +603,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_Draw(ID3D11DeviceContext1 static HRESULT STDMETHODCALLTYPE d3d11_immediate_context_Map(ID3D11DeviceContext1 *iface, ID3D11Resource *resource, UINT subresource_idx, D3D11_MAP map_type, UINT map_flags, D3D11_MAPPED_SUBRESOURCE *mapped_subresource) { + struct d3d11_immediate_context *context = impl_from_ID3D11DeviceContext1(iface); struct wined3d_resource *wined3d_resource; struct wined3d_map_desc map_desc; HRESULT hr; @@ -616,7 +617,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_immediate_context_Map(ID3D11DeviceContext wined3d_resource = wined3d_resource_from_d3d11_resource(resource);
wined3d_mutex_lock(); - hr = wined3d_resource_map(wined3d_resource, subresource_idx, + hr = wined3d_device_context_map(context->wined3d_context, wined3d_resource, subresource_idx, &map_desc, NULL, wined3d_map_flags_from_d3d11_map_type(map_type)); wined3d_mutex_unlock();
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=88627
Your paranoid android.
=== debiant2 (build log) ===
Task: Could not create the win32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the wow32 report
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/device.c | 8 ++++++++ dlls/wined3d/resource.c | 2 +- dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 67b1de831e3..9240bad9d27 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5316,6 +5316,14 @@ HRESULT CDECL wined3d_device_context_map(struct wined3d_device_context *context, return context->ops->map(context, resource, sub_resource_idx, map_desc, box, flags); }
+HRESULT CDECL wined3d_device_context_unmap(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx) +{ + TRACE("context %p, resource %p, sub_resource_idx %u.\n", context, resource, sub_resource_idx); + + return context->ops->unmap(context, resource, sub_resource_idx); +} + struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(const struct wined3d_device *device, unsigned int view_idx) { diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 8085c0e6aee..6e34605f547 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -327,7 +327,7 @@ HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned { TRACE("resource %p, sub_resource_idx %u.\n", resource, sub_resource_idx);
- return resource->device->cs->c.ops->unmap(&resource->device->cs->c, resource, sub_resource_idx); + return wined3d_device_context_unmap(&resource->device->cs->c, resource, sub_resource_idx); }
void CDECL wined3d_resource_preload(struct wined3d_resource *resource) diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 874b0a9dfc7..7c81eff1593 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -190,6 +190,7 @@ @ cdecl wined3d_device_context_set_unordered_access_view(ptr long long ptr long) @ cdecl wined3d_device_context_set_vertex_declaration(ptr ptr) @ cdecl wined3d_device_context_set_viewports(ptr long ptr) +@ cdecl wined3d_device_context_unmap(ptr ptr long) @ cdecl wined3d_device_context_update_sub_resource(ptr ptr long ptr ptr long long long)
@ cdecl wined3d_output_find_closest_matching_mode(ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index a0c5a876ad7..e0a205f3dad 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2607,6 +2607,8 @@ void __cdecl wined3d_device_context_set_vertex_declaration(struct wined3d_device struct wined3d_vertex_declaration *declaration); void __cdecl wined3d_device_context_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count, const struct wined3d_viewport *viewports); +HRESULT __cdecl wined3d_device_context_unmap(struct wined3d_device_context *context, + struct wined3d_resource *resource, unsigned int sub_resource_idx); void __cdecl wined3d_device_context_update_sub_resource(struct wined3d_device_context *context, struct wined3d_resource *resource, unsigned int sub_resource_idx, const struct wined3d_box *box, const void *data, unsigned int row_pitch, unsigned int depth_pitch, unsigned int flags);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d11/device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 6944c479e60..47f865ed14c 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -631,6 +631,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_immediate_context_Map(ID3D11DeviceContext static void STDMETHODCALLTYPE d3d11_immediate_context_Unmap(ID3D11DeviceContext1 *iface, ID3D11Resource *resource, UINT subresource_idx) { + struct d3d11_immediate_context *context = impl_from_ID3D11DeviceContext1(iface); struct wined3d_resource *wined3d_resource;
TRACE("iface %p, resource %p, subresource_idx %u.\n", iface, resource, subresource_idx); @@ -638,7 +639,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_Unmap(ID3D11DeviceContext1 wined3d_resource = wined3d_resource_from_d3d11_resource(resource);
wined3d_mutex_lock(); - wined3d_resource_unmap(wined3d_resource, subresource_idx); + wined3d_device_context_unmap(context->wined3d_context, wined3d_resource, subresource_idx); wined3d_mutex_unlock(); }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=88629
Your paranoid android.
=== debiant2 (build log) ===
Task: Could not create the win32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the wow32 report
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com