mesa: Change "BRIAN PAUL" to "THE AUTHORS" in license text.
[mesa.git] / src / mesa / main / texcompress_s3tc.c
index 9595c849b53fd024e1f46e8b3373ca38d7acd06d..acf46f48da7cdef6f7bedccb978675c7f9a3a481 100644 (file)
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 #include "dlopen.h"
 #include "image.h"
 #include "macros.h"
-#include "mfeatures.h"
 #include "mtypes.h"
 #include "texcompress.h"
 #include "texcompress_s3tc.h"
 #include "texstore.h"
-#include "swrast/s_context.h"
 #include "format_unpack.h"
 
 
@@ -332,170 +330,6 @@ _mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
 }
 
 
-static void
-fetch_texel_2d_rgb_dxt1(const struct swrast_texture_image *texImage,
-                        GLint i, GLint j, GLint k, GLubyte *texel)
-{
-   if (fetch_ext_rgb_dxt1) {
-      GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
-      fetch_ext_rgb_dxt1(texImage->RowStride,
-                         texImage->Map + sliceOffset, i, j, texel);
-   }
-   else
-      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgb_dxt1");
-}
-
-
-void
-_mesa_fetch_texel_rgb_dxt1(const struct swrast_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba);
-   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
-   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
-   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-
-static void
-fetch_texel_2d_rgba_dxt1(const struct swrast_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLubyte *texel)
-{
-   if (fetch_ext_rgba_dxt1) {
-      GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
-      fetch_ext_rgba_dxt1(texImage->RowStride,
-                          texImage->Map + sliceOffset, i, j, texel);
-   }
-   else
-      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt1\n");
-}
-
-
-void
-_mesa_fetch_texel_rgba_dxt1(const struct swrast_texture_image *texImage,
-                            GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba);
-   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
-   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
-   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-
-static void
-fetch_texel_2d_rgba_dxt3(const struct swrast_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLubyte *texel)
-{
-   if (fetch_ext_rgba_dxt3) {
-      GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
-      fetch_ext_rgba_dxt3(texImage->RowStride,
-                          texImage->Map + sliceOffset, i, j, texel);
-   }
-   else
-      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt3\n");
-}
-
-
-void
-_mesa_fetch_texel_rgba_dxt3(const struct swrast_texture_image *texImage,
-                            GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba);
-   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
-   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
-   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-
-static void
-fetch_texel_2d_rgba_dxt5(const struct swrast_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLubyte *texel)
-{
-   if (fetch_ext_rgba_dxt5) {
-      GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
-      fetch_ext_rgba_dxt5(texImage->RowStride,
-                          texImage->Map + sliceOffset, i, j, texel);
-   }
-   else
-      _mesa_debug(NULL, "attempted to decode s3tc texture without library available: fetch_texel_2d_rgba_dxt5\n");
-}
-
-
-void
-_mesa_fetch_texel_rgba_dxt5(const struct swrast_texture_image *texImage,
-                            GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba);
-   texel[RCOMP] = UBYTE_TO_FLOAT(rgba[RCOMP]);
-   texel[GCOMP] = UBYTE_TO_FLOAT(rgba[GCOMP]);
-   texel[BCOMP] = UBYTE_TO_FLOAT(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-void
-_mesa_fetch_texel_srgb_dxt1(const struct swrast_texture_image *texImage,
-                            GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba);
-   texel[RCOMP] = _mesa_nonlinear_to_linear(rgba[RCOMP]);
-   texel[GCOMP] = _mesa_nonlinear_to_linear(rgba[GCOMP]);
-   texel[BCOMP] = _mesa_nonlinear_to_linear(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-void
-_mesa_fetch_texel_srgba_dxt1(const struct swrast_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba);
-   texel[RCOMP] = _mesa_nonlinear_to_linear(rgba[RCOMP]);
-   texel[GCOMP] = _mesa_nonlinear_to_linear(rgba[GCOMP]);
-   texel[BCOMP] = _mesa_nonlinear_to_linear(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-void
-_mesa_fetch_texel_srgba_dxt3(const struct swrast_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba);
-   texel[RCOMP] = _mesa_nonlinear_to_linear(rgba[RCOMP]);
-   texel[GCOMP] = _mesa_nonlinear_to_linear(rgba[GCOMP]);
-   texel[BCOMP] = _mesa_nonlinear_to_linear(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-void
-_mesa_fetch_texel_srgba_dxt5(const struct swrast_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   /* just sample as GLubyte and convert to float here */
-   GLubyte rgba[4];
-   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba);
-   texel[RCOMP] = _mesa_nonlinear_to_linear(rgba[RCOMP]);
-   texel[GCOMP] = _mesa_nonlinear_to_linear(rgba[GCOMP]);
-   texel[BCOMP] = _mesa_nonlinear_to_linear(rgba[BCOMP]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(rgba[ACOMP]);
-}
-
-
 /** Report problem with dxt texture decompression, once */
 static void
 problem(const char *func)
@@ -582,6 +416,80 @@ fetch_rgba_dxt5(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 
+static void
+fetch_srgb_dxt1(const GLubyte *map, const GLuint imageOffsets[],
+                GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   if (fetch_ext_rgb_dxt1) {
+      GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+      GLubyte tex[4];
+      fetch_ext_rgb_dxt1(rowStride, map + sliceOffset, i, j, tex);
+      texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]);
+      texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]);
+      texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]);
+      texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
+   }
+   else {
+      problem("srgb_dxt1");
+   }
+}
+
+static void
+fetch_srgba_dxt1(const GLubyte *map, const GLuint imageOffsets[],
+                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   if (fetch_ext_rgba_dxt1) {
+      GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+      GLubyte tex[4];
+      fetch_ext_rgba_dxt1(rowStride, map + sliceOffset, i, j, tex);
+      texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]);
+      texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]);
+      texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]);
+      texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
+   }
+   else {
+      problem("srgba_dxt1");
+   }
+}
+
+static void
+fetch_srgba_dxt3(const GLubyte *map, const GLuint imageOffsets[],
+                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   if (fetch_ext_rgba_dxt3) {
+      GLuint sliceOffset = k ? imageOffsets[k] : 0;
+      GLubyte tex[4];
+      fetch_ext_rgba_dxt3(rowStride, map + sliceOffset, i, j, tex);
+      texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]);
+      texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]);
+      texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]);
+      texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
+   }
+   else {
+      problem("srgba_dxt3");
+   }
+}
+
+static void
+fetch_srgba_dxt5(const GLubyte *map, const GLuint imageOffsets[],
+                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   if (fetch_ext_rgba_dxt5) {
+      GLuint sliceOffset = k ? imageOffsets[k] : 0;
+      GLubyte tex[4];
+      fetch_ext_rgba_dxt5(rowStride, map + sliceOffset, i, j, tex);
+      texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]);
+      texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]);
+      texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]);
+      texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
+   }
+   else {
+      problem("srgba_dxt5");
+   }
+}
+
+
+
 compressed_fetch_func
 _mesa_get_dxt_fetch_func(gl_format format)
 {
@@ -594,6 +502,14 @@ _mesa_get_dxt_fetch_func(gl_format format)
       return fetch_rgba_dxt3;
    case MESA_FORMAT_RGBA_DXT5:
       return fetch_rgba_dxt5;
+   case MESA_FORMAT_SRGB_DXT1:
+      return fetch_srgb_dxt1;
+   case MESA_FORMAT_SRGBA_DXT1:
+      return fetch_srgba_dxt1;
+   case MESA_FORMAT_SRGBA_DXT3:
+      return fetch_srgba_dxt3;
+   case MESA_FORMAT_SRGBA_DXT5:
+      return fetch_srgba_dxt5;
    default:
       return NULL;
    }