README.md 14.8 KB
Newer Older
Nicolai Hähnle's avatar
Nicolai Hähnle committed
1 2

Piglit
3 4
======

Nicolai Hähnle's avatar
Nicolai Hähnle committed
5 6 7
1. About
2. Setup
3. How to run tests
8 9 10
4. Available test sets
5. How to write tests
6. Todo
Nicolai Hähnle's avatar
Nicolai Hähnle committed
11 12 13 14 15


1. About
--------

16 17
Piglit is a collection of automated tests for OpenGL and OpenCL
implementations.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
18 19

The goal of Piglit is to help improve the quality of open source
20
OpenGL and OpenCL drivers by providing developers with a simple means to
Nicolai Hähnle's avatar
Nicolai Hähnle committed
21 22 23 24 25 26 27 28 29 30 31 32
perform regression tests.

The original tests have been taken from
- Glean ( http://glean.sf.net/ ) and
- Mesa ( http://www.mesa3d.org/ )


2. Setup
--------

First of all, you need to make sure that the following are installed:

33
  - Python 2.7.x
34
  - Python Mako module
35
  - numpy (http://www.numpy.org)
36
  - six (https://pypi.python.org/pypi/six)
Nicolai Hähnle's avatar
Nicolai Hähnle committed
37 38 39
  - cmake (http://www.cmake.org)
  - GL, glu and glut libraries and development packages (i.e. headers)
  - X11 libraries and development packages (i.e. headers)
40
  - waffle (http://www.waffle-gl.org)
41
  - mako
42 43 44 45 46 47

Optionally, you can install the following:

  - lxml. An accelerated python xml library using libxml2 (http://lxml.de/)
  - simplejson. A fast C based implementation of the python json library.
    (https://simplejson.readthedocs.org/en/latest/)
48 49
  - jsonstreams. A JSON stream writer for python.
    (https://jsonstreams.readthedocs.io/en/stable/)
50 51 52

For Python 2.x you can install the following to add features, these are
unnecessary for python3:
53
  - backports.lzma. A backport of python3's lzma module to python2,
54 55
    this enables fast native xz (de)compression in piglit for results files
    (https://github.com/peterjc/backports.lzma)
56 57 58
  - subprocess32. A backport of the subprocess from python3.2, which includes
    timeout support. This only works for Linux

59
For testing the python framework using `py.test unittests/framework`
60 61 62 63
  - py.test. A python test framework, used for running the python framework
    test suite.
  - tox. A tool for testing python packages against multiple configurations of
    python (https://tox.readthedocs.org/en/latest/index.html)
64 65
  - mock. A python module for mocking other python modules. Required only for
    unittests (https://github.com/testing-cabal/mock)
66 67 68 69
  - psutil. A portable process library for python
  - jsonschema. A JSON validator library for python
  - pytest-mock. A mock plugin for pytest
  - pytest-pythonpath. A plugin for pytest to do automagic with sys.path
70
  - pytest-raises. A plugin for pytest that allows decorating tests that expect
71 72 73
    failure
  - pytest-warnings. A plugin for pytest that handles python warnings
  - pytest-timeout. A plugin for pytest to timeout tests.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
74 75 76

Now configure the build system:

77
    $ ccmake .
Nicolai Hähnle's avatar
Nicolai Hähnle committed
78 79 80 81

This will start cmake's configuration tool, just follow the onscreen
instructions. The default settings should be fine, but I recommend you:
 - Press 'c' once (this will also check for dependencies) and then
82
 - Set `CMAKE_BUILD_TYPE` to `Debug` Now you can press 'c' again and then 'g' to generate the build system.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
83 84
Now build everything:

85
    $ make
Nicolai Hähnle's avatar
Nicolai Hähnle committed
86 87


88
### 2.1 Cross Compiling
89

90 91
On Linux, if cross-compiling a 32-bit build on a 64-bit host, first make sure
you didn't have CMakeCache.txt file left from 64-bit build (it would retain old
92 93
flags), then you must invoke cmake with options
`-DCMAKE_SYSTEM_PROCESSOR=x86 -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32`.
94

Nicolai Hähnle's avatar
Nicolai Hähnle committed
95

96
### 2.2 Ubuntu
97 98

Install development packages.
99 100

    $ sudo apt-get install cmake g++ mesa-common-dev libgl1-mesa-dev python-numpy python-mako freeglut3-dev x11proto-gl-dev libxrender-dev libwaffle-dev
101

102
Configure and build.
103 104 105

    $ cmake .
    $ make
106 107


108
### 2.3 Mac OS X
109

110
Install CMake.
111 112 113 114 115 116 117
http://cmake.org/cmake/resources/software.html
Download and install 'Mac OSX Universal' platform.

Install Xcode.
http://developer.apple.com/xcode

Configure and build.
118 119 120

    $ cmake .
    $ make
121 122


123
### 2.4 Cygwin
124 125 126 127 128 129 130 131 132 133 134 135

Install development packages.
  - cmake
  - gcc4
  - make
  - opengl
  - libGL-devel
  - python
  - python-numpy
  - libglut-devel

Configure and build.
136 137 138

    $ cmake .
    $ make
139 140


141
### 2.5 Windows
142

143
Install Python 3.
144 145 146 147 148 149
http://www.python.org/download

Install CMake.
http://cmake.org/cmake/resources/software.html
Download and install 'Windows' platform.

150 151 152 153 154
Download and install Ninja
https://github.com/ninja-build/ninja/releases

Install MinGW-w64
https://mingw-w64.org/
155 156 157

Download OpenGL Core API and Extension Header Files.
http://www.opengl.org/registry/#headers
158
Pass `-DGLEXT_INCLUDE_DIR=/path/to/headers`
159 160

Install python mako.
161 162

    pip install mako
163 164

Install NumPy.
165 166

    pip install numpy
167

168

169
#### 2.5.1 GLUT
170

171 172
Download freeglut for Mingw.
http://www.transmissionzero.co.uk/software/freeglut-devel/
173

174 175
    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
    ninja -C build
176 177


178
#### 2.5.2 Waffle
179

180
Download and build waffle for MinGW.
181 182 183 184 185
http://www.waffle-gl.org/

Open the Command Prompt.
CD to piglit directory.

186
    cmake -H. -Bbuild -G "Ninja" -DGLEXT_INCLUDE_DIR=\path\to\glext -DPIGLIT_USE_WAFFLE=TRUE -DWAFFLE_INCLUDE_DIRS=\path\to\waffle\include\waffle WAFFLE_LDFLAGS=\path\to\waffle\lib\libwaffle-1.a
187

188

Nicolai Hähnle's avatar
Nicolai Hähnle committed
189 190 191 192 193
3. How to run tests
-------------------

Make sure that everything is set up correctly:

194
    $ ./piglit run sanity results/sanity
Nicolai Hähnle's avatar
Nicolai Hähnle committed
195

196 197
You may include '.py' on the profile, or you may exclude it (sanity vs sanity.py),
both are equally valid.
198

199 200 201
You may also preface test profiles with tests/ (or any other path you like),
which may be useful for shell tab completion.

202
You may provide multiple profiles to be run at the same time:
203

204
    $ ./piglit run quick_cl gpu deqp_gles3 results/gl-cl-combined
205

206
Use
Nicolai Hähnle's avatar
Nicolai Hähnle committed
207

208 209 210 211 212
    $ ./piglit run

or

    $ ./piglit run -h
Nicolai Hähnle's avatar
Nicolai Hähnle committed
213

214 215 216
To learn more about the command's syntax.

Have a look into the tests/ directory to see what test profiles are available:
Nicolai Hähnle's avatar
Nicolai Hähnle committed
217

218
    $ ls tests/*.py
Nicolai Hähnle's avatar
Nicolai Hähnle committed
219

220 221
See also section 4.

Nicolai Hähnle's avatar
Nicolai Hähnle committed
222 223
To create some nice formatted test summaries, run

224
    $ ./piglit summary html summary/sanity results/sanity
Nicolai Hähnle's avatar
Nicolai Hähnle committed
225 226

Hint: You can combine multiple test results into a single summary.
227
During development, you can use this to watch for regressions:
Nicolai Hähnle's avatar
Nicolai Hähnle committed
228

229
    $ ./piglit summary html summary/compare results/baseline results/current
Nicolai Hähnle's avatar
Nicolai Hähnle committed
230

231 232
You can combine as many testruns as you want this way (in theory;
the HTML layout becomes awkward when the number of testruns increases)
Nicolai Hähnle's avatar
Nicolai Hähnle committed
233 234 235

Have a look at the results with a browser:

236
    $ xdg-open summary/sanity/index.html
Nicolai Hähnle's avatar
Nicolai Hähnle committed
237 238 239

The summary shows the 'status' of a test:

240 241 242 243 244 245 246
  - **pass:**   This test has completed successfully.
  - **warn:**   The test completed successfully, but something unexpected happened.
    Look at the details for more information.
  - **fail:**   The test failed.
  - **crash:**  The test binary exited with a non-zero exit code.
  - **skip:**   The test was skipped.
  - **timeout:**  The test ran longer than its allotted time and was forcibly killed.
247

248 249 250

There are also dmesg-* statuses. These have the same meaning as above, but are
triggered by dmesg related messages.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
251

252 253

### 3.1 Environment Variables
254 255 256 257

There are a number of environment variables that control the way piglit
behaves.

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
  - `PIGLIT_COMPRESSION`

    Overrides the compression method used. The same values that piglit.conf
    allows for core:compression.

  - `PIGLIT_PLATFORM`

    Overrides the platform run on. These allow the same values as `piglit run -p`.
    This values is honored by the tests themselves, and can be used when running
    a single test.

  - `PIGLIT_FORCE_GLSLPARSER_DESKTOP`

    Force glslparser tests to be run with the desktop (non-gles) version of
    glslparsertest. This can be used to test ESX_compatability extensions
    for OpenGL

  - `PIGLIT_NO_FAST_SKIP`

    Piglit has a mechanism run in the python layer for skipping tests with
    unmet OpenGL or window system dependencies without starting a new
    process (which is expensive). Sometimes this system doesn't work or is
    undesirable, setting this environment variable to True will disable this
    system.

  - `PIGLIT_NO_TIMEOUT`

    When this variable is true in python then any timeouts given by tests
    will be ignored, and they will run until completion or they are killed.
287

288 289

### 3.2 Note
290

291 292 293 294 295 296
The way `piglit run` and `piglit summary` count tests are different,
`piglit run` counts the number of Test derived instance in the profile(s)
selected, while `piglit summary` counts the number of subtests a result
contains, or it's result if there are no subtests. This means that the number
shown by `piglit run` will be less than or equal to the number calculated by
`piglit summary`.
297

Nicolai Hähnle's avatar
Nicolai Hähnle committed
298

299
### 3.3 Shell Completions
300 301 302 303 304 305 306 307

Piglit has completions for bash, located in completions/bash/piglit. Once this
file is sourced into bash `piglit` and `./piglit` will have tab completion
available. For global availability place the file somewhere that bash will
source the file on startup. If piglit is installed and bash-completions are
available, then this completion file will be installed system-wide.


308 309 310 311 312 313
4. Available test sets
----------------------

Test sets are specified as Python scripts in the tests directory.
The following test sets are currently available:

314

315
### 4.1 OpenGL Tests
316

317 318 319 320
  - **sanity.py** This suite contains minimal OpenGL sanity tests. These tests
    must pass, otherwise the other tests will not generate reliable results.
  - **all.py** This suite contains all OpenGL tests.
  - **quick.py** Run all tests, but cut down significantly on their runtime
Nicolai Hähnle's avatar
Nicolai Hähnle committed
321
    (and thus on the number of problems they can find).
322 323 324 325 326 327 328 329 330 331
  - **gpu.py** A further reduced set of tests from quick.py, this runs tests
    only for hardware functionality and not tests for the software stack.
  - **llvmpipe.py** A reduced set of tests from gpu.py removing tests that are
    problematic using llvmpipe
  - **cpu.py** This profile runs tests that don't touch the gpu, in other words
    all of the tests in quick.py that are not run by gpu.py
  - **glslparser.py** A subset of all.py which runs only glslparser tests
  - **shader.py** A subset of all.py which runs only shader tests
  - **no_error.py** A modified version of the test list run as khr_no_error
    variants
332

333

334
### 4.2 OpenCL Tests
335

336 337 338
  - **cl.py** This suite contains all OpenCL tests.
  - **quick_cl.py** This runs all of the tests from cl.py as well as tests from
    opencv and oclconform.
339 340


341
### 4.3 External Integration
342

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
  - **xts.py** Support for running the X Test Suite using piglit.
  - **igt.py** Support for running Intel-gpu-tools test suite using piglit.
  - **deqp_egl.py** Support for running dEQP's EGL profile with piglit.
  - **deqp_gles2.py** Support for running dEQP's gles2 profile with piglit.
  - **deqp_gles3.py** Support for running dEQP's gles3 profile with piglit.
  - **deqp_gles31.py** Support for running dEQP's gles3.1 profile with piglit.
  - **deqp_vk.py** Support for running the official Khronos Vulkan CTS profile
    with piglit.
  - **khr_gl.py** Support for running the open source Khronos OpenGL CTS tests
    with piglit.
  - **khr_gl45.py** Support for running the open source Khronos OpenGL 4.5 CTS
    tests with piglit.
  - **cts_gl.py** Support for running the closed source Khronos OpenGL CTS
    tests with piglit.
  - **cts_gl45.py** Support for running the closed source Khronos OpenGL 4.5
    CTS tests with piglit.
  - **cts_gles.py** Support for running the closed source Khronos GLES CTS
    tests with piglit.
  - **oglconform.py** Support for running sub-test of the Intel oglconform test
    suite with piglit.
363

364

365
5. How to write tests
Nicolai Hähnle's avatar
Nicolai Hähnle committed
366 367 368 369 370 371
---------------------

Every test is run as a separate process. This minimizes the impact that
severe bugs like memory corruption have on the testing process.

Therefore, tests can be implemented in an arbitrary standalone language.
372
C is the preferred language for compiled tests, piglit also supports its own
373
simple formats for test shaders and glsl parser input.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
374

375 376 377
All new tests must be added to the appropriate profile, all.py profile for
OpenGL and cl.py for OpenCL. There are a few basic test classes supported by the
python framework:
Nicolai Hähnle's avatar
Nicolai Hähnle committed
378

379 380 381 382 383
 PiglitBaseTest
   A shared base class for all native piglit tests.

   It starts each test as a subprocess, captures stdout and stderr, and waits
   for the test to return.
384

385 386 387 388 389 390 391
   It provides test timeouts by setting the instances 'timeout' attribute to an
   integer > 0 which is the number of seconds the test should run.

   It interprets output by reading stdout and looking for 'PIGLIT: ' in the
   output, and then reading any trailing characters as well formed json
   returning the test result.

392 393
   This is a base class and should not be used directly, but provides an
   explanation of the behavior of the following classes.
394 395 396 397 398 399 400 401 402 403 404

 PiglitGLTest
   A test class for native piglit OpenGL tests.

   In addition to the properties of PiglitBaseTest it provides a mechanism for
   detecting test window resizes and rerunning tests as well as keyword
   arguments for platform requirements.

 PiglitCLTest
   A test class for native piglit OpenCL tests.

405
   It currently provides no special features.
406 407 408 409

 GLSLParserTest
   A class for testing a glsl parser.

410 411
   It is generally unnecessary to call this class directly as it uses a helper
   function to search directories for tests.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
412

413
 ShaderTest
414
   A class for testing using OpenGL shaders.
Nicolai Hähnle's avatar
Nicolai Hähnle committed
415

416 417
   It is generally unnecessary to call this class directly as it uses a helper
   function to search directories for tests.
418 419 420 421 422 423 424 425 426 427 428 429 430 431


6. Integration
--------------

Piglit provides integration for other test suites as well. The rational for
this is that it provides piglit's one process per test protections (one test
crashing does not crash the whole suite), and access to piglit's reporting
tools.

Most integration is done through the use of piglit.conf, or through environment
variables, with piglit.conf being the preferred method.


432
### 6.1 dEQP
433 434 435 436 437 438 439 440

Piglit provides a generic layer for dEQP based test suites, and specific
integration for several suites.

I suggest using Chad Versace's repo of dEQP, which contains a gbm target.
https://github.com/chadversary/deqp

It should be built as follows:
441 442

    cmake . -DDEQP_TARGET=gbm -GNinja
443 444 445 446 447 448 449 450

Additional targets are available in the targets directory. gbm isn't compatible
for most (any?) blob driver, so another target might be necessary if that is a
requirement. One of the x11_* targets or drm is probably a good choice.

The use of ninja is optional.

Once dEQP is built add the following information to piglit.conf, which can
451 452
either be located in the root of the piglit repo, or in `$XDG_CONFIG_HOME`
(usually `$HOME/.config`).
453

454 455
    [deqp-gles2]
    bin=<deqp source dir>/modules/gles2/deqp-gles2
456

457 458
    [deqp-gles3]
    bin=<deqp source dir>/modules/gles3/deqp-gles3
459

460 461
    [deqp-gles31]
    bin=<deqp source dir>/modules/gles31/deqp-gles31
462 463

These platforms can be run using deqp_gles*.py as a suite in piglit.
464 465 466
For example:

    ./piglit run deqp_gles31 my_results -c
467 468

It is also possible to mix integrated suites and piglit profiles together:
469 470

    ./piglit run deqp_gles31 quick cl my_results
471 472 473 474 475

dEQP profiles generally contain all of the tests from the previous profile, so
gles31 covers gles3 and gles2.


476
### 6.2 Khronos CTS
477 478 479

Add the following to your piglit.conf file:

480 481
    [cts]
    bin=<cts source dir>/cts/glcts