summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/panfrost/ci/gitlab-ci.yml
blob: 956ad89e820d5bfc1924da641c45ff88d3873055 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# DEBIAN_TAG is the tag of the docker image used for the build jobs. If the
# image doesn't exist yet, the docker-image stage generates it.
#
# In order to generate a new image, one should generally change the tag.
# While removing the image from the registry would also work, that's not
# recommended except for ephemeral images during development: Replacing an
# image after a significant amount of time might pull in newer versions of
# gcc/clang or other packages, which might break the build with older commits
# using the same tag.
#
# After merging a change resulting in generating a new image to the main
# repository, it's recommended to remove the image from the source repository's
# container registry, so that the image from the main repository's registry
# will be used there as well.  You can manage your images on your fork of:
# https://gitlab.freedesktop.org/xorg/xserver/container_registry
variables:
  UPSTREAM_REPO: mesa/mesa
  DEBIAN_VERSION: testing-slim
  DEBIAN_TAG: "2019-06-07-1"

include:
  - project: 'wayland/ci-templates'
    ref: c73dae8b84697ef18e2dbbf4fed7386d9652b0cd
    file: '/templates/debian.yml'

stages:
  - containers
  - build
  - test

# Retry jobs after runner system failures
.retry: &retry
  retry:
    max: 2
    when:
      - runner_system_failure

# Build Docker image with deqp, the rootfs and the build deps for Mesa
.container:
  extends: .debian@container-ifnot-exists
  stage: containers
  <<: *retry
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
    IMAGE_LOCAL: "$CI_REGISTRY/$CI_PROJECT_PATH/${DEBIAN_ARCH}:latest"
    DEBIAN_EXEC: 'DEBIAN_ARCH=${DEBIAN_ARCH}
                  GCC_ARCH=${GCC_ARCH}
                  KERNEL_ARCH=${KERNEL_ARCH}
                  DEFCONFIG=${DEFCONFIG}
                  DEVICE_TREES=${DEVICE_TREES}
                  KERNEL_IMAGE_NAME=${KERNEL_IMAGE_NAME}
                  bash src/gallium/drivers/panfrost/ci/debian-install.sh'

container:armhf:
  extends: .container
  variables:
    DEBIAN_ARCH: "armhf"
    GCC_ARCH: "arm-linux-gnueabihf"
    KERNEL_ARCH: "arm"
    DEFCONFIG: "arch/arm/configs/multi_v7_defconfig"
    DEVICE_TREES: "arch/arm/boot/dts/rk3288-veyron-jaq.dtb"
    KERNEL_IMAGE_NAME: "zImage"

container:arm64:
  extends: .container
  variables:
    DEBIAN_ARCH: "arm64"
    GCC_ARCH: "aarch64-linux-gnu"
    KERNEL_ARCH: "arm64"
    DEFCONFIG: "arch/arm64/configs/defconfig"
    DEVICE_TREES: "arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dtb"
    KERNEL_IMAGE_NAME: "Image"

.build:
  stage: build
  image: $CI_REGISTRY/$CI_PROJECT_PATH/${DEBIAN_ARCH}:latest
  cache:
    paths:
      - ccache
  before_script:
    - mkdir -p results mesa-build
    - mkdir -p ccache
  script:
    - export CCACHE_BASEDIR=$CI_PROJECT_DIR
    - export CCACHE_DIR=$CI_PROJECT_DIR/ccache
    - export PATH="/usr/lib/ccache:$PATH"
    - ccache -s

    # Build Mesa
    - /usr/share/meson/debcrossgen --arch ${DEBIAN_ARCH} -o /tmp/cross_file.txt
    - meson . mesa-build
        --cross-file /tmp/cross_file.txt
        --libdir /artifacts/rootfs/mesa/lib/
        --buildtype release
        -Dgallium-drivers=kmsro,panfrost
        -Ddri-drivers=
        -Dprefix=/artifacts/rootfs/mesa
    - ninja -C mesa-build install
    - du -sh /artifacts/rootfs/mesa/*
    - rm -rf /artifacts/rootfs/mesa/include

    # Pack rootfs
    - cp src/gallium/drivers/panfrost/ci/deqp-runner.sh /artifacts/rootfs/deqp/.
    - du -sh /artifacts/rootfs/deqp/*
    - find /artifacts/rootfs/ -type f -printf "%s\t%p\n" | sort -n
    - cd /artifacts/rootfs/ ; find -H  |  cpio -H newc -v -o | gzip -c - > $CI_PROJECT_DIR/results/panfrost-rootfs-${DEBIAN_ARCH}.cpio.gz

    # Copy kernel and DT
    - cp /artifacts/${KERNEL_IMAGE_NAME} /artifacts/*.dtb $CI_PROJECT_DIR/results/.

    # Generate LAVA job
    - cd $CI_PROJECT_DIR
    - src/gallium/drivers/panfrost/ci/generate_lava.py
        --template src/gallium/drivers/panfrost/ci/lava-deqp.yml.jinja2
        --arch ${DEBIAN_ARCH}
        --base-artifacts-url $CI_PROJECT_URL/-/jobs/$CI_JOB_ID/artifacts/raw/results
        --device-type ${DEVICE_TYPE}
        --kernel-image-name ${KERNEL_IMAGE_NAME}
        > results/lava-deqp.yml
    - cp src/gallium/drivers/panfrost/ci/expected-failures.txt results/.
  artifacts:
    when: always
    paths:
      - results/

build:armhf:
  extends: .build
  variables:
    DEBIAN_ARCH: "armhf"
    GCC_ARCH: "arm-linux-gnueabihf"
    DEVICE_TYPE: "rk3288-veyron-jaq"
    KERNEL_IMAGE_NAME: "zImage"

build:arm64:
  extends: .build
  variables:
    DEBIAN_ARCH: "arm64"
    GCC_ARCH: "aarch64-linux-gnu"
    DEVICE_TYPE: "rk3399-gru-kevin"
    KERNEL_IMAGE_NAME: "Image"

.test:
  stage: test
  tags:
    - idle-jobs
  image: $CI_REGISTRY/$CI_PROJECT_PATH/arm64:latest  # Any of the images will be fine
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for submitting the job
  script:
    - mkdir -p ~/.config/
    - |
      echo "default:
        uri: https://lava.collabora.co.uk/RPC2
        timeout: 120
        username: jenkins-fdo
        token: $LAVA_TOKEN
      " > ~/.config/lavacli.yaml
    - lava_job_id=`lavacli jobs submit $CI_PROJECT_DIR/results/lava-deqp.yml` || echo $lava_job_id
    - lavacli jobs logs $lava_job_id | grep -a -v "{'case':" | tee results/lava-deqp-$lava_job_id.log
    - lavacli jobs show $lava_job_id
    - curl "https://lava.collabora.co.uk/results/$lava_job_id/csv?user=jenkins-fdo&token=$LAVA_TOKEN" > raw_results.csv
    - cat raw_results.csv | csvcut -c 12,3 | grep dEQP-GLES2 | sort > results/results-$lava_job_id.csv

    # FIXME: Remove flip-flops from comparison files
    - |
      FLIP_FLOPS="
        dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_neg_x_neg_z_and_pos_x_pos_z_and_neg_x_neg_y_pos_z
        dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_pos_y_pos_z_and_neg_x_neg_y_pos_z_and_pos_x_pos_y_neg_z
        dEQP-GLES2.functional.fbo.render.color.blend_rbo_rgb5_a1
        dEQP-GLES2.functional.fbo.render.color.blend_rbo_rgb5_a1_depth_component16
        dEQP-GLES2.functional.fbo.render.color.blend_rbo_rgba4
        dEQP-GLES2.functional.fbo.render.color.blend_rbo_rgba4_depth_component16
        dEQP-GLES2.functional.fbo.render.color.blend_npot_rbo_rgb5_a1
        dEQP-GLES2.functional.fbo.render.color.blend_npot_rbo_rgb5_a1_depth_component16
        dEQP-GLES2.functional.fbo.render.color.blend_npot_rbo_rgba4
        dEQP-GLES2.functional.fbo.render.color.blend_npot_rbo_rgba4_depth_component16
        dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1
        dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1_depth_component16
        dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1_stencil_index8
        dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgba4_depth_component16
        dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgba4_stencil_index8
        dEQP-GLES2.functional.fbo.render.recreate_depthbuffer.
        dEQP-GLES2.functional.fbo.render.recreate_stencilbuffer.
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer_clear.rbo_rgb5_a1
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer_clear.rbo_rgba4
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer_clear.tex2d_rgb
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer_clear.tex2d_rgba
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer.rbo_rgb5_a1
        dEQP-GLES2.functional.fbo.render.shared_colorbuffer.rbo_rgba4
        dEQP-GLES2.functional.fbo.render.shared_depthbuffer.rbo_rgb5_a1_depth_component16
        dEQP-GLES2.functional.fbo.render.shared_depthbuffer.rbo_rgba4_depth_component16
        dEQP-GLES2.functional.fbo.render.stencil_clear.rbo_rgb5_a1_stencil_index8
        dEQP-GLES2.functional.fbo.render.stencil.npot_rbo_rgb5_a1_stencil_index8
        dEQP-GLES2.functional.fbo.render.stencil.npot_rbo_rgba4_stencil_index8
        dEQP-GLES2.functional.fbo.render.stencil.rbo_rgb5_a1_stencil_index8
        dEQP-GLES2.functional.fbo.render.stencil.rbo_rgba4_stencil_index8
        dEQP-GLES2.functional.lifetime.attach.deleted_input.renderbuffer_framebuffer
        dEQP-GLES2.functional.lifetime.attach.deleted_output.renderbuffer_framebuffer
        dEQP-GLES2.functional.polygon_offset.fixed16_factor_0_slope
        dEQP-GLES2.functional.polygon_offset.fixed16_factor_1_slope
        dEQP-GLES2.functional.shaders.invariance.highp.loop_4
        dEQP-GLES2.functional.shaders.matrix.mul.dynamic_highp_mat4_vec4_vertex
        dEQP-GLES2.functional.shaders.matrix.mul.dynamic_highp_vec4_mat4_fragment
        dEQP-GLES2.functional.shaders.operator.common_functions.smoothstep.mediump_vec3_vertex
        dEQP-GLES2.functional.shaders.random.all_features.fragment.12
        dEQP-GLES2.functional.shaders.random.all_features.fragment.37
        dEQP-GLES2.functional.texture.units.2_units.mixed.1
        dEQP-GLES2.functional.texture.units.2_units.mixed.3
        dEQP-GLES2.functional.texture.units.2_units.only_2d.2
        dEQP-GLES2.functional.texture.units.4_units.mixed.5
        dEQP-GLES2.functional.texture.units.4_units.only_2d.0
        dEQP-GLES2.functional.texture.units.8_units.only_cube.2
        dEQP-GLES2.functional.texture.units.all_units.mixed.6
        dEQP-GLES2.functional.texture.units.all_units.only_cube.4
        dEQP-GLES2.functional.texture.units.all_units.only_cube.7
        dEQP-GLES2.functional.texture.units.all_units.only_cube.8
        "

    # FIXME: These tests fail in RK3288 but pass on RK3399
    - |
      FLIP_FLOPS="$FLIP_FLOPS
        dEQP-GLES2.functional.fragment_ops.blend.*
        dEQP-GLES2.functional.shaders.builtin_variable.max_draw_buffers_vertex
        dEQP-GLES2.functional.shaders.matrix.div.const_lowp_mat2_mat2_vertex
        dEQP-GLES2.functional.shaders.operator.unary_operator.pre_increment_effect.highp_ivec4_vertex
        dEQP-GLES2.functional.shaders.texture_functions.vertex.texture2dprojlod_vec3
        "

    - for test in $FLIP_FLOPS; do sed -i "/$test/d" results/expected-failures.txt results/results-$lava_job_id.csv; done

    - PASSED=$(grep pass$ results/results-$lava_job_id.csv | wc -l)
    - FAILED=$(grep fail$ results/results-$lava_job_id.csv | wc -l)
    - TOTAL=$(wc -l < results/results-$lava_job_id.csv)
    - 'echo "Passed: $PASSED ($(expr $PASSED \* 100 / $TOTAL)%)"'
    - 'echo "Failed: $FAILED ($(expr $FAILED \* 100 / $TOTAL)%)"'
    - 'echo "Total: $TOTAL"'
    - 'if [ $TOTAL != 16374 ]; then echo "WARNING: Unexpected count of results. Incomplete run?"; fi'

    - sed '/,pass/d' results/results-$lava_job_id.csv | sed 's/,fail//' > results/failures-$lava_job_id.txt
    - diff -u results/expected-failures.txt results/failures-$lava_job_id.txt
  artifacts:
    when: always
    paths:
      - results/

test:armhf:
  extends: .test
  dependencies:
    - build:armhf

test:arm64:
  extends: .test
  dependencies:
    - build:arm64