=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Implement forceEarlyDepthStencil shader global flag.

Alexandre Julliard julliard at winehq.org
Mon Jul 24 15:51:20 CDT 2017


Module: wine
Branch: master
Commit: a6d26527c61178a4408ce37833ab281f05248fa6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a6d26527c61178a4408ce37833ab281f05248fa6

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Jul 24 00:15:55 2017 +0200

wined3d: Implement forceEarlyDepthStencil shader global flag.

Signed-off-by: Józef Kucia <jkucia 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     |  3 +++
 dlls/wined3d/shader.c          | 23 +++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |  3 +++
 3 files changed, 29 insertions(+)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index f96f48d..7290fc7 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -7393,6 +7393,9 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
     if (shader->limits->constant_float + extra_constants_needed >= gl_info->limits.glsl_ps_float_constants)
         FIXME("Insufficient uniforms to run this shader.\n");
 
+    if (shader->u.ps.force_early_depth_stencil)
+        shader_addline(buffer, "layout(early_fragment_tests) in;\n");
+
     shader_addline(buffer, "void main()\n{\n");
 
     /* Direct3D applications expect integer vPos values, while OpenGL drivers
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 8827641..d9504ef 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1085,6 +1085,21 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
             else
                 reg_maps->cb_sizes[reg->idx[0].offset] = reg->idx[1].offset;
         }
+        else if (ins.handler_idx == WINED3DSIH_DCL_GLOBAL_FLAGS)
+        {
+            if (ins.flags & WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL)
+            {
+                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+                    shader->u.ps.force_early_depth_stencil = TRUE;
+                else
+                    FIXME("Invalid instruction %#x for shader type %#x.\n",
+                            ins.handler_idx, shader_version.type);
+            }
+            else
+            {
+                WARN("Ignoring global flags %#x.\n", ins.flags);
+            }
+        }
         else if (ins.handler_idx == WINED3DSIH_DCL_GS_INSTANCES)
         {
             if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
@@ -1760,6 +1775,14 @@ static void shader_dump_global_flags(struct wined3d_string_buffer *buffer, DWORD
             shader_addline(buffer, " | ");
     }
 
+    if (global_flags & WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL)
+    {
+        shader_addline(buffer, "forceEarlyDepthStencil");
+        global_flags &= ~WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL;
+        if (global_flags)
+            shader_addline(buffer, " | ");
+    }
+
     if (global_flags & WINED3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS)
     {
         shader_addline(buffer, "enableRawAndStructuredBuffers");
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ccf0563..eae451b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -559,6 +559,7 @@ enum wined3d_shader_interpolation_mode
 enum wined3d_shader_global_flags
 {
     WINED3DSGF_REFACTORING_ALLOWED               = 0x1,
+    WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL         = 0x4,
     WINED3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS = 0x8,
 };
 
@@ -3866,6 +3867,8 @@ struct wined3d_pixel_shader
     /* Some information about the shader behavior */
     BOOL color0_mov;
     DWORD color0_reg;
+
+    BOOL force_early_depth_stencil;
 };
 
 struct wined3d_compute_shader




More information about the wine-cvs mailing list