[PATCH] wined3d: Reduce locking of device context operations.

Jan Sikorski jsikorski at codeweavers.com
Mon Nov 1 03:07:18 CDT 2021


Only actually take the lock for the immediate context. According to the
d3d11 documentation, operations on device contexts are not thread safe,
and testing on Windows confirms this.

Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
---
 dlls/wined3d/cs.c              |  18 ++--
 dlls/wined3d/device.c          | 152 ++++++++++++++++-----------------
 dlls/wined3d/wined3d_private.h |  12 +++
 3 files changed, 97 insertions(+), 85 deletions(-)

diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index f266e59b4b5..bcd26b6fbb1 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1019,7 +1019,7 @@ void CDECL wined3d_device_context_dispatch(struct wined3d_device_context *contex
 {
     struct wined3d_cs_dispatch *op;
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT);
     op->opcode = WINED3D_CS_OP_DISPATCH;
     op->parameters.indirect = FALSE;
@@ -1030,7 +1030,7 @@ void CDECL wined3d_device_context_dispatch(struct wined3d_device_context *contex
     acquire_compute_pipeline_resources(context);
 
     wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_dispatch_indirect(struct wined3d_device_context *context,
@@ -1038,7 +1038,7 @@ void CDECL wined3d_device_context_dispatch_indirect(struct wined3d_device_contex
 {
     struct wined3d_cs_dispatch *op;
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT);
     op->opcode = WINED3D_CS_OP_DISPATCH;
     op->parameters.indirect = TRUE;
@@ -1049,7 +1049,7 @@ void CDECL wined3d_device_context_dispatch_indirect(struct wined3d_device_contex
     wined3d_device_context_acquire_resource(context, &buffer->resource);
 
     wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
@@ -1206,7 +1206,7 @@ void CDECL wined3d_device_context_draw_indirect(struct wined3d_device_context *c
     const struct wined3d_state *state = context->state;
     struct wined3d_cs_draw *op;
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT);
     op->opcode = WINED3D_CS_OP_DRAW;
     op->primitive_type = state->primitive_type;
@@ -1220,7 +1220,7 @@ void CDECL wined3d_device_context_draw_indirect(struct wined3d_device_context *c
     wined3d_device_context_acquire_resource(context, &buffer->resource);
 
     wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static void wined3d_cs_exec_flush(struct wined3d_cs *cs, const void *data)
@@ -3824,7 +3824,7 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device
 
     TRACE("context %p, list %p.\n", context, list);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     memory = heap_alloc(sizeof(*object) + deferred->resource_count * sizeof(*object->resources)
             + deferred->upload_count * sizeof(*object->uploads)
             + deferred->command_list_count * sizeof(*object->command_lists)
@@ -3833,7 +3833,7 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device
 
     if (!memory)
     {
-        wined3d_mutex_unlock();
+        wined3d_device_context_unlock(context);
         return E_OUTOFMEMORY;
     }
 
@@ -3886,7 +3886,7 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device
 
     TRACE("Created command list %p.\n", object);
     *list = object;
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 
     return S_OK;
 }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1c584b93fe0..c5de58c29c9 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1649,11 +1649,11 @@ void CDECL wined3d_device_context_reset_state(struct wined3d_device_context *con
 {
     TRACE("context %p.\n", context);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     state_cleanup(context->state);
     wined3d_state_reset(context->state, &context->device->adapter->d3d_info);
     wined3d_device_context_emit_reset_state(context, true);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_state(struct wined3d_device_context *context, struct wined3d_state *state)
@@ -1663,7 +1663,7 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte
 
     TRACE("context %p, state %p.\n", context, state);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     context->state = state;
     wined3d_device_context_emit_set_feature_level(context, state->feature_level);
 
@@ -1760,7 +1760,7 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte
     wined3d_device_context_emit_set_blend_state(context, state->blend_state, &state->blend_factor, state->sample_mask);
     wined3d_device_context_emit_set_depth_stencil_state(context, state->depth_stencil_state, state->stencil_ref);
     wined3d_device_context_emit_set_rasterizer_state(context, state->rasterizer_state);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 struct wined3d_state * CDECL wined3d_device_get_state(struct wined3d_device *device)
@@ -1793,7 +1793,7 @@ void CDECL wined3d_device_context_set_shader(struct wined3d_device_context *cont
 
     TRACE("context %p, type %#x, shader %p.\n", context, type, shader);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->shader[type];
     if (shader == prev)
         goto out;
@@ -1805,7 +1805,7 @@ void CDECL wined3d_device_context_set_shader(struct wined3d_device_context *cont
     if (prev)
         wined3d_shader_decref(prev);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 struct wined3d_shader * CDECL wined3d_device_context_get_shader(const struct wined3d_device_context *context,
@@ -1831,7 +1831,7 @@ void CDECL wined3d_device_context_set_constant_buffers(struct wined3d_device_con
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (!memcmp(buffers, &state->cb[type][start_idx], count * sizeof(*buffers)))
         goto out;
 
@@ -1848,7 +1848,7 @@ void CDECL wined3d_device_context_set_constant_buffers(struct wined3d_device_con
             wined3d_buffer_decref(prev);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_blend_state(struct wined3d_device_context *context,
@@ -1860,7 +1860,7 @@ void CDECL wined3d_device_context_set_blend_state(struct wined3d_device_context
     TRACE("context %p, blend_state %p, blend_factor %p, sample_mask %#x.\n",
             context, blend_state, blend_factor, sample_mask);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->blend_state;
     if (prev == blend_state && !memcmp(blend_factor, &state->blend_factor, sizeof(*blend_factor))
             && sample_mask == state->sample_mask)
@@ -1875,7 +1875,7 @@ void CDECL wined3d_device_context_set_blend_state(struct wined3d_device_context
     if (prev)
         wined3d_blend_state_decref(prev);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_depth_stencil_state(struct wined3d_device_context *context,
@@ -1886,7 +1886,7 @@ void CDECL wined3d_device_context_set_depth_stencil_state(struct wined3d_device_
 
     TRACE("context %p, depth_stencil_state %p, stencil_ref %u.\n", context, depth_stencil_state, stencil_ref);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->depth_stencil_state;
     if (prev == depth_stencil_state && state->stencil_ref == stencil_ref)
         goto out;
@@ -1899,7 +1899,7 @@ void CDECL wined3d_device_context_set_depth_stencil_state(struct wined3d_device_
     if (prev)
         wined3d_depth_stencil_state_decref(prev);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_rasterizer_state(struct wined3d_device_context *context,
@@ -1910,7 +1910,7 @@ void CDECL wined3d_device_context_set_rasterizer_state(struct wined3d_device_con
 
     TRACE("context %p, rasterizer_state %p.\n", context, rasterizer_state);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->rasterizer_state;
     if (prev == rasterizer_state)
         goto out;
@@ -1922,7 +1922,7 @@ void CDECL wined3d_device_context_set_rasterizer_state(struct wined3d_device_con
     if (prev)
         wined3d_rasterizer_state_decref(prev);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count,
@@ -1939,7 +1939,7 @@ void CDECL wined3d_device_context_set_viewports(struct wined3d_device_context *c
                 viewports[i].width, viewports[i].height, viewports[i].min_z, viewports[i].max_z);
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (viewport_count)
         memcpy(state->viewports, viewports, viewport_count * sizeof(*viewports));
     else
@@ -1947,7 +1947,7 @@ void CDECL wined3d_device_context_set_viewports(struct wined3d_device_context *c
     state->viewport_count = viewport_count;
 
     wined3d_device_context_emit_set_viewports(context, viewport_count, viewports);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_scissor_rects(struct wined3d_device_context *context, unsigned int rect_count,
@@ -1963,7 +1963,7 @@ void CDECL wined3d_device_context_set_scissor_rects(struct wined3d_device_contex
         TRACE("%u: %s\n", i, wine_dbgstr_rect(&rects[i]));
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (state->scissor_rect_count == rect_count
             && !memcmp(state->scissor_rects, rects, rect_count * sizeof(*rects)))
     {
@@ -1979,7 +1979,7 @@ void CDECL wined3d_device_context_set_scissor_rects(struct wined3d_device_contex
 
     wined3d_device_context_emit_set_scissor_rects(context, rect_count, rects);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_shader_resource_views(struct wined3d_device_context *context,
@@ -1999,7 +1999,7 @@ void CDECL wined3d_device_context_set_shader_resource_views(struct wined3d_devic
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (!memcmp(views, &state->shader_resource_view[type][start_idx], count * sizeof(*views)))
         goto out;
 
@@ -2037,7 +2037,7 @@ void CDECL wined3d_device_context_set_shader_resource_views(struct wined3d_devic
         }
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_samplers(struct wined3d_device_context *context, enum wined3d_shader_type type,
@@ -2054,7 +2054,7 @@ void CDECL wined3d_device_context_set_samplers(struct wined3d_device_context *co
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (!memcmp(samplers, &state->sampler[type][start_idx], count * sizeof(*samplers)))
         goto out;
 
@@ -2071,7 +2071,7 @@ void CDECL wined3d_device_context_set_samplers(struct wined3d_device_context *co
             wined3d_sampler_decref(prev);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_unordered_access_views(struct wined3d_device_context *context,
@@ -2090,7 +2090,7 @@ void CDECL wined3d_device_context_set_unordered_access_views(struct wined3d_devi
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (!memcmp(uavs, &state->unordered_access_view[pipeline][start_idx], count * sizeof(*uavs)) && !initial_counts)
         goto out;
 
@@ -2107,7 +2107,7 @@ void CDECL wined3d_device_context_set_unordered_access_views(struct wined3d_devi
             wined3d_unordered_access_view_decref(prev);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_render_targets_and_unordered_access_views(struct wined3d_device_context *context,
@@ -2115,7 +2115,7 @@ void CDECL wined3d_device_context_set_render_targets_and_unordered_access_views(
         struct wined3d_rendertarget_view *depth_stencil_view, UINT uav_count,
         struct wined3d_unordered_access_view *const *unordered_access_views, const unsigned int *initial_counts)
 {
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (rtv_count != ~0u)
     {
         if (depth_stencil_view && !(depth_stencil_view->resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL))
@@ -2138,7 +2138,7 @@ void CDECL wined3d_device_context_set_render_targets_and_unordered_access_views(
                 unordered_access_views, initial_counts);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static void wined3d_device_context_unbind_srv_for_rtv(struct wined3d_device_context *context,
@@ -2200,7 +2200,7 @@ HRESULT CDECL wined3d_device_context_set_rendertarget_views(struct wined3d_devic
         }
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     /* Set the viewport and scissor rectangles, if requested. Tests show that
      * stateblock recording is ignored, the change goes directly into the
      * primary stateblock. */
@@ -2246,7 +2246,7 @@ HRESULT CDECL wined3d_device_context_set_rendertarget_views(struct wined3d_devic
         wined3d_device_context_unbind_srv_for_rtv(context, view, FALSE);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
     return WINED3D_OK;
 }
 
@@ -2265,7 +2265,7 @@ HRESULT CDECL wined3d_device_context_set_depth_stencil_view(struct wined3d_devic
         return WINED3DERR_INVALIDCALL;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = fb->depth_stencil;
     if (prev == view)
     {
@@ -2280,7 +2280,7 @@ HRESULT CDECL wined3d_device_context_set_depth_stencil_view(struct wined3d_devic
         wined3d_rendertarget_view_decref(prev);
     wined3d_device_context_unbind_srv_for_rtv(context, view, TRUE);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
     return WINED3D_OK;
 }
 
@@ -2292,7 +2292,7 @@ void CDECL wined3d_device_context_set_predication(struct wined3d_device_context
 
     TRACE("context %p, predicate %p, value %#x.\n", context, predicate, value);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->predicate;
     if (predicate)
     {
@@ -2304,7 +2304,7 @@ void CDECL wined3d_device_context_set_predication(struct wined3d_device_context
     wined3d_device_context_emit_set_predication(context, predicate, value);
     if (prev)
         wined3d_query_decref(prev);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 HRESULT CDECL wined3d_device_context_set_stream_sources(struct wined3d_device_context *context,
@@ -2332,7 +2332,7 @@ HRESULT CDECL wined3d_device_context_set_stream_sources(struct wined3d_device_co
         }
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     if (!memcmp(streams, &state->streams[start_idx], count * sizeof(*streams)))
         goto out;
 
@@ -2350,7 +2350,7 @@ HRESULT CDECL wined3d_device_context_set_stream_sources(struct wined3d_device_co
             wined3d_buffer_decref(prev);
     }
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
     return WINED3D_OK;
 }
 
@@ -2365,7 +2365,7 @@ void CDECL wined3d_device_context_set_index_buffer(struct wined3d_device_context
     TRACE("context %p, buffer %p, format %s, offset %u.\n",
             context, buffer, debug_d3dformat(format_id), offset);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev_buffer = state->index_buffer;
     prev_format = state->index_format;
     prev_offset = state->index_offset;
@@ -2382,7 +2382,7 @@ void CDECL wined3d_device_context_set_index_buffer(struct wined3d_device_context
     if (prev_buffer)
         wined3d_buffer_decref(prev_buffer);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_vertex_declaration(struct wined3d_device_context *context,
@@ -2393,7 +2393,7 @@ void CDECL wined3d_device_context_set_vertex_declaration(struct wined3d_device_c
 
     TRACE("context %p, declaration %p.\n", context, declaration);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     prev = state->vertex_declaration;
     if (declaration == prev)
         goto out;
@@ -2405,7 +2405,7 @@ void CDECL wined3d_device_context_set_vertex_declaration(struct wined3d_device_c
     if (prev)
         wined3d_vertex_declaration_decref(prev);
 out:
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_set_stream_outputs(struct wined3d_device_context *context,
@@ -2416,7 +2416,7 @@ void CDECL wined3d_device_context_set_stream_outputs(struct wined3d_device_conte
 
     TRACE("context %p, outputs %p.\n", context, outputs);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_set_stream_outputs(context, outputs);
     for (i = 0; i < WINED3D_MAX_STREAM_OUTPUT_BUFFERS; ++i)
     {
@@ -2429,7 +2429,7 @@ void CDECL wined3d_device_context_set_stream_outputs(struct wined3d_device_conte
         if (prev_buffer)
             wined3d_buffer_decref(prev_buffer);
     }
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_draw(struct wined3d_device_context *context, unsigned int start_vertex,
@@ -2440,10 +2440,10 @@ void CDECL wined3d_device_context_draw(struct wined3d_device_context *context, u
     TRACE("context %p, start_vertex %u, vertex_count %u, start_instance %u, instance_count %u.\n",
             context, start_vertex, vertex_count, start_instance, instance_count);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_draw(context, state->primitive_type, state->patch_vertex_count,
             0, start_vertex, vertex_count, start_instance, instance_count, false);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_draw_indexed(struct wined3d_device_context *context, int base_vertex_index,
@@ -2454,10 +2454,10 @@ void CDECL wined3d_device_context_draw_indexed(struct wined3d_device_context *co
     TRACE("context %p, base_vertex_index %d, start_index %u, index_count %u, start_instance %u, instance_count %u.\n",
             context, base_vertex_index, start_index, index_count, start_instance, instance_count);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_draw(context, state->primitive_type, state->patch_vertex_count,
             base_vertex_index, start_index, index_count, start_instance, instance_count, true);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_get_constant_buffer(const struct wined3d_device_context *context,
@@ -4150,10 +4150,10 @@ void CDECL wined3d_device_context_set_primitive_type(struct wined3d_device_conte
     TRACE("context %p, primitive_type %s, patch_vertex_count %u.\n",
             context, debug_d3dprimitivetype(primitive_type), patch_vertex_count);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     state->primitive_type = primitive_type;
     state->patch_vertex_count = patch_vertex_count;
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_get_primitive_type(const struct wined3d_device_context *context,
@@ -4471,9 +4471,9 @@ void CDECL wined3d_device_context_copy_uav_counter(struct wined3d_device_context
     TRACE("context %p, dst_buffer %p, offset %u, uav %p.\n",
             context, dst_buffer, offset, uav);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_copy_uav_counter(context, dst_buffer, offset, uav);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static bool resources_format_compatible(const struct wined3d_resource *src_resource,
@@ -4548,10 +4548,10 @@ void CDECL wined3d_device_context_copy_resource(struct wined3d_device_context *c
     if (dst_resource->type == WINED3D_RTYPE_BUFFER)
     {
         wined3d_box_set(&src_box, 0, 0, src_resource->size, 1, 0, 1);
-        wined3d_mutex_lock();
+        wined3d_device_context_lock(context);
         wined3d_device_context_emit_blt_sub_resource(context, dst_resource, 0, &src_box,
                 src_resource, 0, &src_box, WINED3D_BLT_RAW, NULL, WINED3D_TEXF_POINT);
-        wined3d_mutex_unlock();
+        wined3d_device_context_unlock(context);
         return;
     }
 
@@ -4567,7 +4567,7 @@ void CDECL wined3d_device_context_copy_resource(struct wined3d_device_context *c
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     for (i = 0; i < dst_texture->level_count; ++i)
     {
         wined3d_texture_get_level_box(src_texture, i, &src_box);
@@ -4580,7 +4580,7 @@ void CDECL wined3d_device_context_copy_resource(struct wined3d_device_context *c
                     src_resource, idx, &src_box, WINED3D_BLT_RAW, NULL, WINED3D_TEXF_POINT);
         }
     }
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 HRESULT CDECL wined3d_device_context_copy_sub_resource_region(struct wined3d_device_context *context,
@@ -4737,10 +4737,10 @@ HRESULT CDECL wined3d_device_context_copy_sub_resource_region(struct wined3d_dev
         }
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_blt_sub_resource(context, dst_resource, dst_sub_resource_idx, &dst_box,
             src_resource, src_sub_resource_idx, src_box, WINED3D_BLT_RAW, NULL, WINED3D_TEXF_POINT);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 
     return WINED3D_OK;
 }
@@ -4780,10 +4780,10 @@ void CDECL wined3d_device_context_update_sub_resource(struct wined3d_device_cont
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_update_sub_resource(context, resource,
             sub_resource_idx, box, data, row_pitch, depth_pitch);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_resolve_sub_resource(struct wined3d_device_context *context,
@@ -4820,7 +4820,7 @@ void CDECL wined3d_device_context_resolve_sub_resource(struct wined3d_device_con
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     fx.resolve_format_id = format_id;
 
     dst_texture = texture_from_resource(dst_resource);
@@ -4834,7 +4834,7 @@ void CDECL wined3d_device_context_resolve_sub_resource(struct wined3d_device_con
             wined3d_texture_get_level_height(src_texture, src_level));
     wined3d_device_context_blt(context, dst_texture, dst_sub_resource_idx, &dst_rect,
             src_texture, src_sub_resource_idx, &src_rect, 0, &fx, WINED3D_TEXF_POINT);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 HRESULT CDECL wined3d_device_context_clear_rendertarget_view(struct wined3d_device_context *context,
@@ -4871,9 +4871,9 @@ HRESULT CDECL wined3d_device_context_clear_rendertarget_view(struct wined3d_devi
             return hr;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_clear_rendertarget_view(context, view, rect, flags, color, depth, stencil);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 
     return WINED3D_OK;
 }
@@ -4889,9 +4889,9 @@ void CDECL wined3d_device_context_clear_uav_float(struct wined3d_device_context
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_clear_uav(context, view, (const struct wined3d_uvec4 *)clear_value, true);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_clear_uav_uint(struct wined3d_device_context *context,
@@ -4899,9 +4899,9 @@ void CDECL wined3d_device_context_clear_uav_uint(struct wined3d_device_context *
 {
     TRACE("context %p, view %p, clear_value %s.\n", context, view, debug_uvec4(clear_value));
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_clear_uav(context, view, clear_value, false);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static unsigned int sanitise_map_flags(const struct wined3d_resource *resource, unsigned int flags)
@@ -4989,9 +4989,9 @@ HRESULT CDECL wined3d_device_context_map(struct wined3d_device_context *context,
             return WINED3DERR_INVALIDCALL;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     hr = wined3d_device_context_emit_map(context, resource, sub_resource_idx, map_desc, box, flags);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
     return hr;
 }
 
@@ -5001,9 +5001,9 @@ HRESULT CDECL wined3d_device_context_unmap(struct wined3d_device_context *contex
     HRESULT hr;
     TRACE("context %p, resource %p, sub_resource_idx %u.\n", context, resource, sub_resource_idx);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     hr = wined3d_device_context_emit_unmap(context, resource, sub_resource_idx);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
     return hr;
 }
 
@@ -5012,9 +5012,9 @@ void CDECL wined3d_device_context_issue_query(struct wined3d_device_context *con
 {
     TRACE("context %p, query %p, flags %#x.\n", context, query, flags);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     context->ops->issue_query(context, query, flags);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 void CDECL wined3d_device_context_execute_command_list(struct wined3d_device_context *context,
@@ -5022,9 +5022,9 @@ void CDECL wined3d_device_context_execute_command_list(struct wined3d_device_con
 {
     TRACE("context %p, list %p, restore_state %d.\n", context, list, restore_state);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_execute_command_list(context, list, restore_state);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 struct wined3d_rendertarget_view * CDECL wined3d_device_context_get_rendertarget_view(
@@ -5072,9 +5072,9 @@ void CDECL wined3d_device_context_generate_mipmaps(struct wined3d_device_context
         return;
     }
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     wined3d_device_context_emit_generate_mipmaps(context, view);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined3d_device *device,
@@ -5298,9 +5298,9 @@ void CDECL wined3d_device_context_flush(struct wined3d_device_context *context)
 {
     TRACE("context %p.\n", context);
 
-    wined3d_mutex_lock();
+    wined3d_device_context_lock(context);
     context->ops->flush(context);
-    wined3d_mutex_unlock();
+    wined3d_device_context_unlock(context);
 }
 
 static void update_swapchain_flags(struct wined3d_texture *texture)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 588e39db9b2..6a6c84ee02f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4839,6 +4839,18 @@ struct wined3d_cs
     LONG pending_presents;
 };
 
+static inline void wined3d_device_context_lock(struct wined3d_device_context *context)
+{
+    if (context == &context->device->cs->c)
+        wined3d_mutex_lock();
+}
+
+static inline void wined3d_device_context_unlock(struct wined3d_device_context *context)
+{
+    if (context == &context->device->cs->c)
+        wined3d_mutex_unlock();
+}
+
 struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device,
         const enum wined3d_feature_level *levels, unsigned int level_count) DECLSPEC_HIDDEN;
 void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
-- 
2.32.0




More information about the wine-devel mailing list