Move the computation of the viewport matrix into a new update_viewport_matrix()
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 29 Mar 2006 03:59:34 +0000 (03:59 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 29 Mar 2006 03:59:34 +0000 (03:59 +0000)
function since the matrix depends on the viewport params and the framebuffer's
depth buffer resolution.
Fixes some renderbuffer / depth range issues.
This simplifies the _mesa_set_viewport() and _mesa_DepthRange() functions too.

src/mesa/main/matrix.c
src/mesa/main/mtypes.h
src/mesa/main/state.c

index f4ec97356306f464c7adb428c965ae29d0bfffe0..069c5c9738968664acd2a2f80d5c6c13106891bb 100644 (file)
@@ -552,6 +552,7 @@ _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
    _mesa_set_viewport(ctx, x, y, width, height);
 }
 
+
 /**
  * Set new viewport parameters and update derived state (the _WindowMap
  * matrix).  Usually called from _mesa_Viewport().
@@ -560,22 +561,11 @@ _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
  * \param x, y coordinates of the lower left corner of the viewport rectangle.
  * \param width width of the viewport rectangle.
  * \param height height of the viewport rectangle.
- *
- * Verifies the parameters, clamps them to the implementation dependent range
- * and updates __GLcontextRec::Viewport. Computes the scale and bias values for
- * the drivers and notifies the driver via the dd_function_table::Viewport
- * callback.
  */
 void
 _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y,
                     GLsizei width, GLsizei height )
 {
-   const GLfloat depthMax = ctx->DrawBuffer->_DepthMaxF;
-   const GLfloat n = ctx->Viewport.Near;
-   const GLfloat f = ctx->Viewport.Far;
-
-   ASSERT(depthMax > 0);
-
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glViewport %d %d %d %d\n", x, y, width, height);
 
@@ -595,20 +585,6 @@ _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y,
    ctx->Viewport.Y = y;
    ctx->Viewport.Height = height;
 
-   /* XXX send transposed width/height to Driver.Viewport() below??? */
-   if (ctx->_RotateMode) {
-      GLint tmp, tmps;
-      tmp = x; x = y; y = tmp;
-      tmps = width; width = height; height = tmps;
-   }
-
-   /* Compute scale and bias values. This is really driver-specific
-    * and should be maintained elsewhere if at all.
-    * NOTE: RasterPos uses this.
-    */
-   _math_matrix_viewport(&ctx->Viewport._WindowMap, x, y, width, height,
-                         n, f, depthMax);
-
    ctx->NewState |= _NEW_VIEWPORT;
 
    if (ctx->Driver.Viewport) {
@@ -622,36 +598,24 @@ _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y,
 
 #if _HAVE_FULL_GL
 void GLAPIENTRY
+/**
+ * Called by glDepthRange
+ *
+ * \param nearval  specifies the Z buffer value which should correspond to
+ *                 the near clip plane
+ * \param farval  specifies the Z buffer value which should correspond to
+ *                the far clip plane
+ */
 _mesa_DepthRange( GLclampd nearval, GLclampd farval )
 {
-   /*
-    * nearval - specifies mapping of the near clipping plane to window
-    *   coordinates, default is 0
-    * farval - specifies mapping of the far clipping plane to window
-    *   coordinates, default is 1
-    *
-    * After clipping and div by w, z coords are in -1.0 to 1.0,
-    * corresponding to near and far clipping planes.  glDepthRange
-    * specifies a linear mapping of the normalized z coords in
-    * this range to window z coords.
-    */
-   GLfloat depthMax;
-   GLfloat n, f;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
-   depthMax = ctx->DrawBuffer->_DepthMaxF;
-
    if (MESA_VERBOSE&VERBOSE_API)
       _mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
 
-   n = (GLfloat) CLAMP( nearval, 0.0, 1.0 );
-   f = (GLfloat) CLAMP( farval, 0.0, 1.0 );
-
-   ctx->Viewport.Near = n;
-   ctx->Viewport.Far = f;
-   ctx->Viewport._WindowMap.m[MAT_SZ] = depthMax * ((f - n) / 2.0F);
-   ctx->Viewport._WindowMap.m[MAT_TZ] = depthMax * ((f - n) / 2.0F + n);
+   ctx->Viewport.Near = (GLfloat) CLAMP( nearval, 0.0, 1.0 );
+   ctx->Viewport.Far = (GLfloat) CLAMP( farval, 0.0, 1.0 );
    ctx->NewState |= _NEW_VIEWPORT;
 
    if (ctx->Driver.DepthRange) {
index 3eadb33e0f3bb5b4e62f7de1d9658ebad971e561..00b01878465e5de81bce8277175001af8cf59ea0 100644 (file)
@@ -2855,7 +2855,6 @@ struct __GLcontextRec
    GLfloat _ModelViewInvScale;
    GLboolean _NeedEyeCoords;
    GLboolean _ForceEyeCoords; 
-   GLboolean _RotateMode;
    GLenum _CurrentProgram;    /* currently executing program */
 
    struct gl_shine_tab *_ShineTable[2]; /**< Active shine tables */
index 994aaff7b00ba82811f3345fca30a87a3f40718a..7e452bdfd7ff4c7869a422ada149c8b0e65f0edf 100644 (file)
@@ -945,6 +945,26 @@ update_program(GLcontext *ctx)
 }
 
 
+static void
+update_viewport_matrix(GLcontext *ctx)
+{
+   const GLfloat depthMax = ctx->DrawBuffer->_DepthMaxF;
+
+   ASSERT(depthMax > 0);
+
+   /* Compute scale and bias values. This is really driver-specific
+    * and should be maintained elsewhere if at all.
+    * NOTE: RasterPos uses this.
+    */
+   _math_matrix_viewport(&ctx->Viewport._WindowMap,
+                         ctx->Viewport.X, ctx->Viewport.Y,
+                         ctx->Viewport.Width, ctx->Viewport.Height,
+                         ctx->Viewport.Near, ctx->Viewport.Far,
+                         depthMax);
+}
+
+
+
 /**
  * If __GLcontextRec::NewState is non-zero then this function \b must be called
  * before rendering any primitive.  Basically, function pointers and
@@ -1002,6 +1022,9 @@ _mesa_update_state( GLcontext *ctx )
    if (new_state & (_NEW_ARRAY | _NEW_PROGRAM))
       update_arrays( ctx );
 
+   if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT))
+      update_viewport_matrix(ctx);
+
    if (ctx->_MaintainTexEnvProgram) {
       if (new_state & (_NEW_TEXTURE | _DD_NEW_SEPARATE_SPECULAR | _NEW_FOG))
         _mesa_UpdateTexEnvProgram(ctx);