Some initial RGB and RGBA floating point texture formats.
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 24 Jan 2004 17:02:19 +0000 (17:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 24 Jan 2004 17:02:19 +0000 (17:02 +0000)
src/mesa/main/texformat.c
src/mesa/main/texformat.h
src/mesa/main/texformat_tmp.h

index 7d366b51d79ccdf6c85f1b392f8574937397d78c..7222b77eb597608f225e27462c40aef516f01027 100644 (file)
@@ -222,6 +222,7 @@ const struct gl_texture_format _mesa_texformat_color_index = {
    fetch_texel_3d_f_color_index,       /* FetchTexel3Df */
 };
 
+/* XXX someday implement 16, 24 and 32-bit integer depth images */
 const struct gl_texture_format _mesa_texformat_depth_component = {
    MESA_FORMAT_DEPTH_COMPONENT,                /* MesaFormat */
    GL_DEPTH_COMPONENT,                 /* BaseFormat */
@@ -242,6 +243,87 @@ const struct gl_texture_format _mesa_texformat_depth_component = {
    fetch_texel_3d_f_depth_component,   /* FetchTexel3Df */
 };
 
+const struct gl_texture_format _mesa_texformat_rgba_float32 = {
+   MESA_FORMAT_RGBA_FLOAT32,           /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   8 * sizeof(GLfloat),                        /* RedBits */
+   8 * sizeof(GLfloat),                        /* GreenBits */
+   8 * sizeof(GLfloat),                        /* BlueBits */
+   8 * sizeof(GLfloat),                        /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLfloat),                        /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgba_f32,          /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_f32,          /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba_f32,          /* FetchTexel3Df */
+};
+
+const struct gl_texture_format _mesa_texformat_rgba_float16 = {
+   MESA_FORMAT_RGBA_FLOAT16,           /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   8 * sizeof(GLhalfNV),               /* RedBits */
+   8 * sizeof(GLhalfNV),               /* GreenBits */
+   8 * sizeof(GLhalfNV),               /* BlueBits */
+   8 * sizeof(GLhalfNV),               /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLhalfNV),                       /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgba_f16,          /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_f16,          /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba_f16,          /* FetchTexel3Df */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_float32 = {
+   MESA_FORMAT_RGB_FLOAT32,            /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   8 * sizeof(GLfloat),                        /* RedBits */
+   8 * sizeof(GLfloat),                        /* GreenBits */
+   8 * sizeof(GLfloat),                        /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLfloat),                        /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgb_f32,           /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_f32,           /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb_f32,           /* FetchTexel3Df */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_float16 = {
+   MESA_FORMAT_RGB_FLOAT16,            /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   8 * sizeof(GLhalfNV),               /* RedBits */
+   8 * sizeof(GLhalfNV),               /* GreenBits */
+   8 * sizeof(GLhalfNV),               /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLhalfNV),                       /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgb_f16,           /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_f16,           /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb_f16,           /* FetchTexel3Df */
+};
+
+
 /*@}*/
 
 
@@ -855,15 +937,16 @@ _mesa_is_hardware_tex_format( const struct gl_texture_format *format )
 
 
 /**
- * Choose an appropriate texture format.
+ * Choose an appropriate texture format given the format, type and
+ * internalFormat parameters passed to glTexImage().
  *
- * \param ctx GL context.
- * \param internalFormat internal texture format.
- * \param format pixel format.
- * \param type data type.
+ * \param ctx  the GL context.
+ * \param internalFormat  user's prefered internal texture format.
+ * \param format  incoming image pixel format.
+ * \param type  incoming image data type.
  *
- * \return a pointer to a gl_texture_format in which to store the texture on
- * success, or NULL on failure.
+ * \return a pointer to a gl_texture_format object which describes the
+ * choosen texture format, or NULL on failure.
  * 
  * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
  * typically override this function with a specialized version.
@@ -1046,6 +1129,17 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
       else
          return NULL;
 
+   /* XXX prototype/example code */
+   /* GL_ATI_texture_float or GL_NV_float_buffer */
+   case GL_RGBA_FLOAT32_ATI:
+      return &_mesa_texformat_rgba_float32;
+   case GL_RGBA_FLOAT16_ATI:
+      return &_mesa_texformat_rgba_float16;
+   case GL_RGB_FLOAT32_ATI:
+      return &_mesa_texformat_rgb_float32;
+   case GL_RGB_FLOAT16_ATI:
+      return &_mesa_texformat_rgb_float16;
+
    default:
       _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
       return NULL;
index c43da46d7b11788b21a837b8f3804bb98e172207..67bd4b5133c0c5931544362014dfcd253495a1b1 100644 (file)
@@ -75,12 +75,17 @@ enum _format {
    MESA_FORMAT_YCBCR_REV,      /*                     UorV UorV YYYY YYYY */
    /*@}*/
 
+   /**
+    * \name Compressed texture formats.
+    */
+   /*@{*/
    MESA_FORMAT_RGB_FXT1,
    MESA_FORMAT_RGBA_FXT1,
    MESA_FORMAT_RGB_DXT1,
    MESA_FORMAT_RGBA_DXT1,
    MESA_FORMAT_RGBA_DXT3,
    MESA_FORMAT_RGBA_DXT5,
+   /*@}*/
 
 #if 0
    /** 
@@ -108,8 +113,8 @@ enum _format {
     * converted to one of these formats.  Components are arrays of GLchan
     * values, so there will be no big/little endian issues.
     *
-    * \note Because these are based on the GLchan data type, one cannot assume 8
-    * bits per channel with these formats.  If you require GLubyte channels,
+    * \note Because these are based on the GLchan data type, one cannot assume
+    * bits per channel with these formats.  If you require GLubyte channels,
     * use one of the hardware formats above.
     */
    /*@{*/
@@ -120,7 +125,17 @@ enum _format {
    MESA_FORMAT_LUMINANCE_ALPHA,
    MESA_FORMAT_INTENSITY,
    MESA_FORMAT_COLOR_INDEX,
-   MESA_FORMAT_DEPTH_COMPONENT
+   /*@}*/
+
+   /**
+    * \name Floating point texture formats.
+    */
+   /*@{*/
+   MESA_FORMAT_DEPTH_COMPONENT,
+   MESA_FORMAT_RGBA_FLOAT32,
+   MESA_FORMAT_RGBA_FLOAT16,
+   MESA_FORMAT_RGB_FLOAT32,
+   MESA_FORMAT_RGB_FLOAT16
    /*@}*/
 };
 
@@ -145,7 +160,15 @@ extern const struct gl_texture_format _mesa_texformat_luminance;
 extern const struct gl_texture_format _mesa_texformat_luminance_alpha;
 extern const struct gl_texture_format _mesa_texformat_intensity;
 extern const struct gl_texture_format _mesa_texformat_color_index;
+/*@}*/
+
+/** Floating point texture formats */
+/*@{*/
 extern const struct gl_texture_format _mesa_texformat_depth_component;
+extern const struct gl_texture_format _mesa_texformat_rgba_float32;
+extern const struct gl_texture_format _mesa_texformat_rgba_float16;
+extern const struct gl_texture_format _mesa_texformat_rgb_float32;
+extern const struct gl_texture_format _mesa_texformat_rgb_float16;
 /*@}*/
 
 /** \name The hardware-friendly formats */
index 061f11daca34b58f8cb7a4abbf5583403a222e01..cf1b3d87a44fedb7513e310d6eb0af0db08c6ffc 100644 (file)
        ((GLubyte *)(t)->Data + (i) * (sz))
 #define USHORT_SRC( t, i, j, k )                                       \
        ((GLushort *)(t)->Data + (i))
-#define FLOAT_SRC( t, i, j, k )                                                \
-       ((GLfloat *)(t)->Data + (i))
+#define FLOAT_SRC( t, i, j, k, sz )                                    \
+       ((GLfloat *)(t)->Data + (i) * (sz))
+#define HALF_SRC( t, i, j, k, sz )                                     \
+       ((GLhalfNV *)(t)->Data + (i) * (sz))
 
 #define FETCH(x) fetch_texel_1d_##x
 
        ((GLubyte *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
 #define USHORT_SRC( t, i, j, k )                                       \
        ((GLushort *)(t)->Data + ((t)->RowStride * (j) + (i)))
-#define FLOAT_SRC( t, i, j, k )                                                \
-       ((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i)))
+#define FLOAT_SRC( t, i, j, k, sz )                                    \
+       ((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
+#define HALF_SRC( t, i, j, k, sz )                                     \
+       ((GLhalfNV *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
 
 #define FETCH(x) fetch_texel_2d_##x
 
 #define USHORT_SRC( t, i, j, k )                                       \
        ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) *           \
                                  (t)->RowStride + (i)))
-#define FLOAT_SRC( t, i, j, k )                                                \
+#define FLOAT_SRC( t, i, j, k, sz )                                    \
        ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) *            \
-                                 (t)->RowStride + (i)))
+                                 (t)->RowStride + (i)) * (sz))
+#define HALF_SRC( t, i, j, k, sz )                                     \
+       ((GLhalfNV *)(t)->Data + (((t)->Height * (k) + (j)) *           \
+                                 (t)->RowStride + (i)) * (sz))
 
 #define FETCH(x) fetch_texel_3d_##x
 
@@ -225,8 +232,7 @@ static void FETCH(color_index)( const struct gl_texture_image *texImage,
                                GLint i, GLint j, GLint k, GLchan *texel )
 {
    const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
-   GLchan *index = (GLchan *) texel;
-   index[0] = src[0];
+   texel[0] = src[0];
 }
 
 /* Fetch CI texel from 1D, 2D or 3D CI texture, returning 1 GLfloat */
@@ -238,31 +244,75 @@ static void FETCH(f_color_index)( const struct gl_texture_image *texImage,
 }
 
 
-#if 000
 /* Fetch depth texel from 1D, 2D or 3D DEPTH texture, returning 1 GLfloat */
-static void FETCH(depth_component)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLchan *texel )
+/* Note: no GLchan version of this function */
+static void FETCH(f_depth_component)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
 {
-#if 0
-   const GLfloat *src = FLOAT_SRC( texImage, i, j, k );
-   GLfloat *depth = (GLfloat *) texel;
-   depth[0] = src[0];
-#else
-   _mesa_problem(NULL, "fetching depth component as non-float!");
-#endif
+   const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
+   texel[0] = src[0];
 }
-#endif
 
 
-/* Fetch depth texel from 1D, 2D or 3D DEPTH texture, returning 1 GLfloat */
-static void FETCH(f_depth_component)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
+/* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgba_f32)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
 {
-   const GLfloat *src = FLOAT_SRC( texImage, i, j, k );
-   texel[0] = src[0];
+   const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 4 );
+   texel[RCOMP] = src[0];
+   texel[GCOMP] = src[1];
+   texel[BCOMP] = src[2];
+   texel[ACOMP] = src[3];
+}
+
+/* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgba_f16)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfNV *src = HALF_SRC( texImage, i, j, k, 4 );
+   texel[RCOMP] = _mesa_half_to_float(src[0]);
+   texel[GCOMP] = _mesa_half_to_float(src[1]);
+   texel[BCOMP] = _mesa_half_to_float(src[2]);
+   texel[ACOMP] = _mesa_half_to_float(src[3]);
+}
+
+
+/* Fetch color texel from 1D, 2D or 3D RGB_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgb_f32)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 3 );
+   texel[RCOMP] = src[0];
+   texel[GCOMP] = src[1];
+   texel[BCOMP] = src[2];
+   texel[ACOMP] = CHAN_MAXF;
+}
+
+/* Fetch color texel from 1D, 2D or 3D RGB_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgb_f16)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfNV *src = HALF_SRC( texImage, i, j, k, 3 );
+   texel[RCOMP] = _mesa_half_to_float(src[0]);
+   texel[GCOMP] = _mesa_half_to_float(src[1]);
+   texel[BCOMP] = _mesa_half_to_float(src[2]);
+   texel[ACOMP] = CHAN_MAXF;
 }
 
 
+
+/*
+ * Begin Hardware formats
+ */
+
 /* Fetch color texel from 1D, 2D or 3D rgba8888 texture, return 4 GLchans */
 static void FETCH(rgba8888)( const struct gl_texture_image *texImage,
                             GLint i, GLint j, GLint k, GLchan *texel )
@@ -350,10 +400,9 @@ static void FETCH(f_rgb565)( const struct gl_texture_image *texImage,
 {
    const GLushort *src = USHORT_SRC( texImage, i, j, k );
    const GLushort s = *src;
-   /* xxx fixup */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 8) & 0xf8) * 255 / 0xf8 );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 3) & 0xfc) * 255 / 0xfc );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) * 255 / 0xf8 );
+   texel[RCOMP] = ((s >> 8) & 0xf8) * (1.0F / 248.0F);
+   texel[GCOMP] = ((s >> 3) & 0xfc) * (1.0F / 252.0F);
+   texel[BCOMP] = ((s << 3) & 0xf8) * (1.0F / 248.0F);
    texel[ACOMP] = CHAN_MAXF;
 }
 
@@ -376,11 +425,10 @@ static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
 {
    const GLushort *src = USHORT_SRC( texImage, i, j, k );
    const GLushort s = *src;
-   /* xxx fixup */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >>  8) & 0xf) * 255 / 0xf );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >>  4) & 0xf) * 255 / 0xf );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s      ) & 0xf) * 255 / 0xf );
-   texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 12) & 0xf) * 255 / 0xf );
+   texel[RCOMP] = ((s >>  8) & 0xf) * (1.0F / 15.0F);
+   texel[GCOMP] = ((s >>  4) & 0xf) * (1.0F / 15.0F);
+   texel[BCOMP] = ((s      ) & 0xf) * (1.0F / 15.0F);
+   texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
 }
 
 
@@ -402,11 +450,10 @@ static void FETCH(f_argb1555)( const struct gl_texture_image *texImage,
 {
    const GLushort *src = USHORT_SRC( texImage, i, j, k );
    const GLushort s = *src;
-   /* xxx better */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 10) & 0x1f) * 255 / 0x1f );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >>  5) & 0x1f) * 255 / 0x1f );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s      ) & 0x1f) * 255 / 0x1f );
-   texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 );
+   texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F);
+   texel[GCOMP] = ((s >>  5) & 0x1f) * (1.0F / 31.0F);
+   texel[BCOMP] = ((s      ) & 0x1f) * (1.0F / 31.0F);
+   texel[ACOMP] = ((s >> 15) & 0x01);
 }
 
 
@@ -451,10 +498,9 @@ static void FETCH(f_rgb332)( const struct gl_texture_image *texImage,
 {
    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
    const GLubyte s = *src;
-   /* xxx improve */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s     ) & 0xe0) * 255 / 0xe0 );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xe0) * 255 / 0xe0 );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 5) & 0xc0) * 255 / 0xc0 );
+   texel[RCOMP] = ((s     ) & 0xe0) * (1.0F / 224.0F);
+   texel[GCOMP] = ((s << 3) & 0xe0) * (1.0F / 224.0F);
+   texel[BCOMP] = ((s << 5) & 0xc0) * (1.0F / 192.0F);
    texel[ACOMP] = CHAN_MAXF;
 }
 
@@ -647,7 +693,6 @@ static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage,
 
 /* Fetch color texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats */
 /* We convert YCbCr to RGB here */
-/* XXX this may break if GLchan != GLubyte */
 static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
                                 GLint i, GLint j, GLint k, GLfloat *texel )
 {
@@ -885,5 +930,6 @@ static void FETCH(bgr233)( const struct gl_texture_image *texImage,
 #undef UBYTE_SRC
 #undef USHORT_SRC
 #undef FLOAT_SRC
+#undef HALF_SRC
 #undef FETCH
 #undef DIM