All D3D versions seem to basically guarantee invariance for the vertex position at the very least. In practice, desktop GL implementations also do the same. That's not necessarily the case for tile based renderers, where the cost of providing invariance might be non negligible. We want this behavior though, so let's ask for it explicitly.
Based on a patch by Stefan Dösinger.
Signed-off-by: Matteo Bruni mbruni@codeweavers.com --- v2: Move the invariant declaration in shader_glsl_generate_ffp_vertex_shader() in the proper place...
Supersedes patch 216446.
dlls/wined3d/glsl_shader.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index fb809052d83..c131cf61766 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -2184,6 +2184,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context_gl *c if (map & 1) shader_addline(buffer, "void subroutine%u();\n", i); }
+ if (version->type != WINED3D_SHADER_TYPE_PIXEL && version->type != WINED3D_SHADER_TYPE_COMPUTE) + shader_addline(buffer, "invariant gl_Position;\n"); + /* Declare the constants (aka uniforms) */ if (shader->limits->constant_float > 0) { @@ -7125,6 +7128,8 @@ static GLuint shader_glsl_generate_vs3_rasterizer_input_setup(struct shader_glsl
shader_glsl_add_version_declaration(buffer, gl_info);
+ shader_addline(buffer, "invariant gl_Position;\n"); + if (per_vertex_point_size) { shader_addline(buffer, "uniform struct\n{\n"); @@ -8994,6 +8999,8 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr if (shader_glsl_use_explicit_attrib_location(gl_info)) shader_addline(buffer, "#extension GL_ARB_explicit_attrib_location : enable\n");
+ shader_addline(buffer, "invariant gl_Position;\n"); + for (i = 0; i < WINED3D_FFP_ATTRIBS_COUNT; ++i) { const char *type = i < ARRAY_SIZE(attrib_info) ? attrib_info[i].type : "vec4";
On Wed, 6 Oct 2021 at 19:04, Matteo Bruni mbruni@codeweavers.com wrote:
v2: Move the invariant declaration in shader_glsl_generate_ffp_vertex_shader() in the proper place...
It's getting further now (from the d3d11 tests):
0:19(1): error: undeclared variable `gl_Position' cannot be marked invariant
On Thu, Oct 7, 2021 at 4:53 PM Henri Verbeet hverbeet@gmail.com wrote:
On Wed, 6 Oct 2021 at 19:04, Matteo Bruni mbruni@codeweavers.com wrote:
v2: Move the invariant declaration in shader_glsl_generate_ffp_vertex_shader() in the proper place...
It's getting further now (from the d3d11 tests):
0:19(1): error: undeclared variable `gl_Position' cannot be marked invariant
I thought I forgot to run the d3d9 tests for this patch but I guess I forgot to run any test at all :/
This time I will give it a proper look before resending, sorry for wasting your time twice.