wined3d: Avoid the deprecated gl_FragData on core profile contexts.

Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Matteo Bruni 2016-03-31 19:50:58 +02:00 committed by Alexandre Julliard
parent 0526544576
commit dd5cf16799
1 changed files with 34 additions and 19 deletions

View File

@ -1619,6 +1619,11 @@ static void PRINTF_ATTR(4, 5) declare_out_varying(const struct wined3d_gl_info *
}
}
static const char *get_fragment_output(const struct wined3d_gl_info *gl_info)
{
return needs_legacy_glsl_syntax(gl_info) ? "gl_FragData" : "ps_out";
}
static BOOL glsl_is_color_reg_read(const struct wined3d_shader *shader, unsigned int idx)
{
const struct wined3d_shader_signature *input_signature = &shader->input_signature;
@ -2009,6 +2014,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
shader_addline(buffer, "vec4 vpos;\n");
}
if (!needs_legacy_glsl_syntax(gl_info))
shader_addline(buffer, "out vec4 ps_out[%u];\n", gl_info->limits.buffers);
if (shader->limits->constant_float + extra_constants_needed >= gl_info->limits.glsl_ps_float_constants)
FIXME("Insufficient uniforms to run this shader.\n");
}
@ -2327,7 +2335,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
WARN("Write to render target %u, only %d supported.\n",
reg->idx[0].offset, gl_info->limits.buffers);
sprintf(register_name, "gl_FragData[%u]", reg->idx[0].offset);
sprintf(register_name, "%s[%u]", get_fragment_output(gl_info), reg->idx[0].offset);
break;
case WINED3DSPR_RASTOUT:
@ -5393,18 +5401,24 @@ static GLuint generate_param_reorder_function(struct shader_glsl_priv *priv,
return ret;
}
static void shader_glsl_generate_srgb_write_correction(struct wined3d_string_buffer *buffer)
static void shader_glsl_generate_srgb_write_correction(struct wined3d_string_buffer *buffer,
const struct wined3d_gl_info *gl_info)
{
shader_addline(buffer, "tmp0.xyz = pow(gl_FragData[0].xyz, vec3(srgb_const0.x));\n");
const char *output = get_fragment_output(gl_info);
shader_addline(buffer, "tmp0.xyz = pow(%s[0].xyz, vec3(srgb_const0.x));\n", output);
shader_addline(buffer, "tmp0.xyz = tmp0.xyz * vec3(srgb_const0.y) - vec3(srgb_const0.z);\n");
shader_addline(buffer, "tmp1.xyz = gl_FragData[0].xyz * vec3(srgb_const0.w);\n");
shader_addline(buffer, "bvec3 srgb_compare = lessThan(gl_FragData[0].xyz, vec3(srgb_const1.x));\n");
shader_addline(buffer, "gl_FragData[0].xyz = mix(tmp0.xyz, tmp1.xyz, vec3(srgb_compare));\n");
shader_addline(buffer, "gl_FragData[0] = clamp(gl_FragData[0], 0.0, 1.0);\n");
shader_addline(buffer, "tmp1.xyz = %s[0].xyz * vec3(srgb_const0.w);\n", output);
shader_addline(buffer, "bvec3 srgb_compare = lessThan(%s[0].xyz, vec3(srgb_const1.x));\n", output);
shader_addline(buffer, "%s[0].xyz = mix(tmp0.xyz, tmp1.xyz, vec3(srgb_compare));\n", output);
shader_addline(buffer, "%s[0] = clamp(%s[0], 0.0, 1.0);\n", output, output);
}
static void shader_glsl_generate_fog_code(struct wined3d_string_buffer *buffer, enum wined3d_ffp_ps_fog_mode mode)
static void shader_glsl_generate_fog_code(struct wined3d_string_buffer *buffer,
const struct wined3d_gl_info *gl_info, enum wined3d_ffp_ps_fog_mode mode)
{
const char *output = get_fragment_output(gl_info);
switch (mode)
{
case WINED3D_FFP_PS_FOG_OFF:
@ -5428,8 +5442,8 @@ static void shader_glsl_generate_fog_code(struct wined3d_string_buffer *buffer,
return;
}
shader_addline(buffer, "gl_FragData[0].xyz = mix(ffp_fog.color.xyz, gl_FragData[0].xyz,"
" clamp(fog, 0.0, 1.0));\n");
shader_addline(buffer, "%s[0].xyz = mix(ffp_fog.color.xyz, %s[0].xyz, clamp(fog, 0.0, 1.0));\n",
output, output);
}
/* Context activation is done by the caller. */
@ -5513,17 +5527,14 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
/* Pixel shaders < 2.0 place the resulting color in R0 implicitly */
if (reg_maps->shader_version.major < 2)
{
/* Some older cards like GeforceFX ones don't support multiple buffers, so also not gl_FragData */
shader_addline(buffer, "gl_FragData[0] = R0;\n");
}
shader_addline(buffer, "%s[0] = R0;\n", get_fragment_output(gl_info));
if (args->srgb_correction)
shader_glsl_generate_srgb_write_correction(buffer);
shader_glsl_generate_srgb_write_correction(buffer, gl_info);
/* SM < 3 does not replace the fog stage. */
if (reg_maps->shader_version.major < 3)
shader_glsl_generate_fog_code(buffer, args->fog);
shader_glsl_generate_fog_code(buffer, gl_info, args->fog);
shader_addline(buffer, "}\n");
@ -6612,6 +6623,9 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
if (!needs_legacy_glsl_syntax(gl_info))
shader_addline(buffer, "out vec4 ps_out[1];\n");
shader_addline(buffer, "vec4 tmp0, tmp1;\n");
shader_addline(buffer, "vec4 ret;\n");
if (tempreg_used || settings->sRGB_write)
@ -6928,12 +6942,13 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
}
}
shader_addline(buffer, "gl_FragData[0] = ffp_varying_specular * specular_enable + ret;\n");
shader_addline(buffer, "%s[0] = ffp_varying_specular * specular_enable + ret;\n",
get_fragment_output(gl_info));
if (settings->sRGB_write)
shader_glsl_generate_srgb_write_correction(buffer);
shader_glsl_generate_srgb_write_correction(buffer, gl_info);
shader_glsl_generate_fog_code(buffer, settings->fog);
shader_glsl_generate_fog_code(buffer, gl_info, settings->fog);
shader_addline(buffer, "}\n");