[PATCH 1/5] ddraw: Create textures for swapchain surfaces.

Henri Verbeet hverbeet at codeweavers.com
Wed Nov 13 03:12:06 CST 2013


---
 dlls/ddraw/ddraw.c |   32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 1dafa1e..6496ac3 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -5143,14 +5143,23 @@ static HRESULT CDECL device_parent_create_texture_surface(struct wined3d_device_
         DWORD flags, struct wined3d_surface **surface)
 {
     struct ddraw *ddraw = ddraw_from_device_parent(device_parent);
-    struct ddraw_texture *texture = container_parent;
-    DDSURFACEDESC2 desc = texture->surface_desc;
     struct ddraw_surface *ddraw_surface;
+    struct ddraw_texture *texture;
+    DDSURFACEDESC2 desc;
     HRESULT hr;
 
     TRACE("device_parent %p, container_parent %p, wined3d_desc %p, sub_resource_idx %u, flags %#x, surface %p.\n",
             device_parent, container_parent, wined3d_desc, sub_resource_idx, flags, surface);
 
+    /* We have a swapchain texture. */
+    if (container_parent == ddraw)
+        return wined3d_surface_create(ddraw->wined3d_device, wined3d_desc->width, wined3d_desc->height,
+                wined3d_desc->format, wined3d_desc->usage, wined3d_desc->pool, wined3d_desc->multisample_type,
+                wined3d_desc->multisample_quality, WINED3D_SURFACE_MAPPABLE, NULL,
+                &ddraw_null_wined3d_parent_ops, surface);
+
+    texture = container_parent;
+    desc = texture->surface_desc;
     desc.dwWidth = wined3d_desc->width;
     desc.dwHeight = wined3d_desc->height;
 
@@ -5179,6 +5188,8 @@ static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_devic
         void *container_parent, const struct wined3d_resource_desc *desc, struct wined3d_surface **surface)
 {
     struct ddraw *ddraw = ddraw_from_device_parent(device_parent);
+    struct wined3d_resource_desc texture_desc;
+    struct wined3d_texture *texture;
     HRESULT hr;
 
     TRACE("device_parent %p, container_parent %p, desc %p, surface %p.\n",
@@ -5190,10 +5201,19 @@ static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_devic
         return E_FAIL;
     }
 
-    if (SUCCEEDED(hr = wined3d_surface_create(ddraw->wined3d_device, desc->width, desc->height, desc->format,
-            desc->usage, desc->pool, desc->multisample_type, desc->multisample_quality, WINED3D_SURFACE_MAPPABLE,
-            ddraw, &ddraw_frontbuffer_parent_ops, surface)))
-        ddraw->wined3d_frontbuffer = *surface;
+    texture_desc = *desc;
+    texture_desc.resource_type = WINED3D_RTYPE_TEXTURE;
+    if (FAILED(hr = wined3d_texture_create_2d(ddraw->wined3d_device, &texture_desc, 1,
+            WINED3D_SURFACE_MAPPABLE, ddraw, &ddraw_frontbuffer_parent_ops, &texture)))
+    {
+        WARN("Failed to create texture, hr %#x.\n", hr);
+        return hr;
+    }
+
+    *surface = wined3d_surface_from_resource(wined3d_texture_get_sub_resource(texture, 0));
+    ddraw->wined3d_frontbuffer = *surface;
+    wined3d_surface_incref(*surface);
+    wined3d_texture_decref(texture);
 
     return hr;
 }
-- 
1.7.10.4




More information about the wine-patches mailing list