d3d10core: Always create a wined3d texture for d3d10core textures.
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index 5f320e0..885a2ef 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -90,7 +90,7 @@
LONG refcount;
IUnknown *dxgi_surface;
- struct wined3d_surface *wined3d_surface;
+ struct wined3d_texture *wined3d_texture;
D3D10_TEXTURE2D_DESC desc;
};
diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c
index d4c0822..2d1db4e 100644
--- a/dlls/d3d10core/device.c
+++ b/dlls/d3d10core/device.c
@@ -24,6 +24,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d10core);
+static void STDMETHODCALLTYPE d3d10_null_wined3d_object_destroyed(void *parent) {}
+
+const struct wined3d_parent_ops d3d10_null_wined3d_parent_ops =
+{
+ d3d10_null_wined3d_object_destroyed,
+};
+
/* Inner IUnknown methods */
static inline struct d3d10_device *impl_from_IUnknown(IUnknown *iface)
@@ -1361,41 +1368,14 @@
enum wined3d_pool pool, UINT level, enum wined3d_cubemap_face face, struct wined3d_surface **surface)
{
struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
- struct d3d10_texture2d *texture;
- D3D10_TEXTURE2D_DESC desc;
- HRESULT hr;
- FIXME("device_parent %p, container_parent %p, width %u, height %u, format %#x, usage %#x,\n"
- "\tpool %#x, level %u, face %u, surface %p partial stub!\n",
+ TRACE("device_parent %p, container_parent %p, width %u, height %u, format %#x, usage %#x,\n"
+ "\tpool %#x, level %u, face %u, surface %p.\n",
device_parent, container_parent, width, height, format, usage, pool, level, face, surface);
- FIXME("Implement DXGI<->wined3d usage conversion\n");
-
- desc.Width = width;
- desc.Height = height;
- desc.MipLevels = 1;
- desc.ArraySize = 1;
- desc.Format = dxgi_format_from_wined3dformat(format);
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Usage = usage;
- desc.BindFlags = 0;
- desc.CPUAccessFlags = 0;
- desc.MiscFlags = 0;
-
- hr = d3d10_device_CreateTexture2D(&device->ID3D10Device_iface, &desc, NULL,
- (ID3D10Texture2D **)&texture);
- if (FAILED(hr))
- {
- ERR("CreateTexture2D failed, returning %#x\n", hr);
- return hr;
- }
-
- *surface = texture->wined3d_surface;
- wined3d_surface_incref(*surface);
- ID3D10Texture2D_Release(&texture->ID3D10Texture2D_iface);
-
- return S_OK;
+ return wined3d_surface_create(device->wined3d_device, width, height, format, level,
+ usage, pool, WINED3D_MULTISAMPLE_NONE, 0, WINED3D_SURFACE_TYPE_OPENGL, 0, container_parent,
+ &d3d10_null_wined3d_parent_ops, surface);
}
static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_device_parent *device_parent,
@@ -1403,6 +1383,7 @@
enum wined3d_multisample_type multisample_type, DWORD multisample_quality, struct wined3d_surface **surface)
{
struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
+ struct wined3d_resource *sub_resource;
struct d3d10_texture2d *texture;
D3D10_TEXTURE2D_DESC desc;
HRESULT hr;
@@ -1434,7 +1415,8 @@
return hr;
}
- *surface = texture->wined3d_surface;
+ sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, 0);
+ *surface = wined3d_surface_from_resource(sub_resource);
wined3d_surface_incref(*surface);
ID3D10Texture2D_Release(&texture->ID3D10Texture2D_iface);
diff --git a/dlls/d3d10core/texture.c b/dlls/d3d10core/texture.c
index d4cf35d..1126e87 100644
--- a/dlls/d3d10core/texture.c
+++ b/dlls/d3d10core/texture.c
@@ -66,8 +66,8 @@
TRACE("%p increasing refcount to %u\n", This, refcount);
- if (refcount == 1 && This->wined3d_surface)
- wined3d_surface_incref(This->wined3d_surface);
+ if (refcount == 1)
+ wined3d_texture_incref(This->wined3d_texture);
return refcount;
}
@@ -88,12 +88,7 @@
TRACE("%p decreasing refcount to %u\n", This, refcount);
if (!refcount)
- {
- if (This->wined3d_surface)
- wined3d_surface_decref(This->wined3d_surface);
- else
- d3d10_texture2d_wined3d_object_released(This);
- }
+ wined3d_texture_decref(This->wined3d_texture);
return refcount;
}
@@ -233,20 +228,23 @@
ERR("Failed to create DXGI surface, returning %#x\n", hr);
return hr;
}
+ }
- FIXME("Implement DXGI<->wined3d usage conversion\n");
+ FIXME("Implement DXGI<->wined3d usage conversion\n");
+ if (desc->ArraySize != 1)
+ FIXME("Array textures not implemented.\n");
+ if (desc->SampleDesc.Count > 1)
+ FIXME("Multisampled textures not implemented.\n");
- hr = wined3d_surface_create(device->wined3d_device, desc->Width, desc->Height,
- wined3dformat_from_dxgi_format(desc->Format), 0, desc->Usage, WINED3D_POOL_DEFAULT,
- desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE,
- desc->SampleDesc.Quality, WINED3D_SURFACE_TYPE_OPENGL, 0, texture, &d3d10_texture2d_wined3d_parent_ops,
- &texture->wined3d_surface);
- if (FAILED(hr))
- {
- ERR("CreateSurface failed, returning %#x\n", hr);
+ hr = wined3d_texture_create_2d(device->wined3d_device, desc->Width, desc->Height,
+ desc->MipLevels, desc->Usage, wined3dformat_from_dxgi_format(desc->Format), WINED3D_POOL_DEFAULT,
+ texture, &d3d10_texture2d_wined3d_parent_ops, &texture->wined3d_texture);
+ if (FAILED(hr))
+ {
+ WARN("Failed to create wined3d texture, hr %#x.\n", hr);
+ if (texture->dxgi_surface)
IDXGISurface_Release(texture->dxgi_surface);
- return hr;
- }
+ return hr;
}
return S_OK;
diff --git a/dlls/d3d10core/view.c b/dlls/d3d10core/view.c
index 57473e4..d038faa 100644
--- a/dlls/d3d10core/view.c
+++ b/dlls/d3d10core/view.c
@@ -37,7 +37,7 @@
return wined3d_buffer_get_resource(((struct d3d10_buffer *)resource)->wined3d_buffer);
case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
- return wined3d_surface_get_resource(((struct d3d10_texture2d *)resource)->wined3d_surface);
+ return wined3d_texture_get_resource(((struct d3d10_texture2d *)resource)->wined3d_texture);
default:
FIXME("Unhandled resource dimension %#x.\n", dimension);
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index 0f78642..79a757b 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -189,9 +189,10 @@
struct wined3d_surface *wined3d_surface;
IUnknown *parent;
- hr = device_parent->ops->create_texture_surface(device_parent, NULL, desc->Width, desc->Height,
- wined3dformat_from_dxgi_format(desc->Format), usage, WINED3D_POOL_DEFAULT, 0,
- WINED3D_CUBEMAP_FACE_POSITIVE_X, &wined3d_surface);
+ hr = device_parent->ops->create_swapchain_surface(device_parent, NULL,
+ desc->Width, desc->Height, wined3dformat_from_dxgi_format(desc->Format), usage,
+ desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE,
+ desc->SampleDesc.Quality, &wined3d_surface);
if (FAILED(hr))
{
ERR("CreateSurface failed, returning %#x\n", hr);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index ea0baa4..f5cc3f5 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3852,6 +3852,11 @@
return WINED3D_OK;
}
+struct wined3d_surface * CDECL wined3d_surface_from_resource(struct wined3d_resource *resource)
+{
+ return surface_from_resource(resource);
+}
+
HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface)
{
TRACE("surface %p.\n", surface);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 3a0ac25..a22ebd1 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -193,6 +193,7 @@
@ cdecl wined3d_surface_create(ptr long long long long long long long long long long ptr ptr ptr)
@ cdecl wined3d_surface_decref(ptr)
@ cdecl wined3d_surface_flip(ptr ptr long)
+@ cdecl wined3d_surface_from_resource(ptr)
@ cdecl wined3d_surface_get_blt_status(ptr long)
@ cdecl wined3d_surface_get_flip_status(ptr long)
@ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index c253230..f587e44 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2325,6 +2325,7 @@
const struct wined3d_parent_ops *parent_ops, struct wined3d_surface **surface);
ULONG __cdecl wined3d_surface_decref(struct wined3d_surface *surface);
HRESULT __cdecl wined3d_surface_flip(struct wined3d_surface *surface, struct wined3d_surface *override, DWORD flags);
+struct wined3d_surface * __cdecl wined3d_surface_from_resource(struct wined3d_resource *resource);
HRESULT __cdecl wined3d_surface_get_blt_status(const struct wined3d_surface *surface, DWORD flags);
HRESULT __cdecl wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags);
HRESULT __cdecl wined3d_surface_get_overlay_position(const struct wined3d_surface *surface, LONG *x, LONG *y);