diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 1d4abd0fe42..50f50029067 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -1916,6 +1916,10 @@ optimizations.extend([ (('f2u', ('ftrunc', 'a(is_not_negative)')), ('f2u', a)), (('f2i', ('ffloor', 'a(is_not_negative)')), ('f2i', a)), (('f2u', ('ffloor', a)), ('f2u', a)), + (('f2u(contract)', ('fadd', 'a(is_integral_not_negative)', 'b(is_a_number_gt_0_and_lt_1)')), ('f2u', a)), + (('f2i(contract)', ('fadd', 'a(is_integral_not_negative)', 'b(is_a_number_gt_0_and_lt_1)')), ('f2i', a)), + (('f2u32', ('u2f32', 'a@16')), ('u2u32', a)), + (('f2i32', ('u2f32', 'a@16')), ('u2u32', a)), # Section 3.3.11 (Conversion Instructions) of the SPIR-V 1.6 spec says: # @@ -1973,8 +1977,13 @@ optimizations.extend([ (('ftrunc', 'a(is_integral)'), a), (('fround_even', 'a(is_integral)'), a), + (('ffract(nnan,contract)', ('fadd', a, 'b(is_integral)')), ('ffract', a)), + (('ffloor(nsz,contract)', ('fadd', 'a(is_a_number_gt_0_and_lt_1)', 'b(is_integral)')), b), + (('ftrunc(nsz,contract)', ('fadd', 'a(is_a_number_gt_0_and_lt_1)', 'b(is_integral_not_negative)')), b), + # fract(x) = x - floor(x), so fract(NaN/Inf) = NaN (('ffract(nnan)', 'a(is_integral)'), 0.0), + (('ffract', 'a(is_a_number_gt_0_and_lt_1)'), a), (('ffract', ('ffract', a)), ('ffract', a)), (('fabs(nsz)', 'a(is_not_negative)'), ('fcanonicalize', a)), (('fabs', 'a(is_not_negative_or_negative_zero)'), ('fcanonicalize', a)), diff --git a/src/compiler/nir/nir_search_helpers.h b/src/compiler/nir/nir_search_helpers.h index 2b1cc9f6f41..010eb9900d9 100644 --- a/src/compiler/nir/nir_search_helpers.h +++ b/src/compiler/nir/nir_search_helpers.h @@ -921,6 +921,7 @@ RELATION(a_number, FP_CLASS_NAN) RELATION(finite, FP_CLASS_ANY_INF | FP_CLASS_NAN) RELATION(finite_not_zero, FP_CLASS_ANY_INF | FP_CLASS_NAN | FP_CLASS_ANY_ZERO) RELATION(integral, FP_CLASS_NON_INTEGRAL) +RELATION(integral_not_negative, FP_CLASS_ANY_NEG | FP_CLASS_NON_INTEGRAL) static inline bool compare_component(const nir_alu_instr *instr, unsigned src, unsigned component, diff --git a/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt b/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt index 27e2d8feb7a..77ac1cffca8 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gl-fails.txt @@ -224,3 +224,33 @@ dEQP-GLES3.functional.transform_feedback.random.separate.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.4,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.1,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.struct.uniform.not_equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.basic_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.for_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.if_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.scope_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_2_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_if_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail diff --git a/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt b/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt index 5fc9f2d6e2c..f8993cfac95 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gl-skips.txt @@ -14,3 +14,7 @@ dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays. dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.22 KHR-GL.*.texture_swizzle.smoke + +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment diff --git a/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt b/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt index 5826d97ca65..64d19d6721e 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gles-fails.txt @@ -220,3 +220,33 @@ dEQP-GLES3.functional.transform_feedback.random.separate.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.4,Crash dEQP-GLES3.functional.transform_feedback.random.separate.triangles.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.1,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.struct.uniform.not_equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.basic_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.for_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.if_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.scope_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_2_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.conditional_fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.const_expr_in_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_default_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.fall_through_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_if_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail diff --git a/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt b/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt index d0782cc02b1..bc146d61eeb 100644 --- a/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt +++ b/src/gallium/drivers/virgl/ci/virgl-gles-skips.txt @@ -10,3 +10,7 @@ dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays. # Sometimes crashes, e.g. https://gitlab.freedesktop.org/kusma/mesa/-/jobs/4109419 dEQP-GLES31.functional.compute.basic.empty + +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt index c83822ead15..1a658979b6c 100644 --- a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt +++ b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt @@ -609,3 +609,14 @@ dEQP-GLES3.functional.transform_feedback.random_full_array_capture.interleaved.p dEQP-GLES3.functional.transform_feedback.random_full_array_capture.interleaved.triangles.1,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.lines.6,Crash dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.triangles.4,Crash + +# !41455 +dEQP-GLES3.functional.shaders.struct.uniform.equal_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_label_dynamic_fragment,Fail +dEQP-GLES3.functional.shaders.switch.default_not_last_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.do_while_loop_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.no_default_label_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_do_while_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.switch_in_switch_dynamic_vertex,Fail +dEQP-GLES3.functional.shaders.switch.while_loop_in_switch_dynamic_vertex,Fail \ No newline at end of file diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt b/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt index 7b63e6b5af1..bb3ccc89de4 100644 --- a/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt +++ b/src/gallium/drivers/virgl/ci/virpipe-gl-skips.txt @@ -22,3 +22,6 @@ spec@ext_framebuffer_object@fbo-blending-formats # uprev Piglit in Mesa spec@egl_ext_protected_content@conformance +# !41455 +dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment +dEQP-GLES2.functional.shaders.struct.uniform.not_equal_fragment