gallivm: get correct min/max behaviour for kernels.

NaN handling for CL is harsher than GLSL

Fixes piglit min/max CL tests

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7309>
This commit is contained in:
Dave Airlie 2020-10-09 10:27:00 +10:00
parent 9845c1636c
commit b8a9bd9b93
2 changed files with 6 additions and 33 deletions

View file

@ -53,37 +53,9 @@ program/execute/atomic_int64_xor-global-return: skip
program/execute/atomic_int64_xor-local: skip
program/execute/builtin/builtin-char-popcount-1.2.generated: skip
program/execute/builtin/builtin-float-cos-1.0.generated: timeout
program/execute/builtin/builtin-float-fmax-1.0.generated/fmax float1: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/fmax float16: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/fmax float2: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/fmax float4: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/fmax float8: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/tss_fmax float16: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/tss_fmax float2: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/tss_fmax float4: fail
program/execute/builtin/builtin-float-fmax-1.0.generated/tss_fmax float8: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/fmin float1: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/fmin float16: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/fmin float2: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/fmin float4: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/fmin float8: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/tss_fmin float16: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/tss_fmin float2: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/tss_fmin float4: fail
program/execute/builtin/builtin-float-fmin-1.0.generated/tss_fmin float8: fail
program/execute/builtin/builtin-float-isfinite-1.0.generated: crash
program/execute/builtin/builtin-float-isnormal-1.0.generated: crash
program/execute/builtin/builtin-float-ldexp-1.0.generated: fail
program/execute/builtin/builtin-float-maxmag-1.1.generated/maxmag float1: fail
program/execute/builtin/builtin-float-maxmag-1.1.generated/maxmag float16: fail
program/execute/builtin/builtin-float-maxmag-1.1.generated/maxmag float2: fail
program/execute/builtin/builtin-float-maxmag-1.1.generated/maxmag float4: fail
program/execute/builtin/builtin-float-maxmag-1.1.generated/maxmag float8: fail
program/execute/builtin/builtin-float-minmag-1.1.generated/minmag float1: fail
program/execute/builtin/builtin-float-minmag-1.1.generated/minmag float16: fail
program/execute/builtin/builtin-float-minmag-1.1.generated/minmag float2: fail
program/execute/builtin/builtin-float-minmag-1.1.generated/minmag float4: fail
program/execute/builtin/builtin-float-minmag-1.1.generated/minmag float8: fail
program/execute/builtin/builtin-float-mix-1.0.generated: crash
program/execute/builtin/builtin-float-sin-1.0.generated: timeout
program/execute/builtin/builtin-float-sincos-1.0.generated: timeout
@ -126,8 +98,8 @@ program/execute/vstore/vstore-half-private: skip
summary:
name: results
---- --------
pass: 3737
fail: 42
pass: 3766
fail: 14
crash: 6
skip: 73
timeout: 4
@ -138,4 +110,4 @@ summary:
changes: 0
fixes: 0
regressions: 0
total: 3862
total: 3863

View file

@ -516,6 +516,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
LLVMValueRef result;
enum gallivm_nan_behavior minmax_nan = bld_base->shader->info.stage == MESA_SHADER_KERNEL ? GALLIVM_NAN_RETURN_OTHER : GALLIVM_NAN_BEHAVIOR_UNDEFINED;
switch (op) {
case nir_op_b2f32:
result = emit_b2f(bld_base, src[0], 32);
@ -652,7 +653,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
result = fcmp32(bld_base, PIPE_FUNC_LESS, src_bit_size[0], src);
break;
case nir_op_fmin:
result = lp_build_min(get_flt_bld(bld_base, src_bit_size[0]), src[0], src[1]);
result = lp_build_min_ext(get_flt_bld(bld_base, src_bit_size[0]), src[0], src[1], minmax_nan);
break;
case nir_op_fmod: {
struct lp_build_context *flt_bld = get_flt_bld(bld_base, src_bit_size[0]);
@ -667,7 +668,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
src[0], src[1]);
break;
case nir_op_fmax:
result = lp_build_max(get_flt_bld(bld_base, src_bit_size[0]), src[0], src[1]);
result = lp_build_max_ext(get_flt_bld(bld_base, src_bit_size[0]), src[0], src[1], minmax_nan);
break;
case nir_op_fneu32:
result = fcmp32(bld_base, PIPE_FUNC_NOTEQUAL, src_bit_size[0], src);