[PATCH 5/5] wined3d: Introduce a separate function to retrieve the GLSL variable prefix.
Henri Verbeet
hverbeet at codeweavers.com
Wed Sep 26 15:34:04 CDT 2012
---
dlls/wined3d/glsl_shader.c | 153 ++++++++++++++++++++++---------------------
1 files changed, 78 insertions(+), 75 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index e10e207..8a072c9 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -174,6 +174,25 @@ static const char *debug_gl_shader_type(GLenum type)
}
}
+static const char *shader_glsl_get_prefix(enum wined3d_shader_type type)
+{
+ switch (type)
+ {
+ case WINED3D_SHADER_TYPE_VERTEX:
+ return "vs";
+
+ case WINED3D_SHADER_TYPE_GEOMETRY:
+ return "gs";
+
+ case WINED3D_SHADER_TYPE_PIXEL:
+ return "ps";
+
+ default:
+ FIXME("Unhandled shader type %#x.\n", type);
+ return "unknown";
+ }
+}
+
/* Extract a line from the info log.
* Note that this modifies the source string. */
static char *get_info_log_line(char **ptr)
@@ -330,11 +349,12 @@ static void shader_glsl_load_psamplers(const struct wined3d_gl_info *gl_info,
const DWORD *tex_unit_map, GLhandleARB programId)
{
GLint name_loc;
- int i;
char sampler_name[20];
+ unsigned int i;
- for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) {
- snprintf(sampler_name, sizeof(sampler_name), "Psampler%d", i);
+ for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
+ {
+ snprintf(sampler_name, sizeof(sampler_name), "ps_sampler%u", i);
name_loc = GL_EXTCALL(glGetUniformLocationARB(programId, sampler_name));
if (name_loc != -1) {
DWORD mapped_unit = tex_unit_map[i];
@@ -356,10 +376,11 @@ static void shader_glsl_load_vsamplers(const struct wined3d_gl_info *gl_info,
{
GLint name_loc;
char sampler_name[20];
- int i;
+ unsigned int i;
- for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) {
- snprintf(sampler_name, sizeof(sampler_name), "Vsampler%d", i);
+ for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
+ {
+ snprintf(sampler_name, sizeof(sampler_name), "vs_sampler%u", i);
name_loc = GL_EXTCALL(glGetUniformLocationARB(programId, sampler_name));
if (name_loc != -1) {
DWORD mapped_unit = tex_unit_map[MAX_FRAGMENT_SAMPLERS + i];
@@ -584,30 +605,11 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
{
GLint tmp_loc;
unsigned int i;
- char tmp_name[8];
+ char tmp_name[10];
const char *prefix;
struct list* ptr;
- switch (shader->reg_maps.shader_version.type)
- {
- case WINED3D_SHADER_TYPE_VERTEX:
- prefix = "VB";
- break;
-
- case WINED3D_SHADER_TYPE_GEOMETRY:
- prefix = "GB";
- break;
-
- case WINED3D_SHADER_TYPE_PIXEL:
- prefix = "PB";
- break;
-
- default:
- FIXME("Unknown shader type %#x.\n",
- shader->reg_maps.shader_version.type);
- prefix = "UB";
- break;
- }
+ prefix = shader_glsl_get_prefix(shader->reg_maps.shader_version.type);
/* TODO: Benchmark and see if it would be beneficial to store the
* locations of the constants to avoid looking up each time */
@@ -619,7 +621,7 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
/* TODO: Benchmark and see if it would be beneficial to store the
* locations of the constants to avoid looking up each time */
- snprintf(tmp_name, sizeof(tmp_name), "%s[%i]", prefix, i);
+ snprintf(tmp_name, sizeof(tmp_name), "%s_b[%i]", prefix, i);
tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, tmp_name));
if (tmp_loc != -1)
{
@@ -639,7 +641,7 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
TRACE_(d3d_constants)("Loading local constants %i: %i\n", idx, values[0]);
- snprintf(tmp_name, sizeof(tmp_name), "%s[%i]", prefix, idx);
+ snprintf(tmp_name, sizeof(tmp_name), "%s_b[%i]", prefix, idx);
tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, tmp_name));
if (tmp_loc != -1) {
/* We found this uniform name in the program - go ahead and send the data */
@@ -900,11 +902,12 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
const struct wined3d_fb_state *fb = &shader->device->fb;
unsigned int i, extra_constants_needed = 0;
const struct wined3d_shader_lconst *lconst;
+ const char *prefix;
DWORD map;
/* There are some minor differences between pixel and vertex shaders */
char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
- char prefix = pshader ? 'P' : 'V';
+ prefix = shader_glsl_get_prefix(reg_maps->shader_version.type);
/* Prototype the subroutines */
for (i = 0, map = reg_maps->labels; map; map >>= 1, ++i)
@@ -979,17 +982,17 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
}
}
max_constantsF = min(shader->limits.constant_float, max_constantsF);
- shader_addline(buffer, "uniform vec4 %cC[%u];\n", prefix, max_constantsF);
+ shader_addline(buffer, "uniform vec4 %s_c[%u];\n", prefix, max_constantsF);
}
/* Always declare the full set of constants, the compiler can remove the
* unused ones because d3d doesn't (yet) support indirect int and bool
* constant addressing. This avoids problems if the app uses e.g. i0 and i9. */
if (shader->limits.constant_int > 0 && reg_maps->integer_constants)
- shader_addline(buffer, "uniform ivec4 %cI[%u];\n", prefix, shader->limits.constant_int);
+ shader_addline(buffer, "uniform ivec4 %s_i[%u];\n", prefix, shader->limits.constant_int);
if (shader->limits.constant_bool > 0 && reg_maps->boolean_constants)
- shader_addline(buffer, "uniform bool %cB[%u];\n", prefix, shader->limits.constant_bool);
+ shader_addline(buffer, "uniform bool %s_b[%u];\n", prefix, shader->limits.constant_bool);
if (!pshader)
{
@@ -1054,37 +1057,37 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
{
case WINED3DSTT_1D:
if (pshader && ps_args->shadow & (1 << i))
- shader_addline(buffer, "uniform sampler1DShadow %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler1DShadow %s_sampler%u;\n", prefix, i);
else
- shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler1D %s_sampler%u;\n", prefix, i);
break;
case WINED3DSTT_2D:
texture = state->textures[i];
if (pshader && ps_args->shadow & (1 << i))
{
if (texture && texture->target == GL_TEXTURE_RECTANGLE_ARB)
- shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler2DRectShadow %s_sampler%u;\n", prefix, i);
else
- shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler2DShadow %s_sampler%u;\n", prefix, i);
}
else
{
if (texture && texture->target == GL_TEXTURE_RECTANGLE_ARB)
- shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler2DRect %s_sampler%u;\n", prefix, i);
else
- shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler2D %s_sampler%u;\n", prefix, i);
}
break;
case WINED3DSTT_CUBE:
if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported Cube shadow sampler.\n");
- shader_addline(buffer, "uniform samplerCube %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform samplerCube %s_sampler%u;\n", prefix, i);
break;
case WINED3DSTT_VOLUME:
if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported 3D shadow sampler.\n");
- shader_addline(buffer, "uniform sampler3D %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform sampler3D %s_sampler%u;\n", prefix, i);
break;
default:
- shader_addline(buffer, "uniform unsupported_sampler %csampler%u;\n", prefix, i);
+ shader_addline(buffer, "uniform unsupported_sampler %s_sampler%u;\n", prefix, i);
FIXME("Unrecognized sampler type: %#x\n", reg_maps->sampler_type[i]);
break;
}
@@ -1121,7 +1124,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
}
fixup->num_consts = (cur + 1) >> 1;
- shader_addline(buffer, "uniform vec4 %csamplerNP2Fixup[%u];\n", prefix, fixup->num_consts);
+ shader_addline(buffer, "uniform vec4 %s_samplerNP2Fixup[%u];\n", prefix, fixup->num_consts);
}
/* Declare address variables */
@@ -1189,7 +1192,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
{
LIST_FOR_EACH_ENTRY(lconst, &shader->constantsF, struct wined3d_shader_lconst, entry)
{
- shader_addline(buffer, "uniform vec4 %cLC%u;\n", prefix, lconst->idx);
+ shader_addline(buffer, "uniform vec4 %s_lc%u;\n", prefix, lconst->idx);
}
}
@@ -1308,6 +1311,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps;
const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
+ const char *prefix = shader_glsl_get_prefix(reg_maps->shader_version.type);
*is_color = FALSE;
@@ -1386,34 +1390,32 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
case WINED3DSPR_CONST:
{
- const char prefix = pshader ? 'P' : 'V';
-
/* Relative addressing */
if (reg->rel_addr)
{
struct glsl_src_param rel_param;
shader_glsl_add_src_param(ins, reg->rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
- if (reg->idx) sprintf(register_name, "%cC[%s + %u]", prefix, rel_param.param_str, reg->idx);
- else sprintf(register_name, "%cC[%s]", prefix, rel_param.param_str);
+ if (reg->idx)
+ sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param.param_str, reg->idx);
+ else
+ sprintf(register_name, "%s_c[%s]", prefix, rel_param.param_str);
}
else
{
if (shader_constant_is_local(shader, reg->idx))
- sprintf(register_name, "%cLC%u", prefix, reg->idx);
+ sprintf(register_name, "%s_lc%u", prefix, reg->idx);
else
- sprintf(register_name, "%cC[%u]", prefix, reg->idx);
+ sprintf(register_name, "%s_c[%u]", prefix, reg->idx);
}
}
break;
case WINED3DSPR_CONSTINT:
- if (pshader) sprintf(register_name, "PI[%u]", reg->idx);
- else sprintf(register_name, "VI[%u]", reg->idx);
+ sprintf(register_name, "%s_i[%u]", prefix, reg->idx);
break;
case WINED3DSPR_CONSTBOOL:
- if (pshader) sprintf(register_name, "PB[%u]", reg->idx);
- else sprintf(register_name, "VB[%u]", reg->idx);
+ sprintf(register_name, "%s_b[%u]", prefix, reg->idx);
break;
case WINED3DSPR_TEXTURE: /* case WINED3DSPR_ADDR: */
@@ -1426,8 +1428,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
break;
case WINED3DSPR_SAMPLER:
- if (pshader) sprintf(register_name, "Psampler%u", reg->idx);
- else sprintf(register_name, "Vsampler%u", reg->idx);
+ sprintf(register_name, "%s_sampler%u", prefix, reg->idx);
break;
case WINED3DSPR_COLOROUT:
@@ -2115,7 +2116,7 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
{
const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
fixup = priv->cur_ps_args->color_fixup[sampler];
- sampler_base = "Psampler";
+ sampler_base = "ps_sampler";
if(priv->cur_ps_args->np2_fixup & (1 << sampler)) {
if(bias) {
@@ -2124,8 +2125,10 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
np2_fixup = TRUE;
}
}
- } else {
- sampler_base = "Vsampler";
+ }
+ else
+ {
+ sampler_base = "vs_sampler";
fixup = COLOR_FIXUP_IDENTITY; /* FIXME: Vshader color fixup */
}
@@ -2144,7 +2147,7 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
const unsigned char idx = priv->cur_np2fixup_info->idx[sampler];
- shader_addline(ins->ctx->buffer, " * PsamplerNP2Fixup[%u].%s)%s);\n", idx >> 1,
+ shader_addline(ins->ctx->buffer, " * ps_samplerNP2Fixup[%u].%s)%s);\n", idx >> 1,
(idx % 2) ? "zw" : "xy", dst_swizzle);
} else if(dx && dy) {
shader_addline(ins->ctx->buffer, ", %s, %s)%s);\n", dx, dy, dst_swizzle);
@@ -4085,17 +4088,17 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer
/* GL locking is done by the caller */
static void hardcode_local_constants(const struct wined3d_shader *shader,
- const struct wined3d_gl_info *gl_info, GLhandleARB programId, char prefix)
+ const struct wined3d_gl_info *gl_info, GLhandleARB programId, const char *prefix)
{
const struct wined3d_shader_lconst *lconst;
GLint tmp_loc;
const float *value;
- char glsl_name[8];
+ char glsl_name[10];
LIST_FOR_EACH_ENTRY(lconst, &shader->constantsF, struct wined3d_shader_lconst, entry)
{
value = (const float *)lconst->value;
- snprintf(glsl_name, sizeof(glsl_name), "%cLC%u", prefix, lconst->idx);
+ snprintf(glsl_name, sizeof(glsl_name), "%s_lc%u", prefix, lconst->idx);
tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
GL_EXTCALL(glUniform4fvARB(tmp_loc, 1, value));
}
@@ -4441,7 +4444,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
GLhandleARB programId = 0;
GLhandleARB reorder_shader_id = 0;
unsigned int i;
- char glsl_name[8];
+ char glsl_name[10];
struct ps_compile_args ps_compile_args;
struct vs_compile_args vs_compile_args;
@@ -4536,24 +4539,24 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
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), "VC[%i]", i);
+ snprintf(glsl_name, sizeof(glsl_name), "vs_c[%u]", i);
entry->vuniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
for (i = 0; i < MAX_CONST_I; ++i)
{
- snprintf(glsl_name, sizeof(glsl_name), "VI[%i]", i);
+ snprintf(glsl_name, sizeof(glsl_name), "vs_i[%u]", i);
entry->vuniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
entry->puniformF_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), "PC[%i]", i);
+ snprintf(glsl_name, sizeof(glsl_name), "ps_c[%u]", i);
entry->puniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
for (i = 0; i < MAX_CONST_I; ++i)
{
- snprintf(glsl_name, sizeof(glsl_name), "PI[%i]", i);
+ snprintf(glsl_name, sizeof(glsl_name), "ps_i[%u]", i);
entry->puniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
}
@@ -4569,12 +4572,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
entry->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, "PsamplerNP2Fixup"));
- } else {
+ if (ps_compile_args.np2_fixup)
+ {
+ if (entry->np2Fixup_info)
+ entry->np2Fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ps_samplerNP2Fixup"));
+ else
FIXME("NP2 texcoord fixup needed for this pixelshader, but no fixup uniform found.\n");
- }
}
}
@@ -4611,9 +4614,9 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
* later
*/
if (pshader && !pshader->load_local_constsF)
- hardcode_local_constants(pshader, gl_info, programId, 'P');
+ hardcode_local_constants(pshader, gl_info, programId, "ps");
if (vshader && !vshader->load_local_constsF)
- hardcode_local_constants(vshader, gl_info, programId, 'V');
+ hardcode_local_constants(vshader, gl_info, programId, "vs");
}
/* GL locking is done by the caller */
--
1.7.8.6
More information about the wine-patches
mailing list