From: Henri Verbeet <hverbeet(a)locutus.nl> --- dlls/wined3d/adapter_gl.c | 3 ++- dlls/wined3d/ffp_gl.c | 17 +++++++++++++++++ dlls/wined3d/sampler.c | 6 +++++- dlls/wined3d/texture_gl.c | 13 +++++++------ dlls/wined3d/wined3d_gl.h | 2 ++ 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 9d97ebda371..e33e27b4cc3 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -138,6 +138,7 @@ static const struct wined3d_extension_map gl_extension_map[] = {"GL_ARB_texture_env_combine", ARB_TEXTURE_ENV_COMBINE }, {"GL_ARB_texture_env_dot3", ARB_TEXTURE_ENV_DOT3 }, {"GL_ARB_texture_filter_anisotropic", ARB_TEXTURE_FILTER_ANISOTROPIC}, + {"GL_ARB_texture_filter_minmax", ARB_TEXTURE_FILTER_MINMAX }, {"GL_ARB_texture_float", ARB_TEXTURE_FLOAT }, {"GL_ARB_texture_gather", ARB_TEXTURE_GATHER }, {"GL_ARB_texture_mirrored_repeat", ARB_TEXTURE_MIRRORED_REPEAT }, @@ -4944,7 +4945,7 @@ static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_ d3d_info->viewport_array_index_any_shader = !!gl_info->supported[ARB_SHADER_VIEWPORT_LAYER_ARRAY]; d3d_info->stencil_export = !!gl_info->supported[ARB_SHADER_STENCIL_EXPORT]; d3d_info->simple_instancing = !!gl_info->supported[ARB_INSTANCED_ARRAYS]; - d3d_info->min_max_filtering = false; + d3d_info->min_max_filtering = !!gl_info->supported[ARB_TEXTURE_FILTER_MINMAX]; d3d_info->unconditional_npot = !!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]; d3d_info->draw_base_vertex_offset = !!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX]; d3d_info->vertex_bgra = !!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]; diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 04c6310013c..8bba21cb7f8 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -157,6 +157,23 @@ GLenum wined3d_gl_compare_func(enum wined3d_cmp_func f) } } +GLenum wined3d_gl_filter_reduction_mode(enum wined3d_filter_reduction_mode m) +{ + switch (m) + { + case WINED3D_FILTER_REDUCTION_WEIGHTED_AVERAGE: + case WINED3D_FILTER_REDUCTION_COMPARISON: + return GL_WEIGHTED_AVERAGE_ARB; + case WINED3D_FILTER_REDUCTION_MINIMUM: + return GL_MIN; + case WINED3D_FILTER_REDUCTION_MAXIMUM: + return GL_MAX; + default: + FIXME("Unhandled reduction mode %#x.\n", m); + return GL_WEIGHTED_AVERAGE_ARB; + } +} + static GLenum gl_blend_op(const struct wined3d_gl_info *gl_info, enum wined3d_blend_op op) { switch (op) diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c index 56b9ff2e642..2f269f06df5 100644 --- a/dlls/wined3d/sampler.c +++ b/dlls/wined3d/sampler.c @@ -87,6 +87,7 @@ static void wined3d_sampler_gl_cs_init(void *object) const struct wined3d_sampler_desc *desc; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; + GLenum reduction_mode; GLuint name; TRACE("sampler_gl %p.\n", sampler_gl); @@ -114,7 +115,10 @@ static void wined3d_sampler_gl_cs_init(void *object) GL_EXTCALL(glSamplerParameteri(name, GL_TEXTURE_MAX_ANISOTROPY, desc->max_anisotropy)); if (desc->reduction_mode == WINED3D_FILTER_REDUCTION_COMPARISON) GL_EXTCALL(glSamplerParameteri(name, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)); - else if (desc->reduction_mode != WINED3D_FILTER_REDUCTION_WEIGHTED_AVERAGE) + reduction_mode = wined3d_gl_filter_reduction_mode(desc->reduction_mode); + if (gl_info->supported[ARB_TEXTURE_FILTER_MINMAX]) + GL_EXTCALL(glSamplerParameteri(name, GL_TEXTURE_REDUCTION_MODE_ARB, reduction_mode)); + else if (reduction_mode != GL_WEIGHTED_AVERAGE_ARB) WARN("Sampler min/max reduction filtering is not supported.\n"); GL_EXTCALL(glSamplerParameteri(name, GL_TEXTURE_COMPARE_FUNC, wined3d_gl_compare_func(desc->comparison_func))); diff --git a/dlls/wined3d/texture_gl.c b/dlls/wined3d/texture_gl.c index 7a097f85f30..97e40d46601 100644 --- a/dlls/wined3d/texture_gl.c +++ b/dlls/wined3d/texture_gl.c @@ -2890,16 +2890,17 @@ void wined3d_texture_gl_apply_sampler_desc(struct wined3d_texture_gl *texture_gl if (!sampler_desc->reduction_mode != !gl_tex->sampler_desc.reduction_mode) { + GLenum reduction_mode = wined3d_gl_filter_reduction_mode(sampler_desc->reduction_mode); + if (sampler_desc->reduction_mode == WINED3D_FILTER_REDUCTION_COMPARISON) - { gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); - } else - { gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE); - if (sampler_desc->reduction_mode != WINED3D_FILTER_REDUCTION_WEIGHTED_AVERAGE) - WARN("Sampler min/max reduction filtering is not supported.\n"); - } + + if (gl_info->supported[ARB_TEXTURE_FILTER_MINMAX]) + gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_REDUCTION_MODE_ARB, reduction_mode); + else if (reduction_mode != GL_WEIGHTED_AVERAGE_ARB) + WARN("Sampler min/max reduction filtering is not supported.\n"); gl_tex->sampler_desc.reduction_mode = sampler_desc->reduction_mode; } diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index ed537686007..0cb36eadafe 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -131,6 +131,7 @@ enum wined3d_gl_extension ARB_TEXTURE_ENV_COMBINE, ARB_TEXTURE_ENV_DOT3, ARB_TEXTURE_FILTER_ANISOTROPIC, + ARB_TEXTURE_FILTER_MINMAX, ARB_TEXTURE_FLOAT, ARB_TEXTURE_GATHER, ARB_TEXTURE_MIRRORED_REPEAT, @@ -404,6 +405,7 @@ static inline GLenum wined3d_gl_min_mip_filter(enum wined3d_texture_filter_type } GLenum wined3d_gl_compare_func(enum wined3d_cmp_func f); +GLenum wined3d_gl_filter_reduction_mode(enum wined3d_filter_reduction_mode m); const char *debug_fboattachment(GLenum attachment); const char *debug_fbostatus(GLenum status); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9683