Matteo Bruni : wined3d: Avoid Y correction on dFdy when using FBO ORM.
Alexandre Julliard
julliard at winehq.org
Tue Jun 1 16:04:33 CDT 2021
Module: wine
Branch: master
Commit: 7c578c14db7c529d374371245ce0b0ee0728672c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7c578c14db7c529d374371245ce0b0ee0728672c
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Mon May 31 21:12:55 2021 +0200
wined3d: Avoid Y correction on dFdy when using FBO ORM.
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/glsl_shader.c | 39 ++++++++++++++++++++-------------------
dlls/wined3d/shader.c | 5 +++--
2 files changed, 23 insertions(+), 21 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 5a3cb4c8a69..6a3aaabe39b 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -4036,6 +4036,9 @@ static void shader_glsl_pow(const struct wined3d_shader_instruction *ins)
/* Map the opcode 1-to-1 to the GL code (arg->dst = instruction(src0, src1, ...) */
static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
{
+ const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
+ bool y_correction = ins->ctx->reg_maps->shader_version.type == WINED3D_SHADER_TYPE_PIXEL
+ ? !priv->cur_ps_args->render_offscreen : false;
struct wined3d_string_buffer *buffer = ins->ctx->buffer;
struct glsl_src_param src_param;
const char *instruction;
@@ -4052,9 +4055,9 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
case WINED3DSIH_DSX: instruction = "dFdx"; break;
case WINED3DSIH_DSX_COARSE: instruction = "dFdxCoarse"; break;
case WINED3DSIH_DSX_FINE: instruction = "dFdxFine"; break;
- case WINED3DSIH_DSY: instruction = "ycorrection.y * dFdy"; break;
- case WINED3DSIH_DSY_COARSE: instruction = "ycorrection.y * dFdyCoarse"; break;
- case WINED3DSIH_DSY_FINE: instruction = "ycorrection.y * dFdyFine"; break;
+ case WINED3DSIH_DSY: instruction = y_correction ? "ycorrection.y * dFdy" : "dFdy"; break;
+ case WINED3DSIH_DSY_COARSE: instruction = y_correction ? "ycorrection.y * dFdyCoarse" : "dFdyCoarse"; break;
+ case WINED3DSIH_DSY_FINE: instruction = y_correction ? "ycorrection.y * dFdyFine" : "dFdyFine"; break;
case WINED3DSIH_FIRSTBIT_HI: instruction = "findMSB"; break;
case WINED3DSIH_FIRSTBIT_LO: instruction = "findLSB"; break;
case WINED3DSIH_FIRSTBIT_SHI: instruction = "findMSB"; break;
@@ -7773,25 +7776,23 @@ static GLuint shader_glsl_generate_fragment_shader(const struct wined3d_context_
shader_glsl_append_imm_vec(buffer, &wined3d_srgb_const[1].x, 4, gl_info);
shader_addline(buffer, ";\n");
}
- if (reg_maps->vpos || reg_maps->usesdsy)
+ if ((reg_maps->usesdsy && wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ || (reg_maps->vpos && !gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]))
{
- if (reg_maps->usesdsy || !gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
- {
- ++extra_constants_needed;
- shader_addline(buffer, "uniform vec4 ycorrection;\n");
- }
- if (reg_maps->vpos)
+ ++extra_constants_needed;
+ shader_addline(buffer, "uniform vec4 ycorrection;\n");
+ }
+ if (reg_maps->vpos)
+ {
+ if (gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
{
- if (gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
- {
- if (context_gl->c.d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER)
- shader_addline(buffer, "layout(%spixel_center_integer) in vec4 gl_FragCoord;\n",
- args->render_offscreen ? "" : "origin_upper_left, ");
- else if (!args->render_offscreen)
- shader_addline(buffer, "layout(origin_upper_left) in vec4 gl_FragCoord;\n");
- }
- shader_addline(buffer, "vec4 vpos;\n");
+ if (context_gl->c.d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER)
+ shader_addline(buffer, "layout(%spixel_center_integer) in vec4 gl_FragCoord;\n",
+ args->render_offscreen ? "" : "origin_upper_left, ");
+ else if (!args->render_offscreen)
+ shader_addline(buffer, "layout(origin_upper_left) in vec4 gl_FragCoord;\n");
}
+ shader_addline(buffer, "vec4 vpos;\n");
}
if (args->alpha_test_func + 1 != WINED3D_CMP_ALWAYS)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 42a3c108860..ae9b21defa1 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -4212,8 +4212,9 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
if (d3d_info->emulated_flatshading)
args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
- args->render_offscreen = shader->reg_maps.vpos && gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]
- ? context->render_offscreen : 0;
+ args->render_offscreen = (shader->reg_maps.vpos && gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
+ || (shader->reg_maps.usesdsy && wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ ? context->render_offscreen : 1;
for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i)
{
More information about the wine-cvs
mailing list