[PATCH 2/5] wined3d: Clamp per-vertex point size in vertex shaders.
Matteo Bruni
mbruni at codeweavers.com
Tue Jun 2 09:39:47 CDT 2015
---
dlls/wined3d/glsl_shader.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index e4bef5b..87ff576 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -4925,7 +4925,7 @@ static void handle_ps3_input(struct shader_glsl_priv *priv,
/* Context activation is done by the caller. */
static GLuint generate_param_reorder_function(struct shader_glsl_priv *priv,
const struct wined3d_shader *vs, const struct wined3d_shader *ps,
- const struct wined3d_gl_info *gl_info)
+ BOOL per_vertex_point_size, const struct wined3d_gl_info *gl_info)
{
struct wined3d_string_buffer *buffer = &priv->shader_buffer;
GLuint ret = 0;
@@ -4939,6 +4939,14 @@ static GLuint generate_param_reorder_function(struct shader_glsl_priv *priv,
shader_addline(buffer, "%s\n", shader_glsl_get_version(gl_info, &vs->reg_maps.shader_version));
+ if (per_vertex_point_size)
+ {
+ shader_addline(buffer, "uniform struct\n{\n");
+ shader_addline(buffer, " float size_min;\n");
+ shader_addline(buffer, " float size_max;\n");
+ shader_addline(buffer, "} ffp_point;\n");
+ }
+
if (ps_major < 3)
{
shader_addline(buffer, "void order_ps_input(in vec4 vs_out[%u])\n{\n", vs->limits->packed_output);
@@ -4983,9 +4991,10 @@ static GLuint generate_param_reorder_function(struct shader_glsl_priv *priv,
shader_addline(buffer, "gl_TexCoord[%u].w = 1.0;\n", semantic_idx);
}
}
- else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_PSIZE))
+ else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_PSIZE) && per_vertex_point_size)
{
- shader_addline(buffer, "gl_PointSize = vs_out[%u].%c;\n", output->register_idx, reg_mask[1]);
+ shader_addline(buffer, "gl_PointSize = clamp(vs_out[%u].%c, ffp_point.size_min, ffp_point.size_max);\n",
+ output->register_idx, reg_mask[1]);
}
else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_FOG))
{
@@ -5019,9 +5028,10 @@ static GLuint generate_param_reorder_function(struct shader_glsl_priv *priv,
shader_addline(buffer, "gl_Position%s = vs_out[%u]%s;\n",
reg_mask, output->register_idx, reg_mask);
}
- else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_PSIZE))
+ else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_PSIZE) && per_vertex_point_size)
{
- shader_addline(buffer, "gl_PointSize = vs_out[%u].%c;\n", output->register_idx, reg_mask[1]);
+ shader_addline(buffer, "gl_PointSize = clamp(vs_out[%u].%c, ffp_point.size_min, ffp_point.size_max);\n",
+ output->register_idx, reg_mask[1]);
}
}
@@ -6711,7 +6721,8 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
WORD map = vshader->reg_maps.input_registers;
struct wined3d_string_buffer *tmp_name = string_buffer_get(&priv->string_buffers);
- reorder_shader_id = generate_param_reorder_function(priv, vshader, pshader, gl_info);
+ reorder_shader_id = generate_param_reorder_function(priv, vshader, pshader,
+ state->gl_primitive_type == GL_POINTS && vshader->reg_maps.point_size, gl_info);
TRACE("Attaching GLSL shader object %u to program %u.\n", reorder_shader_id, program_id);
GL_EXTCALL(glAttachShader(program_id, reorder_shader_id));
checkGLcall("glAttachShader");
--
2.3.6
More information about the wine-patches
mailing list