u_format: implement fetch_rgba_uint and fetch_rgba_sint for integer formats
authorMarek Olšák <maraeo@gmail.com>
Mon, 2 Jan 2012 01:59:51 +0000 (02:59 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 5 Jan 2012 17:29:11 +0000 (18:29 +0100)
Fetching int as float and vice versa is not allowed.
Fetching unsigned int as signed int and vice versa is not allowed either.
Doing conversions like that isn't allowed for samplers in OpenGL.

The three hooks could be consolidated into one fetch hook, which would fetch
uint as uint32, sint as sint32, and everything else as float. The receiving
parameter would be void*. This would be useful for implementing vertex fetches
for shader model 4.0, which has untyped registers.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/util/u_format.h
src/gallium/auxiliary/util/u_format_pack.py
src/gallium/auxiliary/util/u_format_table.py

index 9694c9034d2bff0fcf7337c6c3047113769e45f7..874ea7eb12aa7bdaa372ef3a717cb4d66caf7ee4 100644 (file)
@@ -254,7 +254,7 @@ struct util_format_description
    /**
     * Fetch a single pixel (i, j) from a block.
     *
-    * Only defined for non-depth-stencil formats.
+    * Only defined for non-depth-stencil and non-integer formats.
     */
    void
    (*fetch_rgba_float)(float *dst,
@@ -358,6 +358,26 @@ struct util_format_description
    (*pack_rgba_sint)(uint8_t *dst, unsigned dst_stride,
                      const int *src, unsigned src_stride,
                      unsigned width, unsigned height);
+
+   /**
+    * Fetch a single pixel (i, j) from a block.
+    *
+    * Only defined for unsigned (pure) integer formats.
+    */
+   void
+   (*fetch_rgba_uint)(uint32_t *dst,
+                      const uint8_t *src,
+                      unsigned i, unsigned j);
+
+   /**
+    * Fetch a single pixel (i, j) from a block.
+    *
+    * Only defined for signed (pure) integer formats.
+    */
+   void
+   (*fetch_rgba_sint)(int32_t *dst,
+                      const uint8_t *src,
+                      unsigned i, unsigned j);
 };
 
 
index fff409fb75d2188f47d367c9fc061d0fdf7fae20..0b3a890d59122598f8ca9d10d8d8541023378077 100644 (file)
@@ -686,6 +686,7 @@ def generate(formats):
 
                 generate_format_unpack(format, channel, native_type, suffix)
                 generate_format_pack(format, channel, native_type, suffix)
+                generate_format_fetch(format, channel, native_type, suffix)
 
                 channel = Channel(SIGNED, False, True, 32)
                 native_type = 'int'
@@ -699,6 +700,7 @@ def generate(formats):
 
                 generate_format_unpack(format, channel, native_type, suffix)
                 generate_format_pack(format, channel, native_type, suffix)   
+                generate_format_fetch(format, channel, native_type, suffix)
 
                 native_type = 'unsigned'
                 suffix = 'unsigned'
index 07beb38723be56c8a29d57255e983e9246d7497c..8edb505237d28e20d2000258e1e3cf05dacb71d9 100755 (executable)
@@ -169,17 +169,23 @@ def write_format_table(formats):
             print "   &util_format_%s_unpack_unsigned, /* unpack_rgba_uint */" % format.short_name() 
             print "   &util_format_%s_pack_unsigned, /* pack_rgba_uint */" % format.short_name()
             print "   &util_format_%s_unpack_signed, /* unpack_rgba_sint */" % format.short_name()
-            print "   &util_format_%s_pack_signed  /* pack_rgba_sint */" % format.short_name()
+            print "   &util_format_%s_pack_signed,  /* pack_rgba_sint */" % format.short_name()
+            print "   &util_format_%s_fetch_unsigned,  /* fetch_rgba_uint */" % format.short_name()
+            print "   NULL  /* fetch_rgba_sint */"
         elif format.colorspace != ZS and format.channels[0].pure == True and format.channels[0].type == SIGNED:
             print "   &util_format_%s_unpack_unsigned, /* unpack_rgba_uint */" % format.short_name()
             print "   &util_format_%s_pack_unsigned, /* pack_rgba_uint */" % format.short_name()
             print "   &util_format_%s_unpack_signed, /* unpack_rgba_sint */" % format.short_name()
-            print "   &util_format_%s_pack_signed  /* pack_rgba_sint */" % format.short_name()
+            print "   &util_format_%s_pack_signed,  /* pack_rgba_sint */" % format.short_name()
+            print "   NULL,  /* fetch_rgba_uint */"
+            print "   &util_format_%s_fetch_signed  /* fetch_rgba_sint */" % format.short_name()
         else:
             print "   NULL, /* unpack_rgba_uint */" 
             print "   NULL, /* pack_rgba_uint */" 
             print "   NULL, /* unpack_rgba_sint */" 
-            print "   NULL  /* pack_rgba_sint */" 
+            print "   NULL, /* pack_rgba_sint */"
+            print "   NULL, /* fetch_rgba_uint */"
+            print "   NULL  /* fetch_rgba_sint */"
         print "};"
         print