In the last few months Chad Versace and I have put a lot of effort<br>into reworking the core of Piglit with an eye towards being able to<br>effectively test GLES, Wayland, Android, and core profiles.  A lot of<br>that work is still in progress, and since others are starting to join<br>
in this effort, it seems like a good time to lay out our long term<br>plans so that we can coordinate.<br><br>Once we&#39;ve had a chance to discuss these plans on the mailing list and<br>come to a consensus, we&#39;re hoping to upload the revised description to<br>
the Piglit website (<a href="http://piglit.freedesktop.org/">http://piglit.freedesktop.org/</a>) so that it&#39;s easy<br>to find and refer to.<br><br><br>Background:<br><br>As of roughly January 2012, Piglit was almost exclusively geared<br>
toward testing desktop OpenGL versions 1.0 through 3.0, running on<br>Linux, Mac OSX, and Windows.  It used GLEW<br>(<a href="http://glew.sourceforge.net/">http://glew.sourceforge.net/</a>) to dispatch to OpenGL functions, and<br>
GLUT (<a href="http://www.opengl.org/resources/libraries/glut/">http://www.opengl.org/resources/libraries/glut/</a>) to interact<br>with the window system.  Neither GLEW nor GLUT are compatible with<br>GLES, Wayland, Android, or core profiles.<br>
<br>Only a few GLES tests existed, but they were compiled separately from<br>the GL tests, and they were not integrated tightly into the framework.<br>Furthermore, tests that in theory should have been able to be run on<br>
both GL and GLES were only compiled for GL.<br><br><br>Long term plan (and status):<br><br>(1) Stop using GLEW, and instead use a custom dispatch mechanism<br>(piglit-dispatch) which can be extended to support GLES and core<br>
profiles.  Piglit-dispatch uses a set of function pointers (passed to<br>it at initialization time) to determine how to late-bind to a given GL<br>function--this will allow its behaviour to be altered based on<br>run-time parameters (see items (3) and (4)).  Piglit-dispatch consists<br>
mostly of generated code that is built from the gl.spec and<br>enumext.spec files published on the OpenGL web site.  These files will<br>be extended as necessary to describe the differences between GL and<br>GLES.  Status: the dispatch mechanism has been written and deployed.<br>
Piglit no longer uses GLEW.  However, the GLES-specific modifications<br>to the .spec files have not yet been made, and the dispatch mechanism<br>does not yet support GLES or core profiles.<br><br>(2) Stop using GLUT, and instead use a new mechanism (Waffle) to<br>
create GL contexts and open windows.  Status: an initial<br>implementation of waffle has been written and deployed.  Piglit can be<br>compiled to use either Waffle or GLUT, based on a compile time switch.<br>Not all desktop GL tests work properly with Waffle yet.  All GLES<br>
tests work properly with Waffle, however, and GLES tests may only be<br>built if the Waffle compilation option is chosen.<br><br>(3) Stop building GLES tests separately from the GL tests.  Instead,<br>build a single set of test binaries that can test the GL API, the GLES<br>
1 API, the GLES 2 API, or (if applicable) all three sequentially.  If<br>libraries for only a subset of these APIs are present on the system,<br>the tests will automatically only exercise those APIs that are<br>present.  This will be possible because Waffle and piglit-dispatch use<br>
dlsym() (or its Windows equivalent) to late-bind to the GL and GLES<br>functions.  Status: GLES and GL tests are still built separately.<br>Waffle is capable of selecting which API to use at runtime, but<br>piglit-dispatch and the rest of piglit are not.<br>
<br>(4) Similarly, we will build a single set of test binaries that can<br>test X windows, Android, Wayland, gbm, or (if applicable) all of them<br>sequentially, depending on command-line options.  Windows and Mac OS<br>tests will still be built separately of course, because those<br>
platforms aren&#39;t binary-compatible with each other or with Linux.<br>Status: When Piglit is built with waffle support enabled, a single set<br>of binaries can test X windows or Wayland depending on an environment<br>variable.  Testing on Android and gbm is not implemented yet.  Testing<br>
on multiple window systems sequentially is not supported yet.<br><br>(5) In order for the framework to know which window systems, GL APIs,<br>and extensions are relevant to any particular test, we will add a<br>declarative mechanism for each test to specify the test requirements.<br>
The declarative syntax will use macros or inline functions.  For<br>example, if a test should run on desktop GL implementations that<br>support GL_EXT_framebuffer_object, desktop GL implementations version<br>3.0 or later, and on ES2 implementations, the test would contain a<br>
line that looks something like &quot;test_params.requirements =<br>OR3(AND(GL_API, EXTENSION(&quot;GL_EXT_framebuffer_object&quot;)),<br>GL_API_VERSION(3, 0), GLES2_API)&quot;.  This will replace the imperative<br>mechanism that we currently use to limit a test to certain GL versions<br>
and extensions (the piglit_require_xxx() functions).  Status: not yet<br>started.<br><br>(6) Since standard C doesn&#39;t allow functions to be called inside a<br>global initializer, to facilitate (5) we will replace the main()<br>
function in tests/util/piglit-framework.c with a piglit_run() function<br>which takes as its input a data structure describing the test<br>requirements (as well as other initialization info like the initial<br>window size).  Each individual test will contain a main() function<br>
that populates the data structure and then calls piglit_run().  To<br>avoid having to write a lot of boilerplate code in each individual<br>test, we&#39;ll provide a macro that creates a standard main() function<br>for those tests that don&#39;t need a lot of customization.  Status: not<br>
yet started.<br><br>(7) In order to allow the majority of piglit tests to run with core<br>profiles, forward-compatible contexts, and GLES (which don&#39;t support<br>depreceated functionality), we will write new wrapper functions in<br>
tests/util which provide low-level testing operations using whatever<br>functionality is present.  For example, we might have a function which<br>replaces any references to &quot;glVertex&quot; in a GLSL program with<br>references to a custom vertex attribute, for those implementations<br>
that don&#39;t support the deprecated &quot;glVertex&quot; feature.  Status: a few<br>wrapper functions already exist, but many more need to be written.<br><br>(8) In order to allow a single test invocation to run in a number of<br>
configurations sequentially (e.g. to test a certain piece of<br>functionality using both Wayland and X windows), we will extend the<br>protocol used by tests to report results so that a single invocation<br>of a test can report multiple test results.  Status: not yet started.<br>
<br><br>Implementation Strategy and immediate plans:<br><br>The above description doesn&#39;t address what order we plan on<br>implementing these features.  We would like to stay flexible on the<br>specific implementation order, so that we can adapt to unexpected<br>
dependencies and to allow people to contribute to the effort as their<br>time becomes available.  However, we would like to avoid regressions<br>as much as possible, since a regression in piglit is likely to be<br>misinterpreted as a regression in Mesa.<br>
<br>Here is what we expect to be working on soon:<br><br>(a) Replace the main() function in tests/util/piglit-framework.c with<br>individual main() functions in each test (see (6) above).<br><br>(b) Add the necessary information to gl.spec and enumext.spec to<br>
indicate which functions are avaiable in GLES, and to describe GLES<br>extensions (see (1) above).<br><br>(c) Modify piglit-dispatch code generation scripts to consume the<br>information from (b) and dispatch properly to GLES.<br>
<br>(d) Add Windows and MacOS X support to Waffle.<br><br>(e) Add basic keyboard input support to Waffle.  This is necessary<br>because most tests recognize &quot;ESC&quot; as a command to exit the test (if<br>not run in &quot;-auto&quot; mode), and because a few tests recognize other keys<br>
(e.g. fbo tests that use keyboard input to cycle between framebuffer<br>formats).<br><br>(f) Remove the compile-time switch that enables Waffle, and switch<br>over to using Waffle for all desktop GL tests.  Note: since we want to<br>
keep Piglit viable as a testing platform for Mesa while these tasks<br>are in progress, we can&#39;t do this until after doing (d) and (e).<br>However, we have already switched over to exclusively using Waffle for<br>GLES testing.<br>
<br>