7 3. [How to run tests](#3-how-to-run-tests)
8 4. [Available test sets](#4-available-test-sets)
9 5. [How to write tests](#5-how-to-write-tests)
10 6. [Integration](#6-integration)
15 Piglit is a collection of automated tests for OpenGL, Vulkan, and OpenCL
18 The goal of Piglit is to help improve the quality of open source
19 OpenGL, Vulkan, and OpenCL drivers by providing developers with a simple
20 means to perform regression tests.
22 The original tests have been taken from
23 - Glean ( http://glean.sf.net/ ) and
24 - Mesa ( http://www.mesa3d.org/ )
29 First of all, you need to make sure that the following are installed:
33 - numpy (http://www.numpy.org)
34 - cmake (http://www.cmake.org)
35 - GL, glu and glut libraries and development packages (i.e. headers)
36 - waffle (http://waffle.freedesktop.org/)
38 Optionally, you can install the following:
40 - X11 libraries and development packages (i.e. headers)
41 - ninja. For a faster build.
42 - lxml. An accelerated python xml library using libxml2 (http://lxml.de/)
43 - jsonstreams. A JSON stream writer for python.
44 (https://jsonstreams.readthedocs.io/en/stable/)
45 - VkRunner. A shader script testing tool for Vulkan.
46 (https://gitlab.freedesktop.org/mesa/vkrunner/)
48 For testing the python framework using `py.test unittests/framework`
49 - py.test. A python test framework, used for running the python framework
51 - tox. A tool for testing python packages against multiple configurations of
52 python (https://tox.readthedocs.org/en/latest/index.html)
53 - psutil. A portable process library for python
54 - jsonschema. A JSON validator library for python
55 - pytest-mock. A mock plugin for pytest
56 - pytest-pythonpath. A plugin for pytest to do automagic with sys.path
57 - pytest-raises. A plugin for pytest that allows decorating tests that expect
59 - pytest-warnings. A plugin for pytest that handles python warnings
60 - pytest-timeout. A plugin for pytest to timeout tests.
62 Now configure the build system:
66 This will start cmake's configuration tool, just follow the onscreen
67 instructions. The default settings should be fine, but I recommend you:
68 - Press 'c' once (this will also check for dependencies) and then
69 - Set `CMAKE_BUILD_TYPE` to `Debug` Now you can press 'c' again and then 'g' to generate the build system.
75 ### 2.1 Cross Compiling
77 On Linux, if cross-compiling a 32-bit build on a 64-bit host, first make sure
78 you didn't have CMakeCache.txt file left from 64-bit build (it would retain old
79 flags), then you must invoke cmake with options
80 `-DCMAKE_SYSTEM_PROCESSOR=x86 -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32`.
85 Install development packages.
87 $ sudo apt-get install cmake g++ mesa-common-dev libgl1-mesa-dev python3-numpy python3-mako freeglut3-dev x11proto-gl-dev libxrender-dev libwaffle-dev libudev-dev
98 http://cmake.org/cmake/resources/software.html
99 Download and install 'Mac OSX Universal' platform.
102 http://developer.apple.com/xcode
112 Install development packages.
131 http://www.python.org/download
134 http://cmake.org/cmake/resources/software.html
135 Download and install 'Windows' platform.
137 Download and install Ninja
138 https://github.com/ninja-build/ninja/releases
141 https://mingw-w64.org/
143 Download OpenGL Core API and Extension Header Files.
144 https://github.com/KhronosGroup/OpenGL-Registry
145 Pass `-DGLEXT_INCLUDE_DIR=/path/to/headers`
158 Download freeglut for Mingw.
159 http://www.transmissionzero.co.uk/software/freeglut-devel/
161 cmake -H. -Bbuild -G "Ninja" -DGLEXT_INCLUDE_DIR=\path\to\glext -DGLUT_INCLUDE_DIR=\path\to\freeglut\include -DGLUT_glut_LIBRARY=\path\to\freeglut\lib\x64\libfreeglut.a -DGLEXT_INCLUDE_DIR=\path\to\glext
167 Download and build waffle for MinGW.
168 https://gitlab.freedesktop.org/mesa/waffle
170 Open the Command Prompt.
171 CD to piglit directory.
173 cmake -H. -Bbuild -G "Ninja" -DGLEXT_INCLUDE_DIR=\path\to\glext -DPIGLIT_USE_WAFFLE=TRUE -DWaffle_INCLUDE_DIRS=\path\to\waffle\include\waffle -DWaffle_LDFLAGS=\path\to\waffle\lib\libwaffle-1.dll.a
176 ## 3. How to run tests
178 Make sure that everything is set up correctly:
180 $ ./piglit run sanity results/sanity
182 You may include '.py' on the profile, or you may exclude it (sanity vs sanity.py),
183 both are equally valid.
185 You may also preface test profiles with tests/ (or any other path you like),
186 which may be useful for shell tab completion.
188 You may provide multiple profiles to be run at the same time:
190 $ ./piglit run quick_cl gpu deqp_gles3 results/gl-cl-combined
200 To learn more about the command's syntax.
202 Have a look into the tests/ directory to see what test profiles are available:
208 To create some nice formatted test summaries, run
210 $ ./piglit summary html summary/sanity results/sanity
212 Hint: You can combine multiple test results into a single summary.
213 During development, you can use this to watch for regressions:
215 $ ./piglit summary html summary/compare results/baseline results/current
217 You can combine as many testruns as you want this way (in theory;
218 the HTML layout becomes awkward when the number of testruns increases)
220 Have a look at the results with a browser:
222 $ xdg-open summary/sanity/index.html
224 The summary shows the 'status' of a test:
226 - **pass:** This test has completed successfully.
227 - **warn:** The test completed successfully, but something unexpected happened.
228 Look at the details for more information.
229 - **fail:** The test failed.
230 - **crash:** The test binary exited with a non-zero exit code.
231 - **skip:** The test was skipped.
232 - **timeout:** The test ran longer than its allotted time and was forcibly killed.
235 There are also dmesg-* statuses. These have the same meaning as above, but are
236 triggered by dmesg related messages.
239 ### 3.1 Environment Variables
241 There are a number of environment variables that control the way piglit
244 - `PIGLIT_COMPRESSION`
246 Overrides the compression method used. The same values that piglit.conf
247 allows for core:compression.
251 Overrides the platform run on. These allow the same values as `piglit run -p`.
252 This values is honored by the tests themselves, and can be used when running
255 - `PIGLIT_FORCE_GLSLPARSER_DESKTOP`
257 Force glslparser tests to be run with the desktop (non-gles) version of
258 glslparsertest. This can be used to test ESX_compatability extensions
261 - `PIGLIT_NO_FAST_SKIP`
263 Piglit has a mechanism run in the python layer for skipping tests with
264 unmet OpenGL or window system dependencies without starting a new
265 process (which is expensive). Sometimes this system doesn't work or is
266 undesirable, setting this environment variable to True will disable this
269 - `PIGLIT_NO_TIMEOUT`
271 When this variable is true in python then any timeouts given by tests
272 will be ignored, and they will run until completion or they are killed.
274 - `PIGLIT_VKRUNNER_BINARY`
276 Can be used to override the path to the vkrunner executable for
277 running Vulkan shader tests. Alternatively the config option
278 vkrunner:bin can be used instead. If neither are set then vkrunner
279 will be searched for in the search path.
283 Used to define the directory with the tests and their executable files.
284 If the project is built out of source, this variable must be set for
285 piglit to run successfully.
290 The way `piglit run` and `piglit summary` count tests are different,
291 `piglit run` counts the number of Test derived instance in the profile(s)
292 selected, while `piglit summary` counts the number of subtests a result
293 contains, or it's result if there are no subtests. This means that the number
294 shown by `piglit run` will be less than or equal to the number calculated by
298 ### 3.3 Shell Completions
300 Piglit has completions for bash, located in completions/bash/piglit. Once this
301 file is sourced into bash `piglit` and `./piglit` will have tab completion
302 available. For global availability place the file somewhere that bash will
303 source the file on startup. If piglit is installed and bash-completions are
304 available, then this completion file will be installed system-wide.
307 ## 4. Available test sets
309 Test sets are specified as Python scripts in the tests directory.
310 The following test sets are currently available:
315 - **sanity.py** This suite contains minimal OpenGL sanity tests. These tests
316 must pass, otherwise the other tests will not generate reliable results.
317 - **all.py** This suite contains all OpenGL tests.
318 - **quick.py** Run all tests, but cut down significantly on their runtime
319 (and thus on the number of problems they can find).
320 - **gpu.py** A further reduced set of tests from quick.py, this runs tests
321 only for hardware functionality and not tests for the software stack.
322 - **llvmpipe.py** A reduced set of tests from gpu.py removing tests that are
323 problematic using llvmpipe
324 - **cpu.py** This profile runs tests that don't touch the gpu, in other words
325 all of the tests in quick.py that are not run by gpu.py
326 - **glslparser.py** A subset of all.py which runs only glslparser tests
327 - **shader.py** A subset of all.py which runs only shader tests
328 - **no_error.py** A modified version of the test list run as khr_no_error
334 - **cl.py** This suite contains all OpenCL tests.
335 - **quick_cl.py** This runs all of the tests from cl.py as well as tests from
336 opencv and oclconform.
341 - **vulkan.py** This suite contains all Vulkan tests. Note that
342 currently all of the Vulkan tests require VkRunner. If it is not
343 installed then all of the tests will be skipped.
348 - **replay.py** This profile allows running
349 [replayer.py](replayer/replayer.py) tests from a traces
350 description file. Check its [README](replayer/README.md) for
351 further information about the format of the description files and
352 running dependencies.
354 ### 4.5 External Integration
356 - **xts.py** Support for running the X Test Suite using piglit.
357 - **igt.py** Support for running Intel-gpu-tools test suite using piglit.
358 - **deqp_egl.py** Support for running dEQP's EGL profile with piglit.
359 - **deqp_gles2.py** Support for running dEQP's gles2 profile with piglit.
360 - **deqp_gles3.py** Support for running dEQP's gles3 profile with piglit.
361 - **deqp_gles31.py** Support for running dEQP's gles3.1 profile with piglit.
362 - **deqp_vk.py** Support for running the official Khronos Vulkan CTS profile
364 - **khr_gl.py** Support for running the open source Khronos OpenGL CTS tests
366 - **khr_gl45.py** Support for running the open source Khronos OpenGL 4.5 CTS
368 - **cts_gl.py** Support for running the closed source Khronos OpenGL CTS
370 - **cts_gl45.py** Support for running the closed source Khronos OpenGL 4.5
371 CTS tests with piglit.
372 - **cts_gles.py** Support for running the closed source Khronos GLES CTS
374 - **oglconform.py** Support for running sub-test of the Intel oglconform test
378 ## 5. How to write tests
380 Every test is run as a separate process. This minimizes the impact that
381 severe bugs like memory corruption have on the testing process.
383 Therefore, tests can be implemented in an arbitrary standalone language.
384 C is the preferred language for compiled tests, piglit also supports its own
385 simple formats for test shaders and glsl parser input.
387 All new tests must be added to the appropriate profile, all.py profile for
388 OpenGL and cl.py for OpenCL. There are a few basic test classes supported by the
392 A shared base class for all native piglit tests.
394 It starts each test as a subprocess, captures stdout and stderr, and waits
395 for the test to return.
397 It provides test timeouts by setting the instances 'timeout' attribute to an
398 integer > 0 which is the number of seconds the test should run.
400 It interprets output by reading stdout and looking for 'PIGLIT: ' in the
401 output, and then reading any trailing characters as well formed json
402 returning the test result.
404 This is a base class and should not be used directly, but provides an
405 explanation of the behavior of the following classes.
408 A test class for native piglit OpenGL tests.
410 In addition to the properties of PiglitBaseTest it provides a mechanism for
411 detecting test window resizes and rerunning tests as well as keyword
412 arguments for platform requirements.
415 A test class for native piglit OpenCL tests.
417 It currently provides no special features.
420 A class for testing a glsl parser.
422 It is generally unnecessary to call this class directly as it uses a helper
423 function to search directories for tests.
426 A class for testing using OpenGL shaders.
428 It is generally unnecessary to call this class directly as it uses a helper
429 function to search directories for tests.
433 See the [HACKING](HACKING) file.
437 Piglit provides integration for other test suites as well. The rational for
438 this is that it provides piglit's one process per test protections (one test
439 crashing does not crash the whole suite), and access to piglit's reporting
442 Most integration is done through the use of piglit.conf, or through environment
443 variables, with `piglit.conf` being the preferred method.
448 Piglit provides a generic layer for dEQP based test suites, and specific
449 integration for several suites.
451 Use the upstream dEQP repo (maintained by Khronos members), which
452 contains the official conformance tests (CTS):
453 https://github.com/KhronosGroup/VK-GL-CTS
455 Once dEQP is built add the following information to piglit.conf, which can
456 either be located in the root of the piglit repo, or in `$XDG_CONFIG_HOME`
457 (usually `$HOME/.config`).
460 bin=<deqp source dir>/modules/gles2/deqp-gles2
463 bin=<deqp source dir>/modules/gles3/deqp-gles3
466 bin=<deqp source dir>/modules/gles31/deqp-gles31
468 These platforms can be run using deqp_gles*.py as a suite in piglit.
471 ./piglit run deqp_gles31 my_results -c
473 It is also possible to mix integrated suites and piglit profiles together:
475 ./piglit run deqp_gles31 quick cl my_results
477 dEQP profiles generally contain all of the tests from the previous profile, so
478 gles31 covers gles3 and gles2.
483 Add the following to your piglit.conf file:
486 bin=<cts source dir>/cts/glcts