From 9b118257c414709163e4094abc2d21424eec52d5 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 6 Nov 2012 22:13:26 +0100 Subject: [PATCH] wined3d: Introduce a separate structure for the ps specific fields in struct glsl_shader_prog_link. --- dlls/wined3d/glsl_shader.c | 116 ++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 192eba35bac..c5c27ac2b1b 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -110,23 +110,28 @@ struct glsl_vs_program GLint pos_fixup_location; }; +struct glsl_ps_program +{ + struct list shader_entry; + GLhandleARB id; + GLint *uniform_f_locations; + GLint uniform_i_locations[MAX_CONST_I]; + GLint bumpenvmat_location[MAX_TEXTURES]; + GLint luminancescale_location[MAX_TEXTURES]; + GLint luminanceoffset_location[MAX_TEXTURES]; + GLint ycorrection_location; + GLint np2_fixup_location; + const struct ps_np2fixup_info *np2_fixup_info; +}; + /* Struct to maintain data about a linked GLSL program */ struct glsl_shader_prog_link { struct wine_rb_entry program_lookup_entry; struct glsl_vs_program vs; - struct list pshader_entry; - GLhandleARB programId; - GLint *puniformF_locations; - GLint puniformI_locations[MAX_CONST_I]; - GLint np2Fixup_location; - GLint bumpenvmat_location[MAX_TEXTURES]; - GLint luminancescale_location[MAX_TEXTURES]; - GLint luminanceoffset_location[MAX_TEXTURES]; - GLint ycorrection_location; - GLhandleARB ps_id; - UINT constant_version; - const struct ps_np2fixup_info *np2Fixup_info; + struct glsl_ps_program ps; + GLhandleARB programId; + UINT constant_version; }; struct glsl_program_key @@ -677,16 +682,16 @@ static void shader_glsl_load_np2fixup_constants(void *shader_priv, /* NP2 texcoord fixup is (currently) only done for pixelshaders. */ if (!use_ps(state)) return; - if (prog->np2Fixup_info && prog->np2Fixup_location != -1) + if (prog->ps.np2_fixup_info && prog->ps.np2_fixup_location != -1) { UINT i; - UINT fixup = prog->np2Fixup_info->active; + UINT fixup = prog->ps.np2_fixup_info->active; GLfloat np2fixup_constants[4 * MAX_FRAGMENT_SAMPLERS]; for (i = 0; fixup; fixup >>= 1, ++i) { const struct wined3d_texture *tex = state->textures[i]; - const unsigned char idx = prog->np2Fixup_info->idx[i]; + const unsigned char idx = prog->ps.np2_fixup_info->idx[i]; GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4]; if (!tex) @@ -707,7 +712,8 @@ static void shader_glsl_load_np2fixup_constants(void *shader_priv, } } - GL_EXTCALL(glUniform4fvARB(prog->np2Fixup_location, prog->np2Fixup_info->num_consts, np2fixup_constants)); + GL_EXTCALL(glUniform4fvARB(prog->ps.np2_fixup_location, + prog->ps.np2_fixup_info->num_consts, np2fixup_constants)); } } @@ -765,44 +771,46 @@ static void shader_glsl_load_constants(const struct wined3d_context *context, /* Load DirectX 9 float constants/uniforms for pixel shader */ shader_glsl_load_constantsF(pshader, gl_info, state->ps_consts_f, - prog->puniformF_locations, &priv->pconst_heap, priv->stack, constant_version); + prog->ps.uniform_f_locations, &priv->pconst_heap, priv->stack, constant_version); /* Load DirectX 9 integer constants/uniforms for pixel shader */ - shader_glsl_load_constantsI(pshader, gl_info, prog->puniformI_locations, state->ps_consts_i, + shader_glsl_load_constantsI(pshader, gl_info, prog->ps.uniform_i_locations, state->ps_consts_i, stateBlock->changed.pixelShaderConstantsI & pshader->reg_maps.integer_constants); /* Load DirectX 9 boolean constants/uniforms for pixel shader */ shader_glsl_load_constantsB(pshader, gl_info, programId, state->ps_consts_b, stateBlock->changed.pixelShaderConstantsB & pshader->reg_maps.boolean_constants); - /* Upload the environment bump map matrix if needed. The needsbumpmat member specifies the texture stage to load the matrix from. - * It can't be 0 for a valid texbem instruction. - */ - for(i = 0; i < MAX_TEXTURES; i++) { + /* Upload the environment bump map matrix if needed. The needsbumpmat + * member specifies the texture stage to load the matrix from. It + * can't be 0 for a valid texbem instruction. */ + for (i = 0; i < MAX_TEXTURES; ++i) + { const float *data; - if(prog->bumpenvmat_location[i] == -1) continue; + if (prog->ps.bumpenvmat_location[i] == -1) + continue; data = (const float *)&state->texture_states[i][WINED3D_TSS_BUMPENV_MAT00]; - GL_EXTCALL(glUniformMatrix2fvARB(prog->bumpenvmat_location[i], 1, 0, data)); + GL_EXTCALL(glUniformMatrix2fvARB(prog->ps.bumpenvmat_location[i], 1, 0, data)); checkGLcall("glUniformMatrix2fvARB"); /* texbeml needs the luminance scale and offset too. If texbeml * is used, needsbumpmat is set too, so we can check that in the * needsbumpmat check. */ - if (prog->luminancescale_location[i] != -1) + if (prog->ps.luminancescale_location[i] != -1) { const GLfloat *scale = (const GLfloat *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LSCALE]; const GLfloat *offset = (const GLfloat *)&state->texture_states[i][WINED3D_TSS_BUMPENV_LOFFSET]; - GL_EXTCALL(glUniform1fvARB(prog->luminancescale_location[i], 1, scale)); + GL_EXTCALL(glUniform1fvARB(prog->ps.luminancescale_location[i], 1, scale)); checkGLcall("glUniform1fvARB"); - GL_EXTCALL(glUniform1fvARB(prog->luminanceoffset_location[i], 1, offset)); + GL_EXTCALL(glUniform1fvARB(prog->ps.luminanceoffset_location[i], 1, offset)); checkGLcall("glUniform1fvARB"); } } - if (prog->ycorrection_location != -1) + if (prog->ps.ycorrection_location != -1) { float correction_params[4]; @@ -815,7 +823,7 @@ static void shader_glsl_load_constants(const struct wined3d_context *context, correction_params[0] = (float) context->current_rt->resource.height; correction_params[1] = -1.0f; } - GL_EXTCALL(glUniform4fvARB(prog->ycorrection_location, 1, correction_params)); + GL_EXTCALL(glUniform4fvARB(prog->ps.ycorrection_location, 1, correction_params)); } } @@ -4107,7 +4115,7 @@ static void add_glsl_program_entry(struct shader_glsl_priv *priv, struct glsl_sh struct glsl_program_key key; key.vs_id = entry->vs.id; - key.ps_id = entry->ps_id; + key.ps_id = entry->ps.id; if (wine_rb_put(&priv->program_lookup, &key, &entry->program_lookup_entry) == -1) { @@ -4135,16 +4143,16 @@ static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const struc struct glsl_program_key key; key.vs_id = entry->vs.id; - key.ps_id = entry->ps_id; + key.ps_id = entry->ps.id; wine_rb_remove(&priv->program_lookup, &key); GL_EXTCALL(glDeleteObjectARB(entry->programId)); if (entry->vs.id) list_remove(&entry->vs.shader_entry); - if (entry->ps_id) - list_remove(&entry->pshader_entry); + if (entry->ps.id) + list_remove(&entry->ps.shader_entry); HeapFree(GetProcessHeap(), 0, entry->vs.uniform_f_locations); - HeapFree(GetProcessHeap(), 0, entry->puniformF_locations); + HeapFree(GetProcessHeap(), 0, entry->ps.uniform_f_locations); HeapFree(GetProcessHeap(), 0, entry); } @@ -4751,9 +4759,9 @@ static void set_glsl_shader_program(const struct wined3d_context *context, entry = HeapAlloc(GetProcessHeap(), 0, sizeof(struct glsl_shader_prog_link)); entry->programId = programId; entry->vs.id = vs_id; - entry->ps_id = ps_id; + entry->ps.id = ps_id; entry->constant_version = 0; - entry->np2Fixup_info = np2fixup_info; + entry->ps.np2_fixup_info = np2fixup_info; /* Add the hash table entry */ add_glsl_program_entry(priv, entry); @@ -4807,7 +4815,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, GL_EXTCALL(glAttachObjectARB(programId, ps_id)); checkGLcall("glAttachObjectARB"); - list_add_head(&pshader->linked_programs, &entry->pshader_entry); + list_add_head(&pshader->linked_programs, &entry->ps.shader_entry); } /* Link the program */ @@ -4827,42 +4835,44 @@ static void set_glsl_shader_program(const struct wined3d_context *context, snprintf(glsl_name, sizeof(glsl_name), "vs_i[%u]", i); entry->vs.uniform_i_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name)); } - entry->puniformF_locations = HeapAlloc(GetProcessHeap(), 0, + entry->ps.uniform_f_locations = HeapAlloc(GetProcessHeap(), 0, sizeof(GLhandleARB) * gl_info->limits.glsl_ps_float_constants); for (i = 0; i < gl_info->limits.glsl_ps_float_constants; ++i) { snprintf(glsl_name, sizeof(glsl_name), "ps_c[%u]", i); - entry->puniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name)); + entry->ps.uniform_f_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name)); } for (i = 0; i < MAX_CONST_I; ++i) { snprintf(glsl_name, sizeof(glsl_name), "ps_i[%u]", i); - entry->puniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name)); + entry->ps.uniform_i_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name)); } - if(pshader) { + if (pshader) + { char name[32]; - for(i = 0; i < MAX_TEXTURES; i++) { + for (i = 0; i < MAX_TEXTURES; ++i) + { sprintf(name, "bumpenvmat%u", i); - entry->bumpenvmat_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); + entry->ps.bumpenvmat_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); sprintf(name, "luminancescale%u", i); - entry->luminancescale_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); + entry->ps.luminancescale_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); sprintf(name, "luminanceoffset%u", i); - entry->luminanceoffset_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); + entry->ps.luminanceoffset_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); } if (ps_compile_args.np2_fixup) { - if (entry->np2Fixup_info) - entry->np2Fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ps_samplerNP2Fixup")); + if (entry->ps.np2_fixup_info) + entry->ps.np2_fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ps_samplerNP2Fixup")); else FIXME("NP2 texcoord fixup needed for this pixelshader, but no fixup uniform found.\n"); } } entry->vs.pos_fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "posFixup")); - entry->ycorrection_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ycorrection")); + entry->ps.ycorrection_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ycorrection")); checkGLcall("Find glsl program uniform locations"); if (pshader && pshader->reg_maps.shader_version.major >= 3 @@ -5052,7 +5062,7 @@ static void shader_glsl_select(const struct wined3d_context *context, enum wined /* In case that NP2 texcoord fixup data is found for the selected program, trigger a reload of the * constants. This has to be done because it can't be guaranteed that sampler() (from state.c) is * called between selecting the shader and using it, which results in wrong fixup for some frames. */ - if (priv->glsl_program && priv->glsl_program->np2Fixup_info) + if (priv->glsl_program && priv->glsl_program->ps.np2_fixup_info) { shader_glsl_load_np2fixup_constants(priv, gl_info, &device->stateBlock->state); } @@ -5135,7 +5145,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader) struct glsl_ps_compiled_shader *gl_shaders = shader_data->gl_shaders.ps; LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, linked_programs, - struct glsl_shader_prog_link, pshader_entry) + struct glsl_shader_prog_link, ps.shader_entry) { delete_glsl_program_entry(priv, gl_info, entry); } @@ -5143,7 +5153,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader) for (i = 0; i < shader_data->num_gl_shaders; ++i) { TRACE("Deleting pixel shader %u.\n", gl_shaders[i].prgId); - if (priv->glsl_program && priv->glsl_program->ps_id == gl_shaders[i].prgId) + if (priv->glsl_program && priv->glsl_program->ps.id == gl_shaders[i].prgId) shader_glsl_select(context, WINED3D_SHADER_MODE_NONE, WINED3D_SHADER_MODE_NONE); GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId)); checkGLcall("glDeleteObjectARB"); @@ -5199,8 +5209,8 @@ static int glsl_program_key_compare(const void *key, const struct wine_rb_entry if (k->vs_id > prog->vs.id) return 1; else if (k->vs_id < prog->vs.id) return -1; - if (k->ps_id > prog->ps_id) return 1; - else if (k->ps_id < prog->ps_id) return -1; + if (k->ps_id > prog->ps.id) return 1; + else if (k->ps_id < prog->ps.id) return -1; return 0; }