[PATCH 5/5] wined3d: Introduce a separate structure for the vs specific fields in struct glsl_shader_prog_link.
Henri Verbeet
hverbeet at codeweavers.com
Mon Nov 5 14:38:25 CST 2012
---
dlls/wined3d/glsl_shader.c | 70 ++++++++++++++++++++++++-------------------
1 files changed, 39 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 75fb7e4..192eba3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -100,24 +100,30 @@ struct shader_glsl_priv {
const struct fragment_pipeline *fragment_pipe;
};
+struct glsl_vs_program
+{
+ struct list shader_entry;
+ GLhandleARB id;
+ GLenum vertex_color_clamp;
+ GLint *uniform_f_locations;
+ GLint uniform_i_locations[MAX_CONST_I];
+ GLint pos_fixup_location;
+};
+
/* Struct to maintain data about a linked GLSL program */
-struct glsl_shader_prog_link {
- struct wine_rb_entry program_lookup_entry;
- struct list vshader_entry;
+struct glsl_shader_prog_link
+{
+ struct wine_rb_entry program_lookup_entry;
+ struct glsl_vs_program vs;
struct list pshader_entry;
GLhandleARB programId;
- GLint *vuniformF_locations;
GLint *puniformF_locations;
- GLint vuniformI_locations[MAX_CONST_I];
GLint puniformI_locations[MAX_CONST_I];
- GLint posFixup_location;
GLint np2Fixup_location;
GLint bumpenvmat_location[MAX_TEXTURES];
GLint luminancescale_location[MAX_TEXTURES];
GLint luminanceoffset_location[MAX_TEXTURES];
GLint ycorrection_location;
- GLenum vertex_color_clamp;
- GLhandleARB vs_id;
GLhandleARB ps_id;
UINT constant_version;
const struct ps_np2fixup_info *np2Fixup_info;
@@ -737,10 +743,10 @@ static void shader_glsl_load_constants(const struct wined3d_context *context,
/* Load DirectX 9 float constants/uniforms for vertex shader */
shader_glsl_load_constantsF(vshader, gl_info, state->vs_consts_f,
- prog->vuniformF_locations, &priv->vconst_heap, priv->stack, constant_version);
+ prog->vs.uniform_f_locations, &priv->vconst_heap, priv->stack, constant_version);
/* Load DirectX 9 integer constants/uniforms for vertex shader */
- shader_glsl_load_constantsI(vshader, gl_info, prog->vuniformI_locations, state->vs_consts_i,
+ shader_glsl_load_constantsI(vshader, gl_info, prog->vs.uniform_i_locations, state->vs_consts_i,
stateBlock->changed.vertexShaderConstantsI & vshader->reg_maps.integer_constants);
/* Load DirectX 9 boolean constants/uniforms for vertex shader */
@@ -749,7 +755,7 @@ static void shader_glsl_load_constants(const struct wined3d_context *context,
/* Upload the position fixup params */
shader_get_position_fixup(context, state, position_fixup);
- GL_EXTCALL(glUniform4fvARB(prog->posFixup_location, 1, position_fixup));
+ GL_EXTCALL(glUniform4fvARB(prog->vs.pos_fixup_location, 1, position_fixup));
checkGLcall("glUniform4fvARB");
}
@@ -4100,7 +4106,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.vs_id = entry->vs.id;
key.ps_id = entry->ps_id;
if (wine_rb_put(&priv->program_lookup, &key, &entry->program_lookup_entry) == -1)
@@ -4128,16 +4134,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.vs_id = entry->vs.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->vshader_entry);
+ if (entry->vs.id)
+ list_remove(&entry->vs.shader_entry);
if (entry->ps_id)
list_remove(&entry->pshader_entry);
- HeapFree(GetProcessHeap(), 0, entry->vuniformF_locations);
+ HeapFree(GetProcessHeap(), 0, entry->vs.uniform_f_locations);
HeapFree(GetProcessHeap(), 0, entry->puniformF_locations);
HeapFree(GetProcessHeap(), 0, entry);
}
@@ -4744,7 +4750,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
/* Create the entry */
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(struct glsl_shader_prog_link));
entry->programId = programId;
- entry->vs_id = vs_id;
+ entry->vs.id = vs_id;
entry->ps_id = ps_id;
entry->constant_version = 0;
entry->np2Fixup_info = np2fixup_info;
@@ -4791,7 +4797,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
}
checkGLcall("glBindAttribLocationARB");
- list_add_head(&vshader->linked_programs, &entry->vshader_entry);
+ list_add_head(&vshader->linked_programs, &entry->vs.shader_entry);
}
/* Attach GLSL pshader */
@@ -4809,17 +4815,17 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
GL_EXTCALL(glLinkProgramARB(programId));
shader_glsl_validate_link(gl_info, programId);
- entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0,
+ entry->vs.uniform_f_locations = HeapAlloc(GetProcessHeap(), 0,
sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants);
for (i = 0; i < gl_info->limits.glsl_vs_float_constants; ++i)
{
snprintf(glsl_name, sizeof(glsl_name), "vs_c[%u]", i);
- entry->vuniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
+ entry->vs.uniform_f_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
for (i = 0; i < MAX_CONST_I; ++i)
{
snprintf(glsl_name, sizeof(glsl_name), "vs_i[%u]", i);
- entry->vuniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
+ entry->vs.uniform_i_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
entry->puniformF_locations = HeapAlloc(GetProcessHeap(), 0,
sizeof(GLhandleARB) * gl_info->limits.glsl_ps_float_constants);
@@ -4855,7 +4861,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
}
}
- entry->posFixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "posFixup"));
+ entry->vs.pos_fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "posFixup"));
entry->ycorrection_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ycorrection"));
checkGLcall("Find glsl program uniform locations");
@@ -4863,9 +4869,11 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
&& pshader->u.ps.declared_in_count > vec4_varyings(3, gl_info))
{
TRACE("Shader %d needs vertex color clamping disabled\n", programId);
- entry->vertex_color_clamp = GL_FALSE;
- } else {
- entry->vertex_color_clamp = GL_FIXED_ONLY_ARB;
+ entry->vs.vertex_color_clamp = GL_FALSE;
+ }
+ else
+ {
+ entry->vs.vertex_color_clamp = GL_FIXED_ONLY_ARB;
}
/* Set the shader to allow uniform loading on it */
@@ -5015,13 +5023,13 @@ static void shader_glsl_select(const struct wined3d_context *context, enum wined
BOOL useVS = vertex_mode == WINED3D_SHADER_MODE_SHADER;
BOOL usePS = fragment_mode == WINED3D_SHADER_MODE_SHADER;
- old_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
+ old_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vs.vertex_color_clamp : GL_FIXED_ONLY_ARB;
priv->fragment_pipe->enable_extension(gl_info, fragment_mode == WINED3D_SHADER_MODE_FFP);
if (useVS || usePS) set_glsl_shader_program(context, device, usePS, useVS);
else priv->glsl_program = NULL;
- current_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
+ current_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vs.vertex_color_clamp : GL_FIXED_ONLY_ARB;
if (old_vertex_color_clamp != current_vertex_color_clamp)
{
@@ -5150,7 +5158,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
struct glsl_vs_compiled_shader *gl_shaders = shader_data->gl_shaders.vs;
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, linked_programs,
- struct glsl_shader_prog_link, vshader_entry)
+ struct glsl_shader_prog_link, vs.shader_entry)
{
delete_glsl_program_entry(priv, gl_info, entry);
}
@@ -5158,7 +5166,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
for (i = 0; i < shader_data->num_gl_shaders; ++i)
{
TRACE("Deleting vertex shader %u.\n", gl_shaders[i].prgId);
- if (priv->glsl_program && priv->glsl_program->vs_id == gl_shaders[i].prgId)
+ if (priv->glsl_program && priv->glsl_program->vs.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");
@@ -5188,8 +5196,8 @@ static int glsl_program_key_compare(const void *key, const struct wine_rb_entry
const struct glsl_shader_prog_link *prog = WINE_RB_ENTRY_VALUE(entry,
const struct glsl_shader_prog_link, program_lookup_entry);
- if (k->vs_id > prog->vs_id) return 1;
- else if (k->vs_id < prog->vs_id) return -1;
+ 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;
--
1.7.8.6
More information about the wine-patches
mailing list