Skip to content
  • Lina Versace's avatar
    dispatch: Generate piglit-dispatch from Khronos XML · ac1f382d
    Lina Versace authored
    
    
    Khronos now generates its headers from XML and no longer maintains the
    old, crufty *.spec files. Piglit should do the same. Otherwise,
    piglit-dispatch won't be able to pick up new extension functions.
    
    As a really really big bonus, after Piglit starts generating its GL
    dispatch code from gl.xml, it will be a small step to start generating
    EGL and GLX dispatch from egl.xml and glx.xml.
    
    This patch imports 'gl.xml' into a new toplevel "registry" directory, to
    follow the precedent of libepoxy.
    
    This patch follows the precedent of libepoxy by importing "gl.xml" into
    a new toplevel "registry" directory.
    
    I did *not* try to redesign piglit-dispatch in this patch. To the
    contrary, I attempted to keep the newly generated dispatch code to be as
    similar as possible as the old generated code. Despite wanting to clean
    up piglit-dispatch's design, I refrained because "a patch should do one
    thing, and do it well".
    
    I strove to keep separate concerns in separate files. File
    "registry/gl.py" parses "registry/gl.xml". File
    "tests/util/gen_dispatch.py" generates code from the that parsed result.
    This decision kept gen_dispatch.py small and focused.
    
    I hope everyone finds the rewritten gen_dispatch.py more maintainable
    and easy to read.
    
    The generated code has changed as following:
    
      - It now contains the GLES1 API, because gl.xml contains information
        on all OpenGL APIs.
    
      - The comment block for each function alias set now contains more
        information. For each function in the set, it now lists the
        complete set of providers.
    
        For example:
          /* glActiveTexture (GL_VERSION_1_3) (GL_VERSION_ES_CM_1_0) (GL_ES_VERSION_2_0) */
          /* glActiveTextureARB (GL_ARB_multitexture) */
          extern PFNGLACTIVETEXTUREPROC piglit_dispatch_glActiveTexture;
          #define glActiveTexture piglit_dispatch_glActiveTexture
          #define glActiveTextureARB piglit_dispatch_glActiveTexture
    
      - Enums are sorted by group then by value. Old dispatch sorted only by
        value.
    
        For example:
          /* Enum Group MapBufferUsageMask */
          #define GL_MAP_READ_BIT 0x0001
          #define GL_MAP_READ_BIT_EXT 0x0001
          #define GL_MAP_WRITE_BIT 0x0002
          #define GL_MAP_WRITE_BIT_EXT 0x0002
          ...
    
    Tested for regressions with:
        piglit run -p x11_egl -x glx -x glean
        Mesa 10.2.1
        Intel Ivybridge
        Fedora 20
    
    v3, for Dylan:
      - Replace ElementTree with cElementTree, for speed.
      - Each method $foo in KeyedOrderedSet that returns
        a generator, rename it to iter${foo} to follow Python2 (not 3)
        naming conventions.
      - Python 2.6 lacks OrderedDict, so don't use it.
      - Remove unused import 'dedent'.
      - Python 2.6 does not recognize the syntax for set literals, so
        replace each set literal with a list literal or generator literal.
      - Replace sys.stderr.write with print(file=sys.stderr).
      - Remove hand-coded OrderedKeyedSet.copy and instead use copy module.
      - Prefer the 'lxml' module (it uses libxml2) over Python's builtin 'xml' module.
      - Replace methods ``def foo(x, y):`` with ``def foo(self, other):``.
      - Replace lists with generators in methods Command.c_*_param_list.
      - PEP8: Separate all toplevel items with 2 newlines.
      - PEP8: Fix minor whitespace issues.
      - PEP8: Replace some ``== None`` with ``is None``.
      - Replace None-check for --out-dir with add_argument(..., required=True)
      - Remove 'prog' assignment when calling ArgumentParser(prog=PROG_NAME).
        Instead, use default value
    
    Signed-off-by: default avatarChad Versace <chad.versace@linux.intel.com>
    ac1f382d