[PATCH 5/5] wined3d: Move the "desc" field from struct wined3d_swapchain to struct wined3d_swapchain_state.

Henri Verbeet hverbeet at codeweavers.com
Mon Jul 29 06:30:55 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/cs.c              |   6 +-
 dlls/wined3d/device.c          |  67 ++++++++++---------
 dlls/wined3d/surface.c         |   6 +-
 dlls/wined3d/swapchain.c       | 147 +++++++++++++++++++++--------------------
 dlls/wined3d/view.c            |  10 +--
 dlls/wined3d/wined3d_private.h |   3 +-
 6 files changed, 123 insertions(+), 116 deletions(-)

diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 8413d0f3c05..3882be91aa9 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -530,7 +530,7 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data)
     swapchain->swapchain_ops->swapchain_present(swapchain, &op->src_rect, &op->dst_rect, op->swap_interval, op->flags);
 
     wined3d_resource_release(&swapchain->front_buffer->resource);
-    for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+    for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
     {
         wined3d_resource_release(&swapchain->back_buffers[i]->resource);
     }
@@ -558,7 +558,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
     pending = InterlockedIncrement(&cs->pending_presents);
 
     wined3d_resource_acquire(&swapchain->front_buffer->resource);
-    for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+    for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
     {
         wined3d_resource_acquire(&swapchain->back_buffers[i]->resource);
     }
@@ -1137,7 +1137,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
     {
         struct wined3d_texture *prev_texture = texture_from_resource(prev->resource);
 
-        if (device->swapchains[0]->desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
+        if (device->swapchains[0]->state.desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
                 || prev_texture->flags & WINED3D_TEXTURE_DISCARD)
             wined3d_texture_validate_location(prev_texture,
                     prev->sub_resource_idx, WINED3D_LOCATION_DISCARDED);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8502b967905..30307cc90c3 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -936,7 +936,7 @@ void CDECL wined3d_device_release_focus_window(struct wined3d_device *device)
 
 static void device_init_swapchain_state(struct wined3d_device *device, struct wined3d_swapchain *swapchain)
 {
-    BOOL ds_enable = swapchain->desc.enable_auto_depth_stencil;
+    BOOL ds_enable = swapchain->state.desc.enable_auto_depth_stencil;
     unsigned int i;
 
     for (i = 0; i < device->adapter->d3d_info.limits.max_rt_count; ++i)
@@ -1044,7 +1044,7 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str
     if (device->d3d_initialized)
         return WINED3DERR_INVALIDCALL;
 
-    swapchain_desc = &swapchain->desc;
+    swapchain_desc = &swapchain->state.desc;
     if (swapchain_desc->backbuffer_count && swapchain_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
     {
         struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
@@ -5294,7 +5294,7 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device)
 
 static void update_swapchain_flags(struct wined3d_texture *texture)
 {
-    unsigned int flags = texture->swapchain->desc.flags;
+    unsigned int flags = texture->swapchain->state.desc.flags;
 
     if (flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
         texture->resource.access |= WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
@@ -5312,6 +5312,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         wined3d_device_reset_cb callback, BOOL reset_state)
 {
     const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
+    struct wined3d_swapchain_state *swapchain_state;
+    struct wined3d_swapchain_desc *current_desc;
     struct wined3d_resource *resource, *cursor;
     struct wined3d_rendertarget_view *view;
     struct wined3d_swapchain *swapchain;
@@ -5330,6 +5332,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         ERR("Failed to get the first implicit swapchain.\n");
         return WINED3DERR_INVALIDCALL;
     }
+    swapchain_state = &swapchain->state;
+    current_desc = &swapchain_state->desc;
 
     if (reset_state)
     {
@@ -5389,25 +5393,24 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         FIXME("Unimplemented swap effect %#x.\n", swapchain_desc->swap_effect);
 
     /* No special treatment of these parameters. Just store them */
-    swapchain->desc.swap_effect = swapchain_desc->swap_effect;
-    swapchain->desc.enable_auto_depth_stencil = swapchain_desc->enable_auto_depth_stencil;
-    swapchain->desc.auto_depth_stencil_format = swapchain_desc->auto_depth_stencil_format;
-    swapchain->desc.refresh_rate = swapchain_desc->refresh_rate;
-    swapchain->desc.auto_restore_display_mode = swapchain_desc->auto_restore_display_mode;
+    current_desc->swap_effect = swapchain_desc->swap_effect;
+    current_desc->enable_auto_depth_stencil = swapchain_desc->enable_auto_depth_stencil;
+    current_desc->auto_depth_stencil_format = swapchain_desc->auto_depth_stencil_format;
+    current_desc->refresh_rate = swapchain_desc->refresh_rate;
+    current_desc->auto_restore_display_mode = swapchain_desc->auto_restore_display_mode;
 
-    if (swapchain_desc->device_window
-            && swapchain_desc->device_window != swapchain->desc.device_window)
+    if (swapchain_desc->device_window && swapchain_desc->device_window != current_desc->device_window)
     {
         TRACE("Changing the device window from %p to %p.\n",
-                swapchain->desc.device_window, swapchain_desc->device_window);
-        swapchain->desc.device_window = swapchain_desc->device_window;
+                current_desc->device_window, swapchain_desc->device_window);
+        current_desc->device_window = swapchain_desc->device_window;
         swapchain->device_window = swapchain_desc->device_window;
         wined3d_swapchain_set_window(swapchain, NULL);
     }
 
-    backbuffer_resized = swapchain_desc->backbuffer_width != swapchain->desc.backbuffer_width
-            || swapchain_desc->backbuffer_height != swapchain->desc.backbuffer_height;
-    windowed = swapchain->desc.windowed;
+    backbuffer_resized = swapchain_desc->backbuffer_width != current_desc->backbuffer_width
+            || swapchain_desc->backbuffer_height != current_desc->backbuffer_height;
+    windowed = current_desc->windowed;
 
     if (!swapchain_desc->windowed != !windowed || swapchain->reapply_mode
             || mode || (!swapchain_desc->windowed && backbuffer_resized))
@@ -5434,18 +5437,18 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     }
     else if (!swapchain_desc->windowed)
     {
-        DWORD style = swapchain->state.style;
-        DWORD exstyle = swapchain->state.exstyle;
+        DWORD style = swapchain_state->style;
+        DWORD exstyle = swapchain_state->exstyle;
         /* If we're in fullscreen, and the mode wasn't changed, we have to get
          * the window back into the right position. Some applications
          * (Battlefield 2, Guild Wars) move it and then call Reset() to clean
          * up their mess. Guild Wars also loses the device during that. */
-        swapchain->state.style = 0;
-        swapchain->state.exstyle = 0;
-        wined3d_swapchain_state_setup_fullscreen(&swapchain->state, swapchain->device_window,
+        swapchain_state->style = 0;
+        swapchain_state->exstyle = 0;
+        wined3d_swapchain_state_setup_fullscreen(swapchain_state, swapchain->device_window,
                 swapchain_desc->backbuffer_width, swapchain_desc->backbuffer_height);
-        swapchain->state.style = style;
-        swapchain->state.exstyle = exstyle;
+        swapchain_state->style = style;
+        swapchain_state->exstyle = exstyle;
     }
 
     if (FAILED(hr = wined3d_swapchain_resize_buffers(swapchain, swapchain_desc->backbuffer_count,
@@ -5453,12 +5456,12 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
             swapchain_desc->multisample_type, swapchain_desc->multisample_quality)))
         return hr;
 
-    if (swapchain_desc->flags != swapchain->desc.flags)
+    if (swapchain_desc->flags != current_desc->flags)
     {
-        swapchain->desc.flags = swapchain_desc->flags;
+        current_desc->flags = swapchain_desc->flags;
 
         update_swapchain_flags(swapchain->front_buffer);
-        for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+        for (i = 0; i < current_desc->backbuffer_count; ++i)
         {
             update_swapchain_flags(swapchain->back_buffers[i]);
         }
@@ -5469,7 +5472,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         device->auto_depth_stencil_view = NULL;
         wined3d_rendertarget_view_decref(view);
     }
-    if (swapchain->desc.enable_auto_depth_stencil)
+    if (current_desc->enable_auto_depth_stencil)
     {
         struct wined3d_resource_desc texture_desc;
         struct wined3d_texture *texture;
@@ -5477,14 +5480,14 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         TRACE("Creating the depth stencil buffer.\n");
 
         texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
-        texture_desc.format = swapchain->desc.auto_depth_stencil_format;
-        texture_desc.multisample_type = swapchain->desc.multisample_type;
-        texture_desc.multisample_quality = swapchain->desc.multisample_quality;
+        texture_desc.format = current_desc->auto_depth_stencil_format;
+        texture_desc.multisample_type = current_desc->multisample_type;
+        texture_desc.multisample_quality = current_desc->multisample_quality;
         texture_desc.usage = 0;
         texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
         texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
-        texture_desc.width = swapchain->desc.backbuffer_width;
-        texture_desc.height = swapchain->desc.backbuffer_height;
+        texture_desc.width = current_desc->backbuffer_width;
+        texture_desc.height = current_desc->backbuffer_height;
         texture_desc.depth = 1;
         texture_desc.size = 0;
 
@@ -5518,7 +5521,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         device->back_buffer_view = NULL;
         wined3d_rendertarget_view_decref(view);
     }
-    if (swapchain->desc.backbuffer_count && swapchain->desc.backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
+    if (current_desc->backbuffer_count && current_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
     {
         struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3668c61fa33..01a2b892dcc 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3091,16 +3091,16 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
          * Prince of Persia 3D use Blt() from the backbuffer to the
          * frontbuffer instead of doing a Flip(). D3d8 and d3d9 applications
          * can't blit directly to the frontbuffer. */
-        enum wined3d_swap_effect swap_effect = dst_swapchain->desc.swap_effect;
+        enum wined3d_swap_effect swap_effect = dst_swapchain->state.desc.swap_effect;
 
         TRACE("Using present for backbuffer -> frontbuffer blit.\n");
 
         /* Set the swap effect to COPY, we don't want the backbuffer to become
          * undefined. */
-        dst_swapchain->desc.swap_effect = WINED3D_SWAP_EFFECT_COPY;
+        dst_swapchain->state.desc.swap_effect = WINED3D_SWAP_EFFECT_COPY;
         wined3d_swapchain_present(dst_swapchain, NULL, NULL,
                 dst_swapchain->win_handle, dst_swapchain->swap_interval, 0);
-        dst_swapchain->desc.swap_effect = swap_effect;
+        dst_swapchain->state.desc.swap_effect = swap_effect;
 
         return WINED3D_OK;
     }
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 10363e007a8..a9de2050db9 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -54,7 +54,7 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
 
     if (swapchain->back_buffers)
     {
-        i = swapchain->desc.backbuffer_count;
+        i = swapchain->state.desc.backbuffer_count;
 
         while (i--)
         {
@@ -75,15 +75,15 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
      * desktop resolution. In case of d3d7 this will be a NOP because ddraw
      * sets the resolution before starting up Direct3D, thus orig_width and
      * orig_height will be equal to the modes in the presentation params. */
-    if (!swapchain->desc.windowed)
+    if (!swapchain->state.desc.windowed)
     {
-        if (swapchain->desc.auto_restore_display_mode)
+        if (swapchain->state.desc.auto_restore_display_mode)
         {
             if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
                     swapchain->device->adapter->ordinal, &swapchain->original_mode)))
                 ERR("Failed to restore display mode, hr %#x.\n", hr);
 
-            if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+            if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
             {
                 wined3d_window_state_restore_from_fullscreen(&swapchain->state,
                         swapchain->device_window, &swapchain->original_window_rect);
@@ -188,8 +188,8 @@ HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
 
     if (!src_rect)
     {
-        SetRect(&s, 0, 0, swapchain->desc.backbuffer_width,
-                swapchain->desc.backbuffer_height);
+        SetRect(&s, 0, 0, swapchain->state.desc.backbuffer_width,
+                swapchain->state.desc.backbuffer_height);
         src_rect = &s;
     }
 
@@ -217,7 +217,7 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc
     SetRect(&src_rect, 0, 0, swapchain->front_buffer->resource.width, swapchain->front_buffer->resource.height);
     dst_rect = src_rect;
 
-    if (swapchain->desc.windowed)
+    if (swapchain->state.desc.windowed)
     {
         MapWindowPoints(swapchain->win_handle, NULL, (POINT *)&dst_rect, 2);
         FIXME("Using destination rect %s in windowed mode, this is likely wrong.\n",
@@ -239,7 +239,7 @@ struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wi
      * NULL). We need this because this function is called from
      * stateblock_init_default_state() to get the default scissorrect
      * dimensions. */
-    if (!swapchain->back_buffers || back_buffer_idx >= swapchain->desc.backbuffer_count)
+    if (!swapchain->back_buffers || back_buffer_idx >= swapchain->state.desc.backbuffer_count)
     {
         WARN("Invalid back buffer index.\n");
         /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it
@@ -289,7 +289,7 @@ void CDECL wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchain,
 {
     TRACE("swapchain %p, desc %p.\n", swapchain, desc);
 
-    *desc = swapchain->desc;
+    *desc = swapchain->state.desc;
 }
 
 HRESULT CDECL wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *swapchain,
@@ -393,7 +393,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
     unsigned int i;
     static const DWORD supported_locations = WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_RB_MULTISAMPLE;
 
-    if (swapchain->desc.backbuffer_count < 2 || !swapchain->render_to_fbo)
+    if (swapchain->state.desc.backbuffer_count < 2 || !swapchain->render_to_fbo)
         return;
 
     texture_prev = wined3d_texture_gl(swapchain->back_buffers[0]);
@@ -403,7 +403,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
     rb0 = texture_prev->rb_multisample;
     locations0 = texture_prev->t.sub_resources[0].locations;
 
-    for (i = 1; i < swapchain->desc.backbuffer_count; ++i)
+    for (i = 1; i < swapchain->state.desc.backbuffer_count; ++i)
     {
         texture = wined3d_texture_gl(swapchain->back_buffers[i]);
         sub_resource = &texture->t.sub_resources[0];
@@ -432,6 +432,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
 static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
         const RECT *src_rect, const RECT *dst_rect, unsigned int swap_interval, DWORD flags)
 {
+    const struct wined3d_swapchain_desc *desc = &swapchain->state.desc;
     struct wined3d_texture *back_buffer = swapchain->back_buffers[0];
     const struct wined3d_fb_state *fb = &swapchain->device->cs->fb;
     struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
@@ -481,7 +482,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
 
         TRACE("Rendering the software cursor.\n");
 
-        if (swapchain->desc.windowed)
+        if (desc->windowed)
             MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&dst_rect, 2);
         if (wined3d_clip_blit(&clip_rect, &dst_rect, &src_rect))
             wined3d_texture_blt(back_buffer, 0, &dst_rect, cursor_texture, 0,
@@ -492,11 +493,11 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
 
     if (!(render_to_fbo = swapchain->render_to_fbo)
             && (src_rect->left || src_rect->top
-            || src_rect->right != swapchain->desc.backbuffer_width
-            || src_rect->bottom != swapchain->desc.backbuffer_height
+            || src_rect->right != desc->backbuffer_width
+            || src_rect->bottom != desc->backbuffer_height
             || dst_rect->left || dst_rect->top
-            || dst_rect->right != swapchain->desc.backbuffer_width
-            || dst_rect->bottom != swapchain->desc.backbuffer_height))
+            || dst_rect->right != desc->backbuffer_width
+            || dst_rect->bottom != desc->backbuffer_height))
         render_to_fbo = TRUE;
 
     /* Rendering to a window of different size, presenting partial rectangles,
@@ -555,16 +556,16 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
      * The FLIP swap effect is not implemented yet. We could mark WINED3D_LOCATION_DRAWABLE
      * up to date and hope WGL flipped front and back buffers and read this data into
      * the FBO. Don't bother about this for now. */
-    if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_DISCARD
-            || swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP_DISCARD)
-        wined3d_texture_validate_location(swapchain->back_buffers[swapchain->desc.backbuffer_count - 1],
+    if (desc->swap_effect == WINED3D_SWAP_EFFECT_DISCARD
+            || desc->swap_effect == WINED3D_SWAP_EFFECT_FLIP_DISCARD)
+        wined3d_texture_validate_location(swapchain->back_buffers[desc->backbuffer_count - 1],
                 0, WINED3D_LOCATION_DISCARDED);
 
     if (dsv && dsv->resource->type != WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_texture *ds = texture_from_resource(dsv->resource);
 
-        if ((swapchain->desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
+        if ((desc->flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
                 || ds->flags & WINED3D_TEXTURE_DISCARD))
             wined3d_texture_validate_location(ds, dsv->sub_resource_idx, WINED3D_LOCATION_DISCARDED);
     }
@@ -614,7 +615,7 @@ static void swapchain_gdi_frontbuffer_updated(struct wined3d_swapchain *swapchai
 
     /* Front buffer coordinates are screen coordinates. Map them to the
      * destination window if not fullscreened. */
-    if (swapchain->desc.windowed)
+    if (swapchain->state.desc.windowed)
         ClientToScreen(window, &offset);
 
     TRACE("offset %s.\n", wine_dbgstr_point(&offset));
@@ -689,7 +690,7 @@ static void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
     if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
         return;
 
-    if (!swapchain->desc.backbuffer_count)
+    if (!swapchain->state.desc.backbuffer_count)
     {
         TRACE("Single buffered rendering.\n");
         swapchain->render_to_fbo = FALSE;
@@ -814,30 +815,30 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
         wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
                 window, desc->backbuffer_width, desc->backbuffer_height);
     }
-    swapchain->desc = *desc;
-    wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->desc.backbuffer_format,
-            &swapchain->desc.multisample_type, &swapchain->desc.multisample_quality);
+    swapchain->state.desc = *desc;
+    wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->state.desc.backbuffer_format,
+            &swapchain->state.desc.multisample_type, &swapchain->state.desc.multisample_quality);
     swapchain_update_render_to_fbo(swapchain);
 
     TRACE("Creating front buffer.\n");
 
     texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
-    texture_desc.format = swapchain->desc.backbuffer_format;
-    texture_desc.multisample_type = swapchain->desc.multisample_type;
-    texture_desc.multisample_quality = swapchain->desc.multisample_quality;
+    texture_desc.format = swapchain->state.desc.backbuffer_format;
+    texture_desc.multisample_type = swapchain->state.desc.multisample_type;
+    texture_desc.multisample_quality = swapchain->state.desc.multisample_quality;
     texture_desc.usage = 0;
     if (device->wined3d->flags & WINED3D_NO3D)
         texture_desc.usage |= WINED3DUSAGE_OWNDC;
     texture_desc.bind_flags = 0;
     texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
-    if (swapchain->desc.flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
+    if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
         texture_desc.access |= WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
-    texture_desc.width = swapchain->desc.backbuffer_width;
-    texture_desc.height = swapchain->desc.backbuffer_height;
+    texture_desc.width = swapchain->state.desc.backbuffer_width;
+    texture_desc.height = swapchain->state.desc.backbuffer_height;
     texture_desc.depth = 1;
     texture_desc.size = 0;
 
-    if (swapchain->desc.flags & WINED3D_SWAPCHAIN_GDI_COMPATIBLE)
+    if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_GDI_COMPATIBLE)
         texture_flags |= WINED3D_TEXTURE_CREATE_GET_DC;
 
     if (FAILED(hr = device->device_parent->ops->create_swapchain_texture(device->device_parent,
@@ -883,9 +884,9 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
         }
     }
 
-    if (swapchain->desc.backbuffer_count > 0)
+    if (swapchain->state.desc.backbuffer_count > 0)
     {
-        if (!(swapchain->back_buffers = heap_calloc(swapchain->desc.backbuffer_count,
+        if (!(swapchain->back_buffers = heap_calloc(swapchain->state.desc.backbuffer_count,
                 sizeof(*swapchain->back_buffers))))
         {
             ERR("Failed to allocate backbuffer array memory.\n");
@@ -893,18 +894,18 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
             goto err;
         }
 
-        texture_desc.bind_flags = swapchain->desc.backbuffer_bind_flags;
+        texture_desc.bind_flags = swapchain->state.desc.backbuffer_bind_flags;
         texture_desc.usage = 0;
         if (device->wined3d->flags & WINED3D_NO3D)
             texture_desc.usage |= WINED3DUSAGE_OWNDC;
-        for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+        for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
         {
             TRACE("Creating back buffer %u.\n", i);
             if (FAILED(hr = device->device_parent->ops->create_swapchain_texture(device->device_parent,
                     parent, &texture_desc, texture_flags, &swapchain->back_buffers[i])))
             {
                 WARN("Failed to create back buffer %u, hr %#x.\n", i, hr);
-                swapchain->desc.backbuffer_count = i;
+                swapchain->state.desc.backbuffer_count = i;
                 goto err;
             }
             wined3d_texture_set_swapchain(swapchain->back_buffers[i], swapchain);
@@ -920,7 +921,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
             struct wined3d_view_desc desc;
             struct wined3d_texture *ds;
 
-            texture_desc.format = swapchain->desc.auto_depth_stencil_format;
+            texture_desc.format = swapchain->state.desc.auto_depth_stencil_format;
             texture_desc.usage = 0;
             texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
             texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
@@ -964,7 +965,7 @@ err:
 
     if (swapchain->back_buffers)
     {
-        for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+        for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
         {
             if (swapchain->back_buffers[i])
             {
@@ -1140,7 +1141,7 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
 
     wined3d_resource_update_draw_binding(&swapchain->front_buffer->resource);
 
-    for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+    for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
     {
         wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->resource);
     }
@@ -1171,8 +1172,8 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
              *
              * Guild Wars 1 wants a WINDOWPOSCHANGED message on the device window to
              * resume drawing after a focus loss. */
-            SetWindowPos(window, NULL, 0, 0, swapchain->desc.backbuffer_width,
-                    swapchain->desc.backbuffer_height, SWP_NOACTIVATE | SWP_NOZORDER);
+            SetWindowPos(window, NULL, 0, 0, swapchain->state.desc.backbuffer_width,
+                    swapchain->state.desc.backbuffer_height, SWP_NOACTIVATE | SWP_NOZORDER);
         }
 
         if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE)
@@ -1216,6 +1217,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
         unsigned int width, unsigned int height, enum wined3d_format_id format_id,
         enum wined3d_multisample_type multisample_type, unsigned int multisample_quality)
 {
+    struct wined3d_swapchain_desc *desc = &swapchain->state.desc;
     BOOL update_desc = FALSE;
 
     TRACE("swapchain %p, buffer_count %u, width %u, height %u, format %s, "
@@ -1225,7 +1227,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
 
     wined3d_swapchain_apply_sample_count_override(swapchain, format_id, &multisample_type, &multisample_quality);
 
-    if (buffer_count && buffer_count != swapchain->desc.backbuffer_count)
+    if (buffer_count && buffer_count != desc->backbuffer_count)
         FIXME("Cannot change the back buffer count yet.\n");
 
     wined3d_cs_finish(swapchain->device->cs, WINED3D_CS_QUEUE_DEFAULT);
@@ -1238,7 +1240,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
 
         RECT client_rect;
 
-        if (!swapchain->desc.windowed)
+        if (!desc->windowed)
             return WINED3DERR_INVALIDCALL;
 
         if (!GetClientRect(swapchain->device_window, &client_rect))
@@ -1254,32 +1256,31 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
             height = client_rect.bottom;
     }
 
-    if (width != swapchain->desc.backbuffer_width
-            || height != swapchain->desc.backbuffer_height)
+    if (width != desc->backbuffer_width || height != desc->backbuffer_height)
     {
-        swapchain->desc.backbuffer_width = width;
-        swapchain->desc.backbuffer_height = height;
+        desc->backbuffer_width = width;
+        desc->backbuffer_height = height;
         update_desc = TRUE;
     }
 
     if (format_id == WINED3DFMT_UNKNOWN)
     {
-        if (!swapchain->desc.windowed)
+        if (!desc->windowed)
             return WINED3DERR_INVALIDCALL;
         format_id = swapchain->original_mode.format_id;
     }
 
-    if (format_id != swapchain->desc.backbuffer_format)
+    if (format_id != desc->backbuffer_format)
     {
-        swapchain->desc.backbuffer_format = format_id;
+        desc->backbuffer_format = format_id;
         update_desc = TRUE;
     }
 
-    if (multisample_type != swapchain->desc.multisample_type
-            || multisample_quality != swapchain->desc.multisample_quality)
+    if (multisample_type != desc->multisample_type
+            || multisample_quality != desc->multisample_quality)
     {
-        swapchain->desc.multisample_type = multisample_type;
-        swapchain->desc.multisample_quality = multisample_quality;
+        desc->multisample_type = multisample_type;
+        desc->multisample_quality = multisample_quality;
         update_desc = TRUE;
     }
 
@@ -1288,16 +1289,16 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
         HRESULT hr;
         UINT i;
 
-        if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, swapchain->desc.backbuffer_width,
-                swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
-                swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
+        if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, desc->backbuffer_width,
+                desc->backbuffer_height, desc->backbuffer_format,
+                desc->multisample_type, desc->multisample_quality, NULL, 0)))
             return hr;
 
-        for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+        for (i = 0; i < desc->backbuffer_count; ++i)
         {
-            if (FAILED(hr = wined3d_texture_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width,
-                    swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
-                    swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
+            if (FAILED(hr = wined3d_texture_update_desc(swapchain->back_buffers[i], desc->backbuffer_width,
+                    desc->backbuffer_height, desc->backbuffer_format,
+                    desc->multisample_type, desc->multisample_quality, NULL, 0)))
                 return hr;
         }
     }
@@ -1314,7 +1315,7 @@ static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swap
     struct wined3d_device *device = swapchain->device;
     HRESULT hr;
 
-    if (swapchain->desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
+    if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
     {
         if (FAILED(hr = wined3d_find_closest_matching_adapter_mode(device->wined3d,
                 device->adapter->ordinal, mode)))
@@ -1336,6 +1337,7 @@ static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swap
 HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchain,
         const struct wined3d_display_mode *mode)
 {
+    struct wined3d_swapchain_state *state = &swapchain->state;
     struct wined3d_display_mode actual_mode;
     RECT original_window_rect, window_rect;
     struct wined3d_device *device;
@@ -1349,7 +1351,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
     device = swapchain->device;
     window = swapchain->device_window;
 
-    if (swapchain->desc.windowed)
+    if (state->desc.windowed)
     {
         SetRect(&window_rect, 0, 0, mode->width, mode->height);
         AdjustWindowRectEx(&window_rect,
@@ -1360,7 +1362,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
         GetWindowRect(window, &original_window_rect);
         OffsetRect(&window_rect, original_window_rect.left, original_window_rect.top);
     }
-    else if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
+    else if (state->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
     {
         actual_mode = *mode;
         if (FAILED(hr = wined3d_swapchain_set_display_mode(swapchain, &actual_mode)))
@@ -1503,13 +1505,14 @@ void wined3d_window_state_restore_from_fullscreen(struct wined3d_swapchain_state
 HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapchain,
         const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode)
 {
+    struct wined3d_swapchain_state *state = &swapchain->state;
     struct wined3d_device *device = swapchain->device;
     struct wined3d_display_mode actual_mode;
     HRESULT hr;
 
     TRACE("swapchain %p, desc %p, mode %p.\n", swapchain, swapchain_desc, mode);
 
-    if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
+    if (state->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
     {
         if (mode)
         {
@@ -1553,10 +1556,10 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
         unsigned int width = actual_mode.width;
         unsigned int height = actual_mode.height;
 
-        if (swapchain->desc.windowed)
+        if (state->desc.windowed)
         {
             /* Switch from windowed to fullscreen */
-            if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
+            if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(state,
                     swapchain->device_window, width, height)))
                 return hr;
         }
@@ -1573,16 +1576,16 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
         }
         swapchain->d3d_mode = actual_mode;
     }
-    else if (!swapchain->desc.windowed)
+    else if (!state->desc.windowed)
     {
         /* Fullscreen -> windowed switch */
         RECT *window_rect = NULL;
-        if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+        if (state->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
             window_rect = &swapchain->original_window_rect;
-        wined3d_window_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, window_rect);
+        wined3d_window_state_restore_from_fullscreen(state, swapchain->device_window, window_rect);
     }
 
-    swapchain->desc.windowed = swapchain_desc->windowed;
+    state->desc.windowed = swapchain_desc->windowed;
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index d74c36f36f3..7962496920b 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -446,13 +446,13 @@ void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarg
     }
     else if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
     {
-        const struct wined3d_swapchain *swapchain = context->swapchain;
+        const struct wined3d_swapchain_desc *desc = &context->swapchain->state.desc;
 
         /* The drawable size of a backbuffer / aux buffer offscreen target is
          * the size of the current context's drawable, which is the size of
          * the back buffer of the swapchain the active context belongs to. */
-        *width = swapchain->desc.backbuffer_width;
-        *height = swapchain->desc.backbuffer_height;
+        *width = desc->backbuffer_width;
+        *height = desc->backbuffer_height;
     }
     else
     {
@@ -562,7 +562,7 @@ static void wined3d_render_target_view_gl_cs_init(void *object)
                         debug_d3dformat(resource->format->id), debug_d3dformat(view_gl->v.format->id));
                 return;
             }
-            if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
+            if (texture_gl->t.swapchain && texture_gl->t.swapchain->state.desc.backbuffer_count > 1)
             {
                 FIXME("Swapchain views not supported.\n");
                 return;
@@ -761,7 +761,7 @@ static void wined3d_shader_resource_view_gl_cs_init(void *object)
         {
             TRACE("Creating identity shader resource view.\n");
         }
-        else if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
+        else if (texture_gl->t.swapchain && texture_gl->t.swapchain->state.desc.backbuffer_count > 1)
         {
             FIXME("Swapchain shader resource views not supported.\n");
         }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2ba7bae33e3..f0660f76096 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4176,6 +4176,8 @@ static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_
 
 struct wined3d_swapchain_state
 {
+    struct wined3d_swapchain_desc desc;
+
     /* Window styles to restore when switching fullscreen mode. */
     LONG style;
     LONG exstyle;
@@ -4203,7 +4205,6 @@ struct wined3d_swapchain
 
     struct wined3d_texture **back_buffers;
     struct wined3d_texture *front_buffer;
-    struct wined3d_swapchain_desc desc;
     struct wined3d_display_mode original_mode, d3d_mode;
     RECT original_window_rect;
     struct wined3d_gamma_ramp orig_gamma;
-- 
2.11.0




More information about the wine-devel mailing list