[PATCH 4/5] wined3d: Introduce a separate structure for the ps specific fields in struct glsl_shader_prog_link.
Henri Verbeet
hverbeet at codeweavers.com
Tue Nov 6 15:13:26 CST 2012
---
dlls/wined3d/glsl_shader.c | 116 ++++++++++++++++++++++++--------------------
1 files changed, 63 insertions(+), 53 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 192eba3..c5c27ac 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;
}
--
1.7.8.6
More information about the wine-patches
mailing list