From e71a360fcd0a6005953e3ef9bd3633cb1e998b94 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 17 May 2016 14:01:49 +0200 Subject: [PATCH] wined3d: Store pixel shader integer constants as wined3d_ivec4 structures. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/arb_program_shader.c | 12 ++++++------ dlls/wined3d/device.c | 4 ++-- dlls/wined3d/glsl_shader.c | 2 +- dlls/wined3d/stateblock.c | 14 ++++---------- dlls/wined3d/wined3d_private.h | 2 +- 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index d75bffd7534..3a81a1732ac 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -595,9 +595,9 @@ static void shader_arb_ps_local_constants(const struct arb_ps_compiled_shader *g if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED) { float val[4]; - val[0] = (float)state->ps_consts_i[4 * i]; - val[1] = (float)state->ps_consts_i[4 * i + 1]; - val[2] = (float)state->ps_consts_i[4 * i + 2]; + val[0] = (float)state->ps_consts_i[i].x; + val[1] = (float)state->ps_consts_i[i].y; + val[2] = (float)state->ps_consts_i[i].z; val[3] = -1.0f; GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->int_consts[i], val)); @@ -4598,9 +4598,9 @@ static void find_arb_ps_compile_args(const struct wined3d_state *state, } else { - args->loop_ctrl[i][0] = state->ps_consts_i[i * 4]; - args->loop_ctrl[i][1] = state->ps_consts_i[i * 4 + 1]; - args->loop_ctrl[i][2] = state->ps_consts_i[i * 4 + 2]; + args->loop_ctrl[i][0] = state->ps_consts_i[i].x; + args->loop_ctrl[i][1] = state->ps_consts_i[i].y; + args->loop_ctrl[i][2] = state->ps_consts_i[i].z; } } } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index ab87956a5c8..a61e1f56ba8 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2657,7 +2657,7 @@ HRESULT CDECL wined3d_device_set_ps_consts_i(struct wined3d_device *device, if (!constants || start_register >= WINED3D_MAX_CONSTS_I) return WINED3DERR_INVALIDCALL; - memcpy(&device->update_state->ps_consts_i[start_register * 4], constants, count * sizeof(int) * 4); + memcpy(&device->update_state->ps_consts_i[start_register], constants, count * sizeof(int) * 4); for (i = 0; i < count; ++i) TRACE("Set INT constant %u to {%d, %d, %d, %d}.\n", start_register + i, constants[i * 4], constants[i * 4 + 1], @@ -2687,7 +2687,7 @@ HRESULT CDECL wined3d_device_get_ps_consts_i(const struct wined3d_device *device if (!constants || start_register >= WINED3D_MAX_CONSTS_I) return WINED3DERR_INVALIDCALL; - memcpy(constants, &device->state.ps_consts_i[start_register * 4], count * sizeof(int) * 4); + memcpy(constants, &device->state.ps_consts_i[start_register], count * sizeof(int) * 4); return WINED3D_OK; } diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9ff2c7b6e62..40754180a95 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1408,7 +1408,7 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context prog->ps.uniform_f_locations, &priv->pconst_heap, priv->stack, constant_version); if (update_mask & WINED3D_SHADER_CONST_PS_I) - shader_glsl_load_constants_i(pshader, gl_info, (const struct wined3d_ivec4 *)state->ps_consts_i, + shader_glsl_load_constants_i(pshader, gl_info, state->ps_consts_i, prog->ps.uniform_i_locations, pshader->reg_maps.integer_constants); if (update_mask & WINED3D_SHADER_CONST_PS_B) diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index d9547ea992b..090faed0bb5 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -673,16 +673,10 @@ void CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock) for (i = 0; i < stateblock->num_contained_ps_consts_i; ++i) { unsigned int idx = stateblock->contained_ps_consts_i[i]; - TRACE("Setting ps_consts_i[%u] to {%d, %d, %d, %d}.\n", idx, - src_state->ps_consts_i[idx * 4 + 0], - src_state->ps_consts_i[idx * 4 + 1], - src_state->ps_consts_i[idx * 4 + 2], - src_state->ps_consts_i[idx * 4 + 3]); - stateblock->state.ps_consts_i[idx * 4 + 0] = src_state->ps_consts_i[idx * 4 + 0]; - stateblock->state.ps_consts_i[idx * 4 + 1] = src_state->ps_consts_i[idx * 4 + 1]; - stateblock->state.ps_consts_i[idx * 4 + 2] = src_state->ps_consts_i[idx * 4 + 2]; - stateblock->state.ps_consts_i[idx * 4 + 3] = src_state->ps_consts_i[idx * 4 + 3]; + TRACE("Setting ps_consts_i[%u] to %s.\n", idx, debug_ivec4(&src_state->ps_consts_i[idx])); + + stateblock->state.ps_consts_i[idx] = src_state->ps_consts_i[idx]; } /* Pixel shader boolean constants. */ @@ -934,7 +928,7 @@ void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock) for (i = 0; i < stateblock->num_contained_ps_consts_i; ++i) { wined3d_device_set_ps_consts_i(device, stateblock->contained_ps_consts_i[i], - stateblock->state.ps_consts_i + stateblock->contained_ps_consts_i[i] * 4, 1); + &stateblock->state.ps_consts_i[stateblock->contained_ps_consts_i[i]].x, 1); } for (i = 0; i < stateblock->num_contained_ps_consts_b; ++i) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b3e19ff2f45..c2f6471fa84 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2217,7 +2217,7 @@ struct wined3d_state struct wined3d_vec4 vs_consts_f[WINED3D_MAX_VS_CONSTS_F]; BOOL ps_consts_b[MAX_CONST_B]; - INT ps_consts_i[WINED3D_MAX_CONSTS_I * 4]; + struct wined3d_ivec4 ps_consts_i[WINED3D_MAX_CONSTS_I]; struct wined3d_vec4 ps_consts_f[WINED3D_MAX_PS_CONSTS_F]; struct wined3d_texture *textures[MAX_COMBINED_SAMPLERS];