[PATCH 6/8] d3d11: Do not keep mutex locked when D3D11_BUFFER_DESC validation fails.
Józef Kucia
jkucia at codeweavers.com
Fri Feb 10 05:26:56 CST 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
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)))
--
2.10.2
More information about the wine-patches
mailing list