From 3851931e1ca632aca8ffada3d06ac260f3b02113 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 12 May 2018 13:55:47 +1000 Subject: [PATCH] Added wined3d-Implement-oMask patchset --- patches/patchinstall.sh | 19 ++++ .../0001-wined3d-Implement-oMask.patch | 94 +++++++++++++++++++ patches/wined3d-Implement-oMask/definition | 2 + 3 files changed, 115 insertions(+) create mode 100644 patches/wined3d-Implement-oMask/0001-wined3d-Implement-oMask.patch create mode 100644 patches/wined3d-Implement-oMask/definition diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 324971ca..01891fc8 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -383,6 +383,7 @@ patch_enable_all () enable_wined3d_CSMT_Main="$1" enable_wined3d_DXTn="$1" enable_wined3d_Dual_Source_Blending="$1" + enable_wined3d_Implement_oMask="$1" enable_wined3d_Indexed_Vertex_Blending="$1" enable_wined3d_QUERY_Stubs="$1" enable_wined3d_Silence_FIXMEs="$1" @@ -1336,6 +1337,9 @@ patch_enable () wined3d-Dual_Source_Blending) enable_wined3d_Dual_Source_Blending="$2" ;; + wined3d-Implement-oMask) + enable_wined3d_Implement_oMask="$2" + ;; wined3d-Indexed_Vertex_Blending) enable_wined3d_Indexed_Vertex_Blending="$2" ;; @@ -7925,6 +7929,21 @@ if test "$enable_wined3d_CSMT_Main" -eq 1; then ) >> "$patchlist" fi +# Patchset wined3d-Implement-oMask +# | +# | This patchset fixes the following Wine bugs: +# | * [#44964] Implement oMask. +# | +# | Modified files: +# | * dlls/wined3d/glsl_shader.c, dlls/wined3d/shader.c, dlls/wined3d/wined3d_private.h +# | +if test "$enable_wined3d_Implement_oMask" -eq 1; then + patch_apply wined3d-Implement-oMask/0001-wined3d-Implement-oMask.patch + ( + printf '%s\n' '+ { "Józef Kucia", "wined3d: Implement oMask.", 1 },'; + ) >> "$patchlist" +fi + # Patchset wined3d-WINED3D_RS_COLORWRITEENABLE # | # | This patchset has the following (direct or indirect) dependencies: diff --git a/patches/wined3d-Implement-oMask/0001-wined3d-Implement-oMask.patch b/patches/wined3d-Implement-oMask/0001-wined3d-Implement-oMask.patch new file mode 100644 index 00000000..4bd97c98 --- /dev/null +++ b/patches/wined3d-Implement-oMask/0001-wined3d-Implement-oMask.patch @@ -0,0 +1,94 @@ +From 18de08ab2090d87ae9a313362fa254c350e5c730 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=B3zef=20Kucia?= +Date: Sat, 12 May 2018 09:29:10 +1000 +Subject: [PATCH] wined3d: Implement oMask + +--- + dlls/wined3d/glsl_shader.c | 10 ++++++++++ + dlls/wined3d/shader.c | 4 ++++ + dlls/wined3d/wined3d_private.h | 6 ++++-- + 3 files changed, 18 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c +index c79fbb5f4fc..e250f34b89a 100644 +--- a/dlls/wined3d/glsl_shader.c ++++ b/dlls/wined3d/glsl_shader.c +@@ -2955,6 +2955,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * + sprintf(register_name, "vpc[%u]", reg->idx[0].offset); + break; + ++ case WINED3DSPR_SAMPLEMASK: ++ sprintf(register_name, "sample_mask"); ++ break; ++ + default: + FIXME("Unhandled register type %#x.\n", reg->type); + sprintf(register_name, "unrecognized_register"); +@@ -7268,6 +7272,9 @@ static void shader_glsl_generate_ps_epilogue(const struct wined3d_gl_info *gl_in + shader_glsl_generate_fog_code(buffer, gl_info, args->fog); + + shader_glsl_generate_alpha_test(buffer, gl_info, args->alpha_test_func + 1); ++ ++ if (reg_maps->sample_mask) ++ shader_addline(buffer, "gl_SampleMask[0] = floatBitsToInt(sample_mask);\n"); + } + + /* Context activation is done by the caller. */ +@@ -7476,6 +7483,9 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context + + shader_addline(buffer, "void main()\n{\n"); + ++ if (reg_maps->sample_mask) ++ shader_addline(buffer, "float sample_mask = uintBitsToFloat(0xffffffffu);\n"); ++ + /* Direct3D applications expect integer vPos values, while OpenGL drivers + * add approximately 0.5. This causes off-by-one problems as spotted by + * the vPos d3d9 visual test. Unfortunately ATI cards do not add exactly +diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c +index 624dc55e900..da7b8134add 100644 +--- a/dlls/wined3d/shader.c ++++ b/dlls/wined3d/shader.c +@@ -810,6 +810,10 @@ static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct w + reg_maps->vocp = 1; + break; + ++ case WINED3DSPR_SAMPLEMASK: ++ reg_maps->sample_mask = 1; ++ break; ++ + default: + TRACE("Not recording register of type %#x and [%#x][%#x].\n", + reg->type, reg->idx[0].offset, reg->idx[1].offset); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index f8f4bd59149..bb2a1068087 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1043,7 +1043,8 @@ struct wined3d_shader_reg_maps + DWORD vocp : 1; + DWORD input_rel_addressing : 1; + DWORD viewport_array : 1; +- DWORD padding : 15; ++ DWORD sample_mask : 1; ++ DWORD padding : 14; + + DWORD rt_mask; /* Used render targets, 32 max. */ + +@@ -4143,13 +4144,14 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) + /* oPos */ + return FALSE; + ++ case WINED3DSPR_CONSTBOOL: /* b# */ + case WINED3DSPR_DEPTHOUT: /* oDepth */ + case WINED3DSPR_DEPTHOUTGE: + case WINED3DSPR_DEPTHOUTLE: +- case WINED3DSPR_CONSTBOOL: /* b# */ + case WINED3DSPR_LOOP: /* aL */ + case WINED3DSPR_PREDICATE: /* p0 */ + case WINED3DSPR_PRIMID: /* primID */ ++ case WINED3DSPR_SAMPLEMASK: + return TRUE; + + case WINED3DSPR_MISCTYPE: +-- +2.17.0 + diff --git a/patches/wined3d-Implement-oMask/definition b/patches/wined3d-Implement-oMask/definition new file mode 100644 index 00000000..b4ab4253 --- /dev/null +++ b/patches/wined3d-Implement-oMask/definition @@ -0,0 +1,2 @@ +Fixes: [44964] Implement oMask. +