From b748b8fd8619ab412517f859dbf9a42b62ef6309 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Thu, 20 Oct 2016 22:10:34 +0200 Subject: [PATCH] st/nine: Track dirty state groups in nine_context Part of the refactor to move all gallium calls to nine_state.c, and have all internal states required for those calls in nine_context. Signed-off-by: Axel Davy --- .../state_trackers/nine/basetexture9.c | 3 +- src/gallium/state_trackers/nine/device9.c | 2 +- src/gallium/state_trackers/nine/nine_ff.c | 25 ++-- src/gallium/state_trackers/nine/nine_state.c | 132 +++++++----------- src/gallium/state_trackers/nine/nine_state.h | 23 +-- src/gallium/state_trackers/nine/swapchain9.c | 2 +- 6 files changed, 81 insertions(+), 106 deletions(-) diff --git a/src/gallium/state_trackers/nine/basetexture9.c b/src/gallium/state_trackers/nine/basetexture9.c index 633fa232877..ddbc5623e73 100644 --- a/src/gallium/state_trackers/nine/basetexture9.c +++ b/src/gallium/state_trackers/nine/basetexture9.c @@ -207,11 +207,12 @@ NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This ) if (This->bind_count) { /* mark state dirty */ struct nine_state *state = &This->base.base.device->state; + struct nine_context *context = &This->base.base.device->context; unsigned s; for (s = 0; s < NINE_MAX_SAMPLERS; ++s) /* Dirty tracking is done in device9 state, not nine_context. */ if (state->texture[s] == This) - state->changed.group |= NINE_STATE_TEXTURE; + context->changed.group |= NINE_STATE_TEXTURE; } /* Allocate a new resource */ diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index 7863af9132d..764ebdb5e68 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -2690,7 +2690,7 @@ NineDevice9_SetSoftwareVertexProcessing( struct NineDevice9 *This, { if (This->params.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING) { This->swvp = bSoftware; - This->state.changed.group |= NINE_STATE_SWVP; + This->context.changed.group |= NINE_STATE_SWVP; return D3D_OK; } else return D3DERR_INVALIDCALL; /* msdn. TODO: check in practice */ diff --git a/src/gallium/state_trackers/nine/nine_ff.c b/src/gallium/state_trackers/nine/nine_ff.c index 306b2aea722..748a9fa0f1e 100644 --- a/src/gallium/state_trackers/nine/nine_ff.c +++ b/src/gallium/state_trackers/nine/nine_ff.c @@ -1898,12 +1898,11 @@ nine_ff_load_vs_transforms(struct NineDevice9 *device) static void nine_ff_load_lights(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct fvec4 *dst = (struct fvec4 *)device->ff.vs_const; unsigned l; - if (state->changed.group & NINE_STATE_FF_MATERIAL) { + if (context->changed.group & NINE_STATE_FF_MATERIAL) { const D3DMATERIAL9 *mtl = &context->ff.material; memcpy(&dst[20], &mtl->Diffuse, 4 * sizeof(float)); @@ -1917,7 +1916,7 @@ nine_ff_load_lights(struct NineDevice9 *device) dst[19].z = dst[25].z * mtl->Ambient.b + mtl->Emissive.b; } - if (!(state->changed.group & NINE_STATE_FF_LIGHTING)) + if (!(context->changed.group & NINE_STATE_FF_LIGHTING)) return; for (l = 0; l < context->ff.num_lights_active; ++l) { @@ -1944,11 +1943,10 @@ nine_ff_load_lights(struct NineDevice9 *device) static void nine_ff_load_point_and_fog_params(struct NineDevice9 *device) { - const struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct fvec4 *dst = (struct fvec4 *)device->ff.vs_const; - if (!(state->changed.group & NINE_STATE_FF_OTHER)) + if (!(context->changed.group & NINE_STATE_FF_OTHER)) return; dst[26].x = asfloat(context->rs[D3DRS_POINTSIZE_MIN]); dst[26].y = asfloat(context->rs[D3DRS_POINTSIZE_MAX]); @@ -1981,12 +1979,11 @@ nine_ff_load_tex_matrices(struct NineDevice9 *device) static void nine_ff_load_ps_params(struct NineDevice9 *device) { - const struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct fvec4 *dst = (struct fvec4 *)device->ff.ps_const; unsigned s; - if (!(state->changed.group & (NINE_STATE_FF_PSSTAGES | NINE_STATE_FF_OTHER))) + if (!(context->changed.group & (NINE_STATE_FF_PSSTAGES | NINE_STATE_FF_OTHER))) return; for (s = 0; s < 8; ++s) @@ -2043,11 +2040,11 @@ nine_ff_update(struct NineDevice9 *device) /* NOTE: the only reference belongs to the hash table */ if (!context->programmable_vs) { device->ff.vs = nine_ff_get_vs(device); - device->state.changed.group |= NINE_STATE_VS; + context->changed.group |= NINE_STATE_VS; } if (!context->ps) { device->ff.ps = nine_ff_get_ps(device); - device->state.changed.group |= NINE_STATE_PS; + context->changed.group |= NINE_STATE_PS; } if (!context->programmable_vs) { @@ -2104,7 +2101,7 @@ nine_ff_update(struct NineDevice9 *device) context->commit |= NINE_STATE_COMMIT_CONST_PS; } - device->state.changed.group &= ~NINE_STATE_FF; + context->changed.group &= ~NINE_STATE_FF; } @@ -2158,25 +2155,29 @@ nine_ff_fini(struct NineDevice9 *device) static void nine_ff_prune_vs(struct NineDevice9 *device) { + struct nine_context *context = &device->context; + if (device->ff.num_vs > 100) { /* could destroy the bound one here, so unbind */ device->pipe->bind_vs_state(device->pipe, NULL); util_hash_table_foreach(device->ff.ht_vs, nine_ff_ht_delete_cb, NULL); util_hash_table_clear(device->ff.ht_vs); device->ff.num_vs = 0; - device->state.changed.group |= NINE_STATE_VS; + context->changed.group |= NINE_STATE_VS; } } static void nine_ff_prune_ps(struct NineDevice9 *device) { + struct nine_context *context = &device->context; + if (device->ff.num_ps > 100) { /* could destroy the bound one here, so unbind */ device->pipe->bind_fs_state(device->pipe, NULL); util_hash_table_foreach(device->ff.ht_ps, nine_ff_ht_delete_cb, NULL); util_hash_table_clear(device->ff.ht_ps); device->ff.num_ps = 0; - device->state.changed.group |= NINE_STATE_PS; + context->changed.group |= NINE_STATE_PS; } } diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index af1968a24c4..a5fa55328ca 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -85,10 +85,9 @@ prepare_rasterizer(struct NineDevice9 *device) static void prepare_vs_constants_userbuf_swvp(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; - if (context->changed.vs_const_f || state->changed.group & NINE_STATE_SWVP) { + if (context->changed.vs_const_f || context->changed.group & NINE_STATE_SWVP) { struct pipe_constant_buffer cb; cb.buffer_offset = 0; @@ -127,7 +126,7 @@ prepare_vs_constants_userbuf_swvp(struct NineDevice9 *device) context->changed.vs_const_f = 0; } - if (context->changed.vs_const_i || state->changed.group & NINE_STATE_SWVP) { + if (context->changed.vs_const_i || context->changed.group & NINE_STATE_SWVP) { struct pipe_constant_buffer cb; cb.buffer_offset = 0; @@ -140,7 +139,7 @@ prepare_vs_constants_userbuf_swvp(struct NineDevice9 *device) context->changed.vs_const_i = 0; } - if (context->changed.vs_const_b || state->changed.group & NINE_STATE_SWVP) { + if (context->changed.vs_const_b || context->changed.group & NINE_STATE_SWVP) { struct pipe_constant_buffer cb; cb.buffer_offset = 0; @@ -199,14 +198,13 @@ prepare_vs_constants_userbuf_swvp(struct NineDevice9 *device) cb->user_buffer = NULL; } - state->changed.group &= ~NINE_STATE_VS_CONST; + context->changed.group &= ~NINE_STATE_VS_CONST; context->commit |= NINE_STATE_COMMIT_CONST_VS; } static void prepare_vs_constants_userbuf(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct pipe_constant_buffer cb; cb.buffer = NULL; @@ -219,13 +217,13 @@ prepare_vs_constants_userbuf(struct NineDevice9 *device) return; } - if (context->changed.vs_const_i || state->changed.group & NINE_STATE_SWVP) { + if (context->changed.vs_const_i || context->changed.group & NINE_STATE_SWVP) { int *idst = (int *)&context->vs_const_f[4 * device->max_vs_const_f]; memcpy(idst, context->vs_const_i, NINE_MAX_CONST_I * sizeof(int[4])); context->changed.vs_const_i = 0; } - if (context->changed.vs_const_b || state->changed.group & NINE_STATE_SWVP) { + if (context->changed.vs_const_b || context->changed.group & NINE_STATE_SWVP) { int *idst = (int *)&context->vs_const_f[4 * device->max_vs_const_f]; uint32_t *bdst = (uint32_t *)&idst[4 * NINE_MAX_CONST_I]; memcpy(bdst, context->vs_const_b, NINE_MAX_CONST_B * sizeof(BOOL)); @@ -269,14 +267,13 @@ prepare_vs_constants_userbuf(struct NineDevice9 *device) context->changed.vs_const_f = 0; - state->changed.group &= ~NINE_STATE_VS_CONST; + context->changed.group &= ~NINE_STATE_VS_CONST; context->commit |= NINE_STATE_COMMIT_CONST_VS; } static void prepare_ps_constants_userbuf(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct pipe_constant_buffer cb; cb.buffer = NULL; @@ -341,7 +338,7 @@ prepare_ps_constants_userbuf(struct NineDevice9 *device) context->changed.ps_const_f = 0; - state->changed.group &= ~NINE_STATE_PS_CONST; + context->changed.group &= ~NINE_STATE_PS_CONST; context->commit |= NINE_STATE_COMMIT_CONST_PS; } @@ -417,7 +414,6 @@ static void update_framebuffer(struct NineDevice9 *device, bool is_clear) { struct pipe_context *pipe = device->pipe; - struct nine_state *state = &device->state; struct nine_context *context = &device->context; struct pipe_framebuffer_state *fb = &context->pipe.fb; unsigned i; @@ -487,7 +483,7 @@ update_framebuffer(struct NineDevice9 *device, bool is_clear) pipe->set_framebuffer_state(pipe, fb); /* XXX: cso ? */ if (is_clear && context->rt_mask == ps_mask) - state->changed.group &= ~NINE_STATE_FB; + context->changed.group &= ~NINE_STATE_FB; } static void @@ -541,7 +537,6 @@ update_viewport(struct NineDevice9 *device) static void update_vertex_elements(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; const struct NineVertexDeclaration9 *vdecl = device->context.vdecl; const struct NineVertexShader9 *vs; @@ -598,8 +593,8 @@ update_vertex_elements(struct NineDevice9 *device) b = ve[n].vertex_buffer_index; context->stream_usage_mask |= 1 << b; /* XXX wine just uses 1 here: */ - if (state->stream_freq[b] & D3DSTREAMSOURCE_INSTANCEDATA) - ve[n].instance_divisor = state->stream_freq[b] & 0x7FFFFF; + if (context->stream_freq[b] & D3DSTREAMSOURCE_INSTANCEDATA) + ve[n].instance_divisor = context->stream_freq[b] & 0x7FFFFF; } else { /* if the vertex declaration is incomplete compared to what the * vertex shader needs, we bind a dummy vbo with 0 0 0 0. @@ -951,11 +946,10 @@ static void nine_update_state(struct NineDevice9 *device) { struct pipe_context *pipe = device->pipe; - struct nine_state *state = &device->state; struct nine_context *context = &device->context; uint32_t group; - DBG("changed state groups: %x\n", state->changed.group); + DBG("changed state groups: %x\n", context->changed.group); /* NOTE: We may want to use the cso cache for everything, or let * NineDevice9.RestoreNonCSOState actually set the states, then we wouldn't @@ -969,7 +963,7 @@ nine_update_state(struct NineDevice9 *device) /* ff_update may change VS/PS dirty bits */ if (unlikely(!context->programmable_vs || !context->ps)) nine_ff_update(device); - group = state->changed.group; + group = context->changed.group; if (group & (NINE_STATE_SHADER_CHANGE_VS | NINE_STATE_SHADER_CHANGE_PS)) { if (group & NINE_STATE_SHADER_CHANGE_VS) @@ -1054,7 +1048,7 @@ nine_update_state(struct NineDevice9 *device) } } - device->state.changed.group &= + context->changed.group &= (NINE_STATE_FF | NINE_STATE_VS_CONST | NINE_STATE_PS_CONST); DBG("finished\n"); @@ -1126,7 +1120,6 @@ nine_context_set_render_state(struct NineDevice9 *device, D3DRENDERSTATETYPE State, DWORD Value) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; /* Amd hacks (equivalent to GL extensions) */ @@ -1139,7 +1132,7 @@ nine_context_set_render_state(struct NineDevice9 *device, if (Value == ALPHA_TO_COVERAGE_ENABLE || Value == ALPHA_TO_COVERAGE_DISABLE) { context->rs[NINED3DRS_ALPHACOVERAGE] = (Value == ALPHA_TO_COVERAGE_ENABLE); - state->changed.group |= NINE_STATE_BLEND; + context->changed.group |= NINE_STATE_BLEND; return; } } @@ -1149,7 +1142,7 @@ nine_context_set_render_state(struct NineDevice9 *device, if (Value == D3DFMT_ATOC || (Value == D3DFMT_UNKNOWN && context->rs[NINED3DRS_ALPHACOVERAGE])) { context->rs[NINED3DRS_ALPHACOVERAGE] = (Value == D3DFMT_ATOC) ? 3 : 0; context->rs[NINED3DRS_ALPHACOVERAGE] &= context->rs[D3DRS_ALPHATESTENABLE] ? 3 : 2; - state->changed.group |= NINE_STATE_BLEND; + context->changed.group |= NINE_STATE_BLEND; return; } } @@ -1157,11 +1150,11 @@ nine_context_set_render_state(struct NineDevice9 *device, DWORD alphacoverage_prev = context->rs[NINED3DRS_ALPHACOVERAGE]; context->rs[NINED3DRS_ALPHACOVERAGE] = (Value ? 3 : 2); if (context->rs[NINED3DRS_ALPHACOVERAGE] != alphacoverage_prev) - state->changed.group |= NINE_STATE_BLEND; + context->changed.group |= NINE_STATE_BLEND; } context->rs[State] = nine_fix_render_state_value(State, Value); - state->changed.group |= nine_render_state_group[State]; + context->changed.group |= nine_render_state_group[State]; } void @@ -1170,7 +1163,6 @@ nine_context_set_texture(struct NineDevice9 *device, struct NineBaseTexture9 *tex) { struct nine_context *context = &device->context; - struct nine_state *state = &device->state; context->samplers_shadow &= ~(1 << Stage); if (tex) @@ -1178,7 +1170,7 @@ nine_context_set_texture(struct NineDevice9 *device, nine_bind(&context->texture[Stage], tex); - state->changed.group |= NINE_STATE_TEXTURE; + context->changed.group |= NINE_STATE_TEXTURE; } void @@ -1187,14 +1179,13 @@ nine_context_set_sampler_state(struct NineDevice9 *device, D3DSAMPLERSTATETYPE Type, DWORD Value) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; if (unlikely(!nine_check_sampler_state_value(Type, Value))) return; context->samp[Sampler][Type] = Value; - state->changed.group |= NINE_STATE_SAMPLER; + context->changed.group |= NINE_STATE_SAMPLER; context->changed.sampler[Sampler] |= 1 << Type; } @@ -1223,7 +1214,6 @@ nine_context_set_stream_source_freq(struct NineDevice9 *device, UINT StreamNumber, UINT Setting) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; context->stream_freq[StreamNumber] = Setting; @@ -1234,14 +1224,13 @@ nine_context_set_stream_source_freq(struct NineDevice9 *device, context->stream_instancedata_mask &= ~(1 << StreamNumber); if (StreamNumber != 0) - state->changed.group |= NINE_STATE_STREAMFREQ; + context->changed.group |= NINE_STATE_STREAMFREQ; } void nine_context_set_indices(struct NineDevice9 *device, struct NineIndexBuffer9 *idxbuf) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; const struct pipe_index_buffer *pipe_idxbuf; @@ -1254,14 +1243,13 @@ nine_context_set_indices(struct NineDevice9 *device, } else pipe_resource_reference(&context->idxbuf.buffer, NULL); - state->changed.group |= NINE_STATE_IDXBUF; + context->changed.group |= NINE_STATE_IDXBUF; } void nine_context_set_vertex_declaration(struct NineDevice9 *device, struct NineVertexDeclaration9 *vdecl) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; BOOL was_programmable_vs = context->programmable_vs; @@ -1270,17 +1258,16 @@ nine_context_set_vertex_declaration(struct NineDevice9 *device, context->programmable_vs = context->vs && !(context->vdecl && context->vdecl->position_t); if (was_programmable_vs != context->programmable_vs) { context->commit |= NINE_STATE_COMMIT_CONST_VS; - state->changed.group |= NINE_STATE_VS; + context->changed.group |= NINE_STATE_VS; } - state->changed.group |= NINE_STATE_VDECL; + context->changed.group |= NINE_STATE_VDECL; } void nine_context_set_vertex_shader(struct NineDevice9 *device, struct NineVertexShader9 *pShader) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; BOOL was_programmable_vs = context->programmable_vs; @@ -1292,7 +1279,7 @@ nine_context_set_vertex_shader(struct NineDevice9 *device, if (!was_programmable_vs && context->programmable_vs) context->commit |= NINE_STATE_COMMIT_CONST_VS; - state->changed.group |= NINE_STATE_VS; + context->changed.group |= NINE_STATE_VS; } void @@ -1301,7 +1288,6 @@ nine_context_set_vertex_shader_constant_f(struct NineDevice9 *device, const float *pConstantData, UINT Vector4fCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; float *vs_const_f = device->may_swvp ? context->vs_const_f_swvp : context->vs_const_f; @@ -1318,7 +1304,7 @@ nine_context_set_vertex_shader_constant_f(struct NineDevice9 *device, } context->changed.vs_const_f = TRUE; - state->changed.group |= NINE_STATE_VS_CONST; + context->changed.group |= NINE_STATE_VS_CONST; } @@ -1328,7 +1314,6 @@ nine_context_set_vertex_shader_constant_i(struct NineDevice9 *device, const int *pConstantData, UINT Vector4iCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; int i; @@ -1346,7 +1331,7 @@ nine_context_set_vertex_shader_constant_i(struct NineDevice9 *device, } context->changed.vs_const_i = TRUE; - state->changed.group |= NINE_STATE_VS_CONST; + context->changed.group |= NINE_STATE_VS_CONST; } void @@ -1355,7 +1340,6 @@ nine_context_set_vertex_shader_constant_b(struct NineDevice9 *device, const BOOL *pConstantData, UINT BoolCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; int i; uint32_t bool_true = device->driver_caps.vs_integer ? 0xFFFFFFFF : fui(1.0f); @@ -1364,14 +1348,13 @@ nine_context_set_vertex_shader_constant_b(struct NineDevice9 *device, context->vs_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0; context->changed.vs_const_b = TRUE; - state->changed.group |= NINE_STATE_VS_CONST; + context->changed.group |= NINE_STATE_VS_CONST; } void nine_context_set_pixel_shader(struct NineDevice9 *device, struct NinePixelShader9* ps) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; unsigned old_mask = context->ps ? context->ps->rt_mask : 1; unsigned mask; @@ -1382,13 +1365,13 @@ nine_context_set_pixel_shader(struct NineDevice9 *device, nine_bind(&context->ps, ps); - state->changed.group |= NINE_STATE_PS; + context->changed.group |= NINE_STATE_PS; mask = context->ps ? context->ps->rt_mask : 1; /* We need to update cbufs if the pixel shader would * write to different render targets */ if (mask != old_mask) - state->changed.group |= NINE_STATE_FB; + context->changed.group |= NINE_STATE_FB; } void @@ -1397,7 +1380,6 @@ nine_context_set_pixel_shader_constant_f(struct NineDevice9 *device, const float *pConstantData, UINT Vector4fCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; memcpy(&context->ps_const_f[StartRegister * 4], @@ -1405,7 +1387,7 @@ nine_context_set_pixel_shader_constant_f(struct NineDevice9 *device, Vector4fCount * 4 * sizeof(context->ps_const_f[0])); context->changed.ps_const_f = TRUE; - state->changed.group |= NINE_STATE_PS_CONST; + context->changed.group |= NINE_STATE_PS_CONST; } void @@ -1414,7 +1396,6 @@ nine_context_set_pixel_shader_constant_i(struct NineDevice9 *device, const int *pConstantData, UINT Vector4iCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; int i; @@ -1431,7 +1412,7 @@ nine_context_set_pixel_shader_constant_i(struct NineDevice9 *device, } } context->changed.ps_const_i = TRUE; - state->changed.group |= NINE_STATE_PS_CONST; + context->changed.group |= NINE_STATE_PS_CONST; } void @@ -1440,7 +1421,6 @@ nine_context_set_pixel_shader_constant_b(struct NineDevice9 *device, const BOOL *pConstantData, UINT BoolCount) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; int i; uint32_t bool_true = device->driver_caps.ps_integer ? 0xFFFFFFFF : fui(1.0f); @@ -1449,7 +1429,7 @@ nine_context_set_pixel_shader_constant_b(struct NineDevice9 *device, context->ps_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0; context->changed.ps_const_b = TRUE; - state->changed.group |= NINE_STATE_PS_CONST; + context->changed.group |= NINE_STATE_PS_CONST; } void @@ -1457,7 +1437,6 @@ nine_context_set_render_target(struct NineDevice9 *device, DWORD RenderTargetIndex, struct NineSurface9 *rt) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; const unsigned i = RenderTargetIndex; @@ -1474,17 +1453,17 @@ nine_context_set_render_target(struct NineDevice9 *device, context->scissor.maxx = rt->desc.Width; context->scissor.maxy = rt->desc.Height; - state->changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE; + context->changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE; if (context->rt[0] && (context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) != (rt->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE)) - state->changed.group |= NINE_STATE_SAMPLE_MASK; + context->changed.group |= NINE_STATE_SAMPLE_MASK; } if (context->rt[i] != rt) { nine_bind(&context->rt[i], rt); - state->changed.group |= NINE_STATE_FB; + context->changed.group |= NINE_STATE_FB; } } @@ -1492,33 +1471,30 @@ void nine_context_set_depth_stencil(struct NineDevice9 *device, struct NineSurface9 *ds) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; nine_bind(&context->ds, ds); - state->changed.group |= NINE_STATE_FB; + context->changed.group |= NINE_STATE_FB; } void nine_context_set_viewport(struct NineDevice9 *device, const D3DVIEWPORT9 *viewport) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; context->viewport = *viewport; - state->changed.group |= NINE_STATE_VIEWPORT; + context->changed.group |= NINE_STATE_VIEWPORT; } void nine_context_set_scissor(struct NineDevice9 *device, const struct pipe_scissor_state *scissor) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; context->scissor = *scissor; - state->changed.group |= NINE_STATE_SCISSOR; + context->changed.group |= NINE_STATE_SCISSOR; } void @@ -1526,24 +1502,22 @@ nine_context_set_transform(struct NineDevice9 *device, D3DTRANSFORMSTATETYPE State, const D3DMATRIX *pMatrix) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; D3DMATRIX *M = nine_state_access_transform(&context->ff, State, TRUE); *M = *pMatrix; context->ff.changed.transform[State / 32] |= 1 << (State % 32); - state->changed.group |= NINE_STATE_FF; + context->changed.group |= NINE_STATE_FF; } void nine_context_set_material(struct NineDevice9 *device, const D3DMATERIAL9 *pMaterial) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; context->ff.material = *pMaterial; - state->changed.group |= NINE_STATE_FF_MATERIAL; + context->changed.group |= NINE_STATE_FF_MATERIAL; } void @@ -1551,11 +1525,10 @@ nine_context_set_light(struct NineDevice9 *device, DWORD Index, const D3DLIGHT9 *pLight) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; (void)nine_state_set_light(&context->ff, Index, pLight); - state->changed.group |= NINE_STATE_FF_LIGHTING; + context->changed.group |= NINE_STATE_FF_LIGHTING; } void @@ -1563,10 +1536,9 @@ nine_context_light_enable(struct NineDevice9 *device, DWORD Index, BOOL Enable) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; - nine_state_light_enable(&context->ff, &state->changed.group, Index, Enable); + nine_state_light_enable(&context->ff, &context->changed.group, Index, Enable); } void @@ -1575,7 +1547,6 @@ nine_context_set_texture_stage_state(struct NineDevice9 *device, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; int bumpmap_index = -1; @@ -1600,7 +1571,7 @@ nine_context_set_texture_stage_state(struct NineDevice9 *device, bumpmap_index = 4 * 8 + 2 * Stage + 1; break; case D3DTSS_TEXTURETRANSFORMFLAGS: - state->changed.group |= NINE_STATE_PS1X_SHADER; + context->changed.group |= NINE_STATE_PS1X_SHADER; break; default: break; @@ -1608,10 +1579,10 @@ nine_context_set_texture_stage_state(struct NineDevice9 *device, if (bumpmap_index >= 0) { context->bumpmap_vars[bumpmap_index] = Value; - state->changed.group |= NINE_STATE_PS_CONST; + context->changed.group |= NINE_STATE_PS_CONST; } - state->changed.group |= NINE_STATE_FF_PSSTAGES; + context->changed.group |= NINE_STATE_FF_PSSTAGES; context->ff.changed.tex_stage[Stage][Type / 32] |= 1 << (Type % 32); } @@ -1633,6 +1604,8 @@ nine_context_apply_stateblock(struct NineDevice9 *device, struct nine_context *context = &device->context; int i; + context->changed.group |= src->changed.group; + for (i = 0; i < ARRAY_SIZE(src->changed.rs); ++i) { uint32_t m = src->changed.rs[i]; while (m) { @@ -1856,11 +1829,11 @@ nine_context_apply_stateblock(struct NineDevice9 *device, static void nine_update_state_framebuffer_clear(struct NineDevice9 *device) { - struct nine_state *state = &device->state; + struct nine_context *context = &device->context; validate_textures(device); - if (state->changed.group & NINE_STATE_FB) + if (context->changed.group & NINE_STATE_FB) update_framebuffer(device, TRUE); } @@ -2278,10 +2251,9 @@ static const DWORD nine_samp_state_defaults[NINED3DSAMP_LAST + 1] = void nine_state_restore_non_cso(struct NineDevice9 *device) { - struct nine_state *state = &device->state; struct nine_context *context = &device->context; - state->changed.group = NINE_STATE_ALL; + context->changed.group = NINE_STATE_ALL; context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1; context->changed.ucp = TRUE; context->commit |= NINE_STATE_COMMIT_CONST_VS | NINE_STATE_COMMIT_CONST_PS; @@ -2343,7 +2315,7 @@ nine_state_set_defaults(struct NineDevice9 *device, const D3DCAPS9 *caps, /* Set changed flags to initialize driver. */ - state->changed.group = NINE_STATE_ALL; + context->changed.group = NINE_STATE_ALL; context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1; context->changed.ucp = TRUE; diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h index dd3331cd390..9894f3898e0 100644 --- a/src/gallium/state_trackers/nine/nine_state.h +++ b/src/gallium/state_trackers/nine/nine_state.h @@ -163,19 +163,19 @@ struct nine_state { struct { uint32_t group; - uint32_t rs[(NINED3DRS_COUNT + 31) / 32]; /* stateblocks only */ - uint32_t vtxbuf; /* stateblocks only */ - uint32_t stream_freq; /* stateblocks only */ - uint32_t texture; /* stateblocks only */ - uint16_t sampler[NINE_MAX_SAMPLERS]; /* stateblocks only */ - struct nine_range *vs_const_f; /* stateblocks only */ - struct nine_range *ps_const_f; /* stateblocks only */ - struct nine_range *vs_const_i; /* stateblocks only */ + uint32_t rs[(NINED3DRS_COUNT + 31) / 32]; + uint32_t vtxbuf; + uint32_t stream_freq; + uint32_t texture; + uint16_t sampler[NINE_MAX_SAMPLERS]; + struct nine_range *vs_const_f; + struct nine_range *ps_const_f; + struct nine_range *vs_const_i; uint16_t ps_const_i; /* NINE_MAX_CONST_I == 16 */ - struct nine_range *vs_const_b; /* stateblocks only */ + struct nine_range *vs_const_b; uint16_t ps_const_b; /* NINE_MAX_CONST_B == 16 */ - uint8_t ucp; /* stateblocks only */ - } changed; + uint8_t ucp; + } changed; /* stateblocks only */ struct NineSurface9 *rt[NINE_MAX_SIMULTANEOUS_RENDERTARGETS]; struct NineSurface9 *ds; @@ -219,6 +219,7 @@ struct nine_state struct nine_context { struct { + uint32_t group; uint16_t sampler[NINE_MAX_SAMPLERS]; uint32_t vtxbuf; BOOL vs_const_f; diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c index 8a405f2374c..b45e60b97ec 100644 --- a/src/gallium/state_trackers/nine/swapchain9.c +++ b/src/gallium/state_trackers/nine/swapchain9.c @@ -896,7 +896,7 @@ NineSwapChain9_Present( struct NineSwapChain9 *This, ID3DPresent_WaitBufferReleased(This->present, This->present_handles[0]); } - This->base.device->state.changed.group |= NINE_STATE_FB; + This->base.device->context.changed.group |= NINE_STATE_FB; return hr; } -- 2.30.2