[PATCH 8/9] d3d11: Implement Texture1D.

Sven Hesse shesse at codeweavers.com
Tue Jan 2 09:25:43 CST 2018


Signed-off-by: Sven Hesse <shesse at codeweavers.com>
---
 dlls/d3d11/d3d11_private.h |  24 ++
 dlls/d3d11/device.c        |  13 +-
 dlls/d3d11/texture.c       | 537 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/d3d11/utils.c         |   4 +
 4 files changed, 576 insertions(+), 2 deletions(-)

diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h
index 4d9f34ea42..6f4184b0b1 100644
--- a/dlls/d3d11/d3d11_private.h
+++ b/dlls/d3d11/d3d11_private.h
@@ -112,6 +112,30 @@ void skip_dword_unknown(const char **ptr, unsigned int count) DECLSPEC_HIDDEN;
 HRESULT parse_dxbc(const char *data, SIZE_T data_size,
         HRESULT (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx) DECLSPEC_HIDDEN;
 
+/* ID3D11Texture1D, ID3D10Texture1D */
+struct d3d_texture1d
+{
+    ID3D11Texture1D ID3D11Texture1D_iface;
+    ID3D10Texture1D ID3D10Texture1D_iface;
+    LONG refcount;
+
+    struct wined3d_private_store private_store;
+    IUnknown *dxgi_surface;
+    struct wined3d_texture *wined3d_texture;
+    D3D11_TEXTURE1D_DESC desc;
+    ID3D11Device *device;
+};
+
+static inline struct d3d_texture1d *impl_from_ID3D10Texture1D(ID3D10Texture1D *iface)
+{
+    return CONTAINING_RECORD(iface, struct d3d_texture1d, ID3D10Texture1D_iface);
+}
+
+HRESULT d3d_texture1d_create(struct d3d_device *device, const D3D11_TEXTURE1D_DESC *desc,
+        const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture1d **texture) DECLSPEC_HIDDEN;
+struct d3d_texture1d *unsafe_impl_from_ID3D11Texture1D(ID3D11Texture1D *iface) DECLSPEC_HIDDEN;
+struct d3d_texture1d *unsafe_impl_from_ID3D10Texture1D(ID3D10Texture1D *iface) DECLSPEC_HIDDEN;
+
 /* ID3D11Texture2D, ID3D10Texture2D */
 struct d3d_texture2d
 {
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index b2a40b3c6d..68279f71d3 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -2739,9 +2739,18 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateBuffer(ID3D11Device *iface,
 static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture1D(ID3D11Device *iface,
         const D3D11_TEXTURE1D_DESC *desc, const D3D11_SUBRESOURCE_DATA *data, ID3D11Texture1D **texture)
 {
-    FIXME("iface %p, desc %p, data %p, texture %p stub!\n", iface, desc, data, texture);
+    struct d3d_device *device = impl_from_ID3D11Device(iface);
+    struct d3d_texture1d *object;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, desc %p, data %p, texture %p.\n", iface, desc, data, texture);
+
+    if (FAILED(hr = d3d_texture1d_create(device, desc, data, &object)))
+        return hr;
+
+    *texture = &object->ID3D11Texture1D_iface;
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d11_device_CreateTexture2D(ID3D11Device *iface,
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index 177c0cc939..ba9001ac60 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -25,6 +25,543 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d11);
 
+/* ID3D11Texture1D methods */
+
+static inline struct d3d_texture1d *impl_from_ID3D11Texture1D(ID3D11Texture1D *iface)
+{
+    return CONTAINING_RECORD(iface, struct d3d_texture1d, ID3D11Texture1D_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d11_texture1d_QueryInterface(ID3D11Texture1D *iface, REFIID riid, void **object)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+
+    TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
+
+    if (IsEqualGUID(riid, &IID_ID3D11Texture1D)
+            || IsEqualGUID(riid, &IID_ID3D11Resource)
+            || IsEqualGUID(riid, &IID_ID3D11DeviceChild)
+            || IsEqualGUID(riid, &IID_IUnknown))
+    {
+        *object = &texture->ID3D11Texture1D_iface;
+        IUnknown_AddRef((IUnknown *)*object);
+        return S_OK;
+    }
+    else if (IsEqualGUID(riid, &IID_ID3D10Texture1D)
+            || IsEqualGUID(riid, &IID_ID3D10Resource)
+            || IsEqualGUID(riid, &IID_ID3D10DeviceChild))
+    {
+        *object = &texture->ID3D10Texture1D_iface;
+        IUnknown_AddRef((IUnknown *)*object);
+        return S_OK;
+    }
+
+    if (texture->dxgi_surface)
+    {
+        TRACE("Forwarding to dxgi surface.\n");
+        return IUnknown_QueryInterface(texture->dxgi_surface, riid, object);
+    }
+
+    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+
+    *object = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE d3d11_texture1d_AddRef(ID3D11Texture1D *iface)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    ULONG refcount = InterlockedIncrement(&texture->refcount);
+
+    TRACE("%p increasing refcount to %u.\n", texture, refcount);
+
+    if (refcount == 1)
+    {
+        ID3D11Device_AddRef(texture->device);
+        wined3d_mutex_lock();
+        wined3d_texture_incref(texture->wined3d_texture);
+        wined3d_mutex_unlock();
+    }
+
+    return refcount;
+}
+
+static ULONG STDMETHODCALLTYPE d3d11_texture1d_Release(ID3D11Texture1D *iface)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    ULONG refcount = InterlockedDecrement(&texture->refcount);
+
+    TRACE("%p decreasing refcount to %u.\n", texture, refcount);
+
+    if (!refcount)
+    {
+        ID3D11Device *device = texture->device;
+
+        wined3d_mutex_lock();
+        wined3d_texture_decref(texture->wined3d_texture);
+        wined3d_mutex_unlock();
+        /* Release the device last, it may cause the wined3d device to be
+         * destroyed. */
+        ID3D11Device_Release(device);
+    }
+
+    return refcount;
+}
+
+static void STDMETHODCALLTYPE d3d11_texture1d_GetDevice(ID3D11Texture1D *iface, ID3D11Device **device)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+
+    TRACE("iface %p, device %p.\n", iface, device);
+
+    *device = texture->device;
+    ID3D11Device_AddRef(*device);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d11_texture1d_GetPrivateData(ID3D11Texture1D *iface,
+        REFGUID guid, UINT *data_size, void *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    IDXGISurface *dxgi_surface;
+    HRESULT hr;
+
+    TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
+
+    if (texture->dxgi_surface
+            && SUCCEEDED(IUnknown_QueryInterface(texture->dxgi_surface, &IID_IDXGISurface, (void **)&dxgi_surface)))
+    {
+        hr = IDXGISurface_GetPrivateData(dxgi_surface, guid, data_size, data);
+        IDXGISurface_Release(dxgi_surface);
+        return hr;
+    }
+
+    return d3d_get_private_data(&texture->private_store, guid, data_size, data);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d11_texture1d_SetPrivateData(ID3D11Texture1D *iface,
+        REFGUID guid, UINT data_size, const void *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    IDXGISurface *dxgi_surface;
+    HRESULT hr;
+
+    TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data);
+
+    if (texture->dxgi_surface
+            && SUCCEEDED(IUnknown_QueryInterface(texture->dxgi_surface, &IID_IDXGISurface, (void **)&dxgi_surface)))
+    {
+        hr = IDXGISurface_SetPrivateData(dxgi_surface, guid, data_size, data);
+        IDXGISurface_Release(dxgi_surface);
+        return hr;
+    }
+
+    return d3d_set_private_data(&texture->private_store, guid, data_size, data);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d11_texture1d_SetPrivateDataInterface(ID3D11Texture1D *iface,
+        REFGUID guid, const IUnknown *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    IDXGISurface *dxgi_surface;
+    HRESULT hr;
+
+    TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data);
+
+    if (texture->dxgi_surface
+            && SUCCEEDED(IUnknown_QueryInterface(texture->dxgi_surface, &IID_IDXGISurface, (void **)&dxgi_surface)))
+    {
+        hr = IDXGISurface_SetPrivateDataInterface(dxgi_surface, guid, data);
+        IDXGISurface_Release(dxgi_surface);
+        return hr;
+    }
+
+    return d3d_set_private_data_interface(&texture->private_store, guid, data);
+}
+
+static void STDMETHODCALLTYPE d3d11_texture1d_GetType(ID3D11Texture1D *iface,
+        D3D11_RESOURCE_DIMENSION *resource_dimension)
+{
+    TRACE("iface %p, resource_dimension %p.\n", iface, resource_dimension);
+
+    *resource_dimension = D3D11_RESOURCE_DIMENSION_TEXTURE1D;
+}
+
+static void STDMETHODCALLTYPE d3d11_texture1d_SetEvictionPriority(ID3D11Texture1D *iface, UINT eviction_priority)
+{
+    FIXME("iface %p, eviction_priority %#x stub!\n", iface, eviction_priority);
+}
+
+static UINT STDMETHODCALLTYPE d3d11_texture1d_GetEvictionPriority(ID3D11Texture1D *iface)
+{
+    FIXME("iface %p stub!\n", iface);
+
+    return 0;
+}
+
+static void STDMETHODCALLTYPE d3d11_texture1d_GetDesc(ID3D11Texture1D *iface, D3D11_TEXTURE1D_DESC *desc)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D11Texture1D(iface);
+    struct wined3d_resource_desc wined3d_desc;
+
+    TRACE("iface %p, desc %p.\n", iface, desc);
+
+    *desc = texture->desc;
+
+    wined3d_mutex_lock();
+    wined3d_resource_get_desc(wined3d_texture_get_resource(texture->wined3d_texture), &wined3d_desc);
+    wined3d_mutex_unlock();
+
+    /* FIXME: Resizing swapchain buffers can cause these to change. We'd like
+     * to get everything from wined3d, but e.g. bind flags don't exist as such
+     * there (yet). */
+    desc->Width = wined3d_desc.width;
+    desc->Format = dxgi_format_from_wined3dformat(wined3d_desc.format);
+}
+
+static const struct ID3D11Texture1DVtbl d3d11_texture1d_vtbl =
+{
+    /* IUnknown methods */
+    d3d11_texture1d_QueryInterface,
+    d3d11_texture1d_AddRef,
+    d3d11_texture1d_Release,
+    /* ID3D11DeviceChild methods */
+    d3d11_texture1d_GetDevice,
+    d3d11_texture1d_GetPrivateData,
+    d3d11_texture1d_SetPrivateData,
+    d3d11_texture1d_SetPrivateDataInterface,
+    /* ID3D11Resource methods */
+    d3d11_texture1d_GetType,
+    d3d11_texture1d_SetEvictionPriority,
+    d3d11_texture1d_GetEvictionPriority,
+    /* ID3D11Texture1D methods */
+    d3d11_texture1d_GetDesc,
+};
+
+struct d3d_texture1d *unsafe_impl_from_ID3D11Texture1D(ID3D11Texture1D *iface)
+{
+    if (!iface)
+        return NULL;
+    assert(iface->lpVtbl == &d3d11_texture1d_vtbl);
+    return CONTAINING_RECORD(iface, struct d3d_texture1d, ID3D11Texture1D_iface);
+}
+
+/* IUnknown methods */
+
+static HRESULT STDMETHODCALLTYPE d3d10_texture1d_QueryInterface(ID3D10Texture1D *iface, REFIID riid, void **object)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
+
+    return d3d11_texture1d_QueryInterface(&texture->ID3D11Texture1D_iface, riid, object);
+}
+
+static ULONG STDMETHODCALLTYPE d3d10_texture1d_AddRef(ID3D10Texture1D *iface)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return d3d11_texture1d_AddRef(&texture->ID3D11Texture1D_iface);
+}
+
+static void STDMETHODCALLTYPE d3d_texture1d_wined3d_object_released(void *parent)
+{
+    struct d3d_texture1d *texture = parent;
+
+    if (texture->dxgi_surface) IUnknown_Release(texture->dxgi_surface);
+    wined3d_private_store_cleanup(&texture->private_store);
+    HeapFree(GetProcessHeap(), 0, texture);
+}
+
+static ULONG STDMETHODCALLTYPE d3d10_texture1d_Release(ID3D10Texture1D *iface)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p.\n", iface);
+
+    return d3d11_texture1d_Release(&texture->ID3D11Texture1D_iface);
+}
+
+/* ID3D10DeviceChild methods */
+
+static void STDMETHODCALLTYPE d3d10_texture1d_GetDevice(ID3D10Texture1D *iface, ID3D10Device **device)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, device %p.\n", iface, device);
+
+    ID3D11Device_QueryInterface(texture->device, &IID_ID3D10Device, (void **)device);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d10_texture1d_GetPrivateData(ID3D10Texture1D *iface,
+        REFGUID guid, UINT *data_size, void *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
+
+    return d3d11_texture1d_GetPrivateData(&texture->ID3D11Texture1D_iface, guid, data_size, data);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d10_texture1d_SetPrivateData(ID3D10Texture1D *iface,
+        REFGUID guid, UINT data_size, const void *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data);
+
+    return d3d11_texture1d_SetPrivateData(&texture->ID3D11Texture1D_iface, guid, data_size, data);
+}
+
+static HRESULT STDMETHODCALLTYPE d3d10_texture1d_SetPrivateDataInterface(ID3D10Texture1D *iface,
+        REFGUID guid, const IUnknown *data)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data);
+
+    return d3d11_texture1d_SetPrivateDataInterface(&texture->ID3D11Texture1D_iface, guid, data);
+}
+
+/* ID3D10Resource methods */
+
+static void STDMETHODCALLTYPE d3d10_texture1d_GetType(ID3D10Texture1D *iface,
+        D3D10_RESOURCE_DIMENSION *resource_dimension)
+{
+    TRACE("iface %p, resource_dimension %p\n", iface, resource_dimension);
+
+    *resource_dimension = D3D10_RESOURCE_DIMENSION_TEXTURE1D;
+}
+
+static void STDMETHODCALLTYPE d3d10_texture1d_SetEvictionPriority(ID3D10Texture1D *iface, UINT eviction_priority)
+{
+    FIXME("iface %p, eviction_priority %u stub!\n", iface, eviction_priority);
+}
+
+static UINT STDMETHODCALLTYPE d3d10_texture1d_GetEvictionPriority(ID3D10Texture1D *iface)
+{
+    FIXME("iface %p stub!\n", iface);
+
+    return 0;
+}
+
+/* ID3D10Texture1D methods */
+
+static HRESULT STDMETHODCALLTYPE d3d10_texture1d_Map(ID3D10Texture1D *iface, UINT sub_resource_idx,
+        D3D10_MAP map_type, UINT map_flags, void **ppData)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+    struct wined3d_map_desc wined3d_map_desc;
+    HRESULT hr;
+
+    TRACE("iface %p, sub_resource_idx %u, map_type %u, map_flags %#x, ppData %p.\n",
+            iface, sub_resource_idx, map_type, map_flags, ppData);
+
+    if (map_flags)
+        FIXME("Ignoring map_flags %#x.\n", map_flags);
+
+    wined3d_mutex_lock();
+    if (SUCCEEDED(hr = wined3d_resource_map(wined3d_texture_get_resource(texture->wined3d_texture), sub_resource_idx,
+            &wined3d_map_desc, NULL, wined3d_map_flags_from_d3d11_map_type(map_type))))
+    {
+        *ppData = wined3d_map_desc.data;
+    }
+    wined3d_mutex_unlock();
+
+    return hr;
+}
+
+static void STDMETHODCALLTYPE d3d10_texture1d_Unmap(ID3D10Texture1D *iface, UINT sub_resource_idx)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+
+    TRACE("iface %p, sub_resource_idx %u.\n", iface, sub_resource_idx);
+
+    wined3d_mutex_lock();
+    wined3d_resource_unmap(wined3d_texture_get_resource(texture->wined3d_texture), sub_resource_idx);
+    wined3d_mutex_unlock();
+}
+
+static void STDMETHODCALLTYPE d3d10_texture1d_GetDesc(ID3D10Texture1D *iface, D3D10_TEXTURE1D_DESC *desc)
+{
+    struct d3d_texture1d *texture = impl_from_ID3D10Texture1D(iface);
+    D3D11_TEXTURE1D_DESC d3d11_desc;
+
+    TRACE("iface %p, desc %p\n", iface, desc);
+
+    d3d11_texture1d_GetDesc(&texture->ID3D11Texture1D_iface, &d3d11_desc);
+
+    desc->Width = d3d11_desc.Width;
+    desc->MipLevels = d3d11_desc.MipLevels;
+    desc->ArraySize = d3d11_desc.ArraySize;
+    desc->Format = d3d11_desc.Format;
+    desc->Usage = d3d10_usage_from_d3d11_usage(d3d11_desc.Usage);
+    desc->BindFlags = d3d10_bind_flags_from_d3d11_bind_flags(d3d11_desc.BindFlags);
+    desc->CPUAccessFlags = d3d10_cpu_access_flags_from_d3d11_cpu_access_flags(d3d11_desc.CPUAccessFlags);
+    desc->MiscFlags = d3d10_resource_misc_flags_from_d3d11_resource_misc_flags(d3d11_desc.MiscFlags);
+}
+
+static const struct ID3D10Texture1DVtbl d3d10_texture1d_vtbl =
+{
+    /* IUnknown methods */
+    d3d10_texture1d_QueryInterface,
+    d3d10_texture1d_AddRef,
+    d3d10_texture1d_Release,
+    /* ID3D10DeviceChild methods */
+    d3d10_texture1d_GetDevice,
+    d3d10_texture1d_GetPrivateData,
+    d3d10_texture1d_SetPrivateData,
+    d3d10_texture1d_SetPrivateDataInterface,
+    /* ID3D10Resource methods */
+    d3d10_texture1d_GetType,
+    d3d10_texture1d_SetEvictionPriority,
+    d3d10_texture1d_GetEvictionPriority,
+    /* ID3D10Texture1D methods */
+    d3d10_texture1d_Map,
+    d3d10_texture1d_Unmap,
+    d3d10_texture1d_GetDesc,
+};
+
+struct d3d_texture1d *unsafe_impl_from_ID3D10Texture1D(ID3D10Texture1D *iface)
+{
+    if (!iface)
+        return NULL;
+    assert(iface->lpVtbl == &d3d10_texture1d_vtbl);
+    return CONTAINING_RECORD(iface, struct d3d_texture1d, ID3D10Texture1D_iface);
+}
+
+static const struct wined3d_parent_ops d3d_texture1d_wined3d_parent_ops =
+{
+    d3d_texture1d_wined3d_object_released,
+};
+
+/*
+static BOOL is_gdi_compatible_texture(const D3D11_TEXTURE1D_DESC *desc)
+{
+    if (!(desc->Format == DXGI_FORMAT_B8G8R8A8_UNORM
+            || desc->Format == DXGI_FORMAT_B8G8R8A8_TYPELESS
+            || desc->Format == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB))
+        return FALSE;
+
+    if (desc->Usage != D3D11_USAGE_DEFAULT)
+        return FALSE;
+
+    return TRUE;
+}
+
+static BOOL validate_texture1d_desc(const D3D11_TEXTURE1D_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;
+}
+*/
+
+HRESULT d3d_texture1d_create(struct d3d_device *device, const D3D11_TEXTURE1D_DESC *desc,
+        const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture1d **out)
+{
+    struct wined3d_resource_desc wined3d_desc;
+    struct d3d_texture1d *texture;
+    unsigned int levels;
+    DWORD flags = 0;
+    HRESULT hr;
+
+/*
+    if (!validate_texture1d_desc(desc))
+    {
+        WARN("Failed to validate texture desc.\n");
+        return E_INVALIDARG;
+    }
+*/
+
+    if (!(texture = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*texture))))
+        return E_OUTOFMEMORY;
+
+    texture->ID3D11Texture1D_iface.lpVtbl = &d3d11_texture1d_vtbl;
+    texture->ID3D10Texture1D_iface.lpVtbl = &d3d10_texture1d_vtbl;
+    texture->refcount = 1;
+    wined3d_mutex_lock();
+    wined3d_private_store_init(&texture->private_store);
+    texture->desc = *desc;
+
+    wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE_1D;
+    wined3d_desc.format = wined3dformat_from_dxgi_format(desc->Format);
+    wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
+    wined3d_desc.multisample_quality = 0;
+    wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage);
+    wined3d_desc.pool = WINED3D_POOL_DEFAULT;
+    wined3d_desc.width = desc->Width;
+    wined3d_desc.height = 1;
+    wined3d_desc.depth = 1;
+    wined3d_desc.size = 0;
+
+    levels = desc->MipLevels ? desc->MipLevels : wined3d_log2i(desc->Width) + 1;
+
+    if (desc->MiscFlags & D3D11_RESOURCE_MISC_GDI_COMPATIBLE)
+        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,
+            texture, &d3d_texture1d_wined3d_parent_ops, &texture->wined3d_texture)))
+    {
+        WARN("Failed to create wined3d texture, hr %#x.\n", hr);
+        wined3d_private_store_cleanup(&texture->private_store);
+        HeapFree(GetProcessHeap(), 0, texture);
+        wined3d_mutex_unlock();
+        if (hr == WINED3DERR_NOTAVAILABLE || hr == WINED3DERR_INVALIDCALL)
+            hr = E_INVALIDARG;
+        return hr;
+    }
+    texture->desc.MipLevels = levels;
+
+    if (desc->MipLevels == 1 && desc->ArraySize == 1)
+    {
+        IWineDXGIDevice *wine_device;
+
+        if (FAILED(hr = ID3D10Device1_QueryInterface(&device->ID3D10Device1_iface, &IID_IWineDXGIDevice,
+                (void **)&wine_device)))
+        {
+            ERR("Device should implement IWineDXGIDevice.\n");
+            wined3d_texture_decref(texture->wined3d_texture);
+            wined3d_mutex_unlock();
+            return E_FAIL;
+        }
+
+        hr = IWineDXGIDevice_create_surface(wine_device, texture->wined3d_texture, 0, NULL,
+                (IUnknown *)&texture->ID3D10Texture1D_iface, (void **)&texture->dxgi_surface);
+        IWineDXGIDevice_Release(wine_device);
+        if (FAILED(hr))
+        {
+            ERR("Failed to create DXGI surface, returning %#.x\n", hr);
+            texture->dxgi_surface = NULL;
+            wined3d_texture_decref(texture->wined3d_texture);
+            wined3d_mutex_unlock();
+            return hr;
+        }
+    }
+    wined3d_mutex_unlock();
+
+    ID3D11Device_AddRef(texture->device = &device->ID3D11Device_iface);
+
+    TRACE("Created texture %p.\n", texture);
+    *out = texture;
+
+    return S_OK;
+}
+
 /* ID3D11Texture2D methods */
 
 static inline struct d3d_texture2d *impl_from_ID3D11Texture2D(ID3D11Texture2D *iface)
diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c
index e919c58da4..790e16eaaf 100644
--- a/dlls/d3d11/utils.c
+++ b/dlls/d3d11/utils.c
@@ -607,6 +607,10 @@ struct wined3d_resource *wined3d_resource_from_d3d11_resource(ID3D11Resource *re
             return wined3d_buffer_get_resource(unsafe_impl_from_ID3D11Buffer(
                     (ID3D11Buffer *)resource)->wined3d_buffer);
 
+        case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
+            return wined3d_texture_get_resource(unsafe_impl_from_ID3D11Texture1D(
+                    (ID3D11Texture1D *)resource)->wined3d_texture);
+
         case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
             return wined3d_texture_get_resource(unsafe_impl_from_ID3D11Texture2D(
                     (ID3D11Texture2D *)resource)->wined3d_texture);
-- 
2.15.1




More information about the wine-devel mailing list