Remove _mesa_ResizeBuffersMESA() call from _mesa_set_viewport().
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 27 Nov 2004 22:47:59 +0000 (22:47 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 27 Nov 2004 22:47:59 +0000 (22:47 +0000)
Now, the driver's Viewport routine should call _mesa_ResizeBuffersMESA()
if necessary.
Cleaned up code related to GLframebuffer width/height initialization.
Set initial viewport/scissor params in _mesa_make_current2(), instead of
in the drivers' MakeCurrent functions.

41 files changed:
src/mesa/drivers/allegro/amesa.c
src/mesa/drivers/beos/GLView.cpp
src/mesa/drivers/dos/dmesa.c
src/mesa/drivers/dri/fb/fb_dri.c
src/mesa/drivers/dri/ffb/ffb_state.c
src/mesa/drivers/dri/ffb/ffb_xmesa.c
src/mesa/drivers/dri/gamma/gamma_state.c
src/mesa/drivers/dri/gamma/gamma_xmesa.c
src/mesa/drivers/dri/i810/i810context.c
src/mesa/drivers/dri/i810/i810state.c
src/mesa/drivers/dri/i830/i830_context.c
src/mesa/drivers/dri/i830/i830_state.c
src/mesa/drivers/dri/i915/intel_context.c
src/mesa/drivers/dri/mach64/mach64_context.c
src/mesa/drivers/dri/mach64/mach64_state.c
src/mesa/drivers/dri/mga/mga_xmesa.c
src/mesa/drivers/dri/mga/mgastate.c
src/mesa/drivers/dri/r128/r128_context.c
src/mesa/drivers/dri/r128/r128_state.c
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_state.c
src/mesa/drivers/dri/savage/savage_xmesa.c
src/mesa/drivers/dri/savage/savagestate.c
src/mesa/drivers/dri/sis/sis_context.c
src/mesa/drivers/dri/sis/sis_state.c
src/mesa/drivers/dri/tdfx/tdfx_context.c
src/mesa/drivers/dri/tdfx/tdfx_state.c
src/mesa/drivers/dri/unichrome/via_context.c
src/mesa/drivers/dri/unichrome/via_state.c
src/mesa/drivers/dri/x11/x11_dri.c
src/mesa/drivers/fbdev/glfbdev.c
src/mesa/drivers/ggi/ggimesa.c
src/mesa/drivers/glide/fxapi.c
src/mesa/drivers/glide/fxdd.c
src/mesa/drivers/svga/svgamesa.c
src/mesa/drivers/windows/gdi/wmesa.c
src/mesa/drivers/x11/xm_dd.c
src/mesa/main/context.c
src/mesa/main/matrix.c
src/mesa/main/mtypes.h

index 92fd1b7068322899c262b71781b44c77fd3040bd..cb46efa56aca715ba8d4e4bbe2556051420b7636 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <allegro.h>\r
+#include "buffers.h"\r
 #include "context.h"\r
 #include "imports.h"\r
 #include "matrix.h"\r
@@ -144,6 +145,13 @@ static void get_buffer_size(GLcontext *ctx, GLuint *width, GLuint *height)
     }\r
 \r
 \r
+static void viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)\r
+{\r
+   /* poll for window size change and realloc software Z/stencil/etc if needed */\r
+   _mesa_ResizeBuffersMESA();\r
+}\r
+\r
+\r
 /**********************************************************************/\r
 /**********************************************************************/\r
 \r
@@ -155,8 +163,9 @@ static void setup_dd_pointers(GLcontext *ctx)
        /* a new context is made current or we change buffers via set_buffer! */\r
 \r
     ctx->Driver.UpdateState   = setup_dd_pointers;\r
-       ctx->Driver.SetBuffer     = set_buffer;\r
-       ctx->Driver.GetBufferSize = get_buffer_size;\r
+    ctx->Driver.SetBuffer     = set_buffer;\r
+    ctx->Driver.GetBufferSize = get_buffer_size;\r
+    ctx->Driver.Viewport      = viewport;\r
 \r
     ctx->Driver.Color               = set_color_generic;\r
     ctx->Driver.ClearColor          = clear_color_generic;\r
@@ -371,9 +380,9 @@ GLboolean AMesaMakeCurrent(AMesaContext context, AMesaBuffer buffer)
         \r
       setup_dd_pointers(context->GLContext);\r
       _mesa_make_current(context->GLContext, buffer->GLBuffer);\r
-      _mesa_set_viewport(context->GLContext, 0, 0, buffer->Width, buffer->Height);\r
    }\r
    else {\r
+      /* XXX I don't think you want to destroy anything here! */
       destroy_bitmap(context->Buffer->Screen);\r
       context->Buffer->Screen = NULL;\r
       context->Buffer->Active = NULL;\r
index 43aa13e70103d8a0fcb75d93cf49799982223ff8..45473a8ef279d47f5f6399261e91d157dc84d45c 100644 (file)
@@ -153,6 +153,7 @@ private:
                              GLuint *height);
    static void         Error(GLcontext *ctx);
    static const GLubyte *      GetString(GLcontext *ctx, GLenum name);
+   static void          Viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
 
    // Front-buffer functions
    static void                 WriteRGBASpanFront(const GLcontext *ctx, GLuint n,
@@ -317,6 +318,7 @@ BGLView::BGLView(BRect rect, char *name,
        functions.ClearIndex    = md->ClearIndex;
        functions.ClearColor    = md->ClearColor;
        functions.Error                 = md->Error;
+        functions.Viewport      = md->Viewport;
 
        // create core context
        GLcontext *ctx = _mesa_create_context(visual, NULL, &functions, md);
@@ -1028,6 +1030,13 @@ void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width,
 }
 
 
+void MesaDriver::Viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
+
 const GLubyte *MesaDriver::GetString(GLcontext *ctx, GLenum name)
 {
    switch (name) {
index 41e0f4d8b3118c16f37a2165d707de1730b207b1..e0b2cf52b14c5b354adcd97f90a5e195a2511b78 100644 (file)
@@ -36,6 +36,7 @@
 #include "imports.h"
 #ifndef FX
 #include "bufferobj.h"
+#include "buffers.h"
 #include "extensions.h"
 #include "macros.h"
 #include "matrix.h"
@@ -812,6 +813,14 @@ get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
 }
 
 
+static void
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
+
 static const GLubyte *
 get_string (GLcontext *ctx, GLenum name)
 {
@@ -898,6 +907,7 @@ dmesa_init_driver_functions (DMesaVisual visual,
    driver->UpdateState = dmesa_update_state;
    driver->GetString = get_string;
    driver->GetBufferSize = get_buffer_size;
+   driver->Viewport = viewport;
    driver->Flush = flush;
    driver->Finish = finish;
    driver->Clear = clear;
@@ -1271,11 +1281,8 @@ DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
       c->buffer = b;
 
       _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
-      if (((GLcontext *)c)->Viewport.Width == 0) {
-         /* initialize viewport to window size */
-         _mesa_Viewport(0, 0, b->width, b->height);
-      }
-   } else {
+   }
+   else {
       /* Detach */
       _mesa_make_current(NULL, NULL);
    }
index 49ae5c98e8db1c633837d97c2e992735e0087cb0..16540ed0518da3b071bb38bdd71918908ea2193a 100644 (file)
@@ -63,6 +63,7 @@
 #include "miniglxP.h"          /* window-system-specific */
 #include "dri_util.h"          /* window-system-specific-ish */
 
+#include "buffers.h"
 #include "context.h"
 #include "extensions.h"
 #include "imports.h"
@@ -133,6 +134,13 @@ get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
 }
 
 
+static void
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   _mesa_ResizeBuffersMESA();
+}
+
+
 /* specifies the buffer for swrast span rendering/reading */
 static void
 set_buffer( GLcontext *ctx, GLframebuffer *buffer, GLuint bufferBit )
@@ -166,6 +174,7 @@ init_core_functions( struct dd_function_table *functions )
    functions->UpdateState = update_state;
    functions->ResizeBuffers = _swrast_alloc_buffers;
    functions->GetBufferSize = get_buffer_size;
+   functions->Viewport = viewport;
 
    functions->Clear = _swrast_Clear;  /* could accelerate with blits */
 }
@@ -536,11 +545,6 @@ fbMakeCurrent( __DRIcontextPrivate *driContextPriv,
       _mesa_make_current2( newFbCtx->glCtx,
                           (GLframebuffer *) driDrawPriv->driverPrivate,
                           (GLframebuffer *) driReadPriv->driverPrivate );
-
-      if ( !newFbCtx->glCtx->Viewport.Width ) {
-        _mesa_set_viewport( newFbCtx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h );
-      }
    } else {
       _mesa_make_current( 0, 0 );
    }
index 86f92c83db7d227349014fbdb7668f4b40dcdeeb..53d56d204369639b5e8dba799c52a5c5396d3766 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include "mtypes.h"
+#include "buffers.h"
 #include "colormac.h"
 #include "mm.h"
 #include "ffb_dd.h"
@@ -444,6 +445,8 @@ void ffbCalcViewport(GLcontext *ctx)
 static void ffbDDViewport(GLcontext *ctx, GLint x, GLint y,
                          GLsizei width, GLsizei height)
 {
+       /* update size of Mesa/software ancillary buffers */
+       _mesa_ResizeBuffersMESA();
        ffbCalcViewport(ctx);
 }
 
index 43c1f3466106d0d158fa21ca40980251c824e373..4e38d0823738539c5f68c89615f976f11c8cd514 100644 (file)
@@ -494,12 +494,6 @@ ffbMakeCurrent(__DRIcontextPrivate *driContextPriv,
                            (GLframebuffer *) driDrawPriv->driverPrivate, 
                            (GLframebuffer *) driReadPriv->driverPrivate);
 
-               if (!fmesa->glCtx->Viewport.Width)
-                       _mesa_set_viewport(fmesa->glCtx,
-                                          0, 0,
-                                          driDrawPriv->w, 
-                                          driDrawPriv->h);
-               
                first_time = 0;
                if (fmesa->wid == ~0) {
                        first_time = 1;
index 7beabc69265acf6fd04d8a105d0d5cc1ed0b9dc6..29f1a57959fa1ed29f11561303b6b01f898aed28 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "gamma_context.h"
 #include "gamma_macros.h"
+#include "buffers.h"
 #include "macros.h"
 #include "glint_dri.h"
 #include "colormac.h"
@@ -1098,6 +1099,8 @@ void gammaUpdateWindow( GLcontext *ctx )
 static void gammaDDViewport( GLcontext *ctx, GLint x, GLint y,
                            GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    gammaUpdateWindow( ctx );
 }
 
index 64ba0d909ace4cbb79aae28afe7e12a8bd5a7c3a..00f6aa32aeb990ba7c8c6de0593dc73bde0fb607 100644 (file)
@@ -225,11 +225,6 @@ newGammaCtx->new_state |= GAMMA_NEW_WINDOW; /* FIXME */
        _mesa_make_current2( newGammaCtx->glCtx, 
                          (GLframebuffer *) driDrawPriv->driverPrivate,
                          (GLframebuffer *) driReadPriv->driverPrivate );
-
-       if (!newGammaCtx->glCtx->Viewport.Width) {
-           _mesa_set_viewport(newGammaCtx->glCtx, 0, 0, 
-                                       driDrawPriv->w, driDrawPriv->h);
-       }
     } else {
        _mesa_make_current( 0, 0 );
     }
index 7db354d193f97100eb0c66659c4253e594a204d3..4443c7eac5c3da23a87296e13f9b30929596aaea 100644 (file)
@@ -431,9 +431,6 @@ i810MakeCurrent(__DRIcontextPrivate *driContextPriv,
       /* Are these necessary?
        */
       i810XMesaWindowMoved( imesa );
-      if (!imesa->glCtx->Viewport.Width)
-        _mesa_set_viewport(imesa->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
    }
    else {
       _mesa_make_current(0,0);
index 35fad6529c98eeedd9646239c48c5cd468812f84..42df2e8b9ee5efe2be7ba2a7dd8c087b4b8642f8 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdio.h>
 
 #include "glheader.h"
+#include "buffers.h"
 #include "context.h"
 #include "macros.h"
 #include "enums.h"
@@ -682,6 +683,8 @@ static void i810Viewport( GLcontext *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    i810CalcViewport( ctx );
 }
 
index 3e6f8a9a1fb242e93d7fc302fb32ec48177f4018..082476f2118cf9e071c3c54bfa51895189efe43b 100644 (file)
@@ -530,10 +530,6 @@ GLboolean i830MakeCurrent(__DRIcontextPrivate *driContextPriv,
       _mesa_make_current2(imesa->glCtx,
                          (GLframebuffer *) driDrawPriv->driverPrivate,
                          (GLframebuffer *) driReadPriv->driverPrivate);
-
-      if (!imesa->glCtx->Viewport.Width)
-        _mesa_set_viewport(imesa->glCtx, 0, 0,
-                           driDrawPriv->w, driDrawPriv->h);
    } else {
       _mesa_make_current(0,0);
    }
index 12cec35c3da5da0c7e6a5cf532682d1e5ad065d7..f8979c701871f974fd72ec333e1da922ba3de9c1 100644 (file)
@@ -36,6 +36,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include "glheader.h"
+#include "buffers.h"
 #include "context.h"
 #include "macros.h"
 #include "enums.h"
@@ -1228,6 +1229,8 @@ static void i830Viewport( GLcontext *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    i830CalcViewport( ctx );
 }
 
index 302ddfa840ebdaf27981a7ffdc6116c5fb76a57b..1ff7b8be7f4186bad5b441ab6f5a4b945324bc56 100644 (file)
@@ -534,9 +534,6 @@ GLboolean intelMakeCurrent(__DRIcontextPrivate *driContextPriv,
       _mesa_make_current2(&intel->ctx,
                          (GLframebuffer *) driDrawPriv->driverPrivate,
                          (GLframebuffer *) driReadPriv->driverPrivate);
-
-      if (!intel->ctx.Viewport.Width)
-        _mesa_set_viewport(&intel->ctx, 0, 0, driDrawPriv->w, driDrawPriv->h);
    } else {
       _mesa_make_current(0,0);
    }
index 0bbda3a43dec31abaa5374f5de39e4f0a17ea8bf..1978c5d615109d4a1fa4b9d46d9e2d6e2f18082f 100644 (file)
@@ -312,11 +312,6 @@ mach64MakeCurrent( __DRIcontextPrivate *driContextPriv,
 
 
       newMach64Ctx->new_state |=  MACH64_NEW_CLIP;
-
-      if ( !newMach64Ctx->glCtx->Viewport.Width ) {
-        _mesa_set_viewport(newMach64Ctx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
-      }
    } else {
       _mesa_make_current( 0, 0 );
    }
index 91f588bb78811746bdd92812c56b01897484a014..ea55124d9167d9a9b578155e9b9d0c869f81e47f 100644 (file)
@@ -37,6 +37,7 @@
 #include "mach64_tex.h"
 
 #include "context.h"
+#include "buffers.h"
 #include "enums.h"
 #include "colormac.h"
 #include "swrast/swrast.h"
@@ -646,6 +647,8 @@ static void mach64Viewport( GLcontext *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    mach64CalcViewport( ctx );
 }
 
index 8bed48c423e4ca8456fbf54da293cc4b33a89fd3..6fcef0c448867d46acd01b47c4e381372f663d28 100644 (file)
@@ -802,11 +802,6 @@ mgaMakeCurrent(__DRIcontextPrivate *driContextPriv,
       _mesa_make_current2(mmesa->glCtx,
                           (GLframebuffer *) driDrawPriv->driverPrivate,
                           (GLframebuffer *) driReadPriv->driverPrivate);
-
-      if (!mmesa->glCtx->Viewport.Width)
-        _mesa_set_viewport(mmesa->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
-
    }
    else {
       _mesa_make_current(NULL, NULL);
index 295d3f5a088e5b16629bacd203b7063307de7ed1..69cc0f33a705a5310d0f25e9a950fa1588a8c643 100644 (file)
@@ -28,6 +28,7 @@
 
 
 #include "mtypes.h"
+#include "buffers.h"
 #include "colormac.h"
 #include "dd.h"
 
@@ -695,6 +696,8 @@ static void mgaViewport( GLcontext *ctx,
                          GLint x, GLint y, 
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    mgaCalcViewport( ctx );
 }
 
index 287f041a81cc075348ff88872ca7841a8e1f4282..2f417d9097f053d81d136b87912992f08b9c6555 100644 (file)
@@ -341,13 +341,7 @@ r128MakeCurrent( __DRIcontextPrivate *driContextPriv,
                            (GLframebuffer *) driDrawPriv->driverPrivate,
                            (GLframebuffer *) driReadPriv->driverPrivate );
 
-
       newR128Ctx->new_state |= R128_NEW_WINDOW | R128_NEW_CLIP;
-
-      if ( !newR128Ctx->glCtx->Viewport.Width ) {
-        _mesa_set_viewport(newR128Ctx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
-      }
    } else {
       _mesa_make_current( 0, 0 );
    }
index 4e43629f49b249f22cc3f5201baa226ea64ef816..320865c67b421046930274dc7629fb77613c5d57 100644 (file)
@@ -41,6 +41,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r128_tex.h"
 
 #include "context.h"
+#include "buffers.h"
 #include "enums.h"
 #include "colormac.h"
 #include "swrast/swrast.h"
@@ -664,6 +665,8 @@ static void r128Viewport( GLcontext *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    r128CalcViewport( ctx );
 }
 
index d5d2ce150a513b1ec68db8b65a55a5a54be5718b..7bf097b1253f4e1cf917a5405336dc66fc5227e9 100644 (file)
@@ -624,11 +624,6 @@ r200MakeCurrent( __DRIcontextPrivate *driContextPriv,
                           (GLframebuffer *) driDrawPriv->driverPrivate,
                           (GLframebuffer *) driReadPriv->driverPrivate );
 
-      if ( !newCtx->glCtx->Viewport.Width ) {
-        _mesa_set_viewport( newCtx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h );
-      }
-
       if (newCtx->vb.enabled)
         r200VtxfmtMakeCurrent( newCtx->glCtx );
 
index fc69ec1b5bcc88faf0e8c502c247f411a87d62b5..9231697a49eaddd2235f8222ad9b3b960a266197 100644 (file)
@@ -593,11 +593,6 @@ radeonMakeCurrent( __DRIcontextPrivate *driContextPriv,
                           (GLframebuffer *) driDrawPriv->driverPrivate,
                           (GLframebuffer *) driReadPriv->driverPrivate );
 
-      if ( !newCtx->glCtx->Viewport.Width ) {
-        _mesa_set_viewport( newCtx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h );
-      }
-
       if (newCtx->vb.enabled)
         radeonVtxfmtMakeCurrent( newCtx->glCtx );
 
index bc94882a660e1fe9544dddd004f72690aaf3bd81..851b62035a50ae71b62a5e2e1f02e168dbb472ea 100644 (file)
@@ -39,6 +39,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "enums.h"
 #include "colormac.h"
 #include "state.h"
+#include "buffers.h"
 #include "context.h"
 
 #include "swrast/swrast.h"
@@ -1451,6 +1452,8 @@ void radeonUpdateWindow( GLcontext *ctx )
 static void radeonViewport( GLcontext *ctx, GLint x, GLint y,
                            GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    /* Don't pipeline viewport changes, conflict with window offset
     * setting below.  Could apply deltas to rescue pipelined viewport
     * values, or keep the originals hanging around.
index adb7f2c82db2e87db4d7c478d0a849e5900165e9..a80ffce5d7454fe77ff259cb42547d27e94a5974 100644 (file)
@@ -676,10 +676,6 @@ savageMakeCurrent(__DRIcontextPrivate *driContextPriv,
                           (GLframebuffer *) driReadPriv->driverPrivate);
       
       savageXMesaWindowMoved( imesa );
-      
-      if (!imesa->glCtx->Viewport.Width)
-        _mesa_set_viewport(imesa->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
    }
    else 
    {
index c6545fbcca39b5e7deee9e004c5a8b3e9ca67c9a..75289fcbfd462659aa12fe661aaabd938e6cb370 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdio.h>
 
 #include "mtypes.h"
+#include "buffers.h"
 #include "enums.h"
 #include "macros.h"
 #include "dd.h"
@@ -704,6 +705,8 @@ static void savageViewport( GLcontext *ctx,
                            GLint x, GLint y, 
                            GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    savageCalcViewport( ctx );
 }
 
index 0d15bfa5e900722cdc8efe25b22dc4ff97bdccca..3b23b7df4e55f26daa2c35d1ccf33e64ea02c9cb 100644 (file)
@@ -312,11 +312,6 @@ sisMakeCurrent( __DRIcontextPrivate *driContextPriv,
 
       sisUpdateBufferSize( newSisCtx );
       sisUpdateClipping( newSisCtx->glCtx );
-
-      if ( newSisCtx->glCtx->Viewport.Width == 0 ) {
-         _mesa_set_viewport(newSisCtx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
-      }
    } else {
       _mesa_make_current( 0, 0 );
    }
index 2cca1611df75fbfd77337fdcff0a87d6bc073a4a..b269d694b0f4ae43f726e4e53dc0dbd66e76ccea 100644 (file)
@@ -39,6 +39,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "sis_tex.h"
 
 #include "context.h"
+#include "buffers.h"
 #include "enums.h"
 #include "colormac.h"
 #include "swrast/swrast.h"
@@ -436,6 +437,8 @@ static void sisDDViewport( GLcontext *ctx,
                           GLint x, GLint y,
                           GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    sisCalcViewport( ctx );
 }
 
index 56b1e459b749229e1971b43da625b6621fc89fe2..683c9bd5f24550fe38ef05a18d5e3782c70002b2 100644 (file)
@@ -666,10 +666,6 @@ tdfxMakeCurrent( __DRIcontextPrivate *driContextPriv,
       _mesa_make_current2( newCtx,
                            (GLframebuffer *) driDrawPriv->driverPrivate,
                            (GLframebuffer *) driReadPriv->driverPrivate );
-
-      if ( !newCtx->Viewport.Width ) {
-        _mesa_set_viewport( newCtx, 0, 0, driDrawPriv->w, driDrawPriv->h );
-      }
    } else {
       _mesa_make_current( 0, 0 );
    }
index 818a9bc23f4321960118a10a18a179182e23f2af..6edf804b2ece10077a1a7c145cbe133b3483ed84 100644 (file)
@@ -40,6 +40,7 @@
  */
 
 #include "mtypes.h"
+#include "buffers.h"
 #include "colormac.h"
 #include "texformat.h"
 #include "texstore.h"
@@ -902,6 +903,8 @@ static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y,
                            GLsizei w, GLsizei h )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    FLUSH_BATCH( fxMesa );
    fxMesa->new_state |= TDFX_NEW_VIEWPORT;
 }
index f058424e64dd4d0909d5a29a6970e6cf386dcb4c..490f574ad1aa4fca47a2e9ee64bce66ecad4601b 100644 (file)
@@ -959,9 +959,6 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
        if (VIA_DEBUG) fprintf(stderr, "Context %d MakeCurrent\n", vmesa->hHWContext);
 #endif
         viaXMesaWindowMoved(vmesa);
-        if (!vmesa->glCtx->Viewport.Width)
-            _mesa_set_viewport(vmesa->glCtx, 0, 0,
-                               driDrawPriv->w, driDrawPriv->h);
     }
     else {
         _mesa_make_current(0,0);
index 79ce4cbe88d514fe11d2273ad5ed5490fc7c6654..4c78a3f263e2c8687c1de1d4c5f8412e5baa7c41 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdio.h>
 
 #include "glheader.h"
+#include "buffers.h"
 #include "context.h"
 #include "macros.h"
 #include "colormac.h"
@@ -464,6 +465,8 @@ static void viaViewport(GLcontext *ctx,
                         GLint x, GLint y,
                         GLsizei width, GLsizei height)
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
     viaCalcViewport(ctx);
 }
 
index f7d25271fbad3ace1ceed4119d6f7a4d03b48219..f414b7e424b4d7bcd9ba02e1028316b046d43eb8 100644 (file)
@@ -409,11 +409,6 @@ x11MakeCurrent(__DRIcontextPrivate *driContextPriv,
       _mesa_make_current2(newFbCtx->glCtx,
                          (GLframebuffer *) driDrawPriv->driverPrivate,
                          (GLframebuffer *) driReadPriv->driverPrivate);
-
-      if (!newFbCtx->glCtx->Viewport.Width) {
-        _mesa_set_viewport(newFbCtx->glCtx, 0, 0,
-                           driDrawPriv->w, driDrawPriv->h);
-      }
    } else {
       _mesa_make_current(0, 0);
    }
index cfb6a70f60bf9ac553c25d64e8cefa50acc799ce..9cf0be0e16bacbd8d1ef96de970359feb05560a7 100644 (file)
@@ -45,6 +45,7 @@
 #include "glheader.h"
 #include <linux/fb.h>
 #include "GL/glfbdev.h"
+#include "buffers.h"
 #include "context.h"
 #include "extensions.h"
 #include "imports.h"
@@ -151,6 +152,14 @@ get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
 }
 
 
+static void
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
+
 /* specifies the buffer for swrast span rendering/reading */
 static void
 set_buffer( GLcontext *ctx, GLframebuffer *buffer, GLuint bufferBit )
@@ -639,6 +648,7 @@ glFBDevCreateContext( const GLFBDevVisualPtr visual, GLFBDevContextPtr share )
    functions.GetString = get_string;
    functions.UpdateState = update_state;
    functions.GetBufferSize = get_buffer_size;
+   functions.Viewport = viewport;
 
    if (!_mesa_initialize_context(&ctx->glcontext, &visual->glvisual,
                                  share ? &share->glcontext : NULL,
index cb34c1a54108c64b2831cf29f2790c3a454df2a9..0652d76248767ba3786a5794a780751140e8839a 100644 (file)
@@ -30,6 +30,7 @@
 #include <ggi/mesa/ggimesa_int.h>
 #include <ggi/mesa/debug.h>
 #include "extensions.h"
+#include "buffers.h"
 #include "colormac.h"
 #include "imports.h"
 #include "matrix.h"
@@ -256,6 +257,13 @@ static void gl_ggiGetSize(GLframebuffer *fb, GLuint *width, GLuint *height)
        printf("returning %d, %d\n", *width, *height);
 }
 
+static void gl_ggiViewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
+
 static void gl_ggiSetIndex(GLcontext *ctx, GLuint ci)
 {
        ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
@@ -400,6 +408,7 @@ static void gl_ggiSetupPointers(GLcontext *ctx)
        /* General information */
        ctx->Driver.GetString = gl_ggiGetString;
        ctx->Driver.GetBufferSize = gl_ggiGetSize;
+        ctx->Driver.Viewport = gl_ggiViewport;
        ctx->Driver.Finish = gl_ggiFlush;
        ctx->Driver.Flush = gl_ggiFlush;
        
@@ -632,15 +641,6 @@ void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis)
        }
        
        _mesa_make_current(ctx->gl_ctx, &LIBGGI_MESAEXT(vis)->mesa_buffer);
-       
-       if (ctx->gl_ctx->Viewport.Width == 0)
-       {
-               _mesa_Viewport(0, 0,
-                              LIBGGI_VIRTX(vis),
-                              LIBGGI_VIRTY(vis));
-               ctx->gl_ctx->Scissor.Width = LIBGGI_VIRTX(vis);
-               ctx->gl_ctx->Scissor.Height = LIBGGI_VIRTY(vis);
-       }
 }
 
 
index 708dad51f41f3cac91acdd596cb89f7f02d3b5c9..a96709c4fa22399a65ce9ea5aac15bd1d91c27fc 100644 (file)
@@ -873,10 +873,6 @@ fxMesaMakeCurrent(fxMesaContext fxMesa)
    _mesa_make_current(fxMesa->glCtx, fxMesa->glBuffer);
 
    fxSetupDDPointers(fxMesa->glCtx);
-
-   /* The first time we call MakeCurrent we set the initial viewport size */
-   if (fxMesa->glCtx->Viewport.Width == 0)
-      _mesa_set_viewport(fxMesa->glCtx, 0, 0, fxMesa->width, fxMesa->height);
 }
 
 
index a54bf8fb9c99525c7ad26f631fc6f98d63f23f7a..e222db951d25b79dd155c9985272cd5860d971aa 100644 (file)
@@ -43,6 +43,7 @@
 #include "image.h"
 #include "mtypes.h"
 #include "fxdrv.h"
+#include "buffers.h"
 #include "enums.h"
 #include "extensions.h"
 #include "macros.h"
@@ -106,7 +107,7 @@ static void fxDisableColor (fxMesaContext fxMesa)
 
 /* Return buffer size information */
 static void
-fxDDBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height)
+fxDDGetBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height)
 {
    GET_CURRENT_CONTEXT(ctx);
    if (ctx && FX_CONTEXT(ctx)) {
@@ -121,6 +122,12 @@ fxDDBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height)
    }
 }
 
+static void
+fxDDViewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
 
 /* Implements glClearColor() */
 static void
@@ -2106,7 +2113,8 @@ fxSetupDDPointers(GLcontext * ctx)
    ctx->Driver.ClearColor = fxDDClearColor;
    ctx->Driver.Clear = fxDDClear;
    ctx->Driver.DrawBuffer = fxDDSetDrawBuffer;
-   ctx->Driver.GetBufferSize = fxDDBufferSize;
+   ctx->Driver.GetBufferSize = fxDDGetBufferSize;
+   ctx->Driver.Viewport = fxDDViewport;
    switch (fxMesa->colDepth) {
       case 15:
          ctx->Driver.DrawPixels = fxDDDrawPixels555;
index 5f636e14afde67fc8852cac0dedf591ac12b3086..980daf30e9624ef3c34724597d3d9d2f5046339c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: svgamesa.c,v 1.23 2002/11/11 18:42:38 brianp Exp $ */
+/* $Id: svgamesa.c,v 1.24 2004/11/27 22:48:00 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -39,6 +39,7 @@
 #include <string.h>
 #include <vga.h>
 #include "GL/svgamesa.h"
+#include "buffers.h"
 #include "context.h"
 #include "extensions.h"
 #include "imports.h"
@@ -212,6 +213,11 @@ static void get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *heigh
    *height = SVGAMesa->height = vga_getydim();
 }
 
+static void viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
 
 static void set_buffer( GLcontext *ctx, GLframebuffer *colorBuffer,
                         GLenum buffer )
@@ -258,6 +264,7 @@ static void svgamesa_update_state( GLcontext *ctx, GLuint new_state )
 
    ctx->Driver.GetBufferSize = get_buffer_size;
    ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
+   ctx->Driver.Viewport = viewport;
 
    /* Software rasterizer pixel paths:
     */
@@ -446,10 +453,8 @@ void SVGAMesaMakeCurrent( SVGAMesaContext ctx )
    _mesa_make_current( ctx->gl_ctx, ctx->gl_buffer );
 
    if (ctx->width==0 || ctx->height==0) {
-      /* setup initial viewport */
       ctx->width = vga_getxdim();
       ctx->height = vga_getydim();
-      _mesa_set_viewport( ctx->gl_ctx, 0, 0, ctx->width, ctx->height );
    }
 #endif
 }
index acd5f4a34fbb5168b1f6f34e871954d58cd8305b..5d7e260c4b610314a166aa9791b984207af5fb9a 100644 (file)
@@ -29,6 +29,7 @@
 //#include "mesa_extend.h"
 
 #include "glheader.h"
+#include "buffers.h"
 #include "colors.h"
 #include "context.h"
 #include "colormac.h"
@@ -614,7 +615,7 @@ static void set_buffer(GLcontext *ctx, GLframebuffer *colorBuffer,
 
 
 /* Return characteristics of the output buffer. */
-static void buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
+static void get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
 {
   /*GET_CURRENT_CONTEXT(ctx);*/
   int New_Size;
@@ -658,6 +659,12 @@ static void buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
 }
 
 
+static void viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
 
 /**********************************************************************/
 /*****           Accelerated point, line, polygon rendering       *****/
@@ -1094,7 +1101,8 @@ static void SetFunctionPointers( struct dd_function_table *functions )
   functions->GetString = get_string;
   functions->UpdateState = wmesa_update_state;
   functions->ResizeBuffers = _swrast_alloc_buffers;
-  functions->GetBufferSize = buffer_size;
+  functions->GetBufferSize = get_buffer_size;
+  functions->Viewport = viewport;
 
   functions->Clear = clear;
 
@@ -1491,12 +1499,6 @@ void WMesaMakeCurrent( WMesaContext c )
   Current = c;
   wmesa_update_state(c->gl_ctx, 0);
   _mesa_make_current(c->gl_ctx, c->gl_buffer);
-  if (Current->gl_ctx->Viewport.Width==0) {
-    /* initialize viewport to window size */
-    _mesa_Viewport( 0, 0, Current->width, Current->height );
-    Current->gl_ctx->Scissor.Width = Current->width;
-    Current->gl_ctx->Scissor.Height = Current->height;
-  }
   if ((c->cColorBits <= 8 ) && (c->rgb_flag == GL_TRUE)){
     WMesaPaletteChange(c->hPalHalfTone);
   }
index d8f3e22cfc9679a66b3cb1345bf5756034991e4c..4afc81484a092124ed5fc1d2845cfe84805dc408 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "glxheader.h"
 #include "bufferobj.h"
+#include "buffers.h"
 #include "context.h"
 #include "colormac.h"
 #include "depth.h"
@@ -1202,6 +1203,23 @@ choose_tex_format( GLcontext *ctx, GLint internalFormat,
 }
 
 
+/**
+ * Called by glViewport.
+ * This is a good time for us to poll the current X window size and adjust
+ * our ancillary (back color, depth, stencil, etc) buffers to match the
+ * current window size.  Remember, we have no opportunity to respond to
+ * conventional X Resize/StructureNotify events since the X driver has no
+ * event loop.  Thus, we poll.
+ * Note that this trick isn't fool-proof.  If the application never calls
+ * glViewport, our notion of the current window size may be incorrect.
+ */
+static void
+xmesa_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   _mesa_ResizeBuffersMESA();
+}
+
+
 /**
  * Initialize the device driver function table with the functions
  * we implement in this driver.
@@ -1222,6 +1240,7 @@ xmesa_init_driver_functions( XMesaVisual xmvisual,
    driver->Enable = enable;
    driver->Clear = clear_buffers;
    driver->ResizeBuffers = xmesa_resize_buffers;
+   driver->Viewport = xmesa_viewport;
 #ifndef XFree86Server
    driver->CopyPixels = xmesa_CopyPixels;
    if (xmvisual->undithered_pf == PF_8R8G8B &&
index 6248016d21c9c12a4de1813ac480d63f4896bded..2423b68ddc704bb2ace48a08d9f08ab0fabf79e6 100644 (file)
@@ -1606,6 +1606,10 @@ _mesa_free_context_data( GLcontext *ctx )
    _mesa_delete_buffer_object(ctx, ctx->Array.NullBufferObj);
 #endif
 
+   /* free dispatch tables */
+   _mesa_free(ctx->Exec);
+   _mesa_free(ctx->Save);
+
    /* Shared context state (display lists, textures, etc) */
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount--;
@@ -1618,9 +1622,6 @@ _mesa_free_context_data( GLcontext *ctx )
 
    if (ctx->Extensions.String)
       FREE((void *) ctx->Extensions.String);
-
-   FREE(ctx->Exec);
-   FREE(ctx->Save);
 }
 
 
@@ -1877,41 +1878,36 @@ _mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
         newCtx->NewState |= _NEW_BUFFERS;
 
 #if _HAVE_FULL_GL
-         if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
+         if (!drawBuffer->Initialized) {
             /* get initial window size */
             GLuint bufWidth, bufHeight;
-
-            /* ask device driver for size of output buffer */
-            (*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
-
-            if (drawBuffer->Width != bufWidth || 
-               drawBuffer->Height != bufHeight) {
-
-              drawBuffer->Width = bufWidth;
-              drawBuffer->Height = bufHeight;
-
-              newCtx->Driver.ResizeBuffers( drawBuffer );
-           }
+            /* ask device driver for size of the buffer */
+            (*newCtx->Driver.GetBufferSize)(drawBuffer, &bufWidth, &bufHeight);
+            /* set initial buffer size */
+            drawBuffer->Width = bufWidth;
+            drawBuffer->Height = bufHeight;
+            newCtx->Driver.ResizeBuffers( drawBuffer );
+            drawBuffer->Initialized = GL_TRUE;
          }
 
-         if (readBuffer != drawBuffer &&
-             readBuffer->Width == 0 && readBuffer->Height == 0) {
+         if (readBuffer != drawBuffer && !readBuffer->Initialized) {
             /* get initial window size */
             GLuint bufWidth, bufHeight;
-
-            /* ask device driver for size of output buffer */
-            (*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
-
-            if (readBuffer->Width != bufWidth ||
-               readBuffer->Height != bufHeight) {
-
-              readBuffer->Width = bufWidth;
-              readBuffer->Height = bufHeight;
-
-              newCtx->Driver.ResizeBuffers( readBuffer );
-           }
+            /* ask device driver for size of the buffer */
+            (*newCtx->Driver.GetBufferSize)(readBuffer, &bufWidth, &bufHeight);
+            /* set initial buffer size */
+            readBuffer->Width = bufWidth;
+            readBuffer->Height = bufHeight;
+            newCtx->Driver.ResizeBuffers( readBuffer );
+            readBuffer->Initialized = GL_TRUE;
          }
 #endif
+         if (newCtx->FirstTimeCurrent) {
+            /* set initial viewport and scissor size now */
+            _mesa_set_viewport(newCtx, 0, 0, drawBuffer->Width, drawBuffer->Height);
+            newCtx->Scissor.Width = drawBuffer->Width;
+            newCtx->Scissor.Height = drawBuffer->Height;
+         }
       }
 
       /* Alert the driver - usually passed on to the sw t&l module,
index 3a4bfe3096778a6eb9969eec2f0d5371323a4313..82ea37508d01e09c6d9cfa205d81cb3f80965ac2 100644 (file)
@@ -35,7 +35,6 @@
 
 #include "glheader.h"
 #include "imports.h"
-#include "buffers.h"
 #include "context.h"
 #include "enums.h"
 #include "macros.h"
@@ -556,11 +555,6 @@ _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
  * Set new viewport parameters and update derived state (the _WindowMap
  * matrix).  Usually called from _mesa_Viewport().
  * 
- * \note  We also call _mesa_ResizeBuffersMESA() because this is a good
- * time to check if the window has been resized.  Many device drivers
- * can't get direct notification from the window system of size changes
- * so this is an ad-hoc solution to that problem.
- * 
  * \param ctx GL context.
  * \param x, y coordinates of the lower left corner of the viewport rectangle.
  * \param width width of the viewport rectangle.
@@ -618,15 +612,10 @@ _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y,
    ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
    ctx->NewState |= _NEW_VIEWPORT;
 
-   /* Check if window/buffer has been resized and if so, reallocate the
-    * ancillary buffers.  This is an ad-hoc solution to detecting window
-    * size changes.  99% of all GL apps call glViewport when a window is
-    * resized so this is a good time to check for new window dims and
-    * reallocate color buffers and ancilliary buffers.
-    */
-   _mesa_ResizeBuffersMESA();
-
    if (ctx->Driver.Viewport) {
+      /* Many drivers will use this call to check for window size changes
+       * and reallocate the z/stencil/accum/etc buffers if needed.
+       */
       (*ctx->Driver.Viewport)( ctx, x, y, width, height );
    }
 }
index 5586e685109b5cbd6cd8b57e2a750b901b8b15ae..a53fb127538296b8bf60f5ae40cf4817ae0a7648 100644 (file)
@@ -1869,6 +1869,8 @@ struct gl_frame_buffer
 
    GLuint Width, Height;       /**< size of frame buffer in pixels */
 
+   GLboolean Initialized;
+
    GLboolean UseSoftwareDepthBuffer;
    GLboolean UseSoftwareAccumBuffer;
    GLboolean UseSoftwareStencilBuffer;