=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d11: Do not keep mutex locked when D3D11_BUFFER_DESC validation fails.

Alexandre Julliard julliard at winehq.org
Fri Feb 10 16:02:24 CST 2017


Module: wine
Branch: master
Commit: 6640bc323acb879b370eb7ba4875d4b1f947206b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6640bc323acb879b370eb7ba4875d4b1f947206b

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Feb 10 12:26:56 2017 +0100

d3d11: Do not keep mutex locked when D3D11_BUFFER_DESC validation fails.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d11/buffer.c | 61 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c
index 1e0469e..af3ab39 100644
--- a/dlls/d3d11/buffer.c
+++ b/dlls/d3d11/buffer.c
@@ -387,52 +387,58 @@ static const struct wined3d_parent_ops d3d_buffer_wined3d_parent_ops =
     d3d_buffer_wined3d_object_released,
 };
 
-static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device,
-        const D3D11_BUFFER_DESC *desc, const D3D11_SUBRESOURCE_DATA *data)
+static BOOL validate_buffer_desc(D3D11_BUFFER_DESC *desc)
 {
-    struct wined3d_buffer_desc wined3d_desc;
-    HRESULT hr;
-
-    buffer->ID3D11Buffer_iface.lpVtbl = &d3d11_buffer_vtbl;
-    buffer->ID3D10Buffer_iface.lpVtbl = &d3d10_buffer_vtbl;
-    buffer->refcount = 1;
-    wined3d_mutex_lock();
-    wined3d_private_store_init(&buffer->private_store);
-    buffer->desc = *desc;
-
-    if (buffer->desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS)
+    if (desc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS)
     {
-        if (buffer->desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
+        if (desc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
         {
             WARN("Raw and structure buffers are mutually exclusive.\n");
-            return E_INVALIDARG;
+            return FALSE;
         }
-        if (!(buffer->desc.BindFlags & (D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS)))
+        if (!(desc->BindFlags & (D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS)))
         {
-            WARN("Invalid bind flags %#x for raw buffer.\n", buffer->desc.BindFlags);
-            return E_INVALIDARG;
+            WARN("Invalid bind flags %#x for raw buffer.\n", desc->BindFlags);
+            return FALSE;
         }
     }
 
-    if (buffer->desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
+    if (desc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
     {
-        if (!buffer->desc.StructureByteStride || buffer->desc.StructureByteStride % 4)
+        if (!desc->StructureByteStride || desc->StructureByteStride % 4)
         {
-            WARN("Invalid structure byte stride %u.\n", buffer->desc.StructureByteStride);
-            return E_INVALIDARG;
+            WARN("Invalid structure byte stride %u.\n", desc->StructureByteStride);
+            return FALSE;
         }
-        if (buffer->desc.ByteWidth % buffer->desc.StructureByteStride)
+        if (desc->ByteWidth % desc->StructureByteStride)
         {
             WARN("Byte width %u is not divisible by structure byte stride %u.\n",
-                    buffer->desc.ByteWidth, buffer->desc.StructureByteStride);
-            return E_INVALIDARG;
+                    desc->ByteWidth, desc->StructureByteStride);
+            return FALSE;
         }
     }
     else
     {
-        buffer->desc.StructureByteStride = 0;
+        desc->StructureByteStride = 0;
     }
 
+    return TRUE;
+}
+
+static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *device,
+        const D3D11_BUFFER_DESC *desc, const D3D11_SUBRESOURCE_DATA *data)
+{
+    struct wined3d_buffer_desc wined3d_desc;
+    HRESULT hr;
+
+    buffer->ID3D11Buffer_iface.lpVtbl = &d3d11_buffer_vtbl;
+    buffer->ID3D10Buffer_iface.lpVtbl = &d3d10_buffer_vtbl;
+    buffer->refcount = 1;
+    buffer->desc = *desc;
+
+    if (!validate_buffer_desc(&buffer->desc))
+        return E_INVALIDARG;
+
     wined3d_desc.byte_width = buffer->desc.ByteWidth;
     wined3d_desc.usage = wined3d_usage_from_d3d11(0, buffer->desc.Usage);
     wined3d_desc.bind_flags = buffer->desc.BindFlags;
@@ -442,6 +448,9 @@ static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *dev
     if (buffer->desc.StructureByteStride)
         FIXME("Ignoring structure byte stride %u.\n", buffer->desc.StructureByteStride);
 
+    wined3d_mutex_lock();
+    wined3d_private_store_init(&buffer->private_store);
+
     if (FAILED(hr = wined3d_buffer_create(device->wined3d_device, &wined3d_desc,
             (const struct wined3d_sub_resource_data *)data, buffer,
             &d3d_buffer_wined3d_parent_ops, &buffer->wined3d_buffer)))




More information about the wine-cvs mailing list