[PATCH v2 4/9] wined3d: Add "layer_count" parameter to wined3d_texture_create().
Józef Kucia
jkucia at codeweavers.com
Wed Apr 20 02:09:43 CDT 2016
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Version 2: Rebased.
---
dlls/d3d10core/tests/device.c | 6 +++---
dlls/d3d11/tests/d3d11.c | 6 +++---
dlls/d3d11/texture.c | 8 +++-----
dlls/d3d8/device.c | 4 ++--
dlls/d3d8/texture.c | 6 +++---
dlls/d3d9/device.c | 4 ++--
dlls/d3d9/texture.c | 6 +++---
dlls/ddraw/ddraw.c | 2 +-
dlls/ddraw/surface.c | 4 ++--
dlls/wined3d/device.c | 4 ++--
dlls/wined3d/surface.c | 2 +-
dlls/wined3d/texture.c | 38 ++++++++++++++++++++++++++++----------
dlls/wined3d/wined3d.spec | 2 +-
include/wine/wined3d.h | 4 ++--
14 files changed, 56 insertions(+), 40 deletions(-)
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c
index 106e4cc..8e69656 100644
--- a/dlls/d3d10core/tests/device.c
+++ b/dlls/d3d10core/tests/device.c
@@ -577,7 +577,7 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_VERTEX_BUFFER, 0, FALSE, TRUE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_INDEX_BUFFER, 0, FALSE, TRUE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_CONSTANT_BUFFER, 0, FALSE, TRUE},
- {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D10_BIND_SHADER_RESOURCE, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D10_BIND_SHADER_RESOURCE, 0, FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
@@ -595,7 +595,7 @@ static void test_create_texture2d(void)
FALSE, TRUE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 12, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
FALSE, TRUE},
- {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D10_BIND_RENDER_TARGET, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D10_BIND_RENDER_TARGET, 0, FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D10_BIND_RENDER_TARGET, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D10_BIND_RENDER_TARGET, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 9, D3D10_BIND_RENDER_TARGET, 0, TRUE, FALSE},
@@ -607,7 +607,7 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G8X24_TYPELESS, 1, D3D10_BIND_DEPTH_STENCIL, 0, TRUE, TRUE},
{DXGI_FORMAT_R10G10B10A2_TYPELESS, 1, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R10G10B10A2_TYPELESS, 1, D3D10_BIND_RENDER_TARGET, 0, TRUE, FALSE},
- {DXGI_FORMAT_R32_TYPELESS, 0, D3D10_BIND_SHADER_RESOURCE, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32_TYPELESS, 0, D3D10_BIND_SHADER_RESOURCE, 0, FALSE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 1, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 9, D3D10_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 9, D3D10_BIND_SHADER_RESOURCE, D3D10_RESOURCE_MISC_TEXTURECUBE,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 713c9cf..4f3ff8e 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -865,7 +865,7 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_VERTEX_BUFFER, 0, FALSE, TRUE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_INDEX_BUFFER, 0, FALSE, TRUE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_CONSTANT_BUFFER, 0, FALSE, TRUE},
- {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D11_BIND_SHADER_RESOURCE, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D11_BIND_SHADER_RESOURCE, 0, FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 3, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
@@ -883,7 +883,7 @@ static void test_create_texture2d(void)
TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 12, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
TRUE, FALSE},
- {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D11_BIND_RENDER_TARGET, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32G32B32A32_TYPELESS, 0, D3D11_BIND_RENDER_TARGET, 0, FALSE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 1, D3D11_BIND_RENDER_TARGET, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 2, D3D11_BIND_RENDER_TARGET, 0, TRUE, FALSE},
{DXGI_FORMAT_R32G32B32A32_TYPELESS, 9, D3D11_BIND_RENDER_TARGET, 0, TRUE, FALSE},
@@ -895,7 +895,7 @@ static void test_create_texture2d(void)
{DXGI_FORMAT_R32G8X24_TYPELESS, 1, D3D11_BIND_DEPTH_STENCIL, 0, TRUE, TRUE},
{DXGI_FORMAT_R10G10B10A2_TYPELESS, 1, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R10G10B10A2_TYPELESS, 1, D3D11_BIND_RENDER_TARGET, 0, TRUE, FALSE},
- {DXGI_FORMAT_R32_TYPELESS, 0, D3D11_BIND_SHADER_RESOURCE, 0, FALSE, TRUE},
+ {DXGI_FORMAT_R32_TYPELESS, 0, D3D11_BIND_SHADER_RESOURCE, 0, FALSE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 1, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 9, D3D11_BIND_SHADER_RESOURCE, 0, TRUE, FALSE},
{DXGI_FORMAT_R32_TYPELESS, 9, D3D11_BIND_SHADER_RESOURCE, D3D11_RESOURCE_MISC_TEXTURECUBE,
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index c6cdc29..d7b2af1 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -457,8 +457,6 @@ static HRESULT d3d_texture2d_init(struct d3d_texture2d *texture, struct d3d_devi
wined3d_private_store_init(&texture->private_store);
texture->desc = *desc;
- if (desc->ArraySize != 1)
- FIXME("Array textures not implemented.\n");
if (desc->SampleDesc.Count > 1)
FIXME("Multisampled textures not implemented.\n");
@@ -476,8 +474,8 @@ 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 (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc,
- levels, 0, (struct wined3d_sub_resource_data *)data, texture,
- &d3d_texture2d_wined3d_parent_ops, &texture->wined3d_texture)))
+ desc->ArraySize, levels, 0, (struct wined3d_sub_resource_data *)data,
+ texture, &d3d_texture2d_wined3d_parent_ops, &texture->wined3d_texture)))
{
WARN("Failed to create wined3d texture, hr %#x.\n", hr);
wined3d_private_store_cleanup(&texture->private_store);
@@ -930,7 +928,7 @@ static HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_devi
levels = desc->MipLevels ? desc->MipLevels : wined3d_log2i(max(max(desc->Width, desc->Height), desc->Depth)) + 1;
if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc,
- levels, 0, (struct wined3d_sub_resource_data *)data, texture,
+ 1, levels, 0, (struct wined3d_sub_resource_data *)data, texture,
&d3d_texture3d_wined3d_parent_ops, &texture->wined3d_texture)))
{
WARN("Failed to create wined3d texture, hr %#x.\n", hr);
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 154d817..2e065db 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -961,7 +961,7 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, UINT width
wined3d_mutex_lock();
if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &desc,
- 1, flags, NULL, NULL, &d3d8_null_wined3d_parent_ops, &texture)))
+ 1, 1, flags, NULL, NULL, &d3d8_null_wined3d_parent_ops, &texture)))
{
wined3d_mutex_unlock();
WARN("Failed to create texture, hr %#x.\n", hr);
@@ -3037,7 +3037,7 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
TRACE("device_parent %p, container_parent %p, desc %p, texture %p.\n",
device_parent, container_parent, desc, texture);
- if (FAILED(hr = wined3d_texture_create(device->wined3d_device, desc, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
+ if (FAILED(hr = wined3d_texture_create(device->wined3d_device, desc, 1, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
NULL, &device->IDirect3DDevice8_iface, &d3d8_null_wined3d_parent_ops, texture)))
{
WARN("Failed to create texture, hr %#x.\n", hr);
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index 7ed79a5..324d896 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -1131,7 +1131,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
levels = wined3d_log2i(max(width, height)) + 1;
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, flags,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
@@ -1176,7 +1176,7 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
levels = wined3d_log2i(edge_length) + 1;
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, flags,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 6, levels, flags,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
@@ -1217,7 +1217,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
levels = wined3d_log2i(max(max(width, height), depth)) + 1;
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, 0,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, 0,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index bd9f935..1531799 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -1134,7 +1134,7 @@ static HRESULT d3d9_device_create_surface(struct d3d9_device *device, UINT width
wined3d_mutex_lock();
if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &desc,
- 1, flags, NULL, NULL, &d3d9_null_wined3d_parent_ops, &texture)))
+ 1, 1, flags, NULL, NULL, &d3d9_null_wined3d_parent_ops, &texture)))
{
wined3d_mutex_unlock();
WARN("Failed to create texture, hr %#x.\n", hr);
@@ -3687,7 +3687,7 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
if (container_parent == device_parent)
container_parent = &device->IDirect3DDevice9Ex_iface;
- if (FAILED(hr = wined3d_texture_create(device->wined3d_device, desc, 1,
+ if (FAILED(hr = wined3d_texture_create(device->wined3d_device, desc, 1, 1,
WINED3D_TEXTURE_CREATE_MAPPABLE, NULL, container_parent, &d3d9_null_wined3d_parent_ops, texture)))
{
WARN("Failed to create texture, hr %#x.\n", hr);
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index 07bd83e..ae0eaac 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1266,7 +1266,7 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
}
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, flags,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
NULL, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
@@ -1316,7 +1316,7 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic
}
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, flags,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 6, levels, flags,
NULL, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
@@ -1362,7 +1362,7 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev
}
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, levels, 0,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, 0,
NULL, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index c969e4d..ef57788 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4824,7 +4824,7 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
return E_FAIL;
}
- if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, desc, 1,
+ if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, desc, 1, 1,
WINED3D_TEXTURE_CREATE_MAPPABLE, NULL, ddraw, &ddraw_frontbuffer_parent_ops, texture)))
{
WARN("Failed to create texture, hr %#x.\n", hr);
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index d914b2f..76cb702 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -6098,7 +6098,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
* visible on the screen. The game Nox is such an application,
* Commandos: Behind Enemy Lines is another. Setting
* WINED3D_TEXTURE_CREATE_GET_DC_LENIENT will ensure this. */
- if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, levels,
+ if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, layers, levels,
WINED3D_TEXTURE_CREATE_GET_DC_LENIENT, NULL, texture,
&ddraw_texture_wined3d_parent_ops, &wined3d_texture)))
{
@@ -6217,7 +6217,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
desc->ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;
desc->u5.dwBackBufferCount = 0;
- if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, 1,
+ if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, 1, 1,
WINED3D_TEXTURE_CREATE_GET_DC_LENIENT, NULL, texture,
&ddraw_texture_wined3d_parent_ops, &wined3d_texture)))
{
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index de8af34..cd2d9a2 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -643,7 +643,7 @@ static void device_load_logo(struct wined3d_device *device, const char *filename
desc.height = bm.bmHeight;
desc.depth = 1;
desc.size = 0;
- if (FAILED(hr = wined3d_texture_create(device, &desc, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
+ if (FAILED(hr = wined3d_texture_create(device, &desc, 1, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
NULL, NULL, &wined3d_null_parent_ops, &device->logo_texture)))
{
ERR("Wine logo requested, but failed to create texture, hr %#x.\n", hr);
@@ -4341,7 +4341,7 @@ static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined
desc.depth = 1;
desc.size = 0;
- hr = wined3d_texture_create(device, &desc, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
+ hr = wined3d_texture_create(device, &desc, 1, 1, WINED3D_TEXTURE_CREATE_MAPPABLE,
&data, NULL, &wined3d_null_parent_ops, &texture);
wined3d_resource_unmap(&cursor_image->resource, sub_resource_idx);
if (FAILED(hr))
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index a0d877c..29a0897 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1759,7 +1759,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
desc.format = dst_format->id;
desc.usage = 0;
desc.pool = WINED3D_POOL_SCRATCH;
- if (FAILED(wined3d_texture_create(device, &desc, 1,
+ if (FAILED(wined3d_texture_create(device, &desc, 1, 1,
WINED3D_TEXTURE_CREATE_MAPPABLE | WINED3D_TEXTURE_CREATE_DISCARD,
NULL, NULL, &wined3d_null_parent_ops, &dst_texture)))
{
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index c8a7695..ef8e0e5 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1689,6 +1689,9 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
unsigned int i, j;
HRESULT hr;
+ if (!(desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) && layer_count != 1)
+ FIXME("Array textures not implemented.\n");
+
/* TODO: It should only be possible to create textures for formats
* that are reported as supported. */
if (WINED3DFMT_UNKNOWN >= desc->format)
@@ -1997,7 +2000,8 @@ BOOL wined3d_texture_check_block_align(const struct wined3d_texture *texture,
}
static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc,
- UINT levels, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops)
+ UINT layer_count, UINT level_count, struct wined3d_device *device, void *parent,
+ const struct wined3d_parent_ops *parent_ops)
{
struct wined3d_device_parent *device_parent = device->device_parent;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
@@ -2006,6 +2010,12 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
unsigned int i;
HRESULT hr;
+ if (layer_count != 1)
+ {
+ ERR("Invalid layer count for volume texture.\n");
+ return E_INVALIDARG;
+ }
+
/* TODO: It should only be possible to create textures for formats
* that are reported as supported. */
if (WINED3DFMT_UNKNOWN >= desc->format)
@@ -2029,7 +2039,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
return WINED3DERR_INVALIDCALL;
}
- if (levels != 1)
+ if (level_count != 1)
{
WARN("WINED3DUSAGE_AUTOGENMIPMAP is set, and level count != 1, returning D3DERR_INVALIDCALL.\n");
return WINED3DERR_INVALIDCALL;
@@ -2071,7 +2081,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
}
}
- if (FAILED(hr = wined3d_texture_init(texture, &texture3d_ops, 1, levels, desc,
+ if (FAILED(hr = wined3d_texture_init(texture, &texture3d_ops, 1, level_count, desc,
0, device, parent, parent_ops, &texture_resource_ops)))
{
WARN("Failed to initialize texture, returning %#x.\n", hr);
@@ -2087,7 +2097,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
if (wined3d_texture_use_pbo(texture, gl_info))
texture->resource.map_binding = WINED3D_LOCATION_BUFFER;
- if (!(volumes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*volumes) * levels)))
+ if (!(volumes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*volumes) * level_count)))
{
wined3d_texture_cleanup(texture);
return E_OUTOFMEMORY;
@@ -2350,15 +2360,23 @@ HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture
}
HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc,
- UINT level_count, DWORD flags, const struct wined3d_sub_resource_data *data, void *parent,
- const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
+ UINT layer_count, UINT level_count, DWORD flags, const struct wined3d_sub_resource_data *data,
+ void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
{
- unsigned int layer_count = desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP ? 6 : 1;
struct wined3d_texture *object;
HRESULT hr;
- TRACE("device %p, desc %p, level_count %u, flags %#x, data %p, parent %p, parent_ops %p, texture %p.\n",
- device, desc, level_count, flags, data, parent, parent_ops, texture);
+ TRACE("device %p, desc %p, layer_count %u, level_count %u, flags %#x, data %p, "
+ "parent %p, parent_ops %p, texture %p.\n",
+ device, desc, layer_count, level_count, flags, data, parent, parent_ops, texture);
+
+ if (!layer_count)
+ {
+ WARN("Invalid layer count.\n");
+ return E_INVALIDARG;
+ }
+ if ((desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) && layer_count != 6)
+ ERR("Invalid layer count %u for legacy cubemap.\n", layer_count);
if (!level_count)
{
@@ -2398,7 +2416,7 @@ HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct
break;
case WINED3D_RTYPE_TEXTURE_3D:
- hr = volumetexture_init(object, desc, level_count, device, parent, parent_ops);
+ hr = volumetexture_init(object, desc, layer_count, level_count, device, parent, parent_ops);
break;
default:
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 9b6bed9..d180293 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -241,7 +241,7 @@
@ cdecl wined3d_texture_add_dirty_region(ptr long ptr)
@ cdecl wined3d_texture_blt(ptr long ptr ptr long ptr long ptr long)
-@ cdecl wined3d_texture_create(ptr ptr long long ptr ptr ptr ptr)
+@ cdecl wined3d_texture_create(ptr ptr long long long ptr ptr ptr ptr)
@ cdecl wined3d_texture_decref(ptr)
@ cdecl wined3d_texture_generate_mipmaps(ptr)
@ cdecl wined3d_texture_get_autogen_filter_type(ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index cf2715c..9b41480 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2448,8 +2448,8 @@ HRESULT __cdecl wined3d_texture_blt(struct wined3d_texture *dst_texture, unsigne
struct wined3d_texture *src_texture, unsigned int src_idx, const RECT *src_rect_in, DWORD flags,
const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter);
HRESULT __cdecl wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc,
- UINT level_count, DWORD flags, const struct wined3d_sub_resource_data *data, void *parent,
- const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture);
+ UINT layer_count, UINT level_count, DWORD flags, const struct wined3d_sub_resource_data *data,
+ void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture);
ULONG __cdecl wined3d_texture_decref(struct wined3d_texture *texture);
void __cdecl wined3d_texture_generate_mipmaps(struct wined3d_texture *texture);
enum wined3d_texture_filter_type __cdecl wined3d_texture_get_autogen_filter_type(const struct wined3d_texture *texture);
--
2.4.10
More information about the wine-patches
mailing list