Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / mesa / drivers / dri / sis / sis_texstate.c
index 021919b0a42ad0d9a0e6f4aedd78a6bc42ca44fb..daec2393211b3809cd0241aceebbfbbcab59032e 100644 (file)
@@ -24,7 +24,6 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
-/* $XFree86$ */
 
 /*
  * Authors:
@@ -32,14 +31,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
  *   Eric Anholt <anholt@FreeBSD.org>
  */
 
-#include "glheader.h"
-#include "imports.h"
-#include "context.h"
-#include "macros.h"
-#include "texformat.h"
+#include "main/glheader.h"
+#include "main/imports.h"
+#include "main/colormac.h"
+#include "main/context.h"
+#include "main/macros.h"
 
 #include "sis_context.h"
-#include "sis_state.h"
 #include "sis_tex.h"
 #include "sis_tris.h"
 #include "sis_alloc.h"
@@ -48,11 +46,12 @@ static GLint TransferTexturePitch (GLint dwPitch);
 
 /* Handle texenv stuff, called from validate_texture (renderstart) */
 static void
-sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
+sis_set_texture_env0( struct gl_context *ctx, struct gl_texture_object *texObj,
    int unit )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
-   
+   GLubyte c[4];
+
    __GLSiSHardware *prev = &smesa->prev;
    __GLSiSHardware *current = &smesa->current;
 
@@ -63,7 +62,6 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
    switch (texture_unit->EnvMode)
    {
    case GL_REPLACE:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 0);
       switch (t->format)
       {
       case GL_ALPHA:
@@ -72,6 +70,7 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor0 = STAGE0_C_CS;
          current->hwTexBlendAlpha0 = STAGE0_A_AF;
          break;
@@ -81,11 +80,12 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor0 = STAGE0_C_CS;
          current->hwTexBlendAlpha0 = STAGE0_A_AS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_MODULATE:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 0);
       switch (t->format)
       {
       case GL_ALPHA:
@@ -94,6 +94,7 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor0 = STAGE0_C_CFCS;
          current->hwTexBlendAlpha0 = STAGE0_A_AF;
          break;
@@ -103,14 +104,16 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor0 = STAGE0_C_CFCS;
          current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_DECAL:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 0);
       switch (t->format)
       {
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor0 = STAGE0_C_CS;
          current->hwTexBlendAlpha0 = STAGE0_A_AF;
          break;
@@ -118,19 +121,24 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor0 = STAGE0_C_CFOMAS_CSAS;
          current->hwTexBlendAlpha0 = STAGE0_A_AF;
          break;
+      case GL_ALPHA:
+      case GL_LUMINANCE:
+      case GL_INTENSITY:
+      case GL_LUMINANCE_ALPHA:
+         current->hwTexBlendColor0 = STAGE0_C_CF;
+         current->hwTexBlendAlpha0 = STAGE0_A_AF;
+         break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_BLEND:
-#if 1 /* XXX Blending broken */
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 1);
-#else
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 0);
-      current->hwTexEnvColor =
-         ((GLint) (texture_unit->EnvColor[3])) << 24 |
-         ((GLint) (texture_unit->EnvColor[0])) << 16 |
-         ((GLint) (texture_unit->EnvColor[1])) << 8 |
-         ((GLint) (texture_unit->EnvColor[2]));
+      UNCLAMPED_FLOAT_TO_RGBA_CHAN(c, texture_unit->EnvColor);
+      current->hwTexEnvColor = ((GLint) (c[3])) << 24 |
+                              ((GLint) (c[0])) << 16 |
+                              ((GLint) (c[1])) << 8 |
+                              ((GLint) (c[2]));
       switch (t->format)
       {
       case GL_ALPHA:
@@ -139,6 +147,7 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor0 = STAGE0_C_CFOMCS_CCCS;
          current->hwTexBlendAlpha0 = STAGE0_A_AF;
          break;
@@ -151,9 +160,13 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor0 = STAGE0_C_CFOMCS_CCCS;
          current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
-#endif
+
+   default:
+      sis_fatal_error("unknown env mode 0x%x\n", texture_unit->EnvMode);
    }
 
    if ((current->hwTexBlendColor0 != prev->hwTexBlendColor0) ||
@@ -169,10 +182,11 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,
 
 /* Handle texenv stuff, called from validate_texture (renderstart) */
 static void
-sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
+sis_set_texture_env1( struct gl_context *ctx, struct gl_texture_object *texObj,
    int unit)
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
+   GLubyte c[4];
 
    __GLSiSHardware *prev = &smesa->prev;
    __GLSiSHardware *current = &smesa->current;
@@ -184,7 +198,6 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
    switch (texture_unit->EnvMode)
    {
    case GL_REPLACE:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV1, 0);
       switch (t->format)
       {
       case GL_ALPHA:
@@ -193,6 +206,7 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor1 = STAGE1_C_CS;
          current->hwTexBlendAlpha1 = STAGE1_A_AF;
          break;
@@ -202,11 +216,12 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor1 = STAGE1_C_CS;
          current->hwTexBlendAlpha1 = STAGE1_A_AS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_MODULATE:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV1, 0);
       switch (t->format)
       {
       case GL_ALPHA:
@@ -215,6 +230,7 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor1 = STAGE1_C_CFCS;
          current->hwTexBlendAlpha1 = STAGE1_A_AF;
          break;
@@ -224,14 +240,16 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor1 = STAGE1_C_CFCS;
          current->hwTexBlendAlpha1 = STAGE1_A_AFAS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_DECAL:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV1, 0);
       switch (t->format)
       {
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor1 = STAGE1_C_CS;
          current->hwTexBlendAlpha1 = STAGE1_A_AF;
          break;
@@ -239,17 +257,24 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor1 = STAGE1_C_CFOMAS_CSAS;
          current->hwTexBlendAlpha1 = STAGE1_A_AF;
          break;
+      case GL_ALPHA:
+      case GL_LUMINANCE:
+      case GL_INTENSITY:
+      case GL_LUMINANCE_ALPHA:
+         current->hwTexBlendColor1 = STAGE1_C_CF;
+         current->hwTexBlendAlpha1 = STAGE1_A_AF;
+         break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
 
    case GL_BLEND:
-      FALLBACK(smesa, SIS_FALLBACK_TEXENV1, 1);
-#if 0 /* XXX Blending broken */
-      current->hwTexEnvColor =
-         ((GLint) (texture_unit->EnvColor[3])) << 24 |
-         ((GLint) (texture_unit->EnvColor[0])) << 16 |
-         ((GLint) (texture_unit->EnvColor[1])) << 8 |
-         ((GLint) (texture_unit->EnvColor[2]));
+      UNCLAMPED_FLOAT_TO_RGBA_CHAN(c, texture_unit->EnvColor);
+      current->hwTexEnvColor = ((GLint) (c[3])) << 24 |
+                              ((GLint) (c[0])) << 16 |
+                              ((GLint) (c[1])) << 8 |
+                              ((GLint) (c[2]));
       switch (t->format)
       {
       case GL_ALPHA:
@@ -258,6 +283,7 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          break;
       case GL_LUMINANCE:
       case GL_RGB:
+      case GL_YCBCR_MESA:
          current->hwTexBlendColor1 = STAGE1_C_CFOMCS_CCCS;
          current->hwTexBlendAlpha1 = STAGE1_A_AF;
          break;
@@ -270,9 +296,13 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
          current->hwTexBlendColor1 = STAGE1_C_CFOMCS_CCCS;
          current->hwTexBlendAlpha1 = STAGE1_A_AFAS;
          break;
+      default:
+        sis_fatal_error("unknown base format 0x%x\n", t->format);
       }
       break;
-#endif
+
+   default:
+      sis_fatal_error("unknown env mode 0x%x\n", texture_unit->EnvMode);
    }
 
    if ((current->hwTexBlendColor1 != prev->hwTexBlendColor1) ||
@@ -288,7 +318,7 @@ sis_set_texture_env1( GLcontext *ctx, struct gl_texture_object *texObj,
 
 /* Returns 0 if a software fallback is necessary */
 static GLboolean
-sis_set_texobj_parm( GLcontext *ctx, struct gl_texture_object *texObj,
+sis_set_texobj_parm( struct gl_context *ctx, struct gl_texture_object *texObj,
    int hw_unit )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
@@ -424,11 +454,16 @@ sis_set_texobj_parm( GLcontext *ctx, struct gl_texture_object *texObj,
       break;
    }
 
-   current->texture[hw_unit].hwTextureBorderColor = 
-      ((GLuint) texObj->_BorderChan[3] << 24) + 
-      ((GLuint) texObj->_BorderChan[0] << 16) + 
-      ((GLuint) texObj->_BorderChan[1] << 8) + 
-      ((GLuint) texObj->_BorderChan[2]);
+   {
+      GLubyte c[4];
+      CLAMPED_FLOAT_TO_UBYTE(c[0], texObj->BorderColor.f[0]);
+      CLAMPED_FLOAT_TO_UBYTE(c[1], texObj->BorderColor.f[1]);
+      CLAMPED_FLOAT_TO_UBYTE(c[2], texObj->BorderColor.f[2]);
+      CLAMPED_FLOAT_TO_UBYTE(c[3], texObj->BorderColor.f[3]);
+
+      current->texture[hw_unit].hwTextureBorderColor = 
+         PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
+   }
 
    if (current->texture[hw_unit].hwTextureBorderColor !=
        prev->texture[hw_unit].hwTextureBorderColor) 
@@ -548,7 +583,7 @@ sis_set_texobj_parm( GLcontext *ctx, struct gl_texture_object *texObj,
 
 /* Disable a texture unit, called from validate_texture */
 static void
-sis_reset_texture_env (GLcontext *ctx, int hw_unit)
+sis_reset_texture_env (struct gl_context *ctx, int hw_unit)
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
 
@@ -585,7 +620,7 @@ sis_reset_texture_env (GLcontext *ctx, int hw_unit)
    }
 }
 
-static void updateTextureUnit( GLcontext *ctx, int unit )
+static void updateTextureUnit( struct gl_context *ctx, int unit )
 {
    sisContextPtr smesa = SIS_CONTEXT( ctx );
    const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
@@ -621,7 +656,7 @@ static void updateTextureUnit( GLcontext *ctx, int unit )
 }
 
 
-void sisUpdateTextureState( GLcontext *ctx )
+void sisUpdateTextureState( struct gl_context *ctx )
 {
    sisContextPtr smesa = SIS_CONTEXT( ctx );
    int i;