From 95bb4c0486a900830ff31cf2d275ecd2f326ec34 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 12 Aug 2009 09:44:25 +0200 Subject: [PATCH] wined3d: Make the "bumpmat" shader_reg_maps member a bitmap. --- dlls/wined3d/arb_program_shader.c | 10 ++++++---- dlls/wined3d/baseshader.c | 4 ++-- dlls/wined3d/glsl_shader.c | 7 +++---- dlls/wined3d/state.c | 5 +++-- dlls/wined3d/wined3d_private.h | 3 ++- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 22835b1f165..ec86d412887 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -3360,8 +3360,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct next_local = shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map, NULL, &priv_ctx); - for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { - if(!reg_maps->bumpmat[i]) continue; + for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i) + { + if (!(map & 1)) continue; cur = compiled->numbumpenvmatconsts; compiled->bumpenvmatconst[cur].const_num = WINED3D_CONST_NUM_UNUSED; @@ -5224,8 +5225,9 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s if (use_ps(stateblock)) { - if(stage != 0 && - ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) { + if (stage != 0 + && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage))) + { /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled * anyway */ diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 3530eabad5f..252197c8a3d 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -686,7 +686,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3 if (ins.handler_idx == WINED3DSIH_TEXBEM || ins.handler_idx == WINED3DSIH_TEXBEML) { - reg_maps->bumpmat[sampler_code] = TRUE; + reg_maps->bumpmat |= 1 << dst_param.reg.idx; if (ins.handler_idx == WINED3DSIH_TEXBEML) { reg_maps->luminanceparams[sampler_code] = TRUE; @@ -695,7 +695,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3 } else if (ins.handler_idx == WINED3DSIH_BEM) { - reg_maps->bumpmat[dst_param.reg.idx] = TRUE; + reg_maps->bumpmat |= 1 << dst_param.reg.idx; } } diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 8488c29f08f..16b772e9c77 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -899,10 +899,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont shader_addline(buffer, "void order_ps_input();\n"); } } else { - for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { - if(!reg_maps->bumpmat[i]) { - continue; - } + for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i) + { + if (!(map & 1)) continue; shader_addline(buffer, "uniform mat2 bumpenvmat%d;\n", i); diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 3fc555cd84b..cb87d737865 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3529,8 +3529,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); - if(stateblock->pixelShader && stage != 0 && - ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) { + if (stateblock->pixelShader && stage != 0 + && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage))) + { /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled * anyway */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index bac13cd5ce4..32402aba121 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -642,7 +642,8 @@ typedef struct shader_reg_maps WORD local_bool_consts; /* MAX_CONST_B, 16 */ WINED3DSAMPLER_TEXTURE_TYPE sampler_type[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)]; - BOOL bumpmat[MAX_TEXTURES], luminanceparams[MAX_TEXTURES]; + BYTE bumpmat; /* MAX_TEXTURES, 8 */ + BOOL luminanceparams[MAX_TEXTURES]; WORD usesnrm : 1; WORD vpos : 1;