mesa: fix AtomicBuffer typo in _mesa_DeleteBuffers
[mesa.git] / src / mesa / main / texcompress_s3tc.c
index 4c162b109667db69c6ccbf939bb874e3bc605e0c..bfb53dce48d07f950717fa6c9546b90b8fdd8de6 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5.3
  *
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  * Copyright (c) 2008 VMware, Inc.
  * 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
- * 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.
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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 "texcompress_s3tc.h"
 #include "texstore.h"
 #include "format_unpack.h"
+#include "util/format_srgb.h"
 
 
 #if defined(_WIN32) || defined(WIN32)
 #define DXTN_LIBNAME "dxtn.dll"
 #define RTLD_LAZY 0
 #define RTLD_GLOBAL 0
-#elif defined(__DJGPP__)
-#define DXTN_LIBNAME "dxtn.dxe"
 #else
 #define DXTN_LIBNAME "libtxc_dxtn.so"
 #endif
@@ -143,14 +142,19 @@ _mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS)
        srcPacking->RowLength != srcWidth ||
        srcPacking->SwapBytes) {
       /* convert image to RGB/GLubyte */
-      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
-                                             baseInternalFormat,
-                                             _mesa_get_format_base_format(dstFormat),
-                                             srcWidth, srcHeight, srcDepth,
-                                             srcFormat, srcType, srcAddr,
-                                             srcPacking);
+      GLubyte *tempImageSlices[1];
+      int rgbRowStride = 3 * srcWidth * sizeof(GLubyte);
+      tempImage = malloc(srcWidth * srcHeight * 3 * sizeof(GLubyte));
       if (!tempImage)
          return GL_FALSE; /* out of memory */
+      tempImageSlices[0] = (GLubyte *) tempImage;
+      _mesa_texstore(ctx, dims,
+                     baseInternalFormat,
+                     MESA_FORMAT_RGB_UNORM8,
+                     rgbRowStride, tempImageSlices,
+                     srcWidth, srcHeight, srcDepth,
+                     srcFormat, srcType, srcAddr,
+                     srcPacking);
       pixels = tempImage;
       srcFormat = GL_RGB;
    }
@@ -195,14 +199,19 @@ _mesa_texstore_rgba_dxt1(TEXSTORE_PARAMS)
        srcPacking->RowLength != srcWidth ||
        srcPacking->SwapBytes) {
       /* convert image to RGBA/GLubyte */
-      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
-                                             baseInternalFormat,
-                                             _mesa_get_format_base_format(dstFormat),
-                                             srcWidth, srcHeight, srcDepth,
-                                             srcFormat, srcType, srcAddr,
-                                             srcPacking);
+      GLubyte *tempImageSlices[1];
+      int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+      tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
       if (!tempImage)
          return GL_FALSE; /* out of memory */
+      tempImageSlices[0] = (GLubyte *) tempImage;
+      _mesa_texstore(ctx, dims,
+                     baseInternalFormat,
+                     MESA_FORMAT_R8G8B8A8_UNORM,
+                     rgbaRowStride, tempImageSlices,
+                     srcWidth, srcHeight, srcDepth,
+                     srcFormat, srcType, srcAddr,
+                     srcPacking);
       pixels = tempImage;
       srcFormat = GL_RGBA;
    }
@@ -247,14 +256,19 @@ _mesa_texstore_rgba_dxt3(TEXSTORE_PARAMS)
        srcPacking->RowLength != srcWidth ||
        srcPacking->SwapBytes) {
       /* convert image to RGBA/GLubyte */
-      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
-                                             baseInternalFormat,
-                                             _mesa_get_format_base_format(dstFormat),
-                                             srcWidth, srcHeight, srcDepth,
-                                             srcFormat, srcType, srcAddr,
-                                             srcPacking);
+      GLubyte *tempImageSlices[1];
+      int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+      tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
       if (!tempImage)
          return GL_FALSE; /* out of memory */
+      tempImageSlices[0] = (GLubyte *) tempImage;
+      _mesa_texstore(ctx, dims,
+                     baseInternalFormat,
+                     MESA_FORMAT_R8G8B8A8_UNORM,
+                     rgbaRowStride, tempImageSlices,
+                     srcWidth, srcHeight, srcDepth,
+                     srcFormat, srcType, srcAddr,
+                     srcPacking);
       pixels = tempImage;
    }
    else {
@@ -298,14 +312,19 @@ _mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
        srcPacking->RowLength != srcWidth ||
        srcPacking->SwapBytes) {
       /* convert image to RGBA/GLubyte */
-      tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
-                                             baseInternalFormat,
-                                            _mesa_get_format_base_format(dstFormat),
-                                             srcWidth, srcHeight, srcDepth,
-                                             srcFormat, srcType, srcAddr,
-                                             srcPacking);
+      GLubyte *tempImageSlices[1];
+      int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+      tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
       if (!tempImage)
          return GL_FALSE; /* out of memory */
+      tempImageSlices[0] = (GLubyte *) tempImage;
+      _mesa_texstore(ctx, dims,
+                     baseInternalFormat,
+                     MESA_FORMAT_R8G8B8A8_UNORM,
+                     rgbaRowStride, tempImageSlices,
+                     srcWidth, srcHeight, srcDepth,
+                     srcFormat, srcType, srcAddr,
+                     srcPacking);
       pixels = tempImage;
    }
    else {
@@ -344,13 +363,12 @@ problem(const char *func)
 
 
 static void
-fetch_rgb_dxt1(const GLubyte *map, const GLuint imageOffsets[],
-               GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_rgb_dxt1(const GLubyte *map,
+               GLint rowStride, GLint i, GLint j, 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);
+      fetch_ext_rgb_dxt1(rowStride, map, i, j, tex);
       texel[RCOMP] = UBYTE_TO_FLOAT(tex[RCOMP]);
       texel[GCOMP] = UBYTE_TO_FLOAT(tex[GCOMP]);
       texel[BCOMP] = UBYTE_TO_FLOAT(tex[BCOMP]);
@@ -362,13 +380,12 @@ fetch_rgb_dxt1(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_rgba_dxt1(const GLubyte *map, const GLuint imageOffsets[],
-                GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_rgba_dxt1(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j, 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);
+      fetch_ext_rgba_dxt1(rowStride, map, i, j, tex);
       texel[RCOMP] = UBYTE_TO_FLOAT(tex[RCOMP]);
       texel[GCOMP] = UBYTE_TO_FLOAT(tex[GCOMP]);
       texel[BCOMP] = UBYTE_TO_FLOAT(tex[BCOMP]);
@@ -380,13 +397,12 @@ fetch_rgba_dxt1(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_rgba_dxt3(const GLubyte *map, const GLuint imageOffsets[],
-                GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_rgba_dxt3(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j, 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);
+      fetch_ext_rgba_dxt3(rowStride, map, i, j, tex);
       texel[RCOMP] = UBYTE_TO_FLOAT(tex[RCOMP]);
       texel[GCOMP] = UBYTE_TO_FLOAT(tex[GCOMP]);
       texel[BCOMP] = UBYTE_TO_FLOAT(tex[BCOMP]);
@@ -398,13 +414,12 @@ fetch_rgba_dxt3(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_rgba_dxt5(const GLubyte *map, const GLuint imageOffsets[],
-                GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_rgba_dxt5(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j, 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);
+      fetch_ext_rgba_dxt5(rowStride, map, i, j, tex);
       texel[RCOMP] = UBYTE_TO_FLOAT(tex[RCOMP]);
       texel[GCOMP] = UBYTE_TO_FLOAT(tex[GCOMP]);
       texel[BCOMP] = UBYTE_TO_FLOAT(tex[BCOMP]);
@@ -417,16 +432,15 @@ 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)
+fetch_srgb_dxt1(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j, 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]);
+      fetch_ext_rgb_dxt1(rowStride, map, i, j, tex);
+      texel[RCOMP] = util_format_srgb_8unorm_to_linear_float(tex[RCOMP]);
+      texel[GCOMP] = util_format_srgb_8unorm_to_linear_float(tex[GCOMP]);
+      texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(tex[BCOMP]);
       texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
    }
    else {
@@ -435,16 +449,15 @@ fetch_srgb_dxt1(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_srgba_dxt1(const GLubyte *map, const GLuint imageOffsets[],
-                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_srgba_dxt1(const GLubyte *map,
+                 GLint rowStride, GLint i, GLint j, 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]);
+      fetch_ext_rgba_dxt1(rowStride, map, i, j, tex);
+      texel[RCOMP] = util_format_srgb_8unorm_to_linear_float(tex[RCOMP]);
+      texel[GCOMP] = util_format_srgb_8unorm_to_linear_float(tex[GCOMP]);
+      texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(tex[BCOMP]);
       texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
    }
    else {
@@ -453,16 +466,15 @@ fetch_srgba_dxt1(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_srgba_dxt3(const GLubyte *map, const GLuint imageOffsets[],
-                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_srgba_dxt3(const GLubyte *map,
+                 GLint rowStride, GLint i, GLint j, 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]);
+      fetch_ext_rgba_dxt3(rowStride, map, i, j, tex);
+      texel[RCOMP] = util_format_srgb_8unorm_to_linear_float(tex[RCOMP]);
+      texel[GCOMP] = util_format_srgb_8unorm_to_linear_float(tex[GCOMP]);
+      texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(tex[BCOMP]);
       texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
    }
    else {
@@ -471,16 +483,15 @@ fetch_srgba_dxt3(const GLubyte *map, const GLuint imageOffsets[],
 }
 
 static void
-fetch_srgba_dxt5(const GLubyte *map, const GLuint imageOffsets[],
-                 GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+fetch_srgba_dxt5(const GLubyte *map,
+                 GLint rowStride, GLint i, GLint j, 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]);
+      fetch_ext_rgba_dxt5(rowStride, map, i, j, tex);
+      texel[RCOMP] = util_format_srgb_8unorm_to_linear_float(tex[RCOMP]);
+      texel[GCOMP] = util_format_srgb_8unorm_to_linear_float(tex[GCOMP]);
+      texel[BCOMP] = util_format_srgb_8unorm_to_linear_float(tex[BCOMP]);
       texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]);
    }
    else {
@@ -491,7 +502,7 @@ fetch_srgba_dxt5(const GLubyte *map, const GLuint imageOffsets[],
 
 
 compressed_fetch_func
-_mesa_get_dxt_fetch_func(gl_format format)
+_mesa_get_dxt_fetch_func(mesa_format format)
 {
    switch (format) {
    case MESA_FORMAT_RGB_DXT1: