[PATCH 2/8] d3d11: Validate array size for cube textures.
Józef Kucia
jkucia at codeweavers.com
Fri Feb 10 05:26:52 CST 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/d3d10core/tests/device.c | 6 +++---
dlls/d3d11/tests/d3d11.c | 6 +++---
dlls/d3d11/texture.c | 34 +++++++++++++++++++++++-----------
3 files changed, 29 insertions(+), 17 deletions(-)
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c
index 79d7fbc..4868f70 100644
--- a/dlls/d3d10core/tests/device.c
+++ b/dlls/d3d10core/tests/device.c
@@ -1218,11 +1218,11 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 5, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 6, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 7, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 807c845..fb095e3 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -1647,11 +1647,11 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 5, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
- FALSE, TRUE},
+ FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 6, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 7, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index de1e865..92c4cdf 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -456,6 +456,25 @@ static BOOL is_gdi_compatible_texture(const D3D11_TEXTURE2D_DESC *desc)
return TRUE;
}
+static BOOL validate_texture2d_desc(const D3D11_TEXTURE2D_DESC *desc)
+{
+ if (desc->MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE
+ && desc->ArraySize < 6)
+ {
+ WARN("Invalid array size %u for cube texture.\n", desc->ArraySize);
+ return FALSE;
+ }
+
+ if (desc->MiscFlags & D3D11_RESOURCE_MISC_GDI_COMPATIBLE
+ && !is_gdi_compatible_texture(desc))
+ {
+ WARN("Incompatible description used to create GDI compatible texture.\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_device *device,
const D3D11_TEXTURE2D_DESC *desc, const D3D11_SUBRESOURCE_DATA *data)
{
@@ -464,6 +483,9 @@ static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_devi
DWORD flags = 0;
HRESULT hr;
+ if (!validate_texture2d_desc(desc))
+ return E_INVALIDARG;
+
texture->ID3D11Texture2D_iface.lpVtbl = &d3d11_texture2d_vtbl;
texture->ID3D10Texture2D_iface.lpVtbl = &d3d10_texture2d_vtbl;
texture->refcount = 1;
@@ -488,17 +510,7 @@ static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_devi
levels = desc->MipLevels ? desc->MipLevels : wined3d_log2i(max(desc->Width, desc->Height)) + 1;
if (desc->MiscFlags & D3D11_RESOURCE_MISC_GDI_COMPATIBLE)
- {
- if (is_gdi_compatible_texture(desc))
- flags |= WINED3D_TEXTURE_CREATE_GET_DC;
- else
- {
- WARN("Incompatible description used to create GDI compatible texture.\n");
- wined3d_private_store_cleanup(&texture->private_store);
- wined3d_mutex_unlock();
- return E_INVALIDARG;
- }
- }
+ flags |= WINED3D_TEXTURE_CREATE_GET_DC;
if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc,
desc->ArraySize, levels, flags, (struct wined3d_sub_resource_data *)data,
--
2.10.2
More information about the wine-patches
mailing list