[PATCH 1/5] wined3d: Store the framebuffer inline in struct wined3d_state.

Matteo Bruni mbruni at codeweavers.com
Tue Mar 24 11:35:20 CDT 2020


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
 dlls/wined3d/arb_program_shader.c |  4 +--
 dlls/wined3d/context.c            | 10 +++----
 dlls/wined3d/cs.c                 | 34 ++++++++++-----------
 dlls/wined3d/device.c             | 50 +++++++++++++++++--------------
 dlls/wined3d/glsl_shader.c        |  2 +-
 dlls/wined3d/shader.c             |  6 ++--
 dlls/wined3d/state.c              | 30 +++++++++----------
 dlls/wined3d/stateblock.c         |  4 +--
 dlls/wined3d/swapchain.c          |  2 +-
 dlls/wined3d/utils.c              |  4 +--
 dlls/wined3d/wined3d_private.h    | 11 +++----
 11 files changed, 79 insertions(+), 78 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index c39694f441e..36c920dc6e0 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -700,7 +700,7 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv, str
     {
         const struct wined3d_shader *pshader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
         const struct arb_ps_compiled_shader *gl_shader = priv->compiled_fprog;
-        UINT rt_height = state->fb->render_targets[0]->height;
+        UINT rt_height = state->fb.render_targets[0]->height;
 
         /* Load DirectX 9 float constants for pixel shader */
         priv->highest_dirty_ps_const = shader_arb_load_constants_f(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
@@ -4607,7 +4607,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
         }
         else
         {
-            UINT rt_height = state->fb->render_targets[0]->height;
+            UINT rt_height = state->fb.render_targets[0]->height;
             shader_arb_ps_local_constants(compiled, context_gl, state, rt_height);
         }
 
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 1c15c25859b..fed4f75ec0e 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3319,7 +3319,7 @@ BOOL wined3d_context_gl_apply_clear_state(struct wined3d_context_gl *context_gl,
     uint32_t rt_mask = 0, *cur_mask;
     unsigned int i;
 
-    if (isStateDirty(&context_gl->c, STATE_FRAMEBUFFER) || fb != state->fb
+    if (isStateDirty(&context_gl->c, STATE_FRAMEBUFFER) || fb != &state->fb
             || rt_count != gl_info->limits.buffers)
     {
         if (!have_framebuffer_attachment(rt_count, rts, dsv))
@@ -3431,7 +3431,7 @@ BOOL wined3d_context_gl_apply_clear_state(struct wined3d_context_gl *context_gl,
 
 static uint32_t find_draw_buffers_mask(const struct wined3d_context_gl *context_gl, const struct wined3d_state *state)
 {
-    struct wined3d_rendertarget_view * const *rts = state->fb->render_targets;
+    struct wined3d_rendertarget_view * const *rts = state->fb.render_targets;
     struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL];
     const struct wined3d_gl_info *gl_info = context_gl->gl_info;
     unsigned int rt_mask, mask;
@@ -3463,7 +3463,7 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
 {
     struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
     uint32_t rt_mask = find_draw_buffers_mask(context_gl, state);
-    const struct wined3d_fb_state *fb = state->fb;
+    const struct wined3d_fb_state *fb = &state->fb;
     DWORD color_location = 0;
     DWORD *cur_mask;
 
@@ -4230,7 +4230,7 @@ static BOOL context_apply_draw_state(struct wined3d_context *context,
     const struct wined3d_state_entry *state_table = context->state_table;
     struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
     const struct wined3d_gl_info *gl_info = context_gl->gl_info;
-    const struct wined3d_fb_state *fb = state->fb;
+    const struct wined3d_fb_state *fb = &state->fb;
     unsigned int i, base;
     WORD map;
 
@@ -5121,7 +5121,7 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
         const struct wined3d_draw_parameters *parameters)
 {
     BOOL emulation = FALSE, rasterizer_discard = FALSE;
-    const struct wined3d_fb_state *fb = state->fb;
+    const struct wined3d_fb_state *fb = &state->fb;
     const struct wined3d_stream_info *stream_info;
     struct wined3d_rendertarget_view *dsv, *rtv;
     struct wined3d_stream_info si_emulated;
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index dbdf5f2ec28..3fd32631ff5 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -612,7 +612,7 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
     op->opcode = WINED3D_CS_OP_CLEAR;
     op->flags = flags & (WINED3DCLEAR_TARGET | WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL);
     op->rt_count = rt_count;
-    op->fb = &cs->fb;
+    op->fb = &cs->state.fb;
     SetRect(&op->draw_rect, vp->x, vp->y, vp->x + vp->width, vp->y + vp->height);
     if (state->rasterizer_state && state->rasterizer_state->desc.scissor)
         IntersectRect(&op->draw_rect, &op->draw_rect, &state->scissor_rects[0]);
@@ -624,12 +624,12 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
 
     for (i = 0; i < rt_count; ++i)
     {
-        if ((view = state->fb->render_targets[i]))
+        if ((view = state->fb.render_targets[i]))
             wined3d_resource_acquire(view->resource);
     }
     if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL))
     {
-        view = state->fb->depth_stencil;
+        view = state->fb.depth_stencil;
         wined3d_resource_acquire(view->resource);
     }
 
@@ -915,11 +915,11 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
     }
     for (i = 0; i < d3d_info->limits.max_rt_count; ++i)
     {
-        if (state->fb->render_targets[i])
-            wined3d_resource_release(state->fb->render_targets[i]->resource);
+        if (state->fb.render_targets[i])
+            wined3d_resource_release(state->fb.render_targets[i]->resource);
     }
-    if (state->fb->depth_stencil)
-        wined3d_resource_release(state->fb->depth_stencil->resource);
+    if (state->fb.depth_stencil)
+        wined3d_resource_release(state->fb.depth_stencil->resource);
     release_shader_resources(state, ~(1u << WINED3D_SHADER_TYPE_COMPUTE));
     release_unordered_access_resources(state->shader[WINED3D_SHADER_TYPE_PIXEL],
             state->unordered_access_view[WINED3D_PIPELINE_GRAPHICS]);
@@ -949,11 +949,11 @@ static void acquire_graphics_pipeline_resources(const struct wined3d_state *stat
     }
     for (i = 0; i < d3d_info->limits.max_rt_count; ++i)
     {
-        if (state->fb->render_targets[i])
-            wined3d_resource_acquire(state->fb->render_targets[i]->resource);
+        if (state->fb.render_targets[i])
+            wined3d_resource_acquire(state->fb.render_targets[i]->resource);
     }
-    if (state->fb->depth_stencil)
-        wined3d_resource_acquire(state->fb->depth_stencil->resource);
+    if (state->fb.depth_stencil)
+        wined3d_resource_acquire(state->fb.depth_stencil->resource);
     acquire_shader_resources(state, ~(1u << WINED3D_SHADER_TYPE_COMPUTE));
     acquire_unordered_access_resources(state->shader[WINED3D_SHADER_TYPE_PIXEL],
             state->unordered_access_view[WINED3D_PIPELINE_GRAPHICS]);
@@ -1103,8 +1103,8 @@ static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const v
     BOOL prev_alpha_swizzle, curr_alpha_swizzle;
     struct wined3d_rendertarget_view *prev;
 
-    prev = cs->state.fb->render_targets[op->view_idx];
-    cs->fb.render_targets[op->view_idx] = op->view;
+    prev = cs->state.fb.render_targets[op->view_idx];
+    cs->state.fb.render_targets[op->view_idx] = op->view;
     device_invalidate_state(cs->device, STATE_FRAMEBUFFER);
 
     prev_alpha_swizzle = prev && prev->format->id == WINED3DFMT_A8_UNORM;
@@ -1132,7 +1132,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
     struct wined3d_device *device = cs->device;
     struct wined3d_rendertarget_view *prev;
 
-    if ((prev = cs->state.fb->depth_stencil) && prev->resource->type != WINED3D_RTYPE_BUFFER)
+    if ((prev = cs->state.fb.depth_stencil) && prev->resource->type != WINED3D_RTYPE_BUFFER)
     {
         struct wined3d_texture *prev_texture = texture_from_resource(prev->resource);
 
@@ -1142,7 +1142,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
                     prev->sub_resource_idx, WINED3D_LOCATION_DISCARDED);
     }
 
-    cs->fb.depth_stencil = op->view;
+    cs->state.fb.depth_stencil = op->view;
 
     if (!prev != !op->view)
     {
@@ -1965,7 +1965,7 @@ static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data)
 
     state_cleanup(&cs->state);
     memset(&cs->state, 0, sizeof(cs->state));
-    state_init(&cs->state, &cs->fb, &adapter->d3d_info, WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
+    state_init(&cs->state, &adapter->d3d_info, WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
 }
 
 void wined3d_cs_emit_reset_state(struct wined3d_cs *cs)
@@ -2844,7 +2844,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
     cs->ops = &wined3d_cs_st_ops;
     cs->device = device;
 
-    state_init(&cs->state, &cs->fb, d3d_info, WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
+    state_init(&cs->state, d3d_info, WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT);
 
     cs->data_size = WINED3D_INITIAL_CS_SIZE;
     if (!(cs->data = heap_alloc(cs->data_size)))
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0a0c4c526c8..0f52b0dea2e 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1070,7 +1070,7 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str
     }
     device->swapchains[0] = swapchain;
 
-    memset(device->fb.render_targets, 0, sizeof(device->fb.render_targets));
+    memset(device->state.fb.render_targets, 0, sizeof(device->state.fb.render_targets));
     if (FAILED(hr = device->adapter->adapter_ops->adapter_init_3d(device)))
         goto err_out;
 
@@ -1145,8 +1145,6 @@ void wined3d_device_uninit_3d(struct wined3d_device *device)
 
     wined3d_cs_emit_reset_state(device->cs);
     state_cleanup(&device->state);
-    memset(&device->state, 0, sizeof(device->state));
-    state_init(&device->state, &device->fb, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
     for (i = 0; i < device->adapter->d3d_info.limits.max_rt_count; ++i)
     {
         wined3d_device_set_rendertarget_view(device, i, NULL, FALSE);
@@ -1163,11 +1161,11 @@ void wined3d_device_uninit_3d(struct wined3d_device *device)
     device->adapter->adapter_ops->adapter_uninit_3d(device);
     device->d3d_initialized = FALSE;
 
-    if ((view = device->fb.depth_stencil))
+    if ((view = device->state.fb.depth_stencil))
     {
         TRACE("Releasing depth/stencil view %p.\n", view);
 
-        device->fb.depth_stencil = NULL;
+        device->state.fb.depth_stencil = NULL;
         wined3d_rendertarget_view_decref(view);
     }
 
@@ -1186,6 +1184,9 @@ void wined3d_device_uninit_3d(struct wined3d_device *device)
 
     heap_free(device->swapchains);
     device->swapchains = NULL;
+
+    memset(&device->state, 0, sizeof(device->state));
+    state_init(&device->state, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
 }
 
 /* Enables thread safety in the wined3d device and its resources. Called by DirectDraw
@@ -1654,7 +1655,7 @@ static void resolve_depth_buffer(struct wined3d_device *device)
     dst_resource = &dst_texture->resource;
     if (!(dst_resource->format_flags & WINED3DFMT_FLAG_DEPTH))
         return;
-    if (!(src_view = state->fb->depth_stencil))
+    if (!(src_view = state->fb.depth_stencil))
         return;
 
     wined3d_device_resolve_sub_resource(device, dst_resource, 0,
@@ -3858,7 +3859,7 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou
 
     if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL))
     {
-        struct wined3d_rendertarget_view *ds = device->fb.depth_stencil;
+        struct wined3d_rendertarget_view *ds = device->state.fb.depth_stencil;
         if (!ds)
         {
             WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n");
@@ -3867,8 +3868,8 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou
         }
         else if (flags & WINED3DCLEAR_TARGET)
         {
-            if (ds->width < device->fb.render_targets[0]->width
-                    || ds->height < device->fb.render_targets[0]->height)
+            if (ds->width < device->state.fb.render_targets[0]->width
+                    || ds->height < device->state.fb.render_targets[0]->height)
             {
                 WARN("Silently ignoring depth and target clear with mismatching sizes\n");
                 return WINED3D_OK;
@@ -4218,8 +4219,8 @@ HRESULT CDECL wined3d_device_validate_device(const struct wined3d_device *device
     if (state->render_states[WINED3D_RS_ZENABLE] || state->render_states[WINED3D_RS_ZWRITEENABLE]
             || state->render_states[WINED3D_RS_STENCILENABLE])
     {
-        struct wined3d_rendertarget_view *rt = device->fb.render_targets[0];
-        struct wined3d_rendertarget_view *ds = device->fb.depth_stencil;
+        struct wined3d_rendertarget_view *rt = device->state.fb.render_targets[0];
+        struct wined3d_rendertarget_view *ds = device->state.fb.depth_stencil;
 
         if (ds && rt && (ds->width < rt->width || ds->height < rt->height))
         {
@@ -4724,14 +4725,14 @@ struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(co
         return NULL;
     }
 
-    return device->fb.render_targets[view_idx];
+    return device->state.fb.render_targets[view_idx];
 }
 
 struct wined3d_rendertarget_view * CDECL wined3d_device_get_depth_stencil_view(const struct wined3d_device *device)
 {
     TRACE("device %p.\n", device);
 
-    return device->fb.depth_stencil;
+    return device->state.fb.depth_stencil;
 }
 
 static void wined3d_unbind_srv_for_rtv(struct wined3d_device *device,
@@ -4796,13 +4797,13 @@ HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device
         wined3d_cs_emit_set_scissor_rects(device->cs, 1, state->scissor_rects);
     }
 
-    prev = device->fb.render_targets[view_idx];
+    prev = device->state.fb.render_targets[view_idx];
     if (view == prev)
         return WINED3D_OK;
 
     if (view)
         wined3d_rendertarget_view_incref(view);
-    device->fb.render_targets[view_idx] = view;
+    device->state.fb.render_targets[view_idx] = view;
     wined3d_cs_emit_set_rendertarget_view(device->cs, view_idx, view);
     /* Release after the assignment, to prevent device_resource_released()
      * from seeing the surface as still in use. */
@@ -4828,14 +4829,14 @@ HRESULT CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *devic
         return WINED3DERR_INVALIDCALL;
     }
 
-    prev = device->fb.depth_stencil;
+    prev = device->state.fb.depth_stencil;
     if (prev == view)
     {
         TRACE("Trying to do a NOP SetRenderTarget operation.\n");
         return WINED3D_OK;
     }
 
-    if ((device->fb.depth_stencil = view))
+    if ((device->state.fb.depth_stencil = view))
         wined3d_rendertarget_view_incref(view);
     wined3d_cs_emit_set_depth_stencil_view(device->cs, view);
     if (prev)
@@ -5100,6 +5101,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     struct wined3d_swapchain *swapchain;
     struct wined3d_view_desc view_desc;
     BOOL backbuffer_resized, windowed;
+    struct wined3d_fb_state old_fb;
     struct wined3d_output *output;
     HRESULT hr = WINED3D_OK;
     unsigned int i;
@@ -5344,8 +5346,12 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         if (device->d3d_initialized)
             device->adapter->adapter_ops->adapter_uninit_3d(device);
 
+        old_fb = device->state.fb;
+
         memset(&device->state, 0, sizeof(device->state));
-        state_init(&device->state, &device->fb, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
+        state_init(&device->state, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
+
+        device->state.fb = old_fb;
 
         device_init_swapchain_state(device, swapchain);
         if (wined3d_settings.logo)
@@ -5447,13 +5453,13 @@ void device_resource_released(struct wined3d_device *device, struct wined3d_reso
 
     if (device->d3d_initialized)
     {
-        for (i = 0; i < ARRAY_SIZE(device->fb.render_targets); ++i)
+        for (i = 0; i < ARRAY_SIZE(device->state.fb.render_targets); ++i)
         {
-            if ((rtv = device->fb.render_targets[i]) && rtv->resource == resource)
+            if ((rtv = device->state.fb.render_targets[i]) && rtv->resource == resource)
                 ERR("Resource %p is still in use as render target %u.\n", resource, i);
         }
 
-        if ((rtv = device->fb.depth_stencil) && rtv->resource == resource)
+        if ((rtv = device->state.fb.depth_stencil) && rtv->resource == resource)
             ERR("Resource %p is still in use as depth/stencil buffer.\n", resource);
     }
 
@@ -5595,7 +5601,7 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined
         return hr;
     }
 
-    state_init(&device->state, &device->fb, &adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
+    state_init(&device->state, &adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT);
 
     device->max_frame_latency = 3;
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 26dde1087a0..df8ee3c030d 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1734,7 +1734,7 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context
         const struct wined3d_vec4 correction_params =
         {
             /* Position is relative to the framebuffer, not the viewport. */
-            context->render_offscreen ? 0.0f : (float)state->fb->render_targets[0]->height,
+            context->render_offscreen ? 0.0f : (float)state->fb.render_targets[0]->height,
             context->render_offscreen ? 1.0f : -1.0f,
             0.0f,
             0.0f,
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 95db994ff30..41c48c0468b 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3904,7 +3904,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
     unsigned int i;
 
     memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
-    if (!d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, state->fb))
+    if (!d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, &state->fb))
     {
         static unsigned int warned = 0;
 
@@ -4161,9 +4161,9 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
     args->render_offscreen = shader->reg_maps.vpos && gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]
             ? context->render_offscreen : 0;
 
-    for (i = 0; i < ARRAY_SIZE(state->fb->render_targets); ++i)
+    for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i)
     {
-        struct wined3d_rendertarget_view *rtv = state->fb->render_targets[i];
+        struct wined3d_rendertarget_view *rtv = state->fb.render_targets[i];
         if (rtv && rtv->format->id == WINED3DFMT_A8_UNORM && !is_identity_fixup(rtv->format->color_fixup))
             args->rt_alpha_swizzle |= 1u << i;
     }
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index b5d54db5b3b..d375122781b 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -236,7 +236,7 @@ static void state_zenable(struct wined3d_context *context, const struct wined3d_
     const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
 
     /* No z test without depth stencil buffers */
-    if (!state->fb->depth_stencil)
+    if (!state->fb.depth_stencil)
     {
         TRACE("No Z buffer - disabling depth test\n");
         zenable = WINED3D_ZB_FALSE;
@@ -556,7 +556,7 @@ static BOOL is_blend_enabled(struct wined3d_context *context, const struct wined
 {
     const struct wined3d_blend_state *b = state->blend_state;
 
-    if (!state->fb->render_targets[index])
+    if (!state->fb.render_targets[index])
         return FALSE;
 
     if (!b->desc.rt[index].enable)
@@ -566,7 +566,7 @@ static BOOL is_blend_enabled(struct wined3d_context *context, const struct wined
      * With blending on we could face a big performance penalty.
      * The d3d9 visual test confirms the behavior. */
     if (context->render_offscreen
-            && !(state->fb->render_targets[index]->format_flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
+            && !(state->fb.render_targets[index]->format_flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
         return FALSE;
 
     return TRUE;
@@ -610,7 +610,7 @@ static void blend(struct wined3d_context *context, const struct wined3d_state *s
     gl_info->gl_ops.gl.p_glEnable(GL_BLEND);
     checkGLcall("glEnable GL_BLEND");
 
-    rt_format = state->fb->render_targets[0]->format;
+    rt_format = state->fb.render_targets[0]->format;
 
     gl_blend_from_d3d(&src_blend, &dst_blend, b->desc.rt[0].src, b->desc.rt[0].dst, rt_format);
 
@@ -683,7 +683,7 @@ static void blend_db2(struct wined3d_context *context, const struct wined3d_stat
         return;
     }
 
-    rt_format = state->fb->render_targets[0]->format;
+    rt_format = state->fb.render_targets[0]->format;
     gl_blend_from_d3d(&src_blend, &dst_blend, b->desc.rt[0].src, b->desc.rt[0].dst, rt_format);
     gl_blend_from_d3d(&src_blend_alpha, &dst_blend_alpha, b->desc.rt[0].src_alpha, b->desc.rt[0].dst_alpha, rt_format);
 
@@ -766,7 +766,7 @@ static void blend_dbb(struct wined3d_context *context, const struct wined3d_stat
         GL_EXTCALL(glEnablei(GL_BLEND, i));
         checkGLcall("glEnablei GL_BLEND");
 
-        rt_format = state->fb->render_targets[i]->format;
+        rt_format = state->fb.render_targets[i]->format;
         gl_blend_from_d3d(&src_blend, &dst_blend, b->desc.rt[i].src, b->desc.rt[i].dst, rt_format);
         gl_blend_from_d3d(&src_blend_alpha, &dst_blend_alpha,
                 b->desc.rt[i].src_alpha, b->desc.rt[i].dst_alpha, rt_format);
@@ -1061,7 +1061,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
     GLint depthFail_back;
 
     /* No stencil test without a stencil buffer. */
-    if (!state->fb->depth_stencil)
+    if (!state->fb.depth_stencil)
     {
         gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
         checkGLcall("glDisable GL_STENCIL_TEST");
@@ -1075,7 +1075,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
     if (!(func_back = wined3d_gl_compare_func(state->render_states[WINED3D_RS_BACK_STENCILFUNC])))
         func_back = GL_ALWAYS;
     mask = state->render_states[WINED3D_RS_STENCILMASK];
-    ref = state->render_states[WINED3D_RS_STENCILREF] & ((1 << state->fb->depth_stencil->format->stencil_size) - 1);
+    ref = state->render_states[WINED3D_RS_STENCILREF] & ((1 << state->fb.depth_stencil->format->stencil_size) - 1);
     stencilFail = gl_stencil_op(state->render_states[WINED3D_RS_STENCILFAIL]);
     depthFail = gl_stencil_op(state->render_states[WINED3D_RS_STENCILZFAIL]);
     stencilPass = gl_stencil_op(state->render_states[WINED3D_RS_STENCILPASS]);
@@ -1157,7 +1157,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
 
 static void state_stencilwrite2s_ext(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
 {
-    DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0;
+    DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0;
     const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
 
     GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK));
@@ -1171,7 +1171,7 @@ static void state_stencilwrite2s_ext(struct wined3d_context *context, const stru
 
 static void state_stencilwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
 {
-    DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0;
+    DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0;
     const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
 
     gl_info->gl_ops.gl.p_glStencilMask(mask);
@@ -1859,7 +1859,7 @@ static void depthbias(struct wined3d_context *context, const struct wined3d_stat
 
     if (scale_bias || const_bias.f)
     {
-        const struct wined3d_rendertarget_view *depth = state->fb->depth_stencil;
+        const struct wined3d_rendertarget_view *depth = state->fb.depth_stencil;
         float factor, units, scale, clamp;
 
         clamp = r ? r->desc.depth_bias_clamp : 0.0f;
@@ -4092,8 +4092,8 @@ static void vertexdeclaration(struct wined3d_context *context, const struct wine
 static void get_viewports(struct wined3d_context *context, const struct wined3d_state *state,
         unsigned int viewport_count, struct wined3d_viewport *viewports)
 {
-    const struct wined3d_rendertarget_view *depth_stencil = state->fb->depth_stencil;
-    const struct wined3d_rendertarget_view *target = state->fb->render_targets[0];
+    const struct wined3d_rendertarget_view *depth_stencil = state->fb.depth_stencil;
+    const struct wined3d_rendertarget_view *target = state->fb.render_targets[0];
     unsigned int width, height, i;
 
     for (i = 0; i < viewport_count; ++i)
@@ -4342,7 +4342,7 @@ static void scissorrect(struct wined3d_context *context, const struct wined3d_st
 
     if (!context->render_offscreen)
     {
-        const struct wined3d_rendertarget_view *target = state->fb->render_targets[0];
+        const struct wined3d_rendertarget_view *target = state->fb.render_targets[0];
         unsigned int width;
 
         wined3d_rendertarget_view_get_drawable_size(target, context, &width, &height);
@@ -4474,7 +4474,7 @@ void state_srgbwrite(struct wined3d_context *context, const struct wined3d_state
 
     TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
 
-    if (needs_srgb_write(context->d3d_info, state, state->fb))
+    if (needs_srgb_write(context->d3d_info, state, &state->fb))
         gl_info->gl_ops.gl.p_glEnable(GL_FRAMEBUFFER_SRGB);
     else
         gl_info->gl_ops.gl.p_glDisable(GL_FRAMEBUFFER_SRGB);
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index b6c3169c4c6..48d133485b8 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -1851,13 +1851,11 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d
         state->streams[i].frequency = 1;
 }
 
-void state_init(struct wined3d_state *state, struct wined3d_fb_state *fb,
-        const struct wined3d_d3d_info *d3d_info, DWORD flags)
+void state_init(struct wined3d_state *state, const struct wined3d_d3d_info *d3d_info, DWORD flags)
 {
     unsigned int i;
 
     state->flags = flags;
-    state->fb = fb;
 
     for (i = 0; i < LIGHTMAP_SIZE; i++)
     {
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index c5fd2879c05..e4cb5a27469 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -506,7 +506,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
     struct wined3d_swapchain_gl *swapchain_gl = wined3d_swapchain_gl(swapchain);
     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;
+    const struct wined3d_fb_state *fb = &swapchain->device->cs->state.fb;
     struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
     struct wined3d_texture *logo_texture, *cursor_texture;
     const struct wined3d_gl_info *gl_info;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index f3ed3b3cec5..7b08851fbf9 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5493,7 +5493,7 @@ void get_projection_matrix(const struct wined3d_context *context, const struct w
         float y_offset = flip
                 ? (center_offset - (2.0f * y) - h) / h
                 : (center_offset - (2.0f * y) - h) / -h;
-        enum wined3d_depth_buffer_type zenable = state->fb->depth_stencil ?
+        enum wined3d_depth_buffer_type zenable = state->fb.depth_stencil ?
                 state->render_states[WINED3D_RS_ZENABLE] : WINED3D_ZB_FALSE;
         float z_scale = zenable ? clip_control ? 1.0f : 2.0f : 0.0f;
         float z_offset = zenable ? clip_control ? 0.0f : -1.0f : 0.0f;
@@ -6236,7 +6236,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
                 break;
         }
     }
-    settings->sRGB_write = !d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, state->fb);
+    settings->sRGB_write = !d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, &state->fb);
     if (d3d_info->vs_clipping || !use_vs(state) || !state->render_states[WINED3D_RS_CLIPPING]
             || !state->render_states[WINED3D_RS_CLIPPLANEENABLE])
     {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 6e976fb0aaa..8740c532a59 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3186,7 +3186,7 @@ struct wined3d_light_state
 struct wined3d_state
 {
     DWORD flags;
-    const struct wined3d_fb_state *fb;
+    struct wined3d_fb_state fb;
 
     struct wined3d_vertex_declaration *vertex_declaration;
     struct wined3d_stream_output stream_output[WINED3D_MAX_STREAM_OUTPUT_BUFFERS];
@@ -3303,7 +3303,6 @@ struct wined3d_device
     struct wine_rb_tree samplers, rasterizer_states, blend_states;
 
     /* Render Target Support */
-    struct wined3d_fb_state fb;
     struct wined3d_rendertarget_view *auto_depth_stencil_view;
 
     /* Cursor management */
@@ -3991,8 +3990,7 @@ HRESULT wined3d_light_state_set_light(struct wined3d_light_state *state, DWORD l
         const struct wined3d_light *params, struct wined3d_light_info **light_info) DECLSPEC_HIDDEN;
 
 void state_cleanup(struct wined3d_state *state) DECLSPEC_HIDDEN;
-void state_init(struct wined3d_state *state, struct wined3d_fb_state *fb,
-        const struct wined3d_d3d_info *d3d_info, DWORD flags) DECLSPEC_HIDDEN;
+void state_init(struct wined3d_state *state, const struct wined3d_d3d_info *d3d_info, DWORD flags) DECLSPEC_HIDDEN;
 void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN;
 
 enum wined3d_cs_queue_id
@@ -4035,7 +4033,6 @@ struct wined3d_cs
 {
     const struct wined3d_cs_ops *ops;
     struct wined3d_device *device;
-    struct wined3d_fb_state fb;
     struct wined3d_state state;
     HMODULE wined3d_module;
     HANDLE thread;
@@ -5306,12 +5303,12 @@ static inline BOOL wined3d_dsv_srv_conflict(const struct wined3d_rendertarget_vi
 static inline BOOL wined3d_resource_check_fbo_attached(const struct wined3d_state *state,
         const struct wined3d_resource *resource, const struct wined3d_format *srv_format)
 {
-    struct wined3d_rendertarget_view * const *rts = &state->fb->render_targets[0];
+    struct wined3d_rendertarget_view * const *rts = &state->fb.render_targets[0];
     const struct wined3d_rendertarget_view *dsv;
     unsigned int i;
 
     if ((resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL)
-            && (dsv = state->fb->depth_stencil) && dsv->resource == resource
+            && (dsv = state->fb.depth_stencil) && dsv->resource == resource
             && wined3d_dsv_srv_conflict(dsv, srv_format))
         return TRUE;
 
-- 
2.24.1




More information about the wine-devel mailing list