Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2.  
  3. # Copyright (C) 2012 Intel Corporation
  4. #
  5. # Permission is hereby granted, free of charge, to any person obtaining a
  6. # copy of this software and associated documentation files (the "Software"),
  7. # to deal in the Software without restriction, including without limitation
  8. # the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. # and/or sell copies of the Software, and to permit persons to whom the
  10. # Software is furnished to do so, subject to the following conditions:
  11. #
  12. # The above copyright notice and this permission notice (including the next
  13. # paragraph) shall be included in all copies or substantial portions of the
  14. # Software.
  15. #
  16. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19. # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  22. # IN THE SOFTWARE.
  23.  
  24. # This script generates the file api_exec.c, which contains
  25. # _mesa_initialize_exec_table().  It is responsible for populating all
  26. # entries in the "exec" dispatch table that aren't dynamic.
  27.  
  28. import collections
  29. import license
  30. import gl_XML
  31. import sys, getopt
  32.  
  33.  
  34. exec_flavor_map = {
  35.     'dynamic': None,
  36.     'mesa': '_mesa_',
  37.     'skip': None,
  38.     }
  39.  
  40.  
  41. header = """/**
  42. * \\file api_exec.c
  43. * Initialize dispatch table.
  44. */
  45.  
  46.  
  47. #include "main/accum.h"
  48. #include "main/api_loopback.h"
  49. #include "main/api_exec.h"
  50. #include "main/arbprogram.h"
  51. #include "main/atifragshader.h"
  52. #include "main/attrib.h"
  53. #include "main/blend.h"
  54. #include "main/bufferobj.h"
  55. #include "main/arrayobj.h"
  56. #include "main/buffers.h"
  57. #include "main/clear.h"
  58. #include "main/clip.h"
  59. #include "main/colortab.h"
  60. #include "main/condrender.h"
  61. #include "main/context.h"
  62. #include "main/convolve.h"
  63. #include "main/depth.h"
  64. #include "main/dlist.h"
  65. #include "main/drawpix.h"
  66. #include "main/drawtex.h"
  67. #include "main/rastpos.h"
  68. #include "main/enable.h"
  69. #include "main/errors.h"
  70. #include "main/es1_conversion.h"
  71. #include "main/eval.h"
  72. #include "main/get.h"
  73. #include "main/feedback.h"
  74. #include "main/fog.h"
  75. #include "main/fbobject.h"
  76. #include "main/framebuffer.h"
  77. #include "main/hint.h"
  78. #include "main/histogram.h"
  79. #include "main/imports.h"
  80. #include "main/light.h"
  81. #include "main/lines.h"
  82. #include "main/matrix.h"
  83. #include "main/multisample.h"
  84. #include "main/pixel.h"
  85. #include "main/pixelstore.h"
  86. #include "main/points.h"
  87. #include "main/polygon.h"
  88. #include "main/querymatrix.h"
  89. #include "main/queryobj.h"
  90. #include "main/readpix.h"
  91. #include "main/samplerobj.h"
  92. #include "main/scissor.h"
  93. #include "main/stencil.h"
  94. #include "main/texenv.h"
  95. #include "main/texgetimage.h"
  96. #include "main/teximage.h"
  97. #include "main/texgen.h"
  98. #include "main/texobj.h"
  99. #include "main/texparam.h"
  100. #include "main/texstate.h"
  101. #include "main/texstorage.h"
  102. #include "main/texturebarrier.h"
  103. #include "main/transformfeedback.h"
  104. #include "main/mtypes.h"
  105. #include "main/varray.h"
  106. #include "main/viewport.h"
  107. #include "main/shaderapi.h"
  108. #include "main/uniforms.h"
  109. #include "main/syncobj.h"
  110. #include "main/formatquery.h"
  111. #include "main/dispatch.h"
  112. #include "vbo/vbo.h"
  113.  
  114.  
  115. /**
  116. * Initialize a context's exec table with pointers to Mesa's supported
  117. * GL functions.
  118. *
  119. * This function depends on ctx->Version.
  120. *
  121. * \param ctx  GL context to which \c exec belongs.
  122. */
  123. void
  124. _mesa_initialize_exec_table(struct gl_context *ctx)
  125. {
  126.   struct _glapi_table *exec;
  127.  
  128.   exec = ctx->Exec;
  129.   assert(exec != NULL);
  130.  
  131.   assert(ctx->Version > 0);
  132.  
  133.   vbo_initialize_exec_dispatch(ctx, exec);
  134. """
  135.  
  136.  
  137. footer = """
  138. }
  139. """
  140.  
  141.  
  142. class PrintCode(gl_XML.gl_print_base):
  143.  
  144.     def __init__(self):
  145.         gl_XML.gl_print_base.__init__(self)
  146.  
  147.         self.name = 'gl_genexec.py'
  148.         self.license = license.bsd_license_template % (
  149.             'Copyright (C) 2012 Intel Corporation',
  150.             'Intel Corporation')
  151.  
  152.     def printRealHeader(self):
  153.         print header
  154.  
  155.     def printRealFooter(self):
  156.         print footer
  157.  
  158.     def printBody(self, api):
  159.         # Collect SET_* calls by the condition under which they should
  160.         # be called.
  161.         settings_by_condition = collections.defaultdict(lambda: [])
  162.         for f in api.functionIterateAll():
  163.             if f.exec_flavor not in exec_flavor_map:
  164.                 raise Exception(
  165.                     'Unrecognized exec flavor {0!r}'.format(f.exec_flavor))
  166.             condition_parts = []
  167.             if f.desktop:
  168.                 if f.deprecated:
  169.                     condition_parts.append('ctx->API == API_OPENGL_COMPAT')
  170.                 else:
  171.                     condition_parts.append('_mesa_is_desktop_gl(ctx)')
  172.             if 'es1' in f.api_map:
  173.                 condition_parts.append('ctx->API == API_OPENGLES')
  174.             if 'es2' in f.api_map:
  175.                 if f.api_map['es2'] == 3:
  176.                     condition_parts.append('_mesa_is_gles3(ctx)')
  177.                 else:
  178.                     condition_parts.append('ctx->API == API_OPENGLES2')
  179.             if not condition_parts:
  180.                 # This function does not exist in any API.
  181.                 continue
  182.             condition = ' || '.join(condition_parts)
  183.             prefix = exec_flavor_map[f.exec_flavor]
  184.             if prefix is None:
  185.                 # This function is not implemented, or is dispatched
  186.                 # dynamically.
  187.                 continue
  188.             settings_by_condition[condition].append(
  189.                 'SET_{0}(exec, {1}{0});'.format(f.name, prefix, f.name))
  190.         # Print out an if statement for each unique condition, with
  191.         # the SET_* calls nested inside it.
  192.         for condition in sorted(settings_by_condition.keys()):
  193.             print '   if ({0}) {{'.format(condition)
  194.             for setting in sorted(settings_by_condition[condition]):
  195.                 print '      {0}'.format(setting)
  196.             print '   }'
  197.  
  198.  
  199. def show_usage():
  200.     print "Usage: %s [-f input_file_name]" % sys.argv[0]
  201.     sys.exit(1)
  202.  
  203.  
  204. if __name__ == '__main__':
  205.     file_name = "gl_and_es_API.xml"
  206.  
  207.     try:
  208.         (args, trail) = getopt.getopt(sys.argv[1:], "m:f:")
  209.     except Exception,e:
  210.         show_usage()
  211.  
  212.     for (arg,val) in args:
  213.         if arg == "-f":
  214.             file_name = val
  215.  
  216.     printer = PrintCode()
  217.  
  218.     api = gl_XML.parse_GL_API(file_name)
  219.     printer.Print(api)
  220.