Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/adapter_gl.c | 1 + dlls/wined3d/glsl_shader.c | 10 ++++++++++ dlls/wined3d/shader.c | 15 ++++++--------- dlls/wined3d/wined3d_private.h | 17 +++++------------ 4 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index a0167f0b00b..5f6d673bfdf 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -3770,6 +3770,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count; d3d_info->limits.varying_count = shader_caps.varying_count; d3d_info->shader_double_precision = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION); + d3d_info->shader_output_interpolation = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION);
d3d_info->viewport_array_index_any_shader = !!gl_info->supported[ARB_SHADER_VIEWPORT_LAYER_ARRAY];
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 1acb6c74bf6..41cf157e84c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1979,6 +1979,14 @@ static void shader_glsl_declare_shader_inputs(const struct wined3d_gl_info *gl_i } }
+static BOOL needs_interpolation_qualifiers_for_shader_outputs(const struct wined3d_gl_info *gl_info) +{ + /* In GLSL 4.40+ it is fine to specify interpolation qualifiers only in + * fragment shaders. In older GLSL versions interpolation qualifiers must + * match between shader stages. */ + return gl_info->glsl_version < MAKEDWORD_VERSION(4, 40); +} + static void shader_glsl_declare_shader_outputs(const struct wined3d_gl_info *gl_info, struct wined3d_string_buffer *buffer, unsigned int element_count, BOOL rasterizer_setup, const DWORD *interpolation_mode) @@ -11108,6 +11116,8 @@ static void shader_glsl_get_caps(const struct wined3d_adapter *adapter, struct s * shader_glsl_alloc(). */ caps->wined3d_caps = WINED3D_SHADER_CAP_VS_CLIPPING | WINED3D_SHADER_CAP_SRGB_WRITE; + if (needs_interpolation_qualifiers_for_shader_outputs(gl_info)) + caps->wined3d_caps |= WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION; }
static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup) diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 973941b8d9e..1d8540e5e94 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -3505,10 +3505,10 @@ HRESULT CDECL wined3d_shader_set_local_constants_float(struct wined3d_shader *sh }
static void init_interpolation_compile_args(DWORD *interpolation_args, - const struct wined3d_shader *pixel_shader, const struct wined3d_gl_info *gl_info) + const struct wined3d_shader *pixel_shader, const struct wined3d_d3d_info *d3d_info) { - if (!needs_interpolation_qualifiers_for_shader_outputs(gl_info) - || !pixel_shader || pixel_shader->reg_maps.shader_version.major < 4) + if (!d3d_info->shader_output_interpolation || !pixel_shader + || pixel_shader->reg_maps.shader_version.major < 4) { memset(interpolation_args, 0, sizeof(pixel_shader->u.ps.interpolation_mode)); return; @@ -3525,7 +3525,6 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL]; const struct wined3d_d3d_info *d3d_info = context->d3d_info; - const struct wined3d_gl_info *gl_info = context->gl_info;
args->fog_src = state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE ? VS_FOG_COORD : VS_FOG_Z; @@ -3548,7 +3547,7 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3 args->flatshading = 0;
init_interpolation_compile_args(args->interpolation_mode, - args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, gl_info); + args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, d3d_info); }
static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2) @@ -3865,7 +3864,6 @@ void find_ds_compile_args(const struct wined3d_state *state, const struct wined3 const struct wined3d_shader *geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY]; const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL]; - const struct wined3d_gl_info *gl_info = context->gl_info;
args->tessellator_output_primitive = hull_shader->u.hs.tessellator_output_primitive; args->tessellator_partitioning = hull_shader->u.hs.tessellator_partitioning; @@ -3877,7 +3875,7 @@ void find_ds_compile_args(const struct wined3d_state *state, const struct wined3 args->render_offscreen = context->render_offscreen;
init_interpolation_compile_args(args->interpolation_mode, - args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, gl_info); + args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, context->d3d_info);
args->padding = 0; } @@ -3886,14 +3884,13 @@ void find_gs_compile_args(const struct wined3d_state *state, const struct wined3 struct gs_compile_args *args, const struct wined3d_context *context) { const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; - const struct wined3d_gl_info *gl_info = context->gl_info;
args->output_count = pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
if (!(args->primitive_type = shader->u.gs.input_type)) args->primitive_type = d3d_primitive_type_from_gl(state->gl_primitive_type);
- init_interpolation_compile_args(args->interpolation_mode, pixel_shader, gl_info); + init_interpolation_compile_args(args->interpolation_mode, pixel_shader, context->d3d_info); }
void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 782d91da772..52a59e0419c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -205,6 +205,7 @@ struct wined3d_d3d_info unsigned int vs_clipping : 1; unsigned int shader_color_key : 1; unsigned int shader_double_precision : 1; + unsigned int shader_output_interpolation : 1; unsigned int viewport_array_index_any_shader : 1; unsigned int texture_npot : 1; unsigned int texture_npot_conditional : 1; @@ -1298,9 +1299,10 @@ BOOL shader_get_stream_output_register_info(const struct wined3d_shader *shader,
typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *);
-#define WINED3D_SHADER_CAP_VS_CLIPPING 0x00000001 -#define WINED3D_SHADER_CAP_SRGB_WRITE 0x00000002 -#define WINED3D_SHADER_CAP_DOUBLE_PRECISION 0x00000004 +#define WINED3D_SHADER_CAP_VS_CLIPPING 0x00000001u +#define WINED3D_SHADER_CAP_SRGB_WRITE 0x00000002u +#define WINED3D_SHADER_CAP_DOUBLE_PRECISION 0x00000004u +#define WINED3D_SHADER_CAP_OUTPUT_INTERPOLATION 0x00000008u
struct shader_caps { @@ -4838,15 +4840,6 @@ static inline BOOL can_use_texture_swizzle(const struct wined3d_d3d_info *d3d_in return d3d_info->texture_swizzle && !is_complex_fixup(format->color_fixup) && !is_scaling_fixup(format->color_fixup); }
-static inline BOOL needs_interpolation_qualifiers_for_shader_outputs(const struct wined3d_gl_info *gl_info) -{ - /* In GLSL 4.40+ it is fine to specify interpolation qualifiers only in - * fragment shaders. In older GLSL versions interpolation qualifiers must - * match between shader stages. - */ - return gl_info->glsl_version < MAKEDWORD_VERSION(4, 40); -} - static inline BOOL is_rasterization_disabled(const struct wined3d_shader *geometry_shader) { return geometry_shader