mesa: fix format conversion bug in get_tex_rgba_uncompressed()
[mesa.git] / src / mesa / main / format_info.py
index 448bd0055372d4f0baeb8fdbdcaa00a4279472d2..729edbb32494ade2dbbb3ec57e07e87d82f84ab6 100644 (file)
@@ -58,11 +58,13 @@ def get_gl_base_format(fmat):
    elif fmat.has_channel('i') and fmat.num_channels() == 1:
       return 'GL_INTENSITY'
    else:
-      assert False
+      sys.exit("error, could not determine base format for {0}, check swizzle".format(fmat.name));
 
 def get_gl_data_type(fmat):
    if fmat.is_compressed():
-      if 'SIGNED' in fmat.name or 'SNORM' in fmat.name:
+      if 'FLOAT' in fmat.name:
+         return 'GL_FLOAT'
+      elif 'SIGNED' in fmat.name or 'SNORM' in fmat.name:
          return 'GL_SIGNED_NORMALIZED'
       else:
          return 'GL_UNSIGNED_NORMALIZED'
@@ -96,14 +98,6 @@ def get_gl_data_type(fmat):
    else:
       assert False
 
-def get_mesa_layout(fmat):
-   if fmat.layout == 'array':
-      return 'MESA_FORMAT_LAYOUT_ARRAY'
-   elif fmat.layout == 'packed':
-      return 'MESA_FORMAT_LAYOUT_PACKED'
-   else:
-      return 'MESA_FORMAT_LAYOUT_OTHER'
-
 def get_channel_bits(fmat, chan_name):
    if fmat.is_compressed():
       # These values are pretty-much bogus, but OpenGL requires that we
@@ -117,7 +111,7 @@ def get_channel_bits(fmat, chan_name):
             return 1 if fmat.has_channel('a') else 0
          else:
             return 0
-      elif fmat.layout == 'rgtc':
+      elif fmat.layout in ('rgtc', 'latc'):
          return 8 if fmat.has_channel(chan_name) else 0
       elif fmat.layout in ('etc1', 'etc2'):
          if fmat.name.endswith('_ALPHA1') and chan_name == 'a':
@@ -125,6 +119,12 @@ def get_channel_bits(fmat, chan_name):
 
          bits = 11 if fmat.name.endswith('11_EAC') else 8
          return bits if fmat.has_channel(chan_name) else 0
+      elif fmat.layout == 'bptc':
+         bits = 16 if fmat.name.endswith('_FLOAT') else 8
+         return bits if fmat.has_channel(chan_name) else 0
+      elif fmat.layout == 'astc':
+         bits = 16 if 'RGBA' in fmat.name else 8
+         return bits if fmat.has_channel(chan_name) else 0
       else:
          assert False
    else:
@@ -174,7 +174,7 @@ for fmat in formats:
    print '   {'
    print '      {0},'.format(fmat.name)
    print '      "{0}",'.format(fmat.name)
-   print '      {0},'.format(get_mesa_layout(fmat))
+   print '      {0},'.format('MESA_FORMAT_LAYOUT_' + fmat.layout.upper())
    print '      {0},'.format(get_gl_base_format(fmat))
    print '      {0},'.format(get_gl_data_type(fmat))
 
@@ -183,10 +183,29 @@ for fmat in formats:
    bits = [ get_channel_bits(fmat, name) for name in ['l', 'i', 'z', 's']]
    print '      {0},'.format(', '.join(map(str, bits)))
 
-   print '      {0}, {1}, {2},'.format(fmat.block_width, fmat.block_height,
-                                       int(fmat.block_size() / 8))
+   print '      {0:d},'.format(fmat.colorspace == 'srgb')
+
+   print '      {0}, {1}, {2}, {3},'.format(fmat.block_width, fmat.block_height,
+                                            fmat.block_depth,
+                                            int(fmat.block_size() / 8))
 
    print '      {{ {0} }},'.format(', '.join(map(str, fmat.swizzle)))
+   if fmat.is_array():
+      chan = fmat.array_element()
+      norm = chan.norm or chan.type == parser.FLOAT
+      print '      MESA_ARRAY_FORMAT({0}),'.format(', '.join([
+         str(chan.size / 8),
+         str(int(chan.sign)),
+         str(int(chan.type == parser.FLOAT)),
+         str(int(norm)),
+         str(len(fmat.channels)),
+         str(fmat.swizzle[0]),
+         str(fmat.swizzle[1]),
+         str(fmat.swizzle[2]),
+         str(fmat.swizzle[3]),
+      ]))
+   else:
+      print '      0,'
    print '   },'
 
 print '};'