Module: wine Branch: master Commit: 6640bc323acb879b370eb7ba4875d4b1f947206b URL: http://source.winehq.org/git/wine.git/?a=commit;h=6640bc323acb879b370eb7ba48...
Author: Józef Kucia jkucia@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@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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)))