Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2.  
  3. CopyRight = '''
  4. /**************************************************************************
  5. *
  6. * Copyright 2010 VMware, Inc.
  7. * All Rights Reserved.
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a
  10. * copy of this software and associated documentation files (the
  11. * "Software"), to deal in the Software without restriction, including
  12. * without limitation the rights to use, copy, modify, merge, publish,
  13. * distribute, sub license, and/or sell copies of the Software, and to
  14. * permit persons to whom the Software is furnished to do so, subject to
  15. * the following conditions:
  16. *
  17. * The above copyright notice and this permission notice (including the
  18. * next paragraph) shall be included in all copies or substantial portions
  19. * of the Software.
  20. *
  21. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  24. * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  25. * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  26. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  27. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. *
  29. **************************************************************************/
  30. '''
  31.  
  32.  
  33. import sys
  34.  
  35. from u_format_parse import *
  36. import u_format_pack
  37.  
  38.  
  39. def layout_map(layout):
  40.     return 'UTIL_FORMAT_LAYOUT_' + str(layout).upper()
  41.  
  42.  
  43. def colorspace_map(colorspace):
  44.     return 'UTIL_FORMAT_COLORSPACE_' + str(colorspace).upper()
  45.  
  46.  
  47. colorspace_channels_map = {
  48.     'rgb': ['r', 'g', 'b', 'a'],
  49.     'srgb': ['sr', 'sg', 'sb', 'a'],
  50.     'zs': ['z', 's'],
  51.     'yuv': ['y', 'u', 'v'],
  52. }
  53.  
  54.  
  55. type_map = {
  56.     VOID:     "UTIL_FORMAT_TYPE_VOID",
  57.     UNSIGNED: "UTIL_FORMAT_TYPE_UNSIGNED",
  58.     SIGNED:   "UTIL_FORMAT_TYPE_SIGNED",
  59.     FIXED:    "UTIL_FORMAT_TYPE_FIXED",
  60.     FLOAT:    "UTIL_FORMAT_TYPE_FLOAT",
  61. }
  62.  
  63.  
  64. def bool_map(value):
  65.     if value:
  66.         return "TRUE"
  67.     else:
  68.         return "FALSE"
  69.  
  70.  
  71. swizzle_map = {
  72.     SWIZZLE_X:    "UTIL_FORMAT_SWIZZLE_X",
  73.     SWIZZLE_Y:    "UTIL_FORMAT_SWIZZLE_Y",
  74.     SWIZZLE_Z:    "UTIL_FORMAT_SWIZZLE_Z",
  75.     SWIZZLE_W:    "UTIL_FORMAT_SWIZZLE_W",
  76.     SWIZZLE_0:    "UTIL_FORMAT_SWIZZLE_0",
  77.     SWIZZLE_1:    "UTIL_FORMAT_SWIZZLE_1",
  78.     SWIZZLE_NONE: "UTIL_FORMAT_SWIZZLE_NONE",
  79. }
  80.  
  81.  
  82. def write_format_table(formats):
  83.     print '/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */'
  84.     print
  85.     # This will print the copyright message on the top of this file
  86.     print CopyRight.strip()
  87.     print
  88.     print '#include "u_format.h"'
  89.     print '#include "u_format_s3tc.h"'
  90.     print '#include "u_format_rgtc.h"'
  91.     print '#include "u_format_latc.h"'
  92.     print '#include "u_format_etc.h"'
  93.     print '#include "u_format_fake.h"'
  94.     print
  95.    
  96.     u_format_pack.generate(formats)
  97.    
  98.     def do_channel_array(channels, swizzles):
  99.         print "   {"
  100.         for i in range(4):
  101.             channel = channels[i]
  102.             if i < 3:
  103.                 sep = ","
  104.             else:
  105.                 sep = ""
  106.             if channel.size:
  107.                 print "      {%s, %s, %s, %u, %u}%s\t/* %s = %s */" % (type_map[channel.type], bool_map(channel.norm), bool_map(channel.pure), channel.size, channel.shift, sep, "xyzw"[i], channel.name)
  108.             else:
  109.                 print "      {0, 0, 0, 0, 0}%s" % (sep,)
  110.         print "   },"
  111.  
  112.     def do_swizzle_array(channels, swizzles):
  113.         print "   {"
  114.         for i in range(4):
  115.             swizzle = swizzles[i]
  116.             if i < 3:
  117.                 sep = ","
  118.             else:
  119.                 sep = ""
  120.             try:
  121.                 comment = colorspace_channels_map[format.colorspace][i]
  122.             except (KeyError, IndexError):
  123.                 comment = 'ignored'
  124.             print "      %s%s\t/* %s */" % (swizzle_map[swizzle], sep, comment)
  125.         print "   },"
  126.  
  127.     for format in formats:
  128.         print 'const struct util_format_description'
  129.         print 'util_format_%s_description = {' % (format.short_name(),)
  130.         print "   %s," % (format.name,)
  131.         print "   \"%s\"," % (format.name,)
  132.         print "   \"%s\"," % (format.short_name(),)
  133.         print "   {%u, %u, %u},\t/* block */" % (format.block_width, format.block_height, format.block_size())
  134.         print "   %s," % (layout_map(format.layout),)
  135.         print "   %u,\t/* nr_channels */" % (format.nr_channels(),)
  136.         print "   %s,\t/* is_array */" % (bool_map(format.is_array()),)
  137.         print "   %s,\t/* is_bitmask */" % (bool_map(format.is_bitmask()),)
  138.         print "   %s,\t/* is_mixed */" % (bool_map(format.is_mixed()),)
  139.         u_format_pack.print_channels(format, do_channel_array)
  140.         u_format_pack.print_channels(format, do_swizzle_array)
  141.         print "   %s," % (colorspace_map(format.colorspace),)
  142.         if format.colorspace != ZS and not format.is_pure_color():
  143.             print "   &util_format_%s_unpack_rgba_8unorm," % format.short_name()
  144.             print "   &util_format_%s_pack_rgba_8unorm," % format.short_name()
  145.             if format.layout == 's3tc' or format.layout == 'rgtc' or format.layout == 'bptc':
  146.                 print "   &util_format_%s_fetch_rgba_8unorm," % format.short_name()
  147.             else:
  148.                 print "   NULL, /* fetch_rgba_8unorm */"
  149.             print "   &util_format_%s_unpack_rgba_float," % format.short_name()
  150.             print "   &util_format_%s_pack_rgba_float," % format.short_name()
  151.             print "   &util_format_%s_fetch_rgba_float," % format.short_name()
  152.         else:
  153.             print "   NULL, /* unpack_rgba_8unorm */"
  154.             print "   NULL, /* pack_rgba_8unorm */"
  155.             print "   NULL, /* fetch_rgba_8unorm */"
  156.             print "   NULL, /* unpack_rgba_float */"
  157.             print "   NULL, /* pack_rgba_float */"
  158.             print "   NULL, /* fetch_rgba_float */"
  159.         if format.has_depth():
  160.             print "   &util_format_%s_unpack_z_32unorm," % format.short_name()
  161.             print "   &util_format_%s_pack_z_32unorm," % format.short_name()
  162.             print "   &util_format_%s_unpack_z_float," % format.short_name()
  163.             print "   &util_format_%s_pack_z_float," % format.short_name()
  164.         else:
  165.             print "   NULL, /* unpack_z_32unorm */"
  166.             print "   NULL, /* pack_z_32unorm */"
  167.             print "   NULL, /* unpack_z_float */"
  168.             print "   NULL, /* pack_z_float */"
  169.         if format.has_stencil():
  170.             print "   &util_format_%s_unpack_s_8uint," % format.short_name()
  171.             print "   &util_format_%s_pack_s_8uint," % format.short_name()
  172.         else:
  173.             print "   NULL, /* unpack_s_8uint */"
  174.             print "   NULL, /* pack_s_8uint */"
  175.         if format.is_pure_unsigned():
  176.             print "   &util_format_%s_unpack_unsigned, /* unpack_rgba_uint */" % format.short_name()
  177.             print "   &util_format_%s_pack_unsigned, /* pack_rgba_uint */" % format.short_name()
  178.             print "   &util_format_%s_unpack_signed, /* unpack_rgba_sint */" % format.short_name()
  179.             print "   &util_format_%s_pack_signed,  /* pack_rgba_sint */" % format.short_name()
  180.             print "   &util_format_%s_fetch_unsigned,  /* fetch_rgba_uint */" % format.short_name()
  181.             print "   NULL  /* fetch_rgba_sint */"
  182.         elif format.is_pure_signed():
  183.             print "   &util_format_%s_unpack_unsigned, /* unpack_rgba_uint */" % format.short_name()
  184.             print "   &util_format_%s_pack_unsigned, /* pack_rgba_uint */" % format.short_name()
  185.             print "   &util_format_%s_unpack_signed, /* unpack_rgba_sint */" % format.short_name()
  186.             print "   &util_format_%s_pack_signed,  /* pack_rgba_sint */" % format.short_name()
  187.             print "   NULL,  /* fetch_rgba_uint */"
  188.             print "   &util_format_%s_fetch_signed  /* fetch_rgba_sint */" % format.short_name()
  189.         else:
  190.             print "   NULL, /* unpack_rgba_uint */"
  191.             print "   NULL, /* pack_rgba_uint */"
  192.             print "   NULL, /* unpack_rgba_sint */"
  193.             print "   NULL, /* pack_rgba_sint */"
  194.             print "   NULL, /* fetch_rgba_uint */"
  195.             print "   NULL  /* fetch_rgba_sint */"
  196.         print "};"
  197.         print
  198.        
  199.     print "const struct util_format_description *"
  200.     print "util_format_description(enum pipe_format format)"
  201.     print "{"
  202.     print "   if (format >= PIPE_FORMAT_COUNT) {"
  203.     print "      return NULL;"
  204.     print "   }"
  205.     print
  206.     print "   switch (format) {"
  207.     for format in formats:
  208.         print "   case %s:" % format.name
  209.         print "      return &util_format_%s_description;" % (format.short_name(),)
  210.     print "   default:"
  211.     print "      return NULL;"
  212.     print "   }"
  213.     print "}"
  214.     print
  215.  
  216.  
  217. def main():
  218.  
  219.     formats = []
  220.     for arg in sys.argv[1:]:
  221.         formats.extend(parse(arg))
  222.     write_format_table(formats)
  223.  
  224.  
  225. if __name__ == '__main__':
  226.     main()
  227.